From 517d8589126ef49c0a71e777ae5f8c26acb28232 Mon Sep 17 00:00:00 2001 From: Sameersribot Date: Mon, 6 Jul 2026 17:46:30 +0000 Subject: [PATCH 1/8] feat(integrations): add AgentLine provider Add AgentLine as a new API_KEY provider: - providers.yaml: agentline entry with communication category - docs: connect.mdx setup guide and account.png logo - docs.json: alphabetical entry in api-integrations --- docs/api-integrations/agentline/account.png | Bin 0 -> 1914 bytes docs/api-integrations/agentline/connect.mdx | 23 +++++++++++++++++++ docs/docs.json | 1 + packages/providers/providers.yaml | 24 ++++++++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 docs/api-integrations/agentline/account.png create mode 100644 docs/api-integrations/agentline/connect.mdx diff --git a/docs/api-integrations/agentline/account.png b/docs/api-integrations/agentline/account.png new file mode 100644 index 0000000000000000000000000000000000000000..4b26a589d31d4a5d55eaea283eab043d0f1b0ad4 GIT binary patch literal 1914 zcmV-=2Zi{FP)T!fKg>)W!z8`)Fc_Hi z@tm_+zq9t*YyI~E)@;pgZd1!$C;$VXR{*)G{`hf#1)v+{Z>f$*09=l*PlVXtYGJ1P zO4)bjBTj(*zXDzmNmWet_X*)%3v963e>#)PWp5PpiY)IAd?e@gzmSa$Zk|t(#qwQN zDRpQGk)?d9?=~&iYMFbK2z#LSdJ5xbiiylEhV)Z2s2$l@D%BP&wTneuW)Hh8XE&Cb z5)J?qTsN#tXrocISAdOv%Re3nICmJ5`+AGx$Np>0=FP!cxxTFdVTW|N6yfpVk&)&C za7#<5G_(pSvD*?IYq#xD$DyxBg??XG)(IFIu(0p=#Gi~11>0gHAW}-ufY7CuvM=}M zCoazKV5iWul5%z!w*-bU(ws~VemKbZkqEVj>F#b;sxB5S-#?*<_WDc_2BiRLFr+F1 zvR0Cc_@}QIN56SL(CQR=*}wuQ0!%L5|A`>Wh z>SDd61v6ELY*)l#1#sP(vsK@F#IsTh5pStO0!gjcmr3sIYRtR{0N?%qU|uTh&*xyX zslgK|txwcMOhc@(1ont_wn1Bj^&=sr_k%bp);^YC)}Gk174t?=>0@t}#=q1h)qW%P zCnaO@>zv>{Id|X?0agILnpI*pvdO{EyN-UQWUXfbO#ormn@O=!RqKy5eD9&Y^1wO5 zc`ut9_?iZP2SiSU7}lCsYsNd?Tb_KS6koR?qQj4t;16aBV+ZDatQdIyP~=@VW;r^g ziP;lj0vI4zh~Leu+t&WQVyhotUo4K#)o&)ik* zLVGgayD>AJyYxXEyp;MUfNog50anf@NomY>FA<1|&BBgO+3MaoSWUCd!3dzz#fj5T zMed%rS3&LKWrPgnn(b^9O6Oy@312Rxm2Iwrv8(*3uE;hbuR=`p8n_Y2WJ zAw&d#61hC>n|(v&@wd+a`X0c)I`j7bl*dNc5kaa5LMkCHz+cOaNefa~kCaY*3*s zVrKmISy=PytJ~>3Y~IamV>VA)D}Q2Eo8mffq;AZqbaC`h)*bkCPaybJ&CU@3_*RE3 zxNH9#fC6bJ(z;_F7|46zxar!O5*$LP`0yLFMMUCk1G31w8 z>4y_eU`MIle5qCRj*cb1jx;0f7LDruNg@bS8;{A7&QUmu+#WK6V_-sh2Jr42kjMsQ_tT=Xm zl)ASMg+qT8P}sB5jwQn^7Ow-qna+26Y1e!L`Ti*9h39Lh) zUJ8&^LmDR9&H&&cs5M>H1Xda%opTN~4QanN_)Q%*(%t zSmw@%6Zmah>)w(zVtoGzFh9(Y3IrvFyeC9i0VN1{APSC^8RB#YDA^rCwOIW}ezf@D zFsA>qlzE0;D)8I^WSW_L^P=nC3P1V;6CL#kQAN}P;vQdQ0+3As;zW!UTAE-(8oeP! z^|oJ_9xp$4IY0X3?LcX%!E3sgcQadk*f_&^Ak6xRPjD5076csN3MEUI{*Lx07*qoM6N<$f-Lf? A0{{R3 literal 0 HcmV?d00001 diff --git a/docs/api-integrations/agentline/connect.mdx b/docs/api-integrations/agentline/connect.mdx new file mode 100644 index 0000000000..91d63ed709 --- /dev/null +++ b/docs/api-integrations/agentline/connect.mdx @@ -0,0 +1,23 @@ +--- +title: 'Connect to AgentLine' +sidebarTitle: 'Connect' +description: 'How to obtain your AgentLine API key and connect to Nango' +--- + + +## Step 1. Finding your API Key + +1. Sign up or log in at [agentline.cloud](https://agentline.cloud) +2. Go to your dashboard and copy your API key (starts with `sk_live_`) + + + + + +## Step 2. Enter your API key in Nango + +In Nango, go to [Connections](https://app.nango.dev/dev/connections) -> _Add Test Connection_ -> select _AgentLine_ -> enter your API key and click _Authorize_. + +Need help getting started? Get help in the [community](https://nango.dev/slack). + +Contribute improvements to the setup guide by [editing this page](https://github.com/nangohq/nango/tree/master/docs/api-integrations/agentline/connect.mdx) diff --git a/docs/docs.json b/docs/docs.json index dcff00762f..5fb85b2f3c 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -935,6 +935,7 @@ "integrations/all/affinity-v2", "api-integrations/agiloft", "api-integrations/agiloft-cc", + "api-integrations/agentline", "integrations/all/aimfox", "integrations/all/aimfox-oauth", "integrations/all/aircall", diff --git a/packages/providers/providers.yaml b/packages/providers/providers.yaml index adb2cab41d..41e4e0a4c5 100644 --- a/packages/providers/providers.yaml +++ b/packages/providers/providers.yaml @@ -763,6 +763,30 @@ affinity-v2: example: 'nrlW2KR5m-qUCA-rTqKb_EUK1swERlenqn70KNMMrTM' doc_section: '#step-1-generating-your-api-key' +agentline: + display_name: AgentLine + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://api.agentline.cloud + headers: + authorization: Bearer *** + verification: + method: GET + endpoints: + - /v1/agents + docs: https://nango.dev/docs/api-integrations/agentline + docs_connect: https://nango.dev/docs/api-integrations/agentline/connect + credentials: + apiKey: + type: string + title: API Key + description: Your AgentLine API key. + pattern: '^sk_live_[a-zA-Z0-9_]+$' + prefix: sk_live_ + doc_section: '#step-1-finding-your-api-key' + agiloft: display_name: Agiloft categories: From 000692bb566cd52b8832a4b7cde1d9ff70189a37 Mon Sep 17 00:00:00 2001 From: Sameersribot Date: Mon, 6 Jul 2026 23:40:16 +0530 Subject: [PATCH 2/8] fix(integrations): correct AgentLine auth, add paginate + missing docs - providers.yaml: fix Bearer *** -> Bearer \ (auth was broken) - providers.yaml: add offset paginate config for list endpoints - providers.yaml: remove invalid prefix field under credentials (schema) - docs.json: place agentline before agiloft (alphabetical) - docs: add api-integrations/agentline.mdx (required by provider validator) --- docs/api-integrations/agentline.mdx | 103 ++++++++++++++++++++++++++++ docs/docs.json | 2 +- packages/providers/providers.yaml | 7 +- 3 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 docs/api-integrations/agentline.mdx diff --git a/docs/api-integrations/agentline.mdx b/docs/api-integrations/agentline.mdx new file mode 100644 index 0000000000..8a69d79a91 --- /dev/null +++ b/docs/api-integrations/agentline.mdx @@ -0,0 +1,103 @@ +--- +title: 'AgentLine' +sidebarTitle: 'AgentLine' +description: 'Integrate your application with the AgentLine API' +--- + +AgentLine is the voice infrastructure for AI agents β€” phone numbers, calls, and SMS through a single API. + +## πŸš€ Quickstart + +Connect to AgentLine with Nango and see data flow in 2 minutes. + + + + In Nango ([free signup](https://app.nango.dev)), go to [Integrations](https://app.nango.dev/dev/integrations) -> _Configure New Integration_ -> _AgentLine_. + + + Go to [Connections](https://app.nango.dev/dev/connections) -> _Add Test Connection_ -> _AgentLine_ -> enter your API key and click _Authorize_. See the [connect guide](/api-integrations/agentline/connect) for how to obtain a key. + + + Let's make your first request to the AgentLine API. Replace the placeholders below with your [secret key](https://app.nango.dev/dev/environment-settings), [integration ID](https://app.nango.dev/dev/integrations), and [connection ID](https://app.nango.dev/dev/connections): + + + + ```bash + curl "https://api.nango.dev/proxy/v1/agents" \ + -H "Authorization: Bearer " \ + -H "Provider-Config-Key: " \ + -H "Connection-Id: " + ``` + + + + + + Install Nango's backend SDK with `npm i @nangohq/node`. Then run: + + ```typescript + import { Nango } from '@nangohq/node'; + + const nango = new Nango({ secretKey: '' }); + + const res = await nango.get({ + endpoint: '/v1/agents', + providerConfigKey: '', + connectionId: '' + }); + + console.log(res.data); + ``` + + + + Or fetch credentials with the [Node SDK](/reference/sdks/node#get-a-connection-with-credentials) or [API](/reference/api/connection/get). + + βœ… You're connected! Check the [Logs](https://app.nango.dev/dev/logs) tab in Nango to inspect requests. + + + + Follow our [Auth implementation guide](/guides/primitives/auth) to integrate Nango in your app. + + + +## πŸ“š AgentLine Integration Guides + +- [Connect to AgentLine](/api-integrations/agentline/connect) +Obtain your AgentLine API key and connect it to Nango. + +Official docs: [AgentLine API](https://docs.agentline.cloud) + +## πŸ”„ Syncing AgentLine data + +AgentLine list endpoints (`/v1/agents`, `/v1/numbers`, `/v1/calls`, `/v1/messages`) support offset pagination (`limit` + `offset`) and return a bare JSON array β€” Nango auto-paginates them via the proxy. + +To continuously mirror AgentLine data into Nango, define a [Sync](/reference/sdk/cli/sync) in your integration. Example for call history: + +```typescript +import type { NangoSync } from '@nangohq/node'; + +interface Call { + id: string; + agent_id: string; + direction: 'inbound' | 'outbound'; + to_number: string; + from_number: string; + status: string; + duration_seconds: number; + started_at: string; +} + +export default async function syncCalls(nango: NangoSync) { + // Nango paginates automatically thanks to the provider's paginate config. + const calls = await nango.get({ + endpoint: '/v1/calls', + // incremental: only fetch calls that changed since the last run + params: { since: nango.lastSyncDate?.toISOString() ?? '' } + }); + + await nango.batchSave(calls.data, 'Call'); +} +``` + +The same pattern applies to `Agent` (`/v1/agents`), `PhoneNumber` (`/v1/numbers`), and `Message` (`/v1/messages`). Use [Actions](/reference/sdk/cli/action) for write operations like `POST /v1/calls` (make an outbound call) or `POST /v1/numbers` (buy a number). diff --git a/docs/docs.json b/docs/docs.json index 5fb85b2f3c..e067c3bf6f 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -933,9 +933,9 @@ "api-integrations/ahrefs", "integrations/all/affinity", "integrations/all/affinity-v2", + "api-integrations/agentline", "api-integrations/agiloft", "api-integrations/agiloft-cc", - "api-integrations/agentline", "integrations/all/aimfox", "integrations/all/aimfox-oauth", "integrations/all/aircall", diff --git a/packages/providers/providers.yaml b/packages/providers/providers.yaml index 41e4e0a4c5..94c962e703 100644 --- a/packages/providers/providers.yaml +++ b/packages/providers/providers.yaml @@ -771,7 +771,11 @@ agentline: proxy: base_url: https://api.agentline.cloud headers: - authorization: Bearer *** + authorization: Bearer ${apiKey} + paginate: + type: offset + offset_name_in_request: offset + limit_name_in_request: limit verification: method: GET endpoints: @@ -784,7 +788,6 @@ agentline: title: API Key description: Your AgentLine API key. pattern: '^sk_live_[a-zA-Z0-9_]+$' - prefix: sk_live_ doc_section: '#step-1-finding-your-api-key' agiloft: From aea463f957c75be891c6db0f53d3580e0646ec03 Mon Sep 17 00:00:00 2001 From: Sameersribot Date: Tue, 7 Jul 2026 18:13:44 +0530 Subject: [PATCH 3/8] docs(integrations): address AgentLine review feedback - providers.yaml: remove paginate config (define in functions per review) - connect.mdx: align with standard Nango docs structure - agentline.mdx: align with standard Nango docs structure - regenerate auto-generated docs (api-catalog, snippets) --- docs/api-catalog.txt | 3 +- docs/api-integrations/agentline.mdx | 34 +- docs/api-integrations/agentline/connect.mdx | 38 +- .../generated/agentline/PreBuiltTooling.mdx | 40 + .../generated/agentline/PreBuiltUseCases.mdx | 3 + packages/providers/providers.yaml | 47966 ++++++++-------- 6 files changed, 24052 insertions(+), 24032 deletions(-) create mode 100644 docs/snippets/generated/agentline/PreBuiltTooling.mdx create mode 100644 docs/snippets/generated/agentline/PreBuiltUseCases.mdx diff --git a/docs/api-catalog.txt b/docs/api-catalog.txt index c338b24363..8ac5f41bde 100644 --- a/docs/api-catalog.txt +++ b/docs/api-catalog.txt @@ -2,7 +2,7 @@ > Compact provider slug catalog for agents. Use the slug to reconstruct provider-specific docs URLs only when needed. -Provider count: 874 +Provider count: 875 URL patterns: - Main provider page: https://nango.dev/docs/integrations/all/{slug}.md or https://nango.dev/docs/api-integrations/{slug}.md @@ -36,6 +36,7 @@ URL patterns: | `adyntel` | Adyntel | API_KEY | [docs](https://nango.dev/docs/api-integrations/adyntel.md) | [connect](https://nango.dev/docs/api-integrations/adyntel/connect.md) | | marketing | | `affinity` | Affinity (v1) | BASIC | [docs](https://nango.dev/docs/integrations/all/affinity.md) | [connect](https://nango.dev/docs/integrations/all/affinity/connect.md) | | crm | | `affinity-v2` | Affinity (v2) | API_KEY | [docs](https://nango.dev/docs/integrations/all/affinity-v2.md) | [connect](https://nango.dev/docs/integrations/all/affinity-v2/connect.md) | | crm | +| `agentline` | AgentLine | API_KEY | [docs](https://nango.dev/docs/api-integrations/agentline.md) | [connect](https://nango.dev/docs/api-integrations/agentline/connect.md) | | communication | | `agiloft` | Agiloft | OAUTH2 | [docs](https://nango.dev/docs/api-integrations/agiloft.md) | [connect](https://nango.dev/docs/api-integrations/agiloft/connect.md) | [setup](https://nango.dev/docs/api-integrations/agiloft/how-to-register-your-own-agiloft-api-oauth-app.md) | productivity | | `agiloft-cc` | Agiloft (Client Credentials) | OAUTH2_CC | [docs](https://nango.dev/docs/api-integrations/agiloft-cc.md) | [connect](https://nango.dev/docs/api-integrations/agiloft-cc/connect.md) | | productivity | | `ahrefs` | Ahrefs | OAUTH2 | [docs](https://nango.dev/docs/api-integrations/ahrefs.md) | | [setup](https://nango.dev/docs/api-integrations/ahrefs/how-to-register-your-own-ahrefs-api-oauth-app.md) | marketing, analytics | diff --git a/docs/api-integrations/agentline.mdx b/docs/api-integrations/agentline.mdx index 8a69d79a91..8c207bbb2c 100644 --- a/docs/api-integrations/agentline.mdx +++ b/docs/api-integrations/agentline.mdx @@ -68,36 +68,4 @@ Obtain your AgentLine API key and connect it to Nango. Official docs: [AgentLine API](https://docs.agentline.cloud) -## πŸ”„ Syncing AgentLine data - -AgentLine list endpoints (`/v1/agents`, `/v1/numbers`, `/v1/calls`, `/v1/messages`) support offset pagination (`limit` + `offset`) and return a bare JSON array β€” Nango auto-paginates them via the proxy. - -To continuously mirror AgentLine data into Nango, define a [Sync](/reference/sdk/cli/sync) in your integration. Example for call history: - -```typescript -import type { NangoSync } from '@nangohq/node'; - -interface Call { - id: string; - agent_id: string; - direction: 'inbound' | 'outbound'; - to_number: string; - from_number: string; - status: string; - duration_seconds: number; - started_at: string; -} - -export default async function syncCalls(nango: NangoSync) { - // Nango paginates automatically thanks to the provider's paginate config. - const calls = await nango.get({ - endpoint: '/v1/calls', - // incremental: only fetch calls that changed since the last run - params: { since: nango.lastSyncDate?.toISOString() ?? '' } - }); - - await nango.batchSave(calls.data, 'Call'); -} -``` - -The same pattern applies to `Agent` (`/v1/agents`), `PhoneNumber` (`/v1/numbers`), and `Message` (`/v1/messages`). Use [Actions](/reference/sdk/cli/action) for write operations like `POST /v1/calls` (make an outbound call) or `POST /v1/numbers` (buy a number). +--- diff --git a/docs/api-integrations/agentline/connect.mdx b/docs/api-integrations/agentline/connect.mdx index 91d63ed709..c14807c7b4 100644 --- a/docs/api-integrations/agentline/connect.mdx +++ b/docs/api-integrations/agentline/connect.mdx @@ -1,23 +1,35 @@ --- -title: 'Connect to AgentLine' -sidebarTitle: 'Connect' -description: 'How to obtain your AgentLine API key and connect to Nango' +title: AgentLine - How do I link my account? +sidebarTitle: AgentLine --- - -## Step 1. Finding your API Key -1. Sign up or log in at [agentline.cloud](https://agentline.cloud) -2. Go to your dashboard and copy your API key (starts with `sk_live_`) +# Overview - - - +To authenticate with AgentLine, you need an **API key** β€” a Bearer token that grants access to your AgentLine account (phone numbers, calls, and SMS). -## Step 2. Enter your API key in Nango +This guide will walk you through finding your API key within AgentLine and connecting it to Nango. -In Nango, go to [Connections](https://app.nango.dev/dev/connections) -> _Add Test Connection_ -> select _AgentLine_ -> enter your API key and click _Authorize_. +### Prerequisites: -Need help getting started? Get help in the [community](https://nango.dev/slack). +- You must have an **AgentLine account**. Sign up at [agentline.cloud](https://agentline.cloud). + +#### Step 1: Finding your API key + +1. Sign up or log in at [agentline.cloud](https://agentline.cloud). +2. Go to your dashboard and copy your API key (starts with `sk_live_`). + + + +Keep your API key secret β€” it grants full access to your AgentLine account. + +#### Step 2: Enter your API key in Nango + +Once you have your **API key**: +1. In Nango, go to [Connections](https://app.nango.dev/dev/connections) -> _Add Test Connection_ -> select _AgentLine_. +2. Enter your **API key** in the designated field. +3. Submit the form, and you should be successfully authenticated. + +You are now connected to AgentLine. Contribute improvements to the setup guide by [editing this page](https://github.com/nangohq/nango/tree/master/docs/api-integrations/agentline/connect.mdx) diff --git a/docs/snippets/generated/agentline/PreBuiltTooling.mdx b/docs/snippets/generated/agentline/PreBuiltTooling.mdx new file mode 100644 index 0000000000..9d88b89f57 --- /dev/null +++ b/docs/snippets/generated/agentline/PreBuiltTooling.mdx @@ -0,0 +1,40 @@ +## Pre-built tooling + + +| Tools | Status | +| - | - | +| Pre-built authorization (API Key) | βœ… | +| Pre-built authorization UI | βœ… | +| Custom authorization UI | βœ… | +| End-user authorization guide | βœ… | +| Expired credentials detection | βœ… | + + +| Tools | Status | +| - | - | +| Pre-built integrations | 🚫 (time to contribute: <48h) | +| API unification | βœ… | +| 2-way sync | βœ… | +| Webhooks from Nango on data modifications | βœ… | +| Real-time webhooks from 3rd-party API | 🚫 (time to contribute: <48h) | +| Proxy requests | βœ… | + + +| Tools | Status | +| - | - | +| HTTP request logging | βœ… | +| End-to-end type safety | βœ… | +| Data runtime validation | βœ… | +| OpenTelemetry export | βœ… | +| Slack alerts on errors | βœ… | +| Integration status API | βœ… | + + +| Tools | Status | +| - | - | +| Create or customize use-cases | βœ… | +| Pre-configured pagination | 🚫 (time to contribute: <48h) | +| Pre-configured rate-limit handling | 🚫 (time to contribute: <48h) | +| Per-customer configurations | βœ… | + + \ No newline at end of file diff --git a/docs/snippets/generated/agentline/PreBuiltUseCases.mdx b/docs/snippets/generated/agentline/PreBuiltUseCases.mdx new file mode 100644 index 0000000000..aa7f4345e3 --- /dev/null +++ b/docs/snippets/generated/agentline/PreBuiltUseCases.mdx @@ -0,0 +1,3 @@ +_No pre-built syncs or actions available yet._ + +Not seeing the integration you need? [Build your own](/guides/functions/functions-guide) independently. \ No newline at end of file diff --git a/packages/providers/providers.yaml b/packages/providers/providers.yaml index 94c962e703..b2d81f2a6b 100644 --- a/packages/providers/providers.yaml +++ b/packages/providers/providers.yaml @@ -1,23985 +1,23981 @@ -# yaml-language-server: $schema=./../../scripts/validation/providers/schema.json -1password-events: - display_name: 1Password (Events API) - categories: - - iam - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.domain} - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /api/v2/auth/introspect - docs: https://nango.dev/docs/api-integrations/1password-events - docs_connect: https://nango.dev/docs/api-integrations/1password-events/connect - connection_config: - domain: - type: string - title: Events API Domain - description: The regional Events API domain for your 1Password account. - order: 1 - enum: - - events.1password.com - - events.1password.ca - - events.1password.eu - credentials: - apiKey: - type: string - title: Bearer Token - description: Your 1Password Events Reporting bearer token - pattern: '^eyJ[a-zA-Z0-9_-]+\.ey[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+$' - example: eyJhbGciOiJF*************.*************CJ9.eyJ**************************************************.*********** - doc_section: '#step-2-generate-a-bearer-token' - -1password-scim: - display_name: 1Password (SCIM) - categories: - - iam - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.domain}/scim - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /Users - docs: https://nango.dev/docs/integrations/all/1password-scim - docs_connect: https://nango.dev/docs/integrations/all/1password-scim/connect - connection_config: - domain: - type: string - title: 1Password SCIM Bridge URL - description: The domain for your 1Password SCIM Bridge. Note this URL is a service hosted in your infrastructure so needs to be setup already by your IT team. Please see the instructions for more info. - example: scim.example.com - pattern: '^[a-zA-Z0-9.-]+$' - prefix: https:// - doc_section: '#step-2-get-your-scim-bridge-url' - credentials: - apiKey: - type: string - title: API Key - description: Your 1Password SCIM API Key - secret: true - doc_section: '#step-1-retrieve-your-1password-scim-api-key' - -1password-users: - display_name: 1Password (Users API) - categories: - - iam - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.domain}/v1beta1/users/oauth2/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.domain}/v1beta1/accounts/${connectionConfig.accountId} - docs: https://nango.dev/docs/api-integrations/1password-users - docs_connect: https://nango.dev/docs/api-integrations/1password-users/connect - connection_config: - domain: - type: string - title: API Domain - description: The regional API domain for your 1Password account. - enum: - - api.1password.com - - api.1password.ca - - api.1password.eu - order: 1 - accountId: - type: string - title: Account ID - description: Your 1Password account ID. - example: XLQMR47VZPBKJHSGWNCYFDE3T9 - pattern: '^[A-Z0-9]{26}$' - order: 2 - credentials: - client_id: - type: string - title: Client ID - description: Your 1Password OAuth application Client ID. - format: uuid - example: 5ab87915-2deb-429c-a1e2-8b0495900f45 - doc_section: '#step-3-obtain-your-client-credentials' - client_secret: - type: string - title: Client Secret - description: Your 1Password OAuth application Client Secret. - secret: true - doc_section: '#step-3-obtain-your-client-credentials' - -3cx: - display_name: 3CX - categories: - - communication - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.domain}/connect/token - token_params: - client_id: ${credentials.clientId} - client_secret: ${credentials.clientSecret} - grant_type: client_credentials - token_headers: - content-type: application/x-www-form-urlencoded - accept: application/json - token_response: - token: access_token - token_expires_in_ms: 3600000 - proxy: - base_url: https://${connectionConfig.domain}/xapi - docs: https://nango.dev/docs/api-integrations/3cx - docs_connect: https://nango.dev/docs/api-integrations/3cx/connect - credentials: - clientId: - type: string - title: Client ID - description: The Client ID from your 3CX API integration - doc_section: '#step-2-create-api-integration' - clientSecret: - type: string - title: API Key - description: The API Key generated when creating your 3CX API integration - secret: true - doc_section: '#step-2-create-api-integration' - connection_config: - domain: - type: string - title: 3CX Domain - description: Your 3CX instance domain - example: mycompany.3cx.us - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-1-find-your-3cx-domain' - -8x8: - display_name: 8x8 - categories: - - communication - auth_mode: OAUTH2_CC - token_url: https://api.8x8.com/oauth/v2/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.8x8.com - docs: https://nango.dev/docs/api-integrations/8x8 - docs_connect: https://nango.dev/docs/api-integrations/8x8/connect - credentials: - client_id: - type: string - title: Client ID - description: Your 8x8 API Client ID from the Admin Console - doc_section: '#step-1-obtaining-your-client-credentials' - client_secret: - type: string - title: Client Secret - description: Your 8x8 API Client Secret from the Admin Console - secret: true - doc_section: '#step-1-obtaining-your-client-credentials' - -absorb-lms: - display_name: Absorb LMS - categories: - - other - auth_mode: OAUTH2 - disable_pkce: true - authorization_url: https://${connectionConfig.portalRoute}/oauth/authorize - token_url: https://${connectionConfig.portalRoute}/oauth/token - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - authorization_params: - response_type: code - proxy: - base_url: https://${connectionConfig.portalRoute} - headers: - x-api-version: ${connectionConfig.apiVersion} - x-api-key: ${connectionConfig.restApiKey} - docs: https://nango.dev/docs/api-integrations/absorb-lms - docs_connect: https://nango.dev/docs/api-integrations/absorb-lms/connect - setup_guide_url: https://nango.dev/docs/api-integrations/absorb-lms/how-to-register-your-own-absorb-lms-api-oauth-app - connection_config: - portalRoute: - type: string - title: Hostname - description: The hostname of your Absorb LMS portal. - example: mycompany.myabsorb.com - prefix: https:// - format: hostname - order: 1 - doc_section: '#step-1-finding-your-portal-route' - restApiKey: - type: string - title: REST API Key - description: Your Absorb LMS REST API Private Key. - secret: true - order: 2 - doc_section: '#step-2-finding-your-rest-api-key' - apiVersion: - type: string - title: '' - description: '' - default_value: 'v1' - hidden: true - -accelo: - display_name: Accelo - categories: - - invoicing - - ticketing - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.api.accelo.com/oauth2/v0/authorize - token_url: https://${connectionConfig.subdomain}.api.accelo.com/oauth2/v0/token - scope_separator: ',' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.api.accelo.com - docs: https://nango.dev/docs/api-integrations/accelo - setup_guide_url: https://nango.dev/docs/api-integrations/accelo/how-to-register-your-own-accelo-api-oauth-app - connection_config: - subdomain: - type: string - title: Accelo Domain - description: The subdomain of your Accelo account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .api.accelo.com - prefix: https:// - -active-campaign: - display_name: ActiveCampaign - categories: - - marketing - - communication - auth_mode: API_KEY - proxy: - headers: - api-token: ${apiKey} - base_url: https://${connectionConfig.hostname}/api - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /3/users/me - docs: https://nango.dev/docs/integrations/all/active-campaign - docs_connect: https://nango.dev/docs/integrations/all/active-campaign/connect - connection_config: - hostname: - type: string - title: Hostname - description: The Hostname for your ActiveCampaign account - format: hostname - prefix: https:// - example: company.activehosted.com - doc_section: '#step-1-finding-your-hostname' - order: 1 - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your ActiveCampaign account - pattern: '^[a-f0-9]{72}$' - example: b4f1a7c9d8e56320a9db472fe6c8351f2e0a4d98b7f6c3e5d9a2f4701b3e8d6c3455abbe - doc_section: '#step-2-finding-your-api-key' - -acuity-scheduling: - display_name: Acuity Scheduling - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://acuityscheduling.com/oauth2/authorize - token_url: https://acuityscheduling.com/oauth2/token - default_scopes: - - api-v1 - proxy: - base_url: https://acuityscheduling.com/api/v1 - docs: https://nango.dev/docs/integrations/all/acuity-scheduling - -acumatica: - display_name: Acumatica - categories: - - erp - - accounting - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.instanceUrl}/identity/connect/token - token_params: - grant_type: password - username: ${connectionConfig.username} - password: ${connectionConfig.password} - proxy: - base_url: https://${connectionConfig.instanceUrl} - docs: https://nango.dev/docs/api-integrations/acumatica - docs_connect: https://nango.dev/docs/api-integrations/acumatica/connect - setup_guide_url: https://nango.dev/docs/api-integrations/acumatica/connect - connection_config: - instanceUrl: - type: string - title: Instance URL - description: The hostname of your Acumatica ERP instance. - format: hostname - example: mycompany.acumatica.com - prefix: https:// - doc_section: '#step-6-identify-your-instance-url' - order: 1 - username: - type: string - title: Username - description: The username of an Acumatica ERP user. - doc_section: '#step-7-enter-credentials-in-the-connect-ui' - order: 2 - password: - type: string - title: Password - description: The password for the specified Acumatica ERP username. - secret: true - doc_section: '#step-7-enter-credentials-in-the-connect-ui' - order: 3 - credentials: - client_id: - type: string - title: Client ID - description: The client ID assigned to your application, including the tenant suffix. - example: 88358B02-A48D-A50E-F710-39C1636C30F6@MyTenant - doc_section: '#step-5-save-to-activate' - client_secret: - type: string - title: Client Secret - description: The client secret created for your application in Acumatica ERP. - secret: true - doc_section: '#step-3-add-a-client-secret' - -addepar: - display_name: Addepar (OAuth) - categories: - - analytics - auth_mode: OAUTH2 - authorization_url: https://id.addepar.com/oauth2/authorize - disable_pkce: true - token_url: https://api.addepar.com/public/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - headers: - addepar-firm: ${connectionConfig.firmId} - retry: - after: - - 'x-ratelimit-retry-after' - base_url: https://api.addepar.com - docs: https://nango.dev/docs/integrations/all/addepar - docs_connect: https://nango.dev/docs/integrations/all/addepar/connect - connection_config: - firmId: - type: string - title: Firm ID - description: Your Addepar Firm ID - pattern: '^[0-9]+$' - doc_section: '#step-1-finding-your-firm-id' - -addepar-basic: - display_name: Addepar (Basic Auth) - categories: - - analytics - auth_mode: BASIC - proxy: - headers: - addepar-firm: ${connectionConfig.firmId} - retry: - after: - - 'x-ratelimit-retry-after' - base_url: https://${connectionConfig.subdomain}.addepar.com/api - docs: https://nango.dev/docs/integrations/all/addepar-basic - docs_connect: https://nango.dev/docs/integrations/all/addepar-basic/connect - credentials: - username: - type: string - title: API Key - description: Your Addepar API Key - example: 5ab87915-2deb-429c-a1e2-8b0495900f45 - format: uuid - doc_section: '#step-4-generating-an-api-key-and-secret' - password: - type: string - title: API Secret - description: Your Addepar API Secret - example: zidcISqfSGh05JsWwuY9ZdSCkXrhANHvCX0U0gkE - pattern: '^[A-Za-z0-9]{40}$' - doc_section: '#step-4-generating-an-api-key-and-secret' - connection_config: - subdomain: - type: string - title: Firm Domain - description: Your Addepar Firm domain - pattern: '^[a-z0-9_-]+$' - example: myfirm - order: 1 - doc_section: '#step-1-finding-your-firm-domain' - firmId: - type: string - title: Firm ID - description: Your Addepar Firm ID - pattern: '^[0-9]+$' - order: 2 - doc_section: '#step-2-finding-your-firm-id' - -adobe: - display_name: Adobe - categories: - - design - auth_mode: OAUTH2 - authorization_url: https://ims-na1.adobelogin.com/ims/authorize/v2 - token_url: https://ims-na1.adobelogin.com/ims/token/v3 - default_scopes: - - offline_access - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://ims-na1.adobelogin.com/ims - docs: https://nango.dev/docs/integrations/all/adobe - -adobe-umapi: - display_name: UMAPI (Adobe User Management API) - categories: - - other - auth_mode: OAUTH2_CC - token_url: https://ims-na1.adobelogin.com/ims/token/v2 - scope_separator: ',' - token_params: - grant_type: client_credentials - proxy: - headers: - x-api-key: ${connectionConfig.clientId} - retry: - after: - - 'retry-after' - base_url: https://usermanagement.adobe.io - docs: https://nango.dev/docs/integrations/all/adobe-umapi - post_connection_script: adobeUmapiPostConnection - docs_connect: https://nango.dev/docs/integrations/all/adobe-umapi/connect - connection_config: - clientId: - type: string - title: '' - description: '' - automated: true - -adobe-workfront: - display_name: Adobe Workfront - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.hostname}/integrations/oauth2/authorize - token_url: https://${connectionConfig.hostname}/integrations/oauth2/api/v1/token - authorization_method: header - body_format: json - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.hostname}/attask/api - docs: https://nango.dev/docs/integrations/all/adobe-workfront - docs_connect: https://nango.dev/docs/integrations/all/adobe-workfront/connect - connection_config: - hostname: - type: string - title: Hostname - prefix: https:// - pattern: '^[a-zA-Z0-9-]+\.my\.workfront(\.adobe)?\.com$' - description: The hostname of your Adobe Workfront account - example: acme.my.workfront.com - -adobe-commerce: - display_name: Adobe Commerce - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.storeDomain}/rest/${connectionConfig.storeCode} - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/api-integrations/adobe-commerce - docs_connect: https://nango.dev/docs/api-integrations/adobe-commerce/connect - connection_config: - storeDomain: - type: string - title: Store Domain - description: The domain of your Adobe Commerce store - format: hostname - prefix: https:// - example: yourstore.com - doc_section: '#step-1-finding-your-store-domain' - order: 1 - storeCode: - type: string - title: Store Code - description: The store code for your Adobe Commerce store - example: default - doc_section: '#step-2-finding-your-store-code' - order: 2 - credentials: - apiKey: - type: string - title: Access Token - example: 3pgsytnpxbyz0waujkw9qllcjb79s379 - pattern: '^[a-z0-9]{32}$' - description: Your Adobe Commerce access token - doc_section: '#step-3-obtaining-your-access-token' - -adp: - display_name: ADP - auth_mode: OAUTH2_CC - categories: - - hr - proxy: - base_url: https://api.adp.com - token_url: https://accounts.adp.com/auth/oauth/v2/token - token_params: - grant_type: client_credentials - require_client_certificate: true - docs: https://nango.dev/docs/integrations/all/adp - docs_connect: https://nango.dev/docs/integrations/all/adp/connect - credentials: - client_certificate: - type: string - title: Client Public Certificate - description: The public certificate (in PEM format) used for Mutual TLS (mTLS) authentication. - example: '-----BEGIN CERTIFICATE-----\\nMIIDdzCCAl+gAwIBAgIEUzZrZDANBgkqhkiG9w0BAQsFADBv\\n...\\n-----END CERTIFICATE-----' - pattern: '^-----BEGIN CERTIFICATE-----\s*([A-Za-z0-9+/=\s]+)\s*-----END CERTIFICATE-----$' - secret: true - doc_section: '#step-2-generating-the-private-key-and-certificate-signing-request' - client_private_key: - type: string - title: Client Private Key - description: The private key (in PEM format) associated with the client certificate, - example: '-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASC...\\n-----END PRIVATE KEY-----' - pattern: '^-----BEGIN PRIVATE KEY-----\s*([A-Za-z0-9+/=\s]+)\s*-----END PRIVATE KEY-----$' - secret: true - doc_section: '#step-2-generating-the-private-key-and-certificate-signing-request' - -adp-lyric: - alias: adp - display_name: ADP Lyric - categories: - - hr - docs: https://nango.dev/docs/integrations/all/adp-lyric - docs_connect: https://nango.dev/docs/integrations/all/adp-lyric/connect - -adp-run: - alias: adp - display_name: RUN Powered by ADP - categories: - - hr - docs: https://nango.dev/docs/integrations/all/adp-run - docs_connect: https://nango.dev/docs/integrations/all/adp-run/connect - -adp-workforce-now: - alias: adp - display_name: ADP Workforce Now - categories: - - hr - docs: https://nango.dev/docs/integrations/all/adp-workforce-now - docs_connect: https://nango.dev/docs/integrations/all/adp-workforce-now/connect - -adp-workforce-now-next-gen: - alias: adp - display_name: ADP Workforce Now Next Generation - categories: - - hr - docs: https://nango.dev/docs/integrations/all/adp-workforce-now-next-gen - docs_connect: https://nango.dev/docs/integrations/all/adp-workforce-now-next-gen/connect - -adyen: - display_name: Adyen - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://ca-${connectionConfig.environment}.adyen.com/ca/ca/oauth/connect.shtml - token_url: https://oauth-${connectionConfig.environment}.adyen.com/v1/token - scope_separator: ' ' - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.resource}-${connectionConfig.environment}.adyen.com - docs: https://nango.dev/docs/integrations/all/adyen - connection_config: - environment: - type: string - title: Environment - description: The environment to use. - enum: - - live - - test - resource: - type: string - title: Resource - description: The resource to use for your various requests - pattern: '^[a-z0-9_-]+$' - example: kyc - suffix: -(live|test).adyen.com - prefix: https:// - -adyntel: - display_name: Adyntel - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.adyntel.com - body: - api_key: ${apiKey} - email: ${connectionConfig.email} - verification: - method: POST - endpoints: - - /domain-keywords - headers: - content-type: application/json - data: - company_domain: example.com - docs: https://nango.dev/docs/api-integrations/adyntel - docs_connect: https://nango.dev/docs/api-integrations/adyntel/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key from your Adyntel dashboard. - example: hd-f66446a8**************-6 - pattern: '^hd-[a-f0-9]+-[a-z0-9]+$' - doc_section: '#step-1-obtain-your-api-key' - connection_config: - email: - type: string - title: Email - description: The login email address for your Adyntel account. - format: email - example: you@company.com - doc_section: '#step-2-find-your-email-address' - -ahrefs: - display_name: Ahrefs - categories: - - marketing - - analytics - auth_mode: OAUTH2 - authorization_url: https://app.ahrefs.com/web/oauth/authorize - token_url: https://ahrefs.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - body_format: form - proxy: - base_url: https://api.ahrefs.com - docs: https://nango.dev/docs/api-integrations/ahrefs - setup_guide_url: https://nango.dev/docs/api-integrations/ahrefs/how-to-register-your-own-ahrefs-api-oauth-app - -affinity: - display_name: Affinity (v1) - categories: - - crm - auth_mode: BASIC - proxy: - base_url: https://api.affinity.co - verification: - method: GET - endpoints: - - /auth/whoami - retry: - at: - - 'x-ratelimit-limit-user' - - 'x-ratelimit-limit-org-reset' - webhook_routing_script: affinityWebhookRouting - docs: https://nango.dev/docs/integrations/all/affinity - docs_connect: https://nango.dev/docs/integrations/all/affinity/connect - credentials: - username: - type: string - title: '' - description: '' - default_value: '' - hidden: true - password: - type: string - title: API Key - description: Your Affinity API Key - pattern: '^[A-Za-z0-9_-]+$' - example: 'nrlW2KR5m-qUCA-rTqKb_EUK1swERlenqn70KNMMrTM' - # https://api-docs.affinity.co/#introduction - # Affinity v1 uses basic auth with an api key - doc_section: '#step-1-generating-your-api-key' - -affinity-v2: - display_name: Affinity (v2) - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.affinity.co - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v2/auth/whoami - retry: - at: - - 'x-ratelimit-limit-user' - - 'x-ratelimit-limit-org-reset' - docs: https://nango.dev/docs/integrations/all/affinity-v2 - docs_connect: https://nango.dev/docs/integrations/all/affinity-v2/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Affinity account - pattern: '^[A-Za-z0-9_-]+$' - example: 'nrlW2KR5m-qUCA-rTqKb_EUK1swERlenqn70KNMMrTM' - doc_section: '#step-1-generating-your-api-key' - -agentline: - display_name: AgentLine - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://api.agentline.cloud - headers: - authorization: Bearer ${apiKey} - paginate: - type: offset - offset_name_in_request: offset - limit_name_in_request: limit - verification: - method: GET - endpoints: - - /v1/agents - docs: https://nango.dev/docs/api-integrations/agentline - docs_connect: https://nango.dev/docs/api-integrations/agentline/connect - credentials: - apiKey: - type: string - title: API Key - description: Your AgentLine API key. - pattern: '^sk_live_[a-zA-Z0-9_]+$' - doc_section: '#step-1-finding-your-api-key' - -agiloft: - display_name: Agiloft - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.hostname}/ewws/oauth - token_url: https://${connectionConfig.hostname}/ewws/otoken - token_params: - grant_type: authorization_code - proxy: - base_url: https://${connectionConfig.hostname} - docs: https://nango.dev/docs/api-integrations/agiloft - docs_connect: https://nango.dev/docs/api-integrations/agiloft/connect - setup_guide_url: https://nango.dev/docs/api-integrations/agiloft/how-to-register-your-own-agiloft-api-oauth-app - connection_config: - hostname: - type: string - title: Hostname - description: The hostname of your Agiloft instance. - format: hostname - prefix: https:// - example: example.agiloft.com - order: 1 - doc_section: '#step-1-find-your-hostname' - -agiloft-cc: - display_name: Agiloft (Client Credentials) - categories: - - productivity - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.hostname}/ewws/otoken - body_format: form - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.hostname} - docs: https://nango.dev/docs/api-integrations/agiloft-cc - docs_connect: https://nango.dev/docs/api-integrations/agiloft-cc/connect - connection_config: - hostname: - type: string - title: Hostname - description: The hostname of your Agiloft instance. - format: hostname - prefix: https:// - example: example.agiloft.com - order: 1 - doc_section: '#step-2-find-your-hostname' - credentials: - client_id: - type: string - title: Client ID - description: The Client ID from your Agiloft API application settings. - doc_section: '#step-1-create-an-api-application-and-get-your-credentials' - client_secret: - type: string - title: Client Secret - description: The Client Secret from your Agiloft API application settings. - secret: true - doc_section: '#step-1-create-an-api-application-and-get-your-credentials' - -aimfox: - display_name: Aimfox - categories: - - surveys - auth_mode: API_KEY - proxy: - base_url: https://api.aimfox.com/api - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v2/campaigns - docs: https://nango.dev/docs/integrations/all/aimfox - docs_connect: https://nango.dev/docs/integrations/all/aimfox/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Aimfox account - format: uuid - example: 123e4567-e89b-12d3-a456-426614174000 - doc_section: '#step-1-generating-your-api-key' - -aimfox-oauth: - display_name: Aimfox (OAuth) - categories: - - surveys - auth_mode: OAUTH2 - authorization_url: https://id.aimfox.com/realms/aimfox-prod/protocol/openid-connect/auth - token_url: https://id.aimfox.com/realms/aimfox-prod/protocol/openid-connect/token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.aimfox.com/api - docs: https://nango.dev/docs/integrations/all/aimfox-oauth - -aircall: - display_name: Aircall (OAuth) - categories: - - support - auth_mode: OAUTH2 - authorization_url: https://dashboard.aircall.io/oauth/authorize - token_url: https://api.aircall.io/v1/oauth/token - authorization_params: - response_type: code - scope: public_api - token_params: - grant_type: authorization_code - proxy: - base_url: https://api.aircall.io - retry: - at: - - 'x-aircallapi-reset' - paginate: - type: link - link_path_in_response_body: meta.next_page_link - response_path: results - docs: https://nango.dev/docs/integrations/all/aircall - -aircall-basic: - alias: aircall - display_name: Aircall (Basic Auth) - categories: - - support - auth_mode: BASIC - proxy: - base_url: https://api.aircall.io - retry: - at: - - 'x-aircallapi-reset' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/ping - paginate: - type: link - link_path_in_response_body: meta.next_page_link - response_path: results - docs_connect: https://nango.dev/docs/integrations/all/aircall-basic/connect - docs: https://nango.dev/docs/integrations/all/aircall-basic - credentials: - username: - type: string - title: API ID - description: The Application ID (API ID) for your Aircall account - pattern: '^[a-zA-Z0-9_-]+$' - doc_section: '#step-1-finding-your-admin-api-key-api-token-and-application-id-api-id' - password: - type: string - title: API Token - description: The Admin API Key (API Token) for your Aircall account - pattern: '^[a-zA-Z0-9_-]+$' - secret: true - doc_section: '#step-1-finding-your-admin-api-key-api-token-and-application-id-api-id' -airtable: - display_name: Airtable - categories: - - popular - - productivity - auth_mode: OAUTH2 - authorization_url: https://airtable.com/oauth2/v1/authorize - token_url: https://airtable.com/oauth2/v1/token - authorization_method: header - auth: - response_type: code - proxy: - base_url: https://api.airtable.com - webhook_routing_script: airtableWebhookRouting - docs: https://nango.dev/docs/api-integrations/airtable - setup_guide_url: https://nango.dev/docs/api-integrations/airtable/how-to-register-your-own-airtable-api-oauth-app - -airtable-pat: - display_name: Airtable (Personal Access Token) - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.airtable.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/airtable-pat - docs_connect: https://nango.dev/docs/integrations/all/airtable-pat/connect - credentials: - apiKey: - type: string - title: Personal Access Token - description: The Personal Access Token for your Airtable account - example: 'patoXxYzA1B2C3D4Ef.98a7b6c5d4e3f2g1h0i9j8k7l6m5n4o3p2q1r0s9t8u7v6w5x4y3z2a1b0cdef' - pattern: '^[a-zA-Z0-9\.]+$' - doc_section: '#step-1-generating-your-personal-access-token' - -autodesk: - display_name: Autodesk - categories: - - design - auth_mode: OAUTH2 - authorization_url: https://developer.api.autodesk.com/authentication/v2/authorize - token_url: https://developer.api.autodesk.com/authentication/v2/token - scope_separator: ' ' - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://developer.api.autodesk.com - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/autodesk - -autotask: - display_name: AutoTask - categories: - - support - - ticketing - auth_mode: API_KEY - webhook_routing_script: autotaskWebhookRouting - webhook_user_defined_secret: true - proxy: - base_url: https://${connectionConfig.subdomain}.autotask.net/atservicesrest - headers: - apiintegrationcode: ${connectionConfig.apiIntegrationCode} - username: ${connectionConfig.username} - secret: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1.0/Companies/entityinformation - docs: https://nango.dev/docs/integrations/all/autotask - docs_connect: https://nango.dev/docs/integrations/all/autotask/connect - connection_config: - subdomain: - type: string - title: AutoTask API Zone - description: The zone subdomain for your Autotask instance (e.g., webservices3, webservices1, etc.) - example: webservices3 - doc_section: '#step-1-finding-your-autotask-api-zone' - apiIntegrationCode: - type: string - title: API Integration Code - description: The tracking identifier assigned to your API-only user (27-character string) - example: ASHJKLFDKAHKASLFH85LSA905H - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-3-configure-the-api-user' - username: - type: string - title: API Username - description: The email address of your API-only user account - example: apiuser@example.com - format: email - doc_section: '#step-3-configure-the-api-user' - credentials: - apiKey: - type: string - title: API Secret - pattern: '^[A-Za-z0-9@#$~*]+$' - description: The secret for your API-only user account - doc_section: '#step-4-generate-api-secret' - -algolia: - display_name: Algolia - categories: - - search - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.APP_ID}.algolia.net - headers: - x-algolia-application-id: ${connectionConfig.APP_ID} - x-algolia-api-key: ${apiKey} - verification: - headers: - content-type: application/json - endpoints: - - /1/keys/${credentials.apiKey} - docs: https://nango.dev/docs/integrations/all/algolia - docs_connect: https://nango.dev/docs/integrations/all/algolia/connect - connection_config: - APP_ID: - type: string - title: Application ID - description: The application ID for your Algolia account - example: ERBSOWZO32 - pattern: '^[A-Z0-9]{10}$' - order: 1 - doc_section: '#step-1-finding-your-application-id' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Algolia account - example: c5c28261f9ade4e34891ccf761491b94 - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-2-finding-your-admin-api-key' - -altrata: - display_name: Altrata - categories: - - analytics - auth_mode: TWO_STEP - token_url: https://api-auth.altrata.com/oauth2/token?grant_type=client_credentials - body_format: form - token_headers: - authorization: Basic ${base64(${credentials.username}:${credentials.password})} - x-api-key: ${credentials.apiKey} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://${connectionConfig.hostname} - headers: - x-api-key: ${credentials.apiKey} - docs: https://nango.dev/docs/api-integrations/altrata - docs_connect: https://nango.dev/docs/api-integrations/altrata/connect - connection_config: - hostname: - type: string - title: Service Hostname - description: The Altrata service hostname to connect to. - example: events.altrata.com - format: hostname - pattern: '^(matching|profile|events|relationships)\.altrata\.com$' - order: 1 - doc_section: '#step-2-choose-a-service-hostname' - credentials: - apiKey: - type: string - title: API Key - description: Your Altrata API key. - secret: true - example: mN3pQv8wLc2jXs5rKt4bGy6uFd1eAh7Z******* - pattern: '^[A-Za-z0-9]+$' - doc_section: '#step-1-obtain-your-credentials' - username: - type: string - title: Username - description: Your Altrata account username. - example: john_doe - doc_section: '#step-1-obtain-your-credentials' - password: - type: string - title: Password - description: Your Altrata account password. - secret: true - doc_section: '#step-1-obtain-your-credentials' - -amazon: - display_name: Amazon - categories: - - dev-tools - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://www.amazon.com/ap/oa - token_url: https://api.amazon.${connectionConfig.extension}/auth/o2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.amazon.com - docs: https://nango.dev/docs/api-integrations/amazon - setup_guide_url: https://nango.dev/docs/api-integrations/amazon/how-to-register-your-own-amazon-api-oauth-app - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension for your Amazon account - example: com - pattern: '^[a-z.]+$' - -amazon-selling-partner: - display_name: Amazon Selling Partner - categories: - - dev-tools - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.domain}/apps/authorize/consent - token_url: https://api.amazon.com/auth/o2/token - authorization_code_param_in_callback: spapi_oauth_code - disable_pkce: true - authorization_params: - application_id: ${connectionConfig.applicationId} - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - redirect_uri_metadata: - - selling_partner_id - proxy: - base_url: https://${connectionConfig.subdomain}-${connectionConfig.region}.amazon.com || https://sellingpartnerapi-${connectionConfig.region}.amazon.com - headers: - x-amz-access-token: ${accessToken} - docs: https://nango.dev/docs/api-integrations/amazon-selling-partner - docs_connect: https://nango.dev/docs/api-integrations/amazon-selling-partner/connect - setup_guide_url: https://nango.dev/docs/api-integrations/amazon-selling-partner/how-to-register-your-own-amazon-selling-partner-api-oauth-app - connection_config: - applicationId: - type: string - title: Application ID - description: The unique identifier for your Amazon Selling Partner application. - example: 'amzn1.sellerapps.app.0bf296b5-36a6-4942-a13e-EXAMPLEfcd28' - pattern: '^[a-zA-Z0-9.-]+$' - doc_section: '#step-1-finding-your-app-id' - order: 1 - domain: - type: string - title: Authorization Domain - description: The domain representing the Amazon platform you are integrating with. - example: sellercentral.amazon.com - pattern: '^[a-z0-9.-]+\.amazon\.[a-z.]+$' - prefix: https:// - suffix: /apps - doc_section: '#step-2-finding-your-authorization-domain' - order: 2 - subdomain: - type: string - title: Proxy BaseUrl Subdomain - description: The subdomain prefix for the Amazon Selling Partner API endpoint. - doc_section: '#step-3-finding-your-proxy-baseurl-subdomain' - order: 3 - enum: - - sellingpartnerapi - - sandbox.sellingpartnerapi - region: - type: string - title: Proxy BaseUrl Region - description: The geographical region associated with the Amazon marketplace. - enum: - - na - - eu - - fe - doc_section: '#step-4-finding-your-proxy-baseurl-region' - order: 4 - -amazon-selling-partner-beta: - display_name: Amazon Selling Partner (Beta) - categories: - - dev-tools - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.domain}/apps/authorize/consent - token_url: https://api.amazon.com/auth/o2/token - authorization_code_param_in_callback: spapi_oauth_code - disable_pkce: true - authorization_params: - application_id: ${connectionConfig.applicationId} - version: beta - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - redirect_uri_metadata: - - selling_partner_id - proxy: - base_url: https://sandbox.sellingpartnerapi-${connectionConfig.region}.amazon.com - headers: - x-amz-access-token: ${accessToken} - docs: https://nango.dev/docs/api-integrations/amazon-selling-partner-beta - docs_connect: https://nango.dev/docs/api-integrations/amazon-selling-partner-beta/connect - setup_guide_url: https://nango.dev/docs/api-integrations/amazon-selling-partner-beta/how-to-register-your-own-amazon-selling-partner-beta-api-oauth-app - connection_config: - applicationId: - type: string - title: Application ID - description: The unique identifier for your Amazon Selling Partner application. - example: 'amzn1.sellerapps.app.0bf296b5-36a6-4942-a13e-EXAMPLEfcd28' - pattern: '^[a-zA-Z0-9.-]+$' - doc_section: '#step-1-finding-your-app-id' - order: 1 - domain: - type: string - title: Domain - description: The domain representing the Amazon platform you are integrating with. - example: sellercentral.amazon.com - pattern: '^[a-z0-9.-]+\.amazon\.[a-z.]+$' - prefix: https:// - suffix: /apps - doc_section: '#step-2-finding-your-authorization-domain' - order: 2 - region: - type: string - title: Proxy BaseUrl Region - description: The geographical region associated with the Amazon marketplace. - enum: - - na - - eu - - fe - doc_section: '#step-3-finding-your-proxy-baseurl-region' - order: 3 - -a-leads: - display_name: A-Leads - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.a-leads.co/gateway - headers: - x-api-key: ${apiKey} - docs: https://nango.dev/docs/integrations/all/a-leads - docs_connect: https://nango.dev/docs/integrations/all/a-leads/connect - credentials: - apiKey: - type: string - title: API Key - description: Your A-Leads API key - doc_section: '#step-1-obtain-your-api-key' - example: a3f8b2e1********************d9c4 - pattern: '^[a-f0-9]{32}$' - -anrok: - display_name: Anrok - categories: - - legal - auth_mode: API_KEY - proxy: - base_url: https://api.anrok.com - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/anrok - docs_connect: https://nango.dev/docs/integrations/all/anrok/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Anrok account - doc_section: '#step-1-finding-your-api-key' - -amplitude: - display_name: Amplitude (Event Streaming API) - categories: - - analytics - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.hostname} || https://amplitude.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/2/events/list - docs: https://nango.dev/docs/api-integrations/amplitude - docs_connect: https://nango.dev/docs/api-integrations/amplitude/connect - credentials: - username: - type: string - title: API Key - example: 64371a39e74ad915af75674c0696e356 - pattern: '^[a-f0-9]{32}$' - description: Your Amplitude API Key - password: - type: string - title: Secret Key - example: 6GhPfVz47PKJGSLcDDc9jL5E4Mn - description: Your Amplitude secret key - connection_config: - hostname: - type: string - title: Hostname - description: The hostname associated with your server residency. - optional: true - enum: - - amplitude.com - - analytics.eu.amplitude.com - -amplitude-mcp: - display_name: Amplitude (MCP US) - categories: - - analytics - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://mcp.amplitude.com/authorize - token_url: https://mcp.amplitude.com/token - registration_url: https://mcp.amplitude.com/register - default_scopes: - - offline_access - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://mcp.amplitude.com - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/amplitude-mcp - -amplitude-mcp-eu: - display_name: Amplitude (MCP EU) - categories: - - analytics - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://mcp.eu.amplitude.com/authorize - token_url: https://mcp.eu.amplitude.com/token - registration_url: https://mcp.eu.amplitude.com/register - default_scopes: - - offline_access - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://mcp.eu.amplitude.com - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/amplitude-mcp-eu - -anthropic: - display_name: Anthropic - categories: - - productivity - - dev-tools - - popular - auth_mode: API_KEY - proxy: - base_url: https://api.anthropic.com - headers: - x-api-key: ${apiKey} - anthropic-version: ${connectionConfig.version} - content-type: application/json - retry: - after: - - 'retry-after' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - v1/models - docs: https://nango.dev/docs/integrations/all/anthropic - connection_config: - version: - type: string - title: API Version - description: The version of the Anthropic API to use - pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}$' - example: '2023-06-01' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Anthropic account - -anthropic-admin: - display_name: Anthropic Administrator - categories: - - productivity - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.anthropic.com - headers: - x-api-key: ${apiKey} - anthropic-version: ${connectionConfig.version} - content-type: application/json - retry: - after: - - 'retry-after' - verification: - headers: - content-type: application/json - method: GET - endpoints: - - /v1/organizations/users - docs: https://nango.dev/docs/integrations/all/anthropic-admin - connection_config: - version: - type: string - title: API Version - description: The version of the Anthropic API to use - pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}$' - example: '2023-06-01' - credentials: - apiKey: - type: string - title: API Key - description: The Admin API key for your Anthropic account - -anvil: - display_name: Anvil - categories: - - legal - - productivity - auth_mode: BASIC - proxy: - base_url: https://app.useanvil.com - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/anvil - docs_connect: https://nango.dev/docs/api-integrations/anvil/connect - credentials: - username: - type: string - title: API Key - description: Your Anvil API key - pattern: '^[A-Za-z0-9]+$' - example: rj8T3fa************************* - doc_section: '#step-1-finding-your-api-key' - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -apaleo: - display_name: Apaleo - categories: - - erp - auth_mode: OAUTH2 - authorization_url: https://identity.apaleo.com/connect/authorize - token_url: https://identity.apaleo.com/connect/token - scope_separator: ' ' - token_params: - grant_type: authorization_code - authorization_params: - response_type: code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.apaleo.com - headers: - content-type: application/json - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/apaleo - -apify: - display_name: Apify - categories: - - dev-tools - - analytics - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.apify.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/apify - docs_connect: https://nango.dev/docs/integrations/all/apify/connect - credentials: - apiKey: - type: string - title: API Token - description: The API token for your Apify account - example: apify_api_***************************nt4w - pattern: '^apify_api_[A-Za-z0-9]+$' - doc_section: '#step-1-generating-your-api-key' - -apollo: - display_name: Apollo (API Key) - categories: - - marketing - auth_mode: API_KEY - proxy: - headers: - x-api-key: ${apiKey} - base_url: https://app.apollo.io/api - docs: https://nango.dev/docs/api-integrations/apollo - docs_connect: https://nango.dev/docs/api-integrations/apollo/connect - credentials_verification_script: apolloCredentialsVerification - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Apollo account - example: eh_3LUIFtj04rG4KF_FoFw - doc_section: '#step-1-finding-your-api-key' - -apollo-oauth: - display_name: Apollo (OAuth) - categories: - - marketing - auth_mode: OAUTH2 - authorization_url: https://app.apollo.io - token_url: https://app.apollo.io/api/v1/oauth/token - authorization_url_fragment: oauth/authorize - body_format: json - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://app.apollo.io/api - docs: https://nango.dev/docs/integrations/all/apollo-oauth - -apple-app-store: - display_name: Apple App Store - categories: - - e-commerce - auth_mode: APP_STORE - token_url: https://api.appstoreconnect.apple.com/v1/apps - authorization_params: - audience: appstoreconnect-v1 - proxy: - base_url: https://api.appstoreconnect.apple.com - docs: https://nango.dev/docs/integrations/all/apple-app-store - -apple-business-manager: - display_name: Apple Business Manager - categories: - - productivity - auth_mode: TWO_STEP - body_format: form - token_url: https://account.apple.com/auth/oauth2/v2/token - token_params: - grant_type: client_credentials - client_id: ${credentials.clientId} - client_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer - client_assertion: ${credentials.assertion} - scope: business.api - token_headers: - content-type: application/x-www-form-urlencoded - assertion: - type: jwt - key: ${assertionOption.privateKey} - lifetimeInSeconds: 15552000 - header: - alg: ES256 - kid: ${credentials.keyId} - payload: - iss: ${credentials.clientId} - sub: ${credentials.clientId} - aud: https://account.apple.com/auth/oauth2/v2/token - jti: ${random} - proxy: - base_url: https://api-business.apple.com - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/api-integrations/apple-business-manager - docs_connect: https://nango.dev/docs/api-integrations/apple-business-manager/connect - credentials: - clientId: - type: string - title: Client ID - description: The Client ID generated when you create an API account. - doc_section: '#step-2-note-your-credentials' - keyId: - type: string - title: Key ID - description: The Key ID generated when you create an API account. - doc_section: '#step-2-note-your-credentials' - assertion: - type: string - title: '' - description: '' - automated: true - assertion_option: - privateKey: - type: string - title: Private Key - description: The EC private key (PEM format) used to sign the client assertion JWT. - doc_section: '#step-1-create-an-api-account-and-generate-a-private-key' - -appstle-subscriptions: - display_name: Appstle Subscriptions - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://subscription-admin.appstle.com - headers: - x-api-key: ${apiKey} - docs: https://nango.dev/docs/integrations/all/appstle-subscriptions - docs_connect: https://nango.dev/docs/integrations/all/appstle-subscriptions/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Appstle Subscriptions API Key - secret: true - doc_section: '#step-1-finding-your-api-key' - example: lBfFAdbxUxyv6jYRgOmrEVNkijCKD10T - pattern: ^[a-zA-Z0-9]+$ - -asana: - display_name: Asana - categories: - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://app.asana.com/-/oauth_authorize - token_url: https://app.asana.com/-/oauth_token - token_params: - grant_type: authorization_code - auth: - response_type: code - default_scopes: - - default - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://app.asana.com - retry: - after: - - 'retry-after' - paginate: - type: cursor - cursor_path_in_response: next_page.offset - cursor_name_in_request: offset - response_path: data - limit_name_in_request: limit - docs: https://nango.dev/docs/api-integrations/asana - setup_guide_url: https://nango.dev/docs/api-integrations/asana/how-to-register-your-own-asana-api-oauth-app - -asana-mcp: - display_name: Asana (MCP) - categories: - - productivity - - ticketing - - mcp - auth_mode: MCP_OAUTH2 - client_registration: static - authorization_url: https://app.asana.com/-/oauth_authorize - token_url: https://app.asana.com/-/oauth_token - authorization_params: - response_type: code - resource: https://mcp.asana.com/v2 - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - default_scopes: - - default - proxy: - headers: - accept: application/json,text/event-stream - base_url: https://mcp.asana.com/ - docs: https://nango.dev/docs/api-integrations/asana-mcp - setup_guide_url: https://nango.dev/docs/api-integrations/asana-mcp/how-to-register-your-own-asana-mcp-oauth-app - -asana-scim: - display_name: Asana (SCIM API) - categories: - - productivity - - ticketing - auth_mode: API_KEY - proxy: - base_url: https://app.asana.com/api - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /1.0/scim/Users - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/asana-scim - docs_connect: https://nango.dev/docs/integrations/all/asana-scim/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Asana scim account - doc_section: '#step-1-finding-asana-api-key' - -ashby: - display_name: Ashby - categories: - - ats - - popular - auth_mode: BASIC - proxy: - base_url: https://api.ashbyhq.com - verification: - method: POST - headers: - content-type: application/json - endpoints: - - apiKey.info - docs: https://nango.dev/docs/integrations/all/ashby - docs_connect: https://nango.dev/docs/integrations/all/ashby/connect - credentials: - username: - type: string - title: API Key - description: The API Key of your Ashby account - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -atlas-so: - display_name: Atlas.so - categories: - - support - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.atlas.so/v1 - docs: https://nango.dev/docs/integrations/all/atlas-so - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Atlas.so account - -atlassian: - display_name: Atlassian - categories: - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://auth.atlassian.com/authorize - token_url: https://auth.atlassian.com/oauth/token - default_scopes: - - offline_access - authorization_params: - response_type: code - audience: api.atlassian.com - prompt: consent - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.atlassian.com - docs: https://nango.dev/docs/integrations/all/atlassian - -atlassian-admin: - display_name: Atlassian Cloud Admin - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.atlassian.com - retry: - at: - - 'x-ratelimit-reset' - headers: - authorization: Bearer ${apiKey} - connection_config: - organizationId: ${connectionConfig.organizationId} - docs: https://nango.dev/docs/integrations/all/atlassian-admin - docs_connect: https://nango.dev/docs/integrations/all/atlassian-admin/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Atlassian account - example: ATCTT3xFfGN0_a1B2-c3D4_E5F6-G7H8I9JKLMNOPQRSTUVWXYZ1234567890=DEADBEEF - pattern: '^ATCTT3xFfGN0[\w\-]+=[A-Z0-9]{8}$' - doc_section: '#step-1-generating-your-api-key' - connection_config: - organizationId: - type: string - title: Atlassian Organization Id - optional: true - description: The organization ID of your Atlassian account - pattern: '^[a-f0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$' - example: '9fa3d2b7-k9l3-4bq1-z3d8-7x1m0a9e2b76' - doc_section: '#step-1-generating-your-api-key' - -atlassian-government-cloud: - display_name: Atlassian Government Cloud - categories: - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://auth.atlassian-us-gov-mod.com/authorize - token_url: https://auth.atlassian-us-gov-mod.com/oauth/token - default_scopes: - - offline_access - authorization_params: - audience: api.atlassian-us-gov-mod.com - prompt: consent - proxy: - base_url: https://api.atlassian-us-gov-mod.com - connection_config: - subdomain: ${connectionConfig.subdomain} - retry: - at: - - 'x-ratelimit-reset' - post_connection_script: atlassianGovernmentCloudPostConnection - docs: https://nango.dev/docs/integrations/all/atlassian-government-cloud - docs_connect: https://nango.dev/docs/integrations/all/atlassian-government-cloud/connect - connection_config: - subdomain: - type: string - title: Subdomain - optional: true - description: The subdomain of your Atlassian Government Cloud account - pattern: '^[a-zA-Z0-9.-]+$' - example: acme - suffix: .atlassian-us-gov-mod.net - prefix: https:// - -atlassian-service-account-api-token: - display_name: Atlassian Service Account (API Token) - categories: - - dev-tools - auth_mode: BASIC - proxy: - base_url: https://api.atlassian.com - retry: - at: - - 'x-ratelimit-reset' - connection_config: - cloudId: ${connectionConfig.cloudId} - post_connection_script: atlassianServicAccountPostConnection - docs: https://nango.dev/docs/api-integrations/atlassian-service-account-api-token - docs_connect: https://nango.dev/docs/api-integrations/atlassian-service-account-api-token/connect - connection_config: - cloudId: - type: string - title: Cloud ID - description: Your Atlassian Cloud ID - example: '12345678-1234-1234-1234-123456789012' - format: uuid - doc_section: '#step-1-finding-your-cloud-id' - order: 1 - credentials: - username: - type: string - title: Service Account Email - description: The email address of your Atlassian service account - example: bot@serviceaccount.atlassian.com - format: email - doc_section: '#step-2-finding-your-service-account-email' - password: - type: string - title: API Token - description: Your Atlassian service account API token - secret: true - example: ATSTT3xFfGF07SUw*******************************RvxLUHWs8ZV58TfHI=610694C8 - pattern: '^[A-Za-z0-9_-]{40,}=[A-Fa-f0-9]{8}$' - doc_section: '#step-3-creating-an-api-token' - -atlassian-service-account-oauth2: - display_name: Atlassian Service Account (OAuth 2.0) - categories: - - dev-tools - auth_mode: OAUTH2_CC - token_url: https://auth.atlassian.com/oauth/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.atlassian.com - retry: - at: - - 'x-ratelimit-reset' - connection_config: - subdomain: ${connectionConfig.subdomain} - post_connection_script: atlassianServicAccountPostConnection - docs: https://nango.dev/docs/api-integrations/atlassian-service-account-oauth2 - docs_connect: https://nango.dev/docs/api-integrations/atlassian-service-account-oauth2/connect - connection_config: - subdomain: - type: string - title: Subdomain - optional: true - description: The subdomain of your Attlassian account - pattern: '^[a-zA-Z0-9.-]+$' - example: subdomain - suffix: .atlassian.net - prefix: https:// - doc_section: '#step-2-finding-your-subdomain' - credentials: - client_id: - type: string - title: Client ID - description: The OAuth 2.0 client ID from your service account credential - doc_section: '#step-1-creating-oauth-client-credentials' - client_secret: - type: string - title: Client Secret - description: The OAuth 2.0 client secret from your service account credential - secret: true - doc_section: '#step-1-creating-oauth-client-credentials' - -attention: - display_name: Attention - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.attention.tech - headers: - authorization: Bearer ${apiKey} - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/conversations?size=1 - docs: https://nango.dev/docs/api-integrations/attention - docs_connect: https://nango.dev/docs/api-integrations/attention/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Attention API key. - example: eyJhbGciOi***.eyJzdWIiOi***.xxxxxxxxxxxx - pattern: '^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$' - doc_section: '#step-1-obtaining-your-api-key' - -attio: - display_name: Attio - categories: - - crm - - popular - auth_mode: OAUTH2 - authorization_url: https://app.attio.com/authorize - token_url: https://app.attio.com/oauth/token - token_params: - grant_type: authorization_code - auth: - response_type: code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.attio.com - retry: - after: - - 'retry-after' - post_connection_script: attioPostConnection - webhook_routing_script: attioWebhookRouting - webhook_user_defined_secret: true - docs: https://nango.dev/docs/api-integrations/attio - setup_guide_url: https://nango.dev/docs/api-integrations/attio/how-to-register-your-own-attio-api-oauth-app - -attio-mcp: - display_name: Attio (MCP) - categories: - - crm - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://app.attio.com/oidc/authorize - token_url: https://app.attio.com/oidc/token - registration_url: https://app.attio.com/oauth/register - scope_separator: '+' - authorization_url_skip_encode: - - scopes - authorization_params: - response_type: code - resource: https://mcp.attio.com/mcp - registration_params: - response_types: - - code - grant_types: - - authorization_code - - refresh_token - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://mcp.attio.com - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/attio-mcp - -auth0: - display_name: Auth0 - categories: - - iam - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.auth0.com/authorize - token_url: https://${connectionConfig.subdomain}.auth0.com/oauth/token - authorization_params: - response_type: code - response_mode: query - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - docs: https://nango.dev/docs/integrations/all/auth0 - proxy: - base_url: https://${connectionConfig.subdomain}.auth0.com - connection_config: - subdomain: - type: string - title: Auth0 Domain - description: The subdomain of your Auth0 account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .auth0.com - prefix: https:// - -auth0-cc: - display_name: Auth0 (Client Credentials) - categories: - - iam - auth_mode: OAUTH2_CC - body_format: json - token_url: https://${connectionConfig.hostname}/oauth/token - token_params: - grant_type: client_credentials - audience: ${connectionConfig.audience} - organization: ${connectionConfig.organization} - docs: https://nango.dev/docs/integrations/all/auth0-cc - docs_connect: https://nango.dev/docs/integrations/all/auth0-cc/connect - proxy: - base_url: https://${connectionConfig.hostname} - connection_config: - hostname: - type: string - title: HostName - description: Your Auth0 host name - format: hostname - prefix: https:// - doc_section: '#step-2-finding-your-hostname' - audience: - type: string - title: Audience - description: The audience for the token - example: https://api.example.com/foobar - doc_section: '#step-3-finding-your-audience' - organization: - type: string - title: Organization - description: The organization name you want the request to be associated with - example: example - optional: true - doc_section: '#step-4-finding-your-organization' - -auvik: - display_name: Auvik - categories: - - support - auth_mode: BASIC - proxy: - base_url: https://auvikapi.${connectionConfig.region}.my.auvik.com - verification: - method: GET - endpoints: - - /v1/authentication/verify - credentials: - username: - type: string - title: User Name / Account Email - description: Auvik User Name (usually an individual user's email address) - doc_section: '#step-1-generate-an-api-key' - password: - type: string - title: API Key - description: Auvik API Key (separate from the user's password) - secret: true - # API key is a base64 encoded string - pattern: '^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{4}|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}={2})$' - example: 'aJ7EjSEDD+7+JqlQ1NtUXyY/3/05GGWwfF7vBbPd0Iy8HG1s' - doc_section: '#step-1-generate-an-api-key' - connection_config: - region: - type: string - title: Region - description: The region of your Auvik account (visible in your browser address bar when logging into the Auvik web UI). - doc_section: '#step-2-determine-your-region' - enum: - - us1 - - us2 - - eu1 - docs: https://nango.dev/docs/integrations/all/auvik - docs_connect: https://nango.dev/docs/integrations/all/auvik/connect - -avanan: - display_name: Avanan - categories: - - other - auth_mode: TWO_STEP - token_request_method: GET - token_url: https://${connectionConfig.subdomain}.avanan.net/v1.0/auth - token_headers: - x-av-app-id: ${credentials.appId} - x-av-req-id: ${random} - x-av-date: '${now:YYYY-MM-DDTHH:mm:ss}' - x-av-sig: '${sha256Hex(${base64(${random}${credentials.appId}${now:YYYY-MM-DDTHH:mm:ss}${credentials.secretKey})})}' - token_response: - token: '' - token_expires_in_ms: 3_600_000 - proxy: - base_url: https://${connectionConfig.subdomain}.avanan.net - headers: - x-av-app-id: ${credentials.appId} - x-av-token: ${accessToken} - x-av-req-id: ${random} - x-av-date: '${now:YYYY-MM-DDTHH:mm:ss}' - x-av-sig: '${sha256Hex(${base64(${random}${credentials.appId}${now:YYYY-MM-DDTHH:mm:ss}${endpoint}${credentials.secretKey})})}' - docs: https://nango.dev/docs/api-integrations/avanan - docs_connect: https://nango.dev/docs/api-integrations/avanan/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The Avanan API subdomain for your region. - order: 1 - doc_section: '#step-1-finding-your-subdomain' - enum: - - smart-api-production-1-us - - smart-api-production-1-eu - - smart-api-production-1-ca - - smart-api-production-5-ap - - smart-api-production-1-euw2 - - smart-api-production-1-mec1 - - smart-api-production-1-aps1 - credentials: - appId: - type: string - title: Client ID - description: Your Avanan Client ID from Avanan Support. - example: 9k8m****************ht3w - pattern: '^[a-z0-9]+$' - doc_section: '#step-2-getting-your-client-id-and-secret-key' - secretKey: - type: string - title: Secret Key - description: Your Avanan Secret Key from Avanan Support. - example: 3k9t****************************0uj5gtrpqlz8x2nvy - pattern: '^[a-z0-9]+$' - secret: true - doc_section: '#step-2-getting-your-client-id-and-secret-key' - -availity: - display_name: Availity - categories: - - other - auth_mode: OAUTH2_CC - token_url: https://api.availity.com/v1/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.availity.com - docs: https://nango.dev/docs/api-integrations/availity - docs_connect: https://nango.dev/docs/api-integrations/availity/connect - credentials: - client_id: - type: string - title: API Key - description: Your application API Key - doc_section: '#step-1-obtaining-your-client-credentials' - client_secret: - type: string - title: Secret - description: Your application Secret - secret: true - doc_section: '#step-1-obtaining-your-client-credentials' - -avalara: - display_name: Avalara - categories: - - legal - auth_mode: BASIC - proxy: - headers: - x-avalara-client: ${connectionConfig.avalaraClient} - content-type: application/json - base_url: https://rest.avatax.com/api/v2 - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /utilities/subscriptions - docs: https://nango.dev/docs/integrations/all/avalara - docs_connect: https://nango.dev/docs/integrations/all/avalara/connect - credentials: - username: - type: string - title: User Name / Account ID - description: Avalara User Name / Account ID - doc_section: '#step-1-finding-your-pair-keys' - password: - type: string - title: Avalara Password / License Key - description: Your Password / License Key - # https://developer.avalara.com/avatax/authentication-in-rest/ - # Avalara is using basic auth with combination of (username and password) - # or (Account ID and License Key) - doc_section: '#step-1-finding-your-pair-keys' - connection_config: - avalaraClient: - type: string - title: Avalara Client - description: The Avalara client for your Avalara account - doc_section: '#step-2-generating-an-avalara-client' - -avalara-sandbox: - display_name: Avalara (Sandbox) - categories: - - legal - auth_mode: BASIC - proxy: - headers: - x-avalara-client: ${connectionConfig.avalaraClient} - content-type: application/json - base_url: https://sandbox-rest.avatax.com/api/v2 - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /utilities/subscriptions - docs: https://nango.dev/docs/integrations/all/avalara-sandbox - docs_connect: https://nango.dev/docs/integrations/all/avalara-sandbox/connect - credentials: - username: - type: string - title: User Name / Account ID - description: Avalara User Name / Account ID - doc_section: '#step-1-finding-your-pair-keys' - password: - type: string - title: Password / License Key - description: Avalara Password / License Key - # https://developer.avalara.com/avatax/authentication-in-rest/ - # Avalara is using basic auth with combination of (username and password) - # or (Account ID and License Key) - doc_section: '#step-1-finding-your-pair-keys' - connection_config: - avalaraClient: - type: string - title: Avalara Client - description: The Avalara client for your Avalara account - doc_section: '#step-2-generating-an-avalara-client' - -avoma: - display_name: Avoma - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.avoma.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/users - docs: https://nango.dev/docs/integrations/all/avoma - docs_connect: https://nango.dev/docs/integrations/all/avoma/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Avoma account - pattern: '^[a-z0-9]{10,}:[a-z0-9]{10,}$' - example: '1awcbx0njh:02k6er2pld4q5irffn23' - doc_section: '#step-1-generating-your-api-key' - -axiom: - display_name: Axiom - categories: - - dev-tools - - analytics - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.axiom.co - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/api-integrations/axiom - docs_connect: https://nango.dev/docs/api-integrations/axiom/connect - connection_config: - subdomain: - type: string - title: Edge / region subdomain - description: The subdomain of the API you would wish to connect to. - enum: - - api - - us-east-1.aws.edge - - eu-central-1.aws.edge - order: 1 - doc_section: '#step-1-finding-your-subdomain' - credentials: - apiKey: - type: string - title: API Token - description: Your Axiom API token. - example: 'xaat-********-****-****-****-********8ec6' - pattern: '^xaat-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$' - doc_section: '#step-2-generating-your-api-token' - -aws: - display_name: AWS - categories: - - dev-tools - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.auth.${connectionConfig.extension}.amazoncognito.com/oauth2/authorize - token_url: https://${connectionConfig.subdomain}.auth.${connectionConfig.extension}.amazoncognito.com/oauth2/token - token_params: - grant_type: authorization_code - auth: - response_type: code - refresh_params: - grant_type: refresh_token - default_scopes: - - openid - proxy: - base_url: https://cognito-${apiSubdomain}.amazonaws.com - docs: https://nango.dev/docs/integrations/all/aws - connection_config: - subdomain: - type: string - title: Cognito Domain Prefix - description: The prefix of your Cognito User Pool domain. - pattern: '^[a-z0-9_-]+$' - example: my-app-pool - prefix: https:// - suffix: .auth - extension: - type: string - title: Cognito Region - description: The AWS region where your Cognito User Pool is hosted. - example: eu-north-1 - pattern: '^[a-z0-9-]+$' - prefix: auth. - suffix: .amazoncognito.com - apiSubdomain: - type: string - title: Cognito API Subdomain - description: The Cognito API subdomain. - example: idp.eu-north-1 - pattern: '^[a-z0-9.-]+$' - suffix: .amazonaws.com - prefix: https://cognito- - -aws-iam: - display_name: AWS IAM - categories: - - dev-tools - - iam - auth_mode: BASIC - proxy: - base_url: https://iam.amazonaws.com - headers: - authorization: '${awsSigV4(${credentials.username}, ${credentials.password}, us-east-1, iam)}' - x-amz-date: '${now:YYYYMMDDTHHmmss[Z]}' - connection_config: - region: ${connectionConfig.region} - retry: - at: - - 'x-ratelimit-reset' - credentials_verification_script: awsIamCredentialsVerification - docs: https://nango.dev/docs/api-integrations/aws-iam - docs_connect: https://nango.dev/docs/api-integrations/aws-iam/connect - credentials: - username: - type: string - title: AWS Access Key ID - description: Your Access Key ID - doc_section: '#step-1-finding-your-pair-keys' - password: - type: string - title: AWS Secret Access Key - description: Your Secret Access Key - # https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html - # aws-iam is using basic auth with AWS Access Key ID and Secret Access Key - doc_section: '#step-1-finding-your-pair-keys' - connection_config: - region: - type: string - title: Region - description: The region to where your AWS account is hosted - example: us-east-1 - pattern: '^[a-z0-9-]+$' - doc_section: '#step-2-finding-your-region-host' - -aws-inspector2: - display_name: AWS Inspector2 - categories: - - dev-tools - auth_mode: BASIC - proxy: - base_url: https://inspector2.${connectionConfig.region}.amazonaws.com - headers: - authorization: '${awsSigV4(${credentials.username}, ${credentials.password}, ${connectionConfig.region}, inspector2, inspector2.${connectionConfig.region}.amazonaws.com)}' - x-amz-date: '${now:YYYYMMDDTHHmmss[Z]}' - retry: - at: - - 'x-ratelimit-reset' - credentials_verification_script: awsIamCredentialsVerification - docs: https://nango.dev/docs/api-integrations/aws-inspector2 - docs_connect: https://nango.dev/docs/api-integrations/aws-inspector2/connect - credentials: - username: - type: string - title: AWS Access Key ID - description: Your Access Key ID. - password: - type: string - title: AWS Secret Access Key - description: Your Secret Access Key. - connection_config: - region: - type: string - title: Region - description: The AWS region where Inspector2 is enabled. - example: us-east-1 - prefix: https://inspector2. - suffix: .amazonaws.com - pattern: '^[a-z0-9-]+$' - -aws-multi-service: - display_name: AWS Multi-Service - categories: - - dev-tools - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.service}.${connectionConfig.region}.amazonaws.com - headers: - authorization: '${awsSigV4(${credentials.username}, ${credentials.password}, ${connectionConfig.region}, ${connectionConfig.service}, ${connectionConfig.service}.${connectionConfig.region}.amazonaws.com)}' - x-amz-date: '${now:YYYYMMDDTHHmmss[Z]}' - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/api-integrations/aws-multi-service - docs_connect: https://nango.dev/docs/api-integrations/aws-multi-service/connect - credentials: - username: - type: string - title: AWS Access Key ID - description: Your Access Key ID. - example: AKIAI***MPLE - pattern: '^[A-Za-z0-9]+$' - password: - type: string - title: AWS Secret Access Key - description: Your Secret Access Key. - example: wJalr***EKEY - pattern: '^[A-Za-z0-9+/]+$' - connection_config: - service: - type: string - title: AWS Service - description: The AWS service you want to connect to. - example: athena - pattern: '^[a-z0-9-]+$' - order: 2 - region: - type: string - title: Region - description: The AWS region where the service is available. - example: us-east-1 - pattern: '^[a-z0-9-]+$' - order: 1 - -aws-scim: - display_name: AWS (SCIM) - categories: - - dev-tools - - iam - auth_mode: API_KEY - proxy: - base_url: ${connectionConfig.scimEndpoint} - headers: - authorization: Bearer ${apiKey} - accept: application/json - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /Users - docs: https://nango.dev/docs/integrations/all/aws-scim - docs_connect: https://nango.dev/docs/integrations/all/aws-scim/connect - credentials: - apiKey: - type: string - title: SCIM Access Token - description: The SCIM Access Token generated from your AWS IAM Identity Center - example: 878374852-dea1-47d5-9ae0-4d00a0bdbb13:ff7d4f04-7385-4add-befe-a9ed18341d0d:l6uepDQrHfNOiOYXZ7HYZL8hlvsYHSG7Cnx104tkRLmDbO8l/p5GxLv6Id5BCLicmjeKvhrlqrPvL6VMcAnJS6oitQrz3ZiZr18rnybzyISRlyjxktYtIK1R80YJXBH6U7NSvwGsu5gDbUZDGlCDeh+FFhL8tmUuHytvxuhz3jNhsh&8X9xiLBg=:ICn/+PhEST+8/pizxTmoA0DW9JcQTL4EVRh0z6DpJwQ4vFQ+iwAxNjh16SHdUovAJyMjT+TPDwI8gN63DLE+9EV+lcV+i2H/OTDE4x7L18WRz3ndMf/4dY98mJ41qRYBgh63Pi8PdXkAex2l8HJLMkzjjPirN+8DCBfPVKK+z/nCc04RXWIz6XOmqwgB1sV5jwfAxPhuV6vqgVosoSngSw7Y2Zon70PiI5UbTTZffF6QWFU7i9b3dgMMDAH6f9vm11EB6YpJt/XC74L1pDvKXiSzhel7b7dYzGvrXK0rN29cnjn0o58VYCOgk9c05p/nRsEaSs2Y/v7BqgxXUvI+Aw== - pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}:[A-Za-z0-9+/]+=*:[A-Za-z0-9+/]+=*$' - doc_section: '#step-2-setting-up-automatic-provisioning' - connection_config: - scimEndpoint: - type: string - title: SCIM Endpoint - description: The SCIM Endpoint mentioned in the AWS IAM Identity Center - example: 'https://scim.ap-south-1.amazonaws.com/lSweb811432-ac8a-4a86-8332-f29hha4f5650/scim/v2' - format: uri - pattern: '^https://.*\/.*\/scim\/v2$' - order: 1 - doc_section: '#step-2-setting-up-automatic-provisioning' - -aws-sigv4: - display_name: AWS SigV4 Proxy - categories: - - storage - auth_mode: AWS_SIGV4 - proxy: - base_url: https://${connectionConfig.service}.${connectionConfig.region}.amazonaws.com - docs: https://nango.dev/docs/integrations/all/aws-sigv4 - docs_connect: https://nango.dev/docs/integrations/all/aws-sigv4/connect - credentials: - role_arn: - type: string - title: IAM Role ARN - description: The ARN of the IAM role your customer creates via your onboarding template. - example: arn:aws:iam::123456789012:role/NangoAccessRole - doc_section: '#step-1-provide-the-role-arn' - connection_config: - region: - type: string - title: AWS Region (optional) - description: Override the region if it differs from the integration default set by the integration owner. - example: us-east-1 - optional: true - doc_section: '#step-3-enter-connection-details' - service: - type: string - title: '' - description: '' - automated: true - integration_config: - service: - type: string - title: AWS Service - description: The AWS service requests are signed for (e.g. s3, execute-api). - example: s3 - pattern: ^[a-z0-9-]+$ - order: 1 - defaultRegion: - type: string - title: Default AWS Region - description: Region used to sign requests when a connection does not specify one. - example: us-east-1 - optional: true - order: 2 - stsMode: - type: string - title: STS Mode - description: How temporary AWS credentials are issued. - enum: - - builtin - - custom - default_value: builtin - optional: true - order: 3 - awsAccessKeyId: - type: string - title: AWS Access Key ID - description: Access key for the IAM principal Nango uses to call STS AssumeRole. - secret: true - optional: true - visible_when: - field: stsMode - equals: builtin - order: 4 - awsSecretAccessKey: - type: string - title: AWS Secret Access Key - description: Secret access key paired with the access key ID above. - secret: true - optional: true - visible_when: - field: stsMode - equals: builtin - order: 5 - stsEndpointUrl: - type: string - title: STS Endpoint URL - description: HTTPS endpoint that issues temporary AWS credentials. - format: uri - pattern: ^https:// - example: https://sts.example.com/assume - optional: true - visible_when: - field: stsMode - equals: custom - order: 6 - stsAuthType: - type: string - title: STS Auth Type - description: How Nango authenticates to the custom STS endpoint. - enum: - - none - - api_key - - basic - default_value: none - optional: true - visible_when: - field: stsMode - equals: custom - order: 7 - stsAuthHeader: - type: string - title: STS Auth Header - description: Header name used to send the API key to the custom STS endpoint. - default_value: x-api-key - optional: true - visible_when: - field: stsAuthType - equals: api_key - order: 8 - stsApiKey: - type: string - title: STS API Key - description: API key value sent to the custom STS endpoint. - secret: true - visible_when: - field: stsAuthType - equals: api_key - order: 9 - stsAuthUsername: - type: string - title: STS Username - description: Username for basic auth to the custom STS endpoint. - optional: true - visible_when: - field: stsAuthType - equals: basic - order: 10 - stsAuthPassword: - type: string - title: STS Password - description: Password for basic auth to the custom STS endpoint. - secret: true - visible_when: - field: stsAuthType - equals: basic - order: 11 - -azure-blob-storage: - categories: - - storage - display_name: Azure Blob Storage - alias: microsoft - default_scopes: - - offline_access - - https://storage.azure.com/.default - proxy: - base_url: https://${connectionConfig.accountName}.blob.core.windows.net - headers: - x-ms-version: ${connectionConfig.version} || 2025-05-05 - docs: https://nango.dev/docs/integrations/all/azure-blob-storage - docs_connect: https://nango.dev/docs/integrations/all/azure-blob-storage/connect - connection_config: - accountName: - type: string - title: Account Name - description: The name of the Azure Storage account you want to connect to. - example: nangoStorage - doc_section: '#step-1-finding-your-account-name' - version: - type: string - title: '' - description: '' - automated: true - -azure-devops: - display_name: Azure DevOps - categories: - - dev-tools - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.organizationUrl} - docs: https://nango.dev/docs/integrations/all/azure-devops - docs_connect: https://nango.dev/docs/integrations/all/azure-devops/connect - # Azure DevOps returns a 202 when the credentials are invalid, - # so we need to explicitly check for this and return respective error message - credentials_verification_script: azureDevopsCredentialsVerification - connection_config: - organizationUrl: - type: string - title: Organization URL - description: The URL of your Azure DevOps organization - example: dev.azure.com/myorg or myorg.visualstudio.com - doc_section: '#step-1-finding-your-organization-url' - prefix: https:// - credentials: - username: - type: string - title: '' - description: '' - default_value: '' - hidden: true - password: - type: string - title: Personal Access Token - description: The Personal Access Token of your Azure DevOps account - doc_section: '#step-2-creating-a-personal-access-token' - -bamboohr: - display_name: BambooHR (OAuth) - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.bamboohr.com/authorize.php - token_url: https://${connectionConfig.subdomain}.bamboohr.com/token.php - authorization_params: - response_type: code - request: authorize - token_params: - grant_type: authorization_code - request: token - refresh_params: - grant_type: refresh_token - request: token - proxy: - base_url: https://api.bamboohr.com/api/gateway.php/${connectionConfig.subdomain} - docs: https://nango.dev/docs/api-integrations/bamboohr - setup_guide_url: https://nango.dev/docs/api-integrations/bamboohr/how-to-register-your-own-bamboohr-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/bamboohr/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of your BambooHR account - pattern: '^[a-z0-9_-]+$' - example: acme - suffix: .bamboohr.com - prefix: https:// - order: 1 - -bamboohr-basic: - display_name: BambooHR (Basic Auth) - categories: - - hr - auth_mode: BASIC - proxy: - base_url: https://api.bamboohr.com/api/gateway.php/${connectionConfig.subdomain} - verification: - headers: - content-type: application/json - method: GET - endpoints: - - /v1/meta/fields - docs: https://nango.dev/docs/integrations/all/bamboohr-basic - docs_connect: https://nango.dev/docs/integrations/all/bamboohr-basic/connect - connection_config: - subdomain: - type: string - title: BambooHR Domain - description: The subdomain of your BambooHR account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .bamboohr.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-subdomain' - credentials: - username: - type: string - title: API key - description: The API Key of your BambooHR account - pattern: '^[a-f0-9]{40}$' - example: 59d783083fb25565aba21744e6bba90de8634de0 - secret: true - doc_section: '#step-2-finding-your-api-key' - password: - type: string - title: Password - description: Password - # https://documentation.bamboohr.com/docs/getting-started - # Bamboo HR is using basic auth with an api key - default_value: x - hidden: true - -basecamp: - display_name: Basecamp - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://launchpad.37signals.com/authorization/new - token_url: https://launchpad.37signals.com/authorization/token - authorization_params: - type: web_server - token_params: - type: web_server - refresh_params: - type: refresh - proxy: - base_url: https://3.basecampapi.com/${connectionConfig.accountId} - headers: - user-agent: ${connectionConfig.appDetails} || App (support@nango.dev) - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/basecamp - docs_connect: https://nango.dev/docs/integrations/all/basecamp/connect - post_connection_script: basecampPostConnection - connection_config: - appDetails: - type: string - title: App Details - description: The details of your app - automated: true - accountId: - type: string - title: Account ID - description: Your Account ID - optional: true - example: '5899981' - pattern: '^[0-9]+$' - doc_section: '#step-1-finding-your-account-id' - -battlenet: - display_name: Battle.net - categories: - - gaming - auth_mode: OAUTH2 - authorization_url: https://oauth.battle.${connectionConfig.extension}/authorize - token_url: https://oauth.battle.${connectionConfig.extension}/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://${connectionConfig.apiDomain} - docs: https://nango.dev/docs/integrations/all/battlenet - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Battle.net account. - enum: - - com - - cn - - net - order: 1 - apiDomain: - type: string - title: API Domain - description: The domain to where you will access your API. - enum: - - us.api.blizzard.com - - eu.api.blizzard.com - - kr.api.blizzard.com - - tw.api.blizzard.com - - gateway.battlenet.com.cn - -beehiiv: - display_name: Beehiiv - categories: - - communication - - marketing - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.beehiiv.com/v2/publications/${connectionConfig.publicationId} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /posts - docs: https://nango.dev/docs/integrations/all/beehiiv - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Beehiiv account - example: 8ab3sjxqvHzyUnP9JhvlfT6C0wsbgr5XQrpaZZjxJkYBPy6sntvT1M2Lk94VQeRb - pattern: '^[a-zA-Z0-9]{64}$' - connection_config: - publicationId: - type: string - title: Publication Id - description: The prefixed ID of the publication object - example: pub_a3d1b49e-2a5d-4f4b-97c8-8f32e1d2f7b9 - pattern: '^(pub_[0-9a-fA-F\-]+)$' - -bettercontact: - display_name: BetterContact - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://app.bettercontact.rocks - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /api/v2/account - docs: https://nango.dev/docs/api-integrations/bettercontact - docs_connect: https://nango.dev/docs/api-integrations/bettercontact/connect - credentials: - apiKey: - type: string - title: API Key - description: Your BetterContact API key - example: f1a9b2c3d4e5f6g7h8i9j0 - pattern: '^[a-z0-9]+$' - doc_section: '#step-1-generating-your-api-key' - -bliro: - display_name: Bliro - categories: - - communication - auth_mode: OAUTH2_CC - body_format: json - token_url: https://accounts.bliro.io/oauth/token - token_params: - grant_type: client_credentials - audience: https://api.bliro.io - proxy: - base_url: https://api.bliro.io - docs: https://nango.dev/docs/api-integrations/bliro - docs_connect: https://nango.dev/docs/api-integrations/bliro/connect - credentials: - client_id: - type: string - title: Client ID - description: Your Bliro client application Client ID. - doc_section: '#step-1-creating-a-client-application' - client_secret: - type: string - title: Client Secret - description: Your Bliro client application Client Secret. - secret: true - doc_section: '#step-1-creating-a-client-application' - -bigchange: - display_name: BigChange - categories: - - productivity - auth_mode: OAUTH2_CC - token_url: https://api.bigchange.com/auth/tokens - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.bigchange.com - headers: - customer-id: ${connectionConfig.customer_id} - docs: https://nango.dev/docs/api-integrations/bigchange - docs_connect: https://nango.dev/docs/api-integrations/bigchange/connect - connection_config: - customer_id: - type: string - title: BigChange Customer ID - description: Your numeric BigChange Customer ID. - example: '5690' - pattern: '^[0-9]+$' - doc_section: '#step-2-find-your-bigchange-customer-id' - credentials: - client_id: - type: string - title: Client ID - description: Your BigChange Partner API client_id. - client_secret: - type: string - title: Client Secret - description: Your BigChange Partner API client_secret. - secret: true - -bigcommerce: - display_name: BigCommerce - categories: - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://login.bigcommerce.com/oauth2/authorize - token_url: https://login.bigcommerce.com/oauth2/token - scope_separator: ' ' - authorization_params: - response_type: code - context: stores/${connectionConfig.storeHash} - account_uuid: ${connectionConfig.accountUuid} - token_params: - context: stores/${connectionConfig.storeHash} - grant_type: authorization_code - proxy: - base_url: https://api.bigcommerce.com/stores/${connectionConfig.storeHash} - docs: https://nango.dev/docs/integrations/all/bigcommerce - connection_config: - storeHash: - type: string - title: Store Hash - description: The store hash of your BigCommerce account - pattern: '^[a-zA-Z0-9]+$' - accountUuid: - type: string - title: Account UUID - description: The account UUID of your BigCommerce account - format: uuid - example: 123e4567-e89b-12d3-a456-426614174000 - -bill-sandbox: - display_name: Bill (Connect API Sandbox) - categories: - - payment - auth_mode: BILL - token_url: https://gateway.stage.bill.com/connect/v3/login - proxy: - base_url: https://gateway.stage.bill.com/connect - docs: https://nango.dev/docs/integrations/all/bill-sandbox - docs_connect: https://nango.dev/docs/integrations/all/bill-sandbox/connect - -bill: - display_name: Bill (Connect API) - categories: - - payment - auth_mode: BILL - token_url: https://gateway.prod.bill.com/connect/v3/login - proxy: - base_url: https://gateway.prod.bill.com/connect - docs: https://nango.dev/docs/integrations/all/bill - -bing-webmasters: - display_name: Bing Webmasters - categories: - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://www.bing.com/webmasters/oauth/authorize - token_url: https://www.bing.com/webmasters/oauth/token - refresh_url: https://www.bing.com/webmasters/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_token_params: - grant_type: refresh_token - proxy: - base_url: https://www.bing.com/webmaster/api.svc/json - docs: https://nango.dev/docs/api-integrations/bing-webmasters - setup_guide_url: https://nango.dev/docs/api-integrations/bing-webmasters/how-to-register-your-own-bing-webmasters-api-oauth-app - -bitbucket: - display_name: Bitbucket - categories: - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://bitbucket.org/site/oauth2/authorize - token_url: https://bitbucket.org/site/oauth2/access_token - proxy: - base_url: https://api.bitbucket.org - docs: https://nango.dev/docs/integrations/all/bitbucket - -bitdefender: - display_name: Bitdefender - categories: - - other - auth_mode: BASIC - proxy: - base_url: ${connectionConfig.ACCESS_URL} - retry: - after: - - 'retry-after' - credentials_verification_script: bitdefenderCredentialsVerification - docs: https://nango.dev/docs/integrations/all/bitdefender - docs_connect: https://nango.dev/docs/integrations/all/bitdefender/connect - credentials: - username: - type: string - title: API Key - description: The API Key of your Bitdefender account - doc_section: '#step-1-finding-your-api-key' - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - connection_config: - ACCESS_URL: - type: string - title: Access URL - description: The access URL of your Bitdefender account - example: https://api.bitdefender.com - format: uri - pattern: '^https://.*' - doc_section: '#step-1-finding-your-api-key' - -bitly: - display_name: Bitly - categories: - - marketing - - social - auth_mode: OAUTH2 - authorization_url: https://bitly.com/oauth/authorize - token_url: https://api-ssl.bitly.com/oauth/access_token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://api-ssl.bitly.com - docs: https://nango.dev/docs/integrations/all/bitly - -blackbaud: - display_name: Blackbaud - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://app.blackbaud.com/oauth/authorize - token_url: https://oauth2.sky.blackbaud.com/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.sky.blackbaud.com - docs: https://nango.dev/docs/integrations/all/blackbaud - -blackbaud-basic: - display_name: Blackbaud (Basic Auth) - categories: - - crm - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.hostName} - headers: - content-type: application/soap+xml; charset=utf-8 - docs: https://nango.dev/docs/integrations/all/blackbaud-basic - docs_connect: https://nango.dev/docs/integrations/all/blackbaud-basic - connection_config: - hostName: - type: string - title: Host Name - description: Your Blackbaud host name - example: https://altrurig01bo3.blackbaudhosting.com - pattern: '^https?:\/\/[a-z0-9.-]+(:\d+)?(\/.*)?$' - order: 1 - doc_section: '#step-1-finding-your-host-name' - credentials: - username: - type: string - title: Username - description: Your Username - doc_section: '#step-3-finding-your-username' - password: - type: string - title: Password - description: Your Password - doc_section: '#step-2-finding-your-password' - -blandai: - display_name: BlandAI - categories: - - support - auth_mode: API_KEY - proxy: - base_url: https://api.bland.ai - headers: - authorization: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - v1/calls - docs: https://nango.dev/docs/integrations/all/blandai - credentials: - apiKey: - type: string - title: API Key - description: The API key for your BlandAI account - -bird: - display_name: Bird - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.bird.com - headers: - authorization: AccessKey ${apiKey} - connection_config: - workspaceId: ${connectionConfig.workspaceId} - docs: https://nango.dev/docs/api-integrations/bird - docs_connect: https://nango.dev/docs/api-integrations/bird/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of your Bird API instance - example: api - suffix: .bird.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-subdomain' - workspaceId: - type: string - title: Workspaces Id - description: The Workspaces Id of your Bird - format: uuid - order: 2 - example: 332bb273-0caf-4240-a5b6-8046b5d3074f - doc_section: '#step-3-finding-your-workspace-id' - credentials: - apiKey: - type: string - title: Access Key - description: Your Bird access key - example: 6BPC******************Rzh3F4x - pattern: '^[A-Za-z0-9]+$' - doc_section: '#step-2-creating-an-access-key' - -boldsign: - display_name: BoldSign - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://account.boldsign.com/connect/authorize - token_url: https://account.boldsign.com/connect/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.boldsign.com - docs: https://nango.dev/docs/integrations/all/boldsign - -boondmanager: - display_name: BoondManager - categories: - - erp - auth_mode: OAUTH2 - authorization_url: https://ui.boondmanager.com/api/oauth2/authorize - token_url: https://ui.boondmanager.com/api/oauth2/token - proxy: - base_url: https://ui.boondmanager.com/api - docs: https://nango.dev/docs/api-integrations/boondmanager - setup_guide_url: https://nango.dev/docs/api-integrations/boondmanager/how-to-register-your-own-boondmanager-api-oauth-app - -box: - display_name: Box - categories: - - knowledge-base - - storage - auth_mode: OAUTH2 - authorization_url: https://account.box.com/api/oauth2/authorize - token_url: https://api.box.com/oauth2/token - proxy: - base_url: https://api.box.com - docs: https://nango.dev/docs/api-integrations/box - setup_guide_url: https://nango.dev/docs/api-integrations/box/how-to-register-your-own-box-api-oauth-app - -booking-com: - display_name: Booking.com - categories: - - e-commerce - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.environmentType}-xml.booking.com - docs: https://nango.dev/docs/integrations/all/booking-com - connection_config: - environmentType: - type: string - title: Environment Type - description: The environment type for your various requests. - enum: - - secure-supply - - supply - credentials: - username: - type: string - title: Machine Account Username - description: The username for your Booking.com machine account - password: - type: string - title: Machine Account Password - description: The password for your Booking.com machine account - -braintree: - display_name: Braintree - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://api.braintreegateway.com/oauth/connect - token_url: https://api.braintreegateway.com/oauth/access_tokens - scope_separator: ',' - authorization_method: header - body_format: json - token_params: - grant_type: authorization_code - redirect_uri_metadata: - - merchantId - proxy: - base_url: https://api.braintreegateway.com - docs: https://nango.dev/docs/integrations/all/braintree - -braintree-sandbox: - display_name: Braintree (Sandbox) - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://api.sandbox.braintreegateway.com/oauth/connect - token_url: https://api.sandbox.braintreegateway.com/oauth/access_tokens - scope_separator: ',' - authorization_method: header - body_format: json - token_params: - grant_type: authorization_code - redirect_uri_metadata: - - merchantId - proxy: - base_url: https://api.sandbox.braintreegateway.com - docs: https://nango.dev/docs/integrations/all/braintree-sandbox - -braze: - display_name: Braze - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://rest.${connectionConfig.instanceUrl} - headers: - authorization: Bearer ${apiKey} - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/integrations/all/braze - docs_connect: https://nango.dev/docs/integrations/all/braze/connect - connection_config: - instanceUrl: - type: string - title: Instance URL - description: The REST API URL of your Braze instance - example: iad-02.braze.com - format: hostname - prefix: https://rest. - order: 1 - doc_section: '#step-1-finding-your-instance-url' - credentials: - apiKey: - type: string - title: API Key - description: The API key to your Braze account - doc_section: '#step-2-finding-your-api-key' - -brevo-api-key: - display_name: Brevo - categories: - - marketing - auth_mode: API_KEY - proxy: - headers: - api-key: ${apiKey} - base_url: https://api.brevo.com/v3 - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /account - docs: https://nango.dev/docs/integrations/all/brevo-api-key - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Brevo account - -breezy-hr: - display_name: Breezy HR - categories: - - hr - - ats - auth_mode: TWO_STEP - body_format: json - token_url: https://api.breezy.hr/v3/signin - token_params: - email: ${credentials.email} - password: ${credentials.password} - token_headers: - content-type: application/json - token_response: - token: access_token - proxy: - base_url: https://api.breezy.hr - headers: - authorization: ${accessToken} - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/integrations/all/breezy-hr - docs_connect: https://nango.dev/docs/integrations/all/breezy-hr/connect - credentials: - email: - type: string - title: Email - description: The email address associated with your Breezy HR account - format: email - doc_section: '#step-1-finding-your-credentials' - password: - type: string - title: Password - description: The password for your Breezy HR account - secret: true - doc_section: '#step-1-finding-your-credentials' - -brex: - display_name: Brex (OAuth) - categories: - - banking - auth_mode: OAUTH2 - authorization_url: https://accounts-api.brex.com/oauth2/default/v1/authorize - token_url: https://accounts-api.brex.com/oauth2/default/v1/token - default_scopes: - - openid - - offline_access - proxy: - base_url: https://platform.brexapis.com - docs: https://nango.dev/docs/api-integrations/brex - setup_guide_url: https://nango.dev/docs/api-integrations/brex/how-to-register-your-own-brex-oauth-app - -brex-api-key: - display_name: Brex (API Key) - categories: - - banking - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://platform.brexapis.com - docs: https://nango.dev/docs/api-integrations/brex-api-key - docs_connect: https://nango.dev/docs/api-integrations/brex-api-key/connect - credentials: - apiKey: - type: string - title: API Token - description: The API Token to your Brex account - example: bxt_vRUwQT3snBmA1IDVq5iK1kXc4N0bhxr377z4 - pattern: '^bxt_[a-zA-Z0-9]+$' - doc_section: '#step-1-finding-your-api-token' - -brex-staging: - display_name: Brex (Staging OAuth) - categories: - - banking - auth_mode: OAUTH2 - authorization_url: https://accounts-api.staging.brexapps.com/oauth2/default/v1/authorize - token_url: https://accounts-api.staging.brexapps.com/oauth2/default/v1/token - proxy: - base_url: https://platform.staging.brexapps.com - docs: https://nango.dev/docs/api-integrations/brex-staging - setup_guide_url: https://nango.dev/docs/api-integrations/brex-staging/how-to-register-your-own-brex-staging-oauth-app - -brightcrowd: - display_name: BrightCrowd - categories: - - social - auth_mode: OAUTH2_CC - token_url: https://bcb-staging.auth.us-east-1.amazoncognito.com/oauth2/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.brightcrowd.com/partner - paginate: - type: cursor - cursor_path_in_response: nextPageToken - cursor_name_in_request: pageToken - docs: https://nango.dev/docs/integrations/all/brightcrowd - docs_connect: https://nango.dev/docs/integrations/all/brightcrowd/connect - -builder-io-private: - display_name: Builder.io (Private) - categories: - - dev-tools - - design - - cms - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.domain} - headers: - authorization: Bearer ${apiKey} - verification: - method: POST - headers: - content-type: application/json - endpoints: - - /api/v1/write/page - docs: https://nango.dev/docs/api-integrations/builder-io-private - docs_connect: https://nango.dev/docs/api-integrations/builder-io-private/connect - connection_config: - domain: - type: string - title: Domain - description: The domain used to access your Builder.io write API. - example: builder.io - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-api-domain' - credentials: - apiKey: - type: string - title: API Key - description: The private key for your Builder.io account. - pattern: '^bpk-[a-f0-9]+$' - example: bpk-**************************** - doc_section: '#step-2-finding-your-api-key' - -builder-io-public: - display_name: Builder.io (Public) - categories: - - dev-tools - - design - - cms - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.domain} - query: - apiKey: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v1/content/page - docs: https://nango.dev/docs/api-integrations/builder-io-public - docs_connect: https://nango.dev/docs/api-integrations/builder-io-public/connect - connection_config: - domain: - type: string - title: Domain - description: The domain used to access your Builder.io content API. - example: cdn.builder.io - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-api-domain' - credentials: - apiKey: - type: string - title: API Key - description: The public api key for your Builder.io account. - pattern: '^[a-zA-Z0-9]+$' - example: bb209fb71eh2412dbe0114bdae18fd15 - doc_section: '#step-2-finding-your-api-key' - -buildium: - display_name: Buildium - categories: - - accounting - - crm - - payment - auth_mode: API_KEY - proxy: - base_url: https://api.buildium.com - headers: - x-buildium-client-id: ${connectionConfig.clientId} - x-buildium-client-secret: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/rentals - docs: https://nango.dev/docs/integrations/all/buildium - docs_connect: https://nango.dev/docs/integrations/all/buildium/connect - connection_config: - clientId: - type: string - title: Client ID - description: Your API Key Client ID - pattern: '^[a-f0-9-]+$' - example: a228f0e7-b4a3-4150-b9ae-8552fc2880d3 - doc_section: '#step-2-finding-your-client-id-and-secret' - order: 1 - credentials: - apiKey: - type: string - title: Secret - description: The Secret for your Buildium account - pattern: '^[A-Za-z0-9+/]+$' - example: uOq2p+xlgpFdijfV/HqY+EvYpZKHRwlyhGuAVbJIxXs - doc_section: '#step-2-finding-your-client-id-and-secret' - -builtwith: - display_name: BuiltWith - categories: - - dev-tools - - analytics - - crm - - marketing - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://api.builtwith.com - query: - KEY: ${apiKey} - docs: https://nango.dev/docs/integrations/all/builtwith - docs_connect: https://nango.dev/docs/integrations/all/builtwith/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your BuiltWith account - example: 1bc32cba-a5d6-438a-bbcc-af312f560a3c - format: uuid - doc_section: '#step-1-finding-your-api-key' - -buffer: - display_name: Buffer - categories: - - marketing - - social - auth_mode: OAUTH2 - authorization_url: https://auth.buffer.com/auth - token_url: https://auth.buffer.com/token - scope_separator: ' ' - authorization_params: - response_type: code - prompt: consent - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - default_scopes: - - offline_access - proxy: - base_url: https://api.buffer.com - docs: https://nango.dev/docs/api-integrations/buffer - setup_guide_url: https://nango.dev/docs/api-integrations/buffer/how-to-register-your-own-buffer-oauth-app - -bullhorn: - display_name: Bullhorn - categories: - - hr - - ats - auth_mode: OAUTH2 - authorization_url: https://auth-west.bullhornstaffing.com/oauth/authorize - token_url: https://auth-west.bullhornstaffing.com/oauth/token - disable_pkce: true - authorization_params: - response_type: code - username: ${connectionConfig.username} - password: ${connectionConfig.password} - action: Login - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: ${connectionConfig.restUrl} - headers: - bhresttoken: ${accessToken} - post_connection_script: bullhornPostConnection - token_response_metadata: - - restUrl - refresh_token_response_metadata: - - restUrl - docs: https://nango.dev/docs/integrations/all/bullhorn - docs_connect: https://nango.dev/docs/integrations/all/bullhorn/connect - connection_config: - restUrl: - type: string - title: '' - description: '' - automated: true - username: - type: string - title: Username - description: Your API Username - doc_section: '#step-1-obtain-your-api-credentials' - password: - type: string - title: Password - description: Your API Password - secret: true - doc_section: '#step-1-obtain-your-api-credentials' - -cal-com-v1: - display_name: Cal.com (v1) - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.cal.com/v1 - query: - apiKey: ${apiKey} - retry: - at: - - 'x-ratelimit-reset' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /me - docs: https://nango.dev/docs/integrations/all/cal-com-v1 - docs_connect: https://nango.dev/docs/integrations/all/cal-com-v1/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Cal.com account - pattern: '^cal_[a-zA-Z0-9_]+$' - example: cal_xxxxxx - doc_section: '#step-1-finding-your-api-key' -cal-com-v2: - display_name: Cal.com (v2) - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.cal.com/v2 - headers: - authorization: Bearer ${apiKey} - paginate: - type: cursor - cursor_name_in_request: cursor - cursor_path_in_response: data.data.nextCursor - limit_name_in_request: limit - retry: - at: - - 'x-ratelimit-reset' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /me - webhook_routing_script: calComWebhookRouting - webhook_user_defined_secret: true - webhook_allowed_query_params: - - nangoConnectionId - docs: https://nango.dev/docs/api-integrations/cal-com-v2 - docs_connect: https://nango.dev/docs/api-integrations/cal-com-v2/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Cal.com account - pattern: '^cal_[a-zA-Z0-9_]+$' - example: cal_xxxxxx - doc_section: '#step-1-finding-your-api-key' - -cal-com-oauth: - display_name: Cal.com (OAuth) - categories: - - productivity - auth_mode: OAUTH2 - body_format: json - authorization_url: https://app.cal.com/auth/oauth2/authorize - token_url: https://api.cal.com/v2/auth/oauth2/token - disable_pkce: true - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.cal.com - retry: - at: - - 'x-ratelimit-reset' - webhook_routing_script: calComWebhookRouting - webhook_user_defined_secret: true - webhook_allowed_query_params: - - nangoConnectionId - docs: https://nango.dev/docs/api-integrations/cal-com-oauth - setup_guide_url: https://nango.dev/docs/api-integrations/cal-com-oauth/how-to-register-your-own-cal-com-oauth-app - -calendly: - display_name: Calendly - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://auth.calendly.com/oauth/authorize - token_url: https://auth.calendly.com/oauth/token - authorization_params: - response_type: code - proxy: - base_url: https://api.calendly.com - paginate: - type: link - link_path_in_response_body: pagination.next_page - retry: - at: - - 'x-ratelimit-reset' - token_response_metadata: - - owner - post_connection_script: calendlyPostConnection - webhook_routing_script: calendlyWebhookRouting - webhook_user_defined_secret: true - docs: https://nango.dev/docs/api-integrations/calendly - setup_guide_url: https://nango.dev/docs/api-integrations/calendly/how-to-register-your-own-calendly-api-oauth-app - -callrail: - display_name: Callrail - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.callrail.com - headers: - authorization: Token token=${apiKey} - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v3/a.json - docs_connect: https://nango.dev/docs/integrations/all/callrail/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Callrail account - pattern: '^[a-f0-9]{32}$' - example: '4f3c12efb9659a0b5c123b568745dbf9' - doc_section: '#step-1-finding-your-api-key' - docs: https://nango.dev/docs/integrations/all/callrail - -canny: - display_name: Canny - categories: - - support - auth_mode: API_KEY - proxy: - base_url: https://canny.io/api/v1 - query: - apiKey: ${apiKey} - verification: - method: POST - headers: - content-type: application/json - endpoints: - - /boards/list - docs: https://nango.dev/docs/integrations/all/canny - docs_connect: https://nango.dev/docs/integrations/all/canny/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Canny account - example: a1f5937c-82df-bd29-4e3a-7b6fda8c54d1 - pattern: '^[a-zA-Z0-9-]+$' - doc_section: '#step-1-finding-your-api-key' - -candis: - display_name: Candis - categories: - - accounting - auth_mode: OAUTH2 - authorization_url: https://id.my.candis.io/auth/realms/candis/protocol/openid-connect/auth - token_url: https://id.my.candis.io/auth/realms/candis/protocol/openid-connect/token - token_request_auth_method: basic - scope_separator: ' ' - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.candis.io - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/candis - setup_guide_url: https://nango.dev/docs/api-integrations/candis/how-to-register-your-own-candis-oauth-app - post_connection_script: candisPostConnection - -canva: - display_name: Canva - categories: - - design - auth_mode: OAUTH2 - authorization_url: https://www.canva.com/api/oauth/authorize - token_url: https://api.canva.com/rest/v1/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.canva.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /rest/v1/users/me - docs: https://nango.dev/docs/integrations/all/canva - token_request_auth_method: basic - -canva-mcp: - display_name: Canva (MCP) - categories: - - design - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://mcp.canva.com/authorize - token_url: https://mcp.canva.com/token - registration_url: https://mcp.canva.com/register - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://mcp.canva.com - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/canva-mcp - -canvas-lms: - display_name: Canvas LMS - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.hostname}/login/oauth2/auth - token_url: https://${connectionConfig.hostname}/login/oauth2/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.hostname} - docs: https://nango.dev/docs/api-integrations/canvas-lms - setup_guide_url: https://nango.dev/docs/api-integrations/canvas-lms/how-to-register-your-own-canvas-lms-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/canvas-lms/connect - connection_config: - hostname: - type: string - title: Canvas Install URL - description: The base URL of your Canvas instance - example: canvas.instructure.com - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-canvas-install-url' - -canva-scim: - display_name: Canva (SCIM API) - categories: - - design - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://www.canva.com/_scim - headers: - authorization: Bearer ${apiKey} - accept: application/json - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/Users - docs: https://nango.dev/docs/integrations/all/canva-scim - docs_connect: https://nango.dev/docs/integrations/all/canva-scim/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Canva scim account - doc_section: '#step-1-finding-canva-api-key' - -certn: - display_name: Certn - categories: - - legal - auth_mode: API_KEY - proxy: - base_url: https://api.certn.co - headers: - authorization: Bearer ${apiKey} - paginate: - type: link - link_path_in_response_body: next - response_path: results - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v2/teams - docs: https://nango.dev/docs/integrations/all/certn - docs_connect: https://nango.dev/docs/integrations/all/certn - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Certn account - doc_section: '#step-1-creating-an-api-key' - -certn-partner: - display_name: Certn Partner - categories: - - legal - auth_mode: OAUTH2_CC - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.certn.co - paginate: - type: offset - offset_name_in_request: page - response_path: data - limit_name_in_request: limit - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v2/teams - docs: https://nango.dev/docs/integrations/all/certn-partner - -chargebee: - display_name: Chargebee - categories: - - payment - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.chargebee.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v2/business_entities - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/chargebee - docs_connect: https://nango.dev/docs/integrations/all/chargebee/connect - connection_config: - subdomain: - type: string - title: Chargebee Domain - description: The subdomain of your Chargebee account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .chargebee.com - prefix: https:// - doc_section: '#step-1-creating-an-api-key' - credentials: - username: - type: string - title: API Key - description: The API key for your Chargebee account - pattern: '^[a-zA-Z0-9_-]+$' - secret: true - password: - type: string - title: Password - description: Password - # https://apidocs.chargebee.com/docs/api/auth?lang=curl - # Chargebee is using basic auth with an api key - default_value: '' - hidden: true - -chatarmin: - display_name: Chatarmin - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://api.chatarmin.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /api/public/contacts?limit=1 - docs: https://nango.dev/docs/api-integrations/chatarmin - docs_connect: https://nango.dev/docs/api-integrations/chatarmin/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Chatarmin API key. - -chattermill: - display_name: Chattermill - categories: - - support - - analytics - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.chattermill.com - headers: - authorization: Bearer ${apiKey} - accept: application/json - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/projects - docs: https://nango.dev/docs/integrations/all/chattermill - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Chattermill account - connection_config: - subdomain: - type: string - title: Chattermill subdomain - description: The subdomain for your api requests. - enum: - - app - - api - - backend - -checkhq: - display_name: Check - categories: - - accounting - auth_mode: API_KEY - proxy: - base_url: https://api.checkhq.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/checkhq - docs_connect: https://nango.dev/docs/integrations/all/checkhq/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your CheckHQ account - doc_section: '#step-1-finding-check-api-token' - -checkr-partner: - display_name: Checkr Partner - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://partners.checkr.com/authorize/${connectionConfig.client_id} - token_url: https://api.checkr.com/oauth/tokens - disable_pkce: true - token_params: - grant_type: authorization_code - proxy: - retry: - at: - - 'x-ratelimit-reset' - base_url: https://api.checkr.com - token_response_metadata: - - checkr_account_id - webhook_routing_script: checkrPartnerWebhookRouting - post_connection_script: checkrPartnerPostConnection - docs: https://nango.dev/docs/integrations/all/checkr-partner - connection_config: - client_id: - type: string - title: Client ID - description: The client ID of your Checkr Partner account - -checkr-partner-staging: - display_name: Checkr Partner (Staging) - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://partners.checkrhq-staging.net/authorize/${connectionConfig.client_id} - token_url: https://api.checkr-staging.com/oauth/tokens - disable_pkce: true - token_params: - grant_type: authorization_code - proxy: - retry: - at: - - 'x-ratelimit-reset' - base_url: https://api.checkr-staging.com - token_response_metadata: - - checkr_account_id - webhook_routing_script: checkrPartnerWebhookRouting - post_connection_script: checkrPartnerPostConnection - docs: https://nango.dev/docs/integrations/all/checkr-partner-staging - connection_config: - client_id: - type: string - title: Client ID - description: The client ID of your Checkr Partner account - -checkout-com: - display_name: Checkout.com - categories: - - payment - auth_mode: OAUTH2_CC - token_url: https://access.checkout.com/connect/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - headers: - content-type: application/json - accept: application/json - base_url: https://api.checkout.com - docs: https://nango.dev/docs/integrations/all/checkout-com - docs_connect: https://nango.dev/docs/integrations/all/checkout-com/connect - -checkout-com-sandbox: - display_name: Checkout.com (Sandbox) - categories: - - payment - auth_mode: OAUTH2_CC - token_url: https://access.sandbox.checkout.com/connect/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - headers: - content-type: application/json - accept: application/json - base_url: https://api.sandbox.checkout.com - docs: https://nango.dev/docs/integrations/all/checkout-com-sandbox - docs_connect: https://nango.dev/docs/integrations/all/checkout-com-sandbox/connect - -chorus: - display_name: Chorus - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://chorus.ai - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v1/users/me - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/chorus - docs_connect: https://nango.dev/docs/integrations/all/chorus/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Chorus account - doc_section: '#step-1-generating-your-chorus-api-key' - -cin7-core: - display_name: Cin7 Core - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://inventory.dearsystems.com/externalapi - headers: - api-auth-accountid: ${connectionConfig.accountId} - api-auth-applicationkey: ${apiKey} - verification: - method: GET - endpoints: - - /v2/me - docs: https://nango.dev/docs/api-integrations/cin7-core - docs_connect: https://nango.dev/docs/api-integrations/cin7-core/connect - connection_config: - accountId: - type: string - title: Account ID - description: Your Cin7 Core Account ID. - doc_section: '#step-1-find-your-account-id-and-api-application-key' - example: a1b2c3d4-****-****-****-ef1234567890 - format: uuid - credentials: - apiKey: - type: string - title: API Application Key - description: Your Cin7 Core API Application Key. - secret: true - pattern: '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$' - doc_section: '#step-1-find-your-account-id-and-api-application-key' - example: 6d6f4999-****-****-****-4e4ed450df0f - -circle-so: - display_name: Circle.so - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://app.circle.so - headers: - authorization: Token ${apiKey} - docs: https://nango.dev/docs/integrations/all/circle-so - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Circle.so account - -circleback-mcp: - display_name: Circleback (MCP) - categories: - - productivity - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://app.circleback.ai/api/oauth/authorize - token_url: https://app.circleback.ai/api/oauth/access-token - registration_url: https://app.circleback.ai/api/oauth/register - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://app.circleback.ai/api/ - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/circleback-mcp - -clari-copilot: - display_name: Clari Copilot - categories: - - marketing - auth_mode: API_KEY - proxy: - headers: - x-api-key: ${apiKey} - x-api-password: ${connectionConfig.API_PASSWORD} - base_url: https://rest-api.copilot.clari.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /calls - docs: https://nango.dev/docs/integrations/all/clari-copilot - connection_config: - API_PASSWORD: - type: string - title: API Password - description: The API password of your Clari Copilot account - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Clari Copilot account - -clay: - display_name: Clay - categories: - - crm - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.clay.com - headers: - authorization: ${apiKey} - verification: - method: GET - endpoints: - - /v3/my-workspaces - connection_config: - workspaceId: ${connectionConfig.workspaceId} - docs: https://nango.dev/docs/api-integrations/clay - docs_connect: https://nango.dev/docs/api-integrations/clay/connect - connection_config: - workspaceId: - type: string - title: Workspace ID - description: The ID of your Clay workspace. - example: '10608232' - pattern: '^\d+$' - doc_section: '#step-2-finding-your-workspace-id' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Clay account. - example: 7de4ba****e439d39**** - pattern: '^[a-f0-9]+$' - doc_section: '#step-1-finding-your-api-key' - -cleverreach: - display_name: CleverReach - categories: - - marketing - auth_mode: OAUTH2 - authorization_url: https://rest.cleverreach.com/oauth/authorize.php - token_url: https://rest.cleverreach.com/oauth/token.php - authorization_params: - response_type: code - grant: basic - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://rest.cleverreach.com - docs: https://nango.dev/docs/api-integrations/cleverreach - setup_guide_url: https://nango.dev/docs/api-integrations/cleverreach/how-to-register-your-own-cleverreach-api-oauth-app - -clickhouse: - display_name: ClickHouse - categories: - - dev-tools - auth_mode: BASIC - proxy: - base_url: https://api.clickhouse.cloud - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/organizations - docs: https://nango.dev/docs/api-integrations/clickhouse - docs_connect: https://nango.dev/docs/api-integrations/clickhouse/connect - credentials: - username: - type: string - title: Key ID - description: Your ClickHouse Cloud API Key ID. - pattern: '^[a-zA-Z0-9]+$' - example: 'Mlx1****************' - doc_section: '#step-1-create-an-api-key' - password: - type: string - title: Key Secret - description: Your ClickHouse Cloud API Key Secret. - secret: true - pattern: '^[a-zA-Z0-9]+$' - example: '4b1d2i7O**********************************' - doc_section: '#step-1-create-an-api-key' - -clicksend: - display_name: ClickSend - categories: - - communication - auth_mode: BASIC - proxy: - base_url: https://rest.clicksend.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v3/account - docs: https://nango.dev/docs/integrations/all/clicksend - docs_connect: https://nango.dev/docs/integrations/all/clicksend/connect - credentials: - username: - type: string - title: Username - description: Your ClickSend account username - doc_section: '#step-1-finding-your-username-and-api-key' - password: - type: string - title: API Key - description: Your ClickSend API Key - secret: true - doc_section: '#step-1-finding-your-username-and-api-key' - -clickup: - display_name: ClickUp - categories: - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://app.clickup.com/api - token_url: https://api.clickup.com/api/v2/oauth/token - proxy: - base_url: https://api.clickup.com - docs: https://nango.dev/docs/api-integrations/clickup - setup_guide_url: https://nango.dev/docs/api-integrations/clickup/how-to-register-your-own-clickup-api-oauth-app - -clio: - display_name: Clio - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.hostname}/oauth/authorize - token_url: https://${connectionConfig.hostname}/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.hostname} - docs: https://nango.dev/docs/api-integrations/clio - docs_connect: https://nango.dev/docs/api-integrations/clio/connect - setup_guide_url: https://nango.dev/docs/api-integrations/clio/how-to-register-your-own-clio-api-oauth-app - connection_config: - hostname: - type: string - title: Hostname - description: The hostname for your Clio region (e.g. app.clio.com for US, eu.app.clio.com for EU, ca.app.clio.com for CA, au.app.clio.com for AU). - default_value: app.clio.com - format: hostname - enum: - - app.clio.com - - eu.app.clio.com - - ca.app.clio.com - - au.app.clio.com - order: 1 - doc_section: '#step-1-finding-your-hostname' - -cloudbeds: - display_name: Cloudbeds - categories: - - other - auth_mode: OAUTH2 - authorization_url: https://api.cloudbeds.com/api/v1.3/oauth - token_url: https://api.cloudbeds.com/api/v1.3/access_token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.cloudbeds.com - docs: https://nango.dev/docs/api-integrations/cloudbeds - setup_guide_url: https://nango.dev/docs/api-integrations/cloudbeds/how-to-register-your-own-cloudbeds-oauth-app - -cloudtalk: - display_name: CloudTalk - categories: - - communication - auth_mode: BASIC - proxy: - base_url: https://my.cloudtalk.io/api - retry: - at: - - 'x-cloudtalkapi-resettime' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /contacts/index.json?limit=1 - docs: https://nango.dev/docs/api-integrations/cloudtalk - docs_connect: https://nango.dev/docs/api-integrations/cloudtalk/connect - credentials: - username: - type: string - title: ID - description: Your CloudTalk API Access ID. - pattern: '^[A-Za-z0-9.%@?_-]+$' - example: 'E1ZH****************RRM' - doc_section: '#step-1-getting-your-api-credentials' - password: - type: string - title: Key - description: Your CloudTalk API Access Key. - secret: true - pattern: '^[A-Za-z0-9.%@?_-]+$' - example: 'bQI*******************************eZ' - doc_section: '#step-1-getting-your-api-credentials' - -clerk: - display_name: Clerk - categories: - - dev-tools - - iam - auth_mode: API_KEY - proxy: - base_url: https://api.clerk.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/jwks - docs: https://nango.dev/docs/integrations/all/clerk - docs_connect: https://nango.dev/docs/integrations/all/clerk/connect - credentials: - apiKey: - type: string - title: Secret Key - description: Your Clerk Secret Key (starts with sk_test_ or sk_live_) - secret: true - pattern: '^sk_(test|live)_[a-zA-Z0-9]+$' - example: 'sk_test_abcdefghijklmnop123456789' - doc_section: '#step-1-retrieve-your-clerk-secret-key' - -cloudentity: - display_name: Cloudentity - auth_mode: OAUTH2_CC - categories: - - iam - token_url: https://${connectionConfig.tenantID}.${connectionConfig.regionID}.authz.cloudentity.io/${connectionConfig.tenantID}/${connectionConfig.workspaceID}/oauth2/token - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.tenantID}.${connectionConfig.regionID}.authz.cloudentity.io/${connectionConfig.tenantID}/${connectionConfig.workspaceID} - docs: https://nango.dev/docs/integrations/all/cloudentity - docs_connect: https://nango.dev/docs/integrations/all/cloudentity/connect - connection_config: - tenantID: - type: string - title: Tenant ID - description: The tenant ID of your Cloudentity account - doc_section: '#step-2-retrieving-the-tenant-id' - regionID: - type: string - title: Region ID - description: The region ID of your Cloudentity account - doc_section: '#step-3-retrieving-the-region-id' - workspaceID: - type: string - title: Workspace ID - description: The workspace ID of your Cloudentity account - doc_section: '#step-4-retrieving-the-workspace-id' - -cloudflare: - display_name: Cloudflare - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.cloudflare.com/client - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/cloudflare - docs_connect: https://nango.dev/docs/api-integrations/cloudflare/connect - credentials: - apiKey: - type: string - title: API Token - description: The API token for your Cloudflare user or account - example: lGlHlGZN3iPR9z7CupZlMB3nzMpTCdfxeUPNj_pf - pattern: '^[a-zA-Z0-9_-]+$' - -cloudflare-mcp: - display_name: Cloudflare (MCP) - categories: - - dev-tools - - mcp - auth_mode: MCP_OAUTH2_GENERIC - proxy: - base_url: ${connectionConfig.mcp_server_url} - headers: - accept: application/json,text/event-stream - connection_config: - mcp_server_url: - type: string - title: Worker URL - description: The full URL of your Cloudflare Worker MCP server. - example: https://my-mcp.myusername.workers.dev - pattern: '^https://[a-zA-Z0-9.-]+(?:\:[0-9]+)?(?:/.*)?$' - doc_section: '#step-1-finding-your-worker-url' - docs: https://nango.dev/docs/api-integrations/cloudflare-mcp - docs_connect: https://nango.dev/docs/api-integrations/cloudflare-mcp/connect - -clover: - display_name: Clover - categories: - - e-commerce - auth_mode: OAUTH2 - body_format: json - authorization_url: https://${connectionConfig.authorizeHost}/oauth/v2/authorize - token_url: https://${connectionConfig.apiHost}/oauth/v2/token - refresh_url: https://${connectionConfig.apiHost}/oauth/v2/refresh - disable_pkce: true - authorization_params: - response_type: code - refresh_params: - grant_type: refresh_token - redirect_uri_metadata: - - merchant_id - - employee_id - proxy: - base_url: https://${connectionConfig.apiHost} - docs: https://nango.dev/docs/api-integrations/clover - setup_guide_url: https://nango.dev/docs/api-integrations/clover/how-to-register-your-own-clover-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/clover/connect - connection_config: - authorizeHost: - type: string - title: Authorization Host - description: The Clover authorization hostname for your region. - enum: - - www.clover.com - - www.eu.clover.com - - www.la.clover.com - - sandbox.dev.clover.com - apiHost: - type: string - title: API Host - description: The Clover API hostname for your region. - enum: - - api.clover.com - - api.eu.clover.com - - api.la.clover.com - - apisandbox.dev.clover.com - -close: - display_name: Close - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://app.close.com/oauth2/authorize - token_url: https://api.close.com/oauth2/token/ - authorization_params: - response_type: code - default_scopes: - - offline_access - proxy: - base_url: https://api.close.com/api - docs: https://nango.dev/docs/integrations/all/close - -coda: - display_name: Coda - categories: - - knowledge-base - - productivity - auth_mode: API_KEY - proxy: - base_url: https://coda.io/apis/v1 - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /whoami - docs: https://nango.dev/docs/integrations/all/coda - docs_connect: https://nango.dev/docs/integrations/all/coda/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Coda account - doc_section: '#step-1-creating-an-api-key' - -codeclimate: - display_name: Code Climate - categories: - - dev-tools - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.domain} - headers: - accept: application/vnd.api+json - authorization: Token token=${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/user - docs: https://nango.dev/docs/integrations/all/codeclimate - docs_connect: https://nango.dev/docs/integrations/all/codeclimate/connect - connection_config: - domain: - type: string - title: Domain - description: The domain of your Code Climate account - format: hostname - prefix: https:// - doc_section: '#step-1-obtaining-the-domain-url' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Code Climate account - doc_section: '#step-2-creating-an-api-key' -codegen: - display_name: Codegen - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.codegen.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/organizations - docs: https://nango.dev/docs/integrations/all/codegen - docs_connect: https://nango.dev/docs/integrations/all/codegen/connect - credentials: - apiKey: - type: string - title: API Token - description: The API Key for your Codegen account - pattern: '^sk-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$' - example: 'sk-897bd628-de64-4018-8e3b-c6f717ca3e1d' - doc_section: '#step-1-finding-your-api-key' - -commercetools: - display_name: Commercetools - categories: - - e-commerce - auth_mode: OAUTH2_CC - token_url: https://auth.${connectionConfig.region}.${connectionConfig.cloudProvider}.commercetools.com/oauth/token - token_request_auth_method: basic - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.${connectionConfig.region}.${connectionConfig.cloudProvider}.commercetools.com/${connectionConfig.projectKey} - headers: - authorization: Bearer ${accessToken} - docs: https://nango.dev/docs/integrations/all/commercetools - docs_connect: https://nango.dev/docs/integrations/all/commercetools/connect - connection_config: - region: - type: string - title: Region - description: The region of your Commercetools account. Use the full region identifier (e.g., 'us-central1' for GCP or 'us-east-2' for AWS). - example: us-central1 - pattern: '^[a-z]+-[a-z0-9-]+$' - doc_section: '#step-3-identify-your-region-and-cloud-provider' - projectKey: - type: string - title: Project Key - description: The project key of your Commercetools account - example: demo-project-slug - pattern: '^[a-zA-Z0-9-_]+$' - doc_section: '#step-2-save-the-api-environment-variables' - cloudProvider: - type: string - title: Cloud Provider - description: Cloud provider used to host your Commercetools project (e.g., 'gcp' or 'aws'). - enum: - - gcp - - aws - doc_section: '#step-3-identify-your-region-and-cloud-provider' - -crowdstrike: - display_name: CrowdStrike - categories: - - dev-tools - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.baseUrl}/oauth2/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.baseUrl} - retry: - after: - - 'x-ratelimit-retryafter' - docs: https://nango.dev/docs/integrations/all/crowdstrike - docs_connect: https://nango.dev/docs/integrations/all/crowdstrike/connect - connection_config: - baseUrl: - type: string - title: Base URL - description: The CrowdStrike API base URL for your cloud environment - example: api.crowdstrike.com - pattern: '^api(?:\.[a-z0-9-]+)*\.crowdstrike\.(?:com|mil)$' - prefix: https:// - doc_section: '#step-1-creating-an-api-client' - order: 1 - -companycam: - display_name: CompanyCam - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.companycam.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/company - docs: https://nango.dev/docs/integrations/all/companycam - credentials: - apiKey: - type: string - title: Access Token - description: The Access Token for your CompanyCam company - -constant-contact: - display_name: Constant Contact - categories: - - marketing - auth_mode: OAUTH2 - authorization_url: https://authz.constantcontact.com/oauth2/default/v1/authorize - token_url: https://authz.constantcontact.com/oauth2/default/v1/token - disable_pkce: true - scope_separator: ' ' - default_scopes: - - offline_access - proxy: - base_url: https://api.cc.email - docs: https://nango.dev/docs/api-integrations/constant-contact - setup_guide_url: https://nango.dev/docs/api-integrations/constant-contact/how-to-register-your-own-constant-contact-oauth-app - -conductorone: - display_name: ConductorOne - categories: - - productivity - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.hostname}/auth/v1/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.hostname}/api - docs: https://nango.dev/docs/api-integrations/conductorone - docs_connect: https://nango.dev/docs/api-integrations/conductorone/connect - connection_config: - hostname: - type: string - title: Hostname - description: The hostname extracted from your Client ID - example: acme.conductor.one - format: hostname - order: 1 - doc_section: '#step-2-obtaining-your-hostname' - credentials: - client_id: - type: string - title: Client ID - description: Your ConductorOne Client ID - example: strange-hydra-68836@acme.conductor.one/pcc - doc_section: '#step-1-obtaining-your-client-credentials' - client_secret: - type: string - title: Client Secret - description: Your ConductorOne Client Secret - example: 'secret-token:conductorone.com:v1:eyJrdHkiOiJPS1AiLCJjcnYiOiJFZDI1NTE5IiwieCI6IkMySEx5Y0d6eUhfZDQwcjJvejZoNkpqdndvRVFBZ0FTRVc2eDB6emh6Y2MiLCJkIjoiLTgzVkxXUVUtZVhQY0ZCWVhDb2NpU29XVmhrYnRXUm9zdkZUZ3JqcXNVbyJ9' - doc_section: '#step-1-obtaining-your-client-credentials' - -copper: - display_name: Copper (OAuth) - categories: - - crm - auth_mode: OAUTH2 - proxy: - base_url: https://api.copper.com/developer_api - default_scopes: - - developer/v1/all - authorization_url: https://app.copper.com/oauth/authorize - token_url: https://app.copper.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - docs: https://nango.dev/docs/integrations/all/copper - -copper-api-key: - display_name: Copper (API Key) - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.copper.com/developer_api - headers: - x-pw-accesstoken: ${apiKey} - x-pw-application: developer_api - x-pw-useremail: ${connectionConfig.userEmail} - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/account - docs_connect: https://nango.dev/docs/integrations/all/copper-api-key/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Copper account - pattern: '^[a-f0-9]{32}$' - example: '4f3c12efb9659a0b5c123b568745dbf9' - doc_section: '#step-1-finding-copper-api-key' - connection_config: - userEmail: - type: string - title: User Email - description: Email address of the user who generated the token - docs: https://nango.dev/docs/integrations/all/copper-api-key - -connectwise-psa: - display_name: ConnectWise PSA - categories: - - support - - ticketing - auth_mode: BASIC - webhook_routing_script: connectwisePsaWebhookRouting - proxy: - base_url: https://${connectionConfig.hostname}/v4_6_release/apis/3.0 || https://${connectionConfig.subdomain}.myconnectwise.net/v4_6_release/apis/3.0 - headers: - accept: application/vnd.connectwise.com+json; version=${connectionConfig.apiVersion} - clientid: ${connectionConfig.clientId} - docs: https://nango.dev/docs/api-integrations/connectwise-psa - docs_connect: https://nango.dev/docs/api-integrations/connectwise-psa/connect - connection_config: - hostname: - type: string - title: Hostname - description: The full ConnectWise PSA hostname. - example: api-na.myconnectwise.net - format: hostname - prefix: https:// - suffix: /v4_6_release/apis/3.0 - subdomain: - type: string - title: '' - description: '' - default_value: '' - hidden: true # deprecating this in favor of hostname - apiVersion: - type: string - title: Api version - description: The API version to connect to ConnectWise PSA - clientId: - type: string - title: Client ID - description: The Client ID assigned to your integration - credentials: - username: - type: string - title: Username - description: The ConnectWise PSA CompanyId followed by either the Public Key, Integrator Username, or MemberId - password: - type: string - title: Password - description: Your ConnectWise PSA private key, integrator password, or member hash - -connectwise-psa-staging: - display_name: ConnectWise PSA (Staging) - categories: - - support - - ticketing - auth_mode: BASIC - webhook_routing_script: connectwisePsaWebhookRouting - proxy: - base_url: https://api-staging.connectwisedev.com/v4_6_release/apis/3.0 - headers: - accept: application/vnd.connectwise.com+json; version=${connectionConfig.apiVersion} - clientid: ${connectionConfig.clientId} - docs: https://nango.dev/docs/integrations/all/connectwise-psa-staging - connection_config: - apiVersion: - type: string - title: Api version - description: The API version to connect to ConnectWise PSA - clientId: - type: string - title: Client ID - description: The Client ID assigned to your integration - -connectwise-rmm: - display_name: ConnectWise RMM - categories: - - support - auth_mode: OAUTH2_CC - body_format: json - token_url: https://openapi.service.${connectionConfig.subdomain}/v1/token - token_params: - grant_type: client_credentials - scope_separator: ' ' - proxy: - base_url: https://openapi.service.${connectionConfig.subdomain} - docs: https://nango.dev/docs/api-integrations/connectwise-rmm - docs_connect: https://nango.dev/docs/api-integrations/connectwise-rmm/connect - connection_config: - subdomain: - type: string - title: API Subdomain - description: The ConnectWise RMM OpenAPI subdomain for your region. - enum: - - itsupport247.net - - euplatform.connectwise.com - - auplatform.connectwise.com - doc_section: '#step-1-find-your-api-subdomain' - credentials: - client_id: - type: string - title: Client ID - description: Your ConnectWise RMM OAuth client ID - example: '6500023' - pattern: '^[A-Za-z0-9._-]+$' - doc_section: '#step-2-create-api-credentials' - client_secret: - type: string - title: Client Secret - description: Your ConnectWise RMM OAuth client secret - secret: true - pattern: '^[A-Za-z0-9._~+/=-]{8,}$' - doc_section: '#step-2-create-api-credentials' - -conta-azul: - display_name: Conta Azul - categories: - - accounting - - erp - auth_mode: OAUTH2 - authorization_url: https://auth.contaazul.com/login - token_url: https://auth.contaazul.com/oauth2/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - scope_separator: ' ' - proxy: - base_url: https://api-v2.contaazul.com - disable_pkce: true - docs: https://nango.dev/docs/api-integrations/conta-azul - setup_guide_url: https://nango.dev/docs/api-integrations/conta-azul/how-to-register-your-own-conta-azul-api-oauth-app - -confluence: - display_name: Confluence - categories: - - knowledge-base - - popular - alias: jira - docs: https://nango.dev/docs/api-integrations/confluence - setup_guide_url: https://nango.dev/docs/api-integrations/confluence/how-to-register-your-own-confluence-api-oauth-app - -confluence-basic: - display_name: Confluence (Basic Auth) - categories: - - knowledge-base - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.atlassian.net - headers: - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /wiki/api/v2/spaces - docs: https://nango.dev/docs/integrations/all/confluence-basic - docs_connect: https://nango.dev/docs/integrations/all/confluence-basic/connect - connection_config: - subdomain: - type: string - title: Confluence Subdomain - description: The subdomain of your Confluence account - pattern: '^[a-z0-9_-]+$' - example: subdomain - suffix: .atlassian.net - prefix: https:// - order: 1 - doc_section: '#step-2-finding-your-atlassian-domain' - credentials: - username: - type: string - title: Email Address - format: email - description: The email address for your Confluence account - doc_section: '#step-1-getting-your-api-token' - password: - type: string - title: API token - description: The API token for your Confluence account - secret: true - doc_section: '#step-1-getting-your-api-token' - -confluence-data-center: - display_name: Confluence Data Center - categories: - - productivity - - ticketing - alias: jira-data-center - proxy: - retry: - after: - - 'retry-after' - base_url: https://${connectionConfig.endpointURL} - docs: https://nango.dev/docs/integrations/all/confluence-data-center - docs_connect: https://nango.dev/docs/integrations/all/confluence-data-center/connect - connection_config: - endpointURL: - type: string - title: Domain - description: The domain of your Confluence Data Center instance - prefix: https:// - pattern: '^[a-zA-Z0-9.-]+(:\d+(/[a-zA-Z0-9.-]*)?)?$' - example: confluence.company.com - doc_section: '#step-1-finding-your-domain' - -contentful: - display_name: Contentful - categories: - - dev-tools - - design - - cms - auth_mode: OAUTH2 - authorization_url: https://be.contentful.com/oauth/authorize - token_url: https://be.contentful.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.contentful.com - retry: - after: - - x-contentful-ratelimit-reset - docs: https://nango.dev/docs/integrations/all/contentful - connection_config: - subdomain: - type: string - title: Contentful Domain - description: The subdomain of your Contentful account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .contentful.com - prefix: https:// - -contentstack: - display_name: Contentstack - categories: - - cms - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.contentstack.com/apps/${connectionConfig.appId}/authorize - token_url: https://${connectionConfig.subdomain}.contentstack.com/apps-api/apps/token - docs: https://nango.dev/docs/integrations/all/contentstack - proxy: - base_url: https://${connectionConfig.apiDomain} - connection_config: - subdomain: - type: string - title: Contentstack Domain - description: The subdomain of your Contentstack account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .contentstack.com - prefix: https:// - order: 2 - appId: - type: string - title: App ID - description: The app ID of your Contentstack account - order: 1 - apiDomain: - type: string - title: API Domain - description: The domain to where you will access your API - pattern: '^[a-z0-9_-]+$' - example: eu-api.contentstack.com - prefix: https:// - order: 3 - -coros: - display_name: Coros - categories: - - sports - auth_mode: OAUTH2 - authorization_url: https://open.coros.com/oauth2/authorize - token_url: https://open.coros.com/oauth2/accesstoken - refresh_url: https://open.coros.com/oauth2/refresh-token - authorization_params: - response_type: code - token_response_metadata: - - openId - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://open.coros.com - docs: https://nango.dev/docs/integrations/all/coros - -coros-sandbox: - display_name: Coros (Sandbox) - categories: - - sports - auth_mode: OAUTH2 - authorization_url: https://opentest.coros.com/oauth2/authorize - token_url: https://opentest.coros.com/oauth2/accesstoken - refresh_url: https://opentest.coros.com/oauth2/refresh-token - authorization_params: - response_type: code - token_response_metadata: - - openId - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://opentest.coros.com - docs: https://nango.dev/docs/integrations/all/coros-sandbox - -coupa-compass: - display_name: Coupa Compass - categories: - - payment - - invoicing - auth_mode: OAUTH2_CC - scope_separator: ' ' - token_url: https://${connectionConfig.instanceDomain}/oauth2/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.instanceDomain} - docs: https://nango.dev/docs/integrations/all/coupa-compass - connection_config: - instanceDomain: - type: string - title: Instance Domain - description: The domain of your Coupa Compass account - format: hostname - prefix: https:// - -cyberimpact: - display_name: Cyberimpact - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.cyberimpact.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /ping - docs: https://nango.dev/docs/integrations/all/cyberimpact - docs_connect: https://nango.dev/docs/integrations/all/cyberimpact/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Cyberimpact account - pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' - example: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...' - doc_section: '#step-1-creating-a-cyberimpact-api-key' - -customer-io: - display_name: Customer.io - categories: - - marketing - - analytics - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.customer.io - docs: https://nango.dev/docs/api-integrations/customer-io - docs_connect: https://nango.dev/docs/api-integrations/customer-io/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The region where your Customer.io instance is hosted. - enum: - - cdp - - cdp-eu - order: 1 - doc_section: '#step-2-choose-your-subdomain' - credentials: - username: - type: string - title: API Key - description: Your Customer.io Pipelines API key. - pattern: '^[a-f0-9]{20}$' - example: 36c7a4***********ab022a3 - doc_section: '#step-1-getting-authentication-credentials' - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -cursor: - display_name: Cursor - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.cursor.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v0/me - docs: https://nango.dev/docs/integrations/all/cursor - docs_connect: https://nango.dev/docs/integrations/all/cursor/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Cursor account - doc_section: '#step-1-finding-api-key' - example: key_9164000970ca2f15c999047a0e2b7e03127885be41198616a6975af08b28239b - pattern: '^(key_[a-f0-9]{64}|crsr_[a-f0-9]{64})$' - -cursor-admin: - display_name: Cursor Admin - categories: - - dev-tools - auth_mode: BASIC - proxy: - base_url: https://api.cursor.com - verification: - method: GET - endpoints: - - /teams/members - docs: https://nango.dev/docs/integrations/all/cursor-admin - docs_connect: https://nango.dev/docs/integrations/all/cursor-admin/connect - credentials: - username: - type: string - title: API key - description: The API Key of your Greenhouse account - example: key_9164000970ca2f15c999047a0e2b7e03127885be41198616a6975af08b28239b - pattern: '^(key_[a-f0-9]{64}|crsr_[a-f0-9]{64})$' - secret: true - doc_section: '#step-1-finding-api-key' - password: - type: string - title: Password - description: Password - default_value: '' - hidden: true - -databricks-account: - display_name: Databricks (Account Level) - categories: - - analytics - auth_mode: OAUTH2_CC - token_url: https://accounts.cloud.databricks.com/oidc/accounts/${connectionConfig.accountId}/v1/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://accounts.cloud.databricks.com/api/2.0/accounts/${connectionConfig.accountId} - docs: https://nango.dev/docs/integrations/all/databricks-account - connection_config: - accountId: - type: string - title: Account ID - description: The ID to your account - format: uuid - example: 123e4567-e89b-12d3-a456-426614174000 - -databricks-workspace: - display_name: Databricks (Workspace Level) - categories: - - analytics - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.databricksInstance}/oidc/v1/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.databricksInstance}/api/2.0/ - docs: https://nango.dev/docs/integrations/all/databricks-workspace - connection_config: - databricksInstance: - type: string - title: Databricks Instance - description: The instance to your databricks deployment - pattern: '^[a-z0-9_-]+(\.[a-z0-9_-]+)*$' - example: dbc-a1b2345c-d6e7.cloud.databricks.com - -# Untested configuration. Please reach out if you have a test account that we can use to test it. -datev: - display_name: Datev - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://login.datev.de/openid/authorize - token_url: https://api.datev.de/token - token_request_auth_method: basic - scope_separator: ' ' - default_scopes: - - openid - authorization_params: - response_type: code id_token - response_mode: query - nonce: AnotherRandomStringDatev - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.datev.de - docs: https://nango.dev/docs/integrations/all/datev - -datacandy: - display_name: DataCandy - categories: - - payment - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.application_url}/api2 - query: - application_key: ${connectionConfig.application_key} - accesskey: ${connectionConfig.access_key} - verification: - method: GET - endpoints: - - /merchant?application_key=${connectionConfig.application_key}&accesskey=${connectionConfig.access_key}&limit=1 - connection_config: - application_url: - type: string - title: Application URL - description: The application URL for DataCandy - example: app.datacandy.com - format: hostname - application_key: - type: string - title: Application Key - description: The application key required for read data access - example: c4f9375f9834b4e7f0a528cc65c055702bf5f24a - access_key: - type: string - title: Access Key - description: The access key required for read data access - example: '3CLJII' - credentials: - username: - type: string - title: Username - description: DataCandy username - password: - type: string - title: Password - description: DataCandy password - secret: true - docs: https://nango.dev/docs/integrations/all/datacandy - -datadog: - display_name: Datadog - categories: - - analytics - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.${connectionConfig.siteParameter}/api - headers: - dd-api-key: ${apiKey} - dd-application-key: ${connectionConfig.applicationKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/validate - retry: - after: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/api-integrations/datadog - docs_connect: https://nango.dev/docs/api-integrations/datadog/connect - connection_config: - siteParameter: - type: string - title: Site Parameter - description: The Datadog site for your account. - enum: - - datadoghq.com - - us3.datadoghq.com - - us5.datadoghq.com - - datadoghq.eu - - ddog-gov.com - - ap1.datadoghq.com - order: 1 - doc_section: '#step-1-finding-your-datadog-domain' - applicationKey: - type: string - title: Application Key - description: The application key required for read data access. - pattern: '^[A-Za-z0-9_]+$' - example: '5d8a7b3f2dc8bce1b234e7f1a1ac54728dbf9e4a7' - doc_section: '#step-3-datadog-application-key' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Datadog account. - pattern: '^[a-f0-9]{32}$' - example: '4f3c12efb9659a0b5c123b568745dbf9' - doc_section: '#step-2-datadog-api-key' - -dayforce: - display_name: Dayforce - categories: - - hr - auth_mode: TWO_STEP - body_format: form - proxy: - base_url: https://${connectionConfig.clientHostname}/api || https://www.dayforcehcm.com/api - forward_headers_on_redirect: true - token_url: https://${connectionConfig.identityHostname}/connect/token || https://dfid.dayforcehcm.com/connect/token - token_params: - grant_type: password - companyId: ${connectionConfig.companyId} - username: ${credentials.username} - password: ${credentials.password} - client_id: Dayforce.HCMAnywhere.Client - token_headers: - content-type: application/x-www-form-urlencoded - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/api-integrations/dayforce - docs_connect: https://nango.dev/docs/api-integrations/dayforce/connect - credentials: - username: - type: string - title: Username - description: Your Dayforce account username. - doc_section: '#step-2-configure-your-dayforce-user' - password: - type: string - title: Password - description: Your Dayforce account password. - doc_section: '#step-2-configure-your-dayforce-user' - connection_config: - companyId: - type: string - title: Company ID - description: The company ID for your Dayforce account. - doc_section: '#step-1-finding-your-company-id' - clientHostname: - type: string - title: API hostname - description: Hostname for the Dayforce API, leave empty for production. - format: hostname - prefix: https:// - suffix: /api - optional: true - example: test.dayforcehcm.com - doc_section: '#step-4-identifying-your-client-host' - identityHostname: - type: string - title: Identity hostname - description: Hostname for the Dayforce Identity token endpoint, leave empty for production. - format: hostname - optional: true - prefix: https:// - suffix: /connect/token - example: dfid.dayforcehcm.com - doc_section: '#step-3-identifying-your-identity-host' - -datto-rmm: - display_name: Datto RMM - categories: - - support - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.platform}-api.centrastage.net/auth/oauth/authorize - token_url: https://${connectionConfig.platform}-api.centrastage.net/auth/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - token_request_auth_method: basic - disable_pkce: true - proxy: - base_url: https://${connectionConfig.platform}-api.centrastage.net/api - docs: https://nango.dev/docs/integrations/all/datto-rmm - docs_connect: https://nango.dev/docs/integrations/all/datto-rmm/connect - connection_config: - platform: - type: string - title: Platform - description: The Datto RMM platform (region) for your account. - enum: - - pinotage - - merlot - - concord - - vidal - - zinfandel - - syrah - order: 1 - doc_section: '#step-2-select-your-platform' - -datto-rmm-password-grant: - display_name: Datto RMM (Password Grant) - categories: - - support - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.platform}-api.centrastage.net/auth/oauth/token - token_params: - grant_type: password - username: ${credentials.username} - password: ${credentials.password} - token_headers: - authorization: Basic ${base64(${credentials.default_username}:${credentials.default_password})} - proxy: - base_url: https://${connectionConfig.platform}-api.centrastage.net/api - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/integrations/all/datto-rmm-password-grant - docs_connect: https://nango.dev/docs/integrations/all/datto-rmm-password-grant/connect - connection_config: - platform: - type: string - title: Platform - description: The Datto RMM platform (region) for your account. - enum: - - pinotage - - merlot - - concord - - vidal - - zinfandel - - syrah - order: 1 - doc_section: '#step-2-select-your-platform' - credentials: - default_username: - type: string - title: '' - description: '' - default_value: 'public-client' - hidden: true - default_password: - type: string - title: '' - description: '' - default_value: 'public' - hidden: true - username: - type: string - title: API Key - pattern: '^[A-Z0-9]{32}$' - example: 'AB7KLM90PQW4XJ8H2TUVN1YZ3R5C6FDG' - doc_section: '#step-1-enable-api-access-and-generate-api-keys' - description: Your Datto RMM API Key - password: - type: string - title: API Secret Key - pattern: '^[A-Z0-9]{32}$' - example: '9XQ7MZB4H1L2WKC0RDFTPY5J8VUNSG3E' - doc_section: '#step-1-enable-api-access-and-generate-api-keys' - description: Your Datto RMM Secret Key - -deel: - display_name: Deel - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://app.deel.com/oauth2/authorize - token_url: https://app.deel.com/oauth2/tokens - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.letsdeel.com - docs: https://nango.dev/docs/integrations/all/deel - -deel-sandbox: - display_name: Deel (Sandbox) - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://demo.deel.com/oauth2/authorize - token_url: https://demo.deel.com/oauth2/tokens - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api-sandbox.demo.deel.com - docs: https://nango.dev/docs/integrations/all/deel-sandbox - -devin: - display_name: Devin - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.devin.ai - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/sessions - docs: https://nango.dev/docs/integrations/all/devin - docs_connect: https://nango.dev/docs/integrations/all/devin/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Devin account - pattern: '^apk_user_[A-Za-z0-9+/=]+$' - example: 'apk_user_dGVzdF9vcmdfeDY1NzRBUElLRVl8Njc1OTdjNDQzMjFhOTZlODhlMmE4MTI0X29yZ194NnB5QlVJa042anVKWWtMOjQ3NzQxYTVmYWE5MTRiNjQ5' - doc_section: '#step-1-finding-your-api-key' - -demodesk: - display_name: DemoDesk - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://demodesk.com - headers: - api-key: ${apiKey} - docs: https://nango.dev/docs/api-integrations/demodesk - docs_connect: https://nango.dev/docs/api-integrations/demodesk/connect - credentials: - apiKey: - type: string - title: API Key - description: Your DemoDesk API key - doc_section: '#step-1-obtaining-your-api-key' - -dialpad: - display_name: Dialpad - categories: - - communication - auth_mode: OAUTH2 - authorization_url: https://dialpad.com/oauth2/authorize - token_url: https://dialpad.com/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://dialpad.com - docs: https://nango.dev/docs/integrations/all/dialpad - -dialpad-sandbox: - display_name: Dialpad (Sandbox) - categories: - - communication - auth_mode: OAUTH2 - authorization_url: https://sandbox.dialpad.com/oauth2/authorize - token_url: https://sandbox.dialpad.com/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://sandbox.dialpad.com - docs: https://nango.dev/docs/integrations/all/dialpad-sandbox - -dialpad-wfm: - display_name: Dialpad WFM - categories: - - hr - auth_mode: API_KEY - proxy: - base_url: https://api.teamsurfboard.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/api-integrations/dialpad-wfm - docs_connect: https://nango.dev/docs/api-integrations/dialpad-wfm/connect - credentials: - apiKey: - type: string - title: Access Token - description: The access token for your account. - secret: true - doc_section: '#step-1-obtain-your-access-token' - -diffbot: - display_name: Diffbot - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://api.diffbot.com - query: - token: ${apiKey} - verification: - method: GET - endpoints: - - /v4/account - docs: https://nango.dev/docs/api-integrations/diffbot - docs_connect: https://nango.dev/docs/api-integrations/diffbot/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Diffbot API token. - example: c4f82a1b********************e7d3 - pattern: '^[a-f0-9]{32}$' - doc_section: '#step-1-obtain-your-api-token' - -digitalocean: - display_name: DigitalOcean - categories: - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://cloud.digitalocean.com/v1/oauth/authorize - token_url: https://cloud.digitalocean.com/v1/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.digitalocean.com - docs: https://nango.dev/docs/integrations/all/digitalocean - -digits: - display_name: Digits - categories: - - accounting - auth_mode: OAUTH2 - authorization_url: https://connect.digits.com/v1/oauth/authorize - token_url: https://connect.digits.com/v1/oauth/token - body_format: json - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://connect.digits.com - docs: https://nango.dev/docs/api-integrations/digits - setup_guide_url: https://nango.dev/docs/api-integrations/digits/how-to-register-your-own-digits-api-oauth-app - -digits-mcp: - display_name: Digits (MCP) - categories: - - accounting - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://api.digits.com/oauth/authorize - token_url: https://api.digits.com/oauth/token - registration_url: https://api.digits.com/oauth/register - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.digits.com - docs: https://nango.dev/docs/api-integrations/digits-mcp - -discolike: - display_name: DiscoLike - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.discolike.com - headers: - x-discolike-key: ${apiKey} - verification: - method: GET - endpoints: - - /v1/count - docs: https://nango.dev/docs/api-integrations/discolike - docs_connect: https://nango.dev/docs/api-integrations/discolike/connect - credentials: - apiKey: - type: string - title: API Key - description: Your DiscoLike API key. - doc_section: '#step-1-obtain-your-api-key' - example: 123e4567-e89b-12d3-a456-426614174000 - format: uuid - -discord: - display_name: Discord - categories: - - gaming - - social - auth_mode: OAUTH2 - authorization_url: https://discord.com/api/oauth2/authorize - token_url: https://discord.com/api/oauth2/token - authorization_params: - response_type: code - proxy: - base_url: https://discord.com - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/discord - setup_guide_url: https://nango.dev/docs/api-integrations/discord/how-to-register-your-own-discord-api-oauth-app - -discourse: - display_name: Discourse - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.defaultHost} - retry: - after: - - 'retry-after' - headers: - api-username: ${connectionConfig.apiUsername} - api-key: ${apiKey} - accept: application/json - docs: https://nango.dev/docs/integrations/all/discourse - connection_config: - defaultHost: - type: string - title: Domain - description: The domain of your Discourse account - format: hostname - prefix: https:// - apiUsername: - type: string - title: API Username - description: The API username of your Discourse account - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Discourse account - -crisp: - display_name: Crisp - categories: - - communication - - support - auth_mode: BASIC - proxy: - base_url: https://api.crisp.chat - headers: - x-crisp-tier: plugin - verification: - method: GET - endpoints: - - /v1/plugin/connect/account - docs: https://nango.dev/docs/integrations/all/crisp - docs_connect: https://nango.dev/docs/integrations/all/crisp/connect - credentials: - username: - type: string - title: Token Identifier - description: The identifier part of your Crisp token keypair - example: 123e4567-e89b-12d3-a456-426614174000 - format: uuid - doc_section: '#step-1-generating-your-token-keypair' - password: - type: string - title: Token Key - pattern: '^[a-f0-9]{64}$' - example: a3f5c8d2b9e4713f2c0a7b4d5e6f8c9b1a2d3e4f5b6c7d8e9f0a1b2c3d4e5f6a7 - description: The key part of your Crisp token keypair - doc_section: '#step-1-generating-your-token-keypair' - -crisp-plugin-install: - display_name: Crisp (Plugin Install) - categories: - - communication - - support - auth_mode: INSTALL_PLUGIN - auth_type: BASIC - redirect_uri_metadata: - - website_id - proxy: - base_url: https://api.crisp.chat - headers: - x-crisp-tier: plugin - verification: - method: GET - endpoints: - - /v1/plugin/connect/account - docs: https://nango.dev/docs/api-integrations/crisp-plugin-install - setup_guide_url: https://nango.dev/docs/api-integrations/crisp-plugin-install/how-to-register-your-own-crisp-plugin - -crunchbase: - display_name: Crunchbase - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.crunchbase.com/ - headers: - x-cb-user-key: ${apiKey} - verification: - method: GET - endpoints: - - /v4/data/autocompletes?query=instantly&limit=1 - docs: https://nango.dev/docs/api-integrations/crunchbase - docs_connect: https://nango.dev/docs/api-integrations/crunchbase/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Crunchbase API key. - doc_section: '#step-1-get-your-api-key' - pattern: '^[a-zA-Z0-9]{32}$' - example: 0f9c************************5336 - -dixa: - display_name: Dixa - categories: - - support - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.apiType}.dixa.io - headers: - authorization: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/agents - base_url_override: https://dev.dixa.io - docs: https://nango.dev/docs/integrations/all/dixa - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Dixa account - connection_config: - apiType: - type: string - title: API Type - description: The Dixa API type to use for requests. - enum: - - dev - - exports - -document360: - display_name: Document360 - categories: - - knowledge-base - auth_mode: API_KEY - proxy: - headers: - api_token: ${apiKey} - base_url: https://api.document360.com - docs: https://nango.dev/docs/integrations/all/document360 - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Document360 account - -docusign: - display_name: DocuSign - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://account.docusign.com/oauth/auth - token_url: https://account.docusign.com/oauth/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://www.docusign.net - post_connection_script: docusignPostConnection - docs: https://nango.dev/docs/integrations/all/docusign - -docusign-sandbox: - display_name: DocuSign (Sandbox) - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://account-d.docusign.com/oauth/auth - token_url: https://account-d.docusign.com/oauth/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://demo.docusign.net - post_connection_script: docusignPostConnection - docs: https://nango.dev/docs/integrations/all/docusign-sandbox - -docuware: - display_name: DocuWare - categories: - - productivity - auth_mode: TWO_STEP - token_url: https://${connectionConfig.domain}/DocuWare/Platform/Home/IdentityServiceInfo - body_format: form - token_request_method: GET - token_headers: - content-type: application/x-www-form-urlencoded - additional_steps: - - body_format: form - token_url: ${step1.IdentityServiceUrl}/.well-known/openid-configuration - token_request_method: GET - - body_format: form - token_url: ${step2.token_endpoint} - token_headers: - content-type: application/x-www-form-urlencoded - token_params: - grant_type: password - scope: docuware.platform - client_id: docuware.platform.net.client - username: ${credentials.username} - password: ${credentials.password} - proxy: - base_url: https://${connectionConfig.domain}/DocuWare/Platform - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/integrations/all/docuware - docs_connect: https://nango.dev/docs/integrations/all/docuware/connect - connection_config: - domain: - type: string - title: Domain - description: The domain to your DocuWare account - format: hostname - prefix: https:// - example: example.docuware.cloud - order: 1 - doc_section: '#step-1-finding-your-domain' - credentials: - username: - type: string - title: Username - description: The Username to your DocuWare account - doc_section: '#step-2-finding-your-credentials' - password: - type: string - title: Password - secret: true - description: The Password to your DocuWare account - doc_section: '#step-2-finding-your-credentials' - -domo: - display_name: Domo - categories: - - productivity - - other - auth_mode: OAUTH2_CC - token_url: https://api.domo.com/oauth/token - scope_separator: ',' - token_params: - grant_type: client_credentials - token_request_auth_method: basic - proxy: - base_url: https://api.domo.com - docs: https://nango.dev/docs/api-integrations/domo - docs_connect: https://nango.dev/docs/api-integrations/domo/connect - credentials: - client_id: - type: string - title: Your Client ID - description: The Client ID of your API client - format: uuid - example: 123e4567-e89b-12d3-a456-426614174000 - doc_section: '#step-1-creating-your-api-client' - client_secret: - type: string - title: Your Client Secret - secret: true - example: a14e6b49******************************768ece - pattern: '^[a-fA-F0-9]{64}$' - description: The Client secret of your API client - doc_section: '#step-1-creating-your-api-client' - -dropbox: - display_name: Dropbox - categories: - - knowledge-base - - storage - auth_mode: OAUTH2 - authorization_url: https://www.dropbox.com/oauth2/authorize - token_url: https://api.dropboxapi.com/oauth2/token - authorization_params: - token_access_type: offline - proxy: - base_url: https://api.dropboxapi.com - docs: https://nango.dev/docs/api-integrations/dropbox - setup_guide_url: https://nango.dev/docs/api-integrations/dropbox/how-to-register-your-own-dropbox-api-oauth-app - -dropbox-sign: - display_name: Dropbox Sign - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://app.hellosign.com/oauth/authorize - token_url: https://app.hellosign.com/oauth/token - authorization_url_skip_empty: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - refresh_url: https://app.hellosign.com/oauth/token?refresh - proxy: - retry: - at: - - 'x-ratelimit-reset' - base_url: https://api.hellosign.com - docs: https://nango.dev/docs/integrations/all/dropbox-sign - -drchrono: - display_name: DrChrono - categories: - - other - auth_mode: OAUTH2 - authorization_url: https://app.drchrono.com/o/authorize/ - token_url: https://app.drchrono.com/o/token/ - authorization_url_skip_empty: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://app.drchrono.com - docs: https://nango.dev/docs/integrations/all/drchrono - -drata: - display_name: Drata - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://public-api.drata.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/api-integrations/drata - docs_connect: https://nango.dev/docs/api-integrations/drata/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Drata API key - -cisco-duo-admin: - display_name: Cisco Duo Admin API - categories: - - iam - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.hostname} - headers: - date: '${now:ddd, DD MMM YYYY HH:mm:ss ZZ}' - authorization: "Basic ${base64(${credentials.username}:${hmacSha1Hex(${now:ddd, DD MMM YYYY HH:mm:ss ZZ}\n${method}\n${host}\n${path}\n${params}, ${credentials.password})})}" - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/cisco-duo-admin - docs_connect: https://nango.dev/docs/api-integrations/cisco-duo-admin/connect - connection_config: - hostname: - type: string - title: API Hostname - description: Your Duo API hostname. - example: api-xxxxxxxx.duosecurity.com - pattern: 'api-[a-z0-9]+\.duosecurity\.com' - order: 1 - credentials: - username: - type: string - title: Integration Key - description: Your Duo application's integration key. - example: DIWJ8X6**********TQ1 - pattern: 'DI[A-Z0-9]{18}' - password: - type: string - title: Secret Key - description: Your Duo application's secret key. - example: Zh5eGm**************************zLJ4Ep - pattern: '[A-Za-z0-9]{40}' - -contactout: - display_name: ContactOut - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.contactout.com - headers: - authorization: basic - token: ${apiKey} - retry: - after: - - 'retry-after' - verification: - method: GET - endpoints: - - /v1/stats - docs: https://nango.dev/docs/integrations/all/contactout - docs_connect: https://nango.dev/docs/integrations/all/contactout/connect - credentials: - apiKey: - type: string - title: API Key - example: ab7KxYpR1qLmN9Zs3TvUeFgH - description: Your ContactOut API Key - -drupal: - display_name: Drupal - categories: - - dev-tools - - design - - cms - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.baseUrl}/rest_api/access_token - token_params: - client_id: ${credentials.clientId} - client_secret: ${credentials.clientSecret} - username: ${credentials.userName} - grant_type: client_credentials - token_headers: - content-type: application/x-www-form-urlencoded - accept: application/json - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://${connectionConfig.baseUrl} - docs: https://nango.dev/docs/integrations/all/drupal - docs_connect: https://nango.dev/docs/integrations/all/drupal/connect - credentials: - clientId: - type: string - title: Client ID - description: Your Client ID - secret: true - doc_section: '#step-3-generating-your-drupal-client-credentials' - clientSecret: - type: string - title: Client Secret - description: Your Client Secret - secret: true - doc_section: '#step-3-generating-your-drupal-client-credentials' - userName: - type: string - title: User Name - description: Your Drupal User Name - doc_section: '#step-2-finding-your-drupal-user-name' - connection_config: - baseUrl: - type: string - title: Base Url - description: Your Drupal base url - example: example.drupal.com - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-drupal-base-url' - -dualentry-mcp: - display_name: Dualentry (MCP) - categories: - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://api.dualentry.com/mcp/authorize - token_url: https://api.dualentry.com/mcp/token - registration_url: https://api.dualentry.com/mcp/register - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.dualentry.com - docs: https://nango.dev/docs/api-integrations/dualentry-mcp - -dynatrace: - display_name: Dynatrace - categories: - - analytics - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.environmentId}.live.dynatrace.com - headers: - authorization: Api-Token ${apiKey} - docs: https://nango.dev/docs/api-integrations/dynatrace - docs_connect: https://nango.dev/docs/api-integrations/dynatrace/connect - connection_config: - environmentId: - type: string - title: Environment ID - description: Your Dynatrace environment ID. - pattern: '^[a-z0-9]+$' - example: mew08*** - order: 1 - doc_section: '#step-1-find-your-environment-id' - credentials: - apiKey: - type: string - title: API Token - description: Your Dynatrace API token. - pattern: '^dt0[a-z]\d+\.[A-Z0-9]+\.[A-Z0-9]+$' - example: dt0s01.ST2EY72KQINMH5***********.G3DFPBEJYMODIDAEX454M7YWB*************************** - doc_section: '#step-2-generate-an-api-token' - -dynatrace-oauth: - display_name: Dynatrace (OAuth) - categories: - - analytics - - dev-tools - auth_mode: OAUTH2_CC - token_url: https://sso.dynatrace.com/sso/oauth2/token - scope_separator: ' ' - token_params: - grant_type: client_credentials - resource: urn:dtaccount:${connectionConfig.accountUuid} - proxy: - base_url: https://api.dynatrace.com - docs: https://nango.dev/docs/api-integrations/dynatrace-oauth - docs_connect: https://nango.dev/docs/api-integrations/dynatrace-oauth/connect - connection_config: - accountUuid: - type: string - title: Account UUID - description: Your Dynatrace account UUID. - example: 9a8b7c6d-1234-5678-abcd-ef0123456789 - format: uuid - order: 1 - doc_section: '#step-1-find-your-account-uuid' - credentials: - client_id: - type: string - title: Client ID - description: Your Dynatrace OAuth client ID. - example: dt0s03.**************** - doc_section: '#step-2-create-an-oauth-client' - client_secret: - type: string - title: Client Secret - description: Your Dynatrace OAuth client secret. - secret: true - example: dt0s03.5NJ******.GYWJPBF****************** - doc_section: '#step-2-create-an-oauth-client' - -emarsys: - display_name: Emarsys Core API (WSSE) - categories: - - marketing - auth_mode: SIGNATURE - signature: - protocol: WSSE - proxy: - base_url: https://api.emarsys.net - headers: - content-type: application/json - x-wsse: ${accessToken} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v2/settings - retry: - at: - - 'x-ratelimit-reset' - token: - expires_in_ms: 300000 - docs: https://nango.dev/docs/integrations/all/emarsys - credentials: - username: - type: string - title: ID - description: The ID of your Emarsys WSSE API Credentials - pattern: '^[a-zA-Z0-9_-]+$' - password: - type: string - title: Client Secret - description: The Client Secret of your Emarsys WSSE API Credentials - pattern: '^[a-zA-Z0-9-]+$' - -emarsys-oauth: - display_name: Emarsys (OAuth) - categories: - - marketing - auth_mode: OAUTH2_CC - token_url: https://auth.emarsys.net/oauth2/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.emarsys.net - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/integrations/all/emarsys-oauth - docs_connect: https://nango.dev/docs/integrations/all/emarsys-oauth/connect - -employment-hero: - display_name: Employment Hero - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://oauth.employmenthero.com/oauth2/authorize - token_url: https://oauth.employmenthero.com/oauth2/token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.employmenthero.com/api - docs: https://nango.dev/docs/integrations/all/employment-hero - -ebay: - display_name: eBay - categories: - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://auth.ebay.com/oauth2/authorize - token_url: https://api.ebay.com/identity/v1/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - token_request_auth_method: basic - proxy: - base_url: https://api.ebay.com/ - docs: https://nango.dev/docs/integrations/all/ebay - -ebay-sandbox: - display_name: eBay (Sandbox) - categories: - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://auth.sandbox.ebay.com/oauth2/authorize - token_url: https://api.sandbox.ebay.com/identity/v1/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - token_request_auth_method: basic - proxy: - base_url: https://api.sandbox.ebay.com/ - docs: https://nango.dev/docs/integrations/all/ebay-sandbox - -easypost: - display_name: EasyPost - categories: - - e-commerce - auth_mode: BASIC - proxy: - base_url: https://api.easypost.com - docs: https://nango.dev/docs/api-integrations/easypost - docs_connect: https://nango.dev/docs/api-integrations/easypost/connect - credentials: - username: - type: string - title: API Key - description: Your EasyPost API key. - pattern: '^EZ(AK|TK)[a-zA-Z0-9]+$' - example: EZTK****************************PCHxBDQG3lpZjneEFUxKmg - doc_section: '#step-1-get-your-api-key' - password: - type: string - title: '' - description: '' - hidden: true - default_value: '' - -e-conomic: - display_name: e-conomic - categories: - - accounting - auth_mode: BASIC - proxy: - base_url: https://restapi.e-conomic.com - headers: - content-type: application/json - docs: https://nango.dev/docs/integrations/all/e-conomic - credentials: - username: - type: string - title: Private Token - description: The Private Token for your e-conomic account - password: - type: string - title: Agreement Grant Token - description: The Agreement Grant Token for your e-conomic account - -ecu360: - display_name: ECU360 (Test) - categories: - - other - auth_mode: TWO_STEP - body_format: json - token_url: https://apim-test.ecu360.com/auth/v1/authenticate - token_params: - userName: ${credentials.userName} - password: ${credentials.password} - isEncrypted: false - mfaToken: '' - token_headers: - ecu360-api-key: ${credentials.apiKey} - content-type: application/json - token_response: - token: jwtToken - token_expires_in_ms: 900000 - proxy: - base_url: https://apim-test.ecu360.com - docs: https://nango.dev/docs/api-integrations/ecu360 - docs_connect: https://nango.dev/docs/api-integrations/ecu360/connect - credentials: - apiKey: - type: string - title: API Key - description: Your ECU360 API Key - secret: true - doc_section: '#step-2-obtaining-your-api-key' - userName: - type: string - title: Username - description: Your ECU360 username - doc_section: '#step-1-finding-your-credentials' - password: - type: string - title: Password - description: Your ECU360 password - secret: true - doc_section: '#step-1-finding-your-credentials' - -ecu360-production: - display_name: ECU360 (Production) - categories: - - other - alias: ecu360 - token_url: https://apim.ecu360.com/auth/v1/authenticate - proxy: - base_url: https://apim.ecu360.com - docs: https://nango.dev/docs/api-integrations/ecu360-production - docs_connect: https://nango.dev/docs/api-integrations/ecu360-production/connect - -egnyte: - display_name: Egnyte - categories: - - storage - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.egnyte.com/puboauth/token - token_url: https://${connectionConfig.subdomain}.egnyte.com/puboauth/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.egnyte.com/pubapi - docs: https://nango.dev/docs/integrations/all/egnyte - connection_config: - subdomain: - type: string - title: Egnyte Domain - description: The subdomain of your Egnyte account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .egnyte.com - prefix: https:// - -elevenlabs: - display_name: Eleven Labs - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.elevenlabs.io - headers: - xi-api-key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/user - docs: https://nango.dev/docs/integrations/all/elevenlabs - credentials: - apiKey: - type: string - title: API Key - description: The API key for your ElevenLabs account - -elevio: - display_name: Elevio - categories: - - knowledge-base - - support - auth_mode: API_KEY - proxy: - base_url: https://api.elev.io - headers: - x-api-key: ${apiKey} - authorization: Bearer ${connectionConfig.jwt} - docs: https://nango.dev/docs/integrations/all/elevio - credentials: - apiKey: - type: string - title: API Key - description: The API key to your Elevio account - pattern: '\b[a-f0-9]{40}\b' - example: 'x12z67890dd34t8gq5j01ycc75912348' - connection_config: - jwt: - type: string - title: JWT - description: The JWT to your Elevio account - pattern: '^[A-Za-z0-9-_]+\.([A-Za-z0-9-_]+\.[A-Za-z0-9-_]+)$' - -entrata: - display_name: Entrata - categories: - - other - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.entrata.com - docs: https://nango.dev/docs/integrations/all/entrata - connection_config: - subdomain: - type: string - title: Entrata Domain - description: The subdomain of your Entrata account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .entrata.com - prefix: https:// - -envoy: - display_name: Envoy - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://app.envoy.com/a/auth/v0/authorize - token_url: https://app.envoy.com/a/auth/v0/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.envoy.com - docs: https://nango.dev/docs/integrations/all/envoy - -epc-gov-uk: - display_name: Energy Performance Certificates (Gov.UK) - categories: - - other - auth_mode: API_KEY - proxy: - base_url: https://api.get-energy-performance-data.communities.gov.uk - headers: - authorization: Bearer ${apiKey} - accept: application/json - verification: - method: GET - endpoints: - - /api/codes - docs: https://nango.dev/docs/api-integrations/epc-gov-uk - docs_connect: https://nango.dev/docs/api-integrations/epc-gov-uk/connect - credentials: - apiKey: - type: string - title: API Key - description: The API bearer token of your account. - pattern: '^[A-Za-z0-9]{64}$' - example: 'a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2' - doc_section: '#step-2-finding-your-api-key' - -epic-games: - display_name: Epic Games - categories: - - gaming - auth_mode: OAUTH2 - authorization_url: https://www.epicgames.com/id/authorize - token_url: https://api.epicgames.dev/epic/oauth/v1/token - authorization_method: header - proxy: - base_url: https://api.epicgames.dev - docs: https://nango.dev/docs/integrations/all/epic-games - -evaluagent: - display_name: EvaluAgent - categories: - - support - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.region}.evaluagent.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/ping - docs: https://nango.dev/docs/integrations/all/evaluagent - connection_config: - region: - type: string - title: Region - description: The region of your EvaluAgent account. - enum: - - api - - api.us-east - - api.aus - credentials: - username: - type: string - title: Access Key Id - description: The Access Key ID for your EvaluAgent account - pattern: '^[a-zA-Z0-9-]+$' - password: - type: string - title: Secret Key - description: The Secret Key for your EvaluAgent account - pattern: '^[a-zA-Z0-9-]+$' - -eventbrite: - display_name: Eventbrite - categories: - - marketing - auth_mode: OAUTH2 - authorization_url: https://www.eventbrite.com/oauth/authorize - token_url: https://www.eventbrite.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://www.eventbriteapi.com - docs: https://nango.dev/docs/integrations/all/eventbrite - -everflow: - display_name: Everflow - categories: - - marketing - - analytics - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.eflow.team - headers: - x-eflow-api-key: ${apiKey} - docs: https://nango.dev/docs/api-integrations/everflow - docs_connect: https://nango.dev/docs/api-integrations/everflow/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: Your Everflow API subdomain. - enum: - - api - - api-eu - order: 1 - doc_section: '#step-2-find-your-subdomain' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Everflow account. - doc_section: '#step-1-generate-your-api-key' - -etsy: - display_name: Etsy - categories: - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://www.etsy.com/oauth/connect - token_url: https://api.etsy.com/v3/public/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.etsy.com - headers: - x-api-key: ${clientId}:${clientSecret} - docs: https://nango.dev/docs/api-integrations/etsy - setup_guide_url: https://nango.dev/docs/api-integrations/etsy/how-to-register-your-own-etsy-api-oauth-app - -exa: - display_name: Exa - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://api.exa.ai - headers: - x-api-key: ${apiKey} - docs: https://nango.dev/docs/integrations/all/exa - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Exa account - -exact-online: - display_name: Exact Online - categories: - - accounting - - erp - auth_mode: OAUTH2 - authorization_url: https://start.exactonline.${connectionConfig.extension}/api/oauth2/auth - token_url: https://start.exactonline.${connectionConfig.extension}/api/oauth2/token - authorization_method: header - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - token_expiration_buffer: 30 - proxy: - base_url: https://start.exactonline.${connectionConfig.extension}/ - headers: - accept: application/json - retry: - at: - - 'x-ratelimit-minutely-reset' - - 'x-ratelimit-reset' - error_code: - - '429' - - '503' - paginate: - type: link - link_path_in_response_body: d.__next - docs: https://nango.dev/docs/integrations/all/exact-online - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Exact Online account. - enum: - - nl - - be - - de - - fr - - es - - co.uk - - com - -exist: - display_name: Exist - categories: - - other - auth_mode: OAUTH2 - authorization_url: https://exist.io/oauth2/authorize - token_url: https://exist.io/oauth2/access_token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://exist.io/ - paginate: - type: link - link_path_in_response_body: next - docs: https://nango.dev/docs/integrations/all/exist - -expensify: - display_name: Expensify - categories: - - productivity - auth_mode: BASIC - proxy: - base_url: https://integrations.expensify.com/Integration-Server/ - headers: - content-type: application/x-www-form-urlencoded - credentials: - username: - type: string - title: Partner User ID - description: Your unique account identifier of Expensify - doc_section: '#step-1-finding-your-partneruserid-and-partnerusersecret' - password: - type: string - title: Partner User Secret - description: Unique secret for your account - doc_section: '#step-1-finding-your-partneruserid-and-partnerusersecret' - credentials_verification_script: expensifyCredentialsVerification - docs: https://nango.dev/docs/integrations/all/expensify - docs_connect: https://nango.dev/docs/integrations/all/expensify/connect - -factorial: - display_name: Factorial - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://api.factorialhr.com/oauth/authorize - token_url: https://api.factorialhr.com/oauth/token - disable_pkce: true - proxy: - base_url: https://api.factorialhr.com/api - docs: https://nango.dev/docs/integrations/all/factorial - -fairing: - display_name: Fairing - categories: - - marketing - - analytics - auth_mode: API_KEY - proxy: - base_url: https://app.fairing.co/api - headers: - authorization: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /questions - docs: https://nango.dev/docs/integrations/all/fairing - docs_connect: https://nango.dev/docs/integrations/all/fairing/connect - credentials: - apiKey: - type: string - title: Secret Token - description: The Secret Token for your Fairing account - pattern: '^[A-Za-z0-9_-]{64}$' - example: '3UjYpDjuk70Lt7AxC4M1x_7XvxoxkeX-OV7uTahJowilqLb2eLLvrtlvCGZgku1q' - doc_section: '#step-1-finding-your-secret-token' - -facebook: - display_name: Facebook - categories: - - marketing - - social - auth_mode: OAUTH2 - authorization_url: https://www.facebook.com/v22.0/dialog/oauth - token_url: https://graph.facebook.com/v22.0/oauth/access_token - proxy: - base_url: https://graph.facebook.com - docs: https://nango.dev/docs/api-integrations/facebook - setup_guide_url: https://nango.dev/docs/api-integrations/facebook/how-to-register-your-own-facebook-api-oauth-app - -fanvue: - display_name: Fanvue - categories: - - other - auth_mode: OAUTH2 - authorization_url: https://auth.fanvue.com/oauth2/auth - token_url: https://auth.fanvue.com/oauth2/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - default_scopes: - - offline_access - - offline - scope_separator: ' ' - proxy: - base_url: https://api.fanvue.com - headers: - x-fanvue-api-version: ${connectionConfig.version} || 2025-06-26 - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/fanvue - connection_config: - version: - type: string - title: '' - description: '' - automated: true - -fiber-ai: - display_name: Fiber AI - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://api.fiber.ai - query: - apiKey: ${apiKey} - verification: - method: GET - endpoints: - - /v1/get-org-credits - docs: https://nango.dev/docs/api-integrations/fiber-ai - docs_connect: https://nango.dev/docs/api-integrations/fiber-ai/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Fiber AI API key. - doc_section: '#step-1-getting-your-api-key' - -fathom: - display_name: Fathom - categories: - - communication - - video - auth_mode: API_KEY - proxy: - base_url: https://api.fathom.ai - headers: - x-api-key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /external/v1/teams - webhook_routing_script: fathomWebhookRouting - webhook_user_defined_secret: true - docs: https://nango.dev/docs/integrations/all/fathom - docs_connect: https://nango.dev/docs/integrations/all/fathom/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Fathom account - -fathom-oauth: - display_name: Fathom (OAuth) - categories: - - communication - - video - auth_mode: OAUTH2 - authorization_url: https://fathom.video/external/v1/oauth2/authorize - token_url: https://fathom.video/external/v1/oauth2/token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - webhook_routing_script: fathomWebhookRouting - webhook_user_defined_secret: true - proxy: - base_url: https://api.fathom.ai - retry: - at: - - 'ratelimit-reset' - docs: https://nango.dev/docs/api-integrations/fathom-oauth - setup_guide_url: https://nango.dev/docs/api-integrations/fathom-oauth/how-to-register-your-own-fathom-oauth-app - -fellow: - display_name: Fellow - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.fellow.app/api - headers: - x-api-key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/me - docs: https://nango.dev/docs/api-integrations/fellow - docs_connect: https://nango.dev/docs/api-integrations/fellow/connect - connection_config: - subdomain: - type: string - title: Workspace Subdomain - description: The subdomain of your Fellow workspace - pattern: '^[a-z0-9_-]+$' - example: myworkspace - order: 1 - doc_section: '#step-1-finding-your-workspace-subdomain' - credentials: - apiKey: - type: string - title: API Key - description: Your Fellow API Key - example: ab84bc2056614635866e4a98c153d7a1ab30541032fd433793d402f2a5db2404 - pattern: '^[a-f0-9]{64}$' - doc_section: '#step-2-generating-your-api-key' - -fern: - display_name: Fern (Public API) - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.baseUrl} - headers: - fern_api_key: ${apiKey} - docs: https://nango.dev/docs/api-integrations/fern - docs_connect: https://nango.dev/docs/api-integrations/fern/connect - credentials: - apiKey: - type: string - title: Fern API key - description: Your Fern API key. - doc_section: '#step-1-generate-your-fern-api-key' - connection_config: - baseUrl: - type: string - title: Docs URL - description: The domain of your Fern docs site. - example: docs.example.com - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-2-find-your-docs-url' - -freeagent: - display_name: FreeAgent - categories: - - accounting - - invoicing - auth_mode: OAUTH2 - authorization_url: https://api.freeagent.com/v2/approve_app - token_url: https://api.freeagent.com/v2/token_endpoint - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.freeagent.com - docs: https://nango.dev/docs/api-integrations/freeagent - setup_guide_url: https://nango.dev/docs/api-integrations/freeagent/how-to-register-your-own-freeagent-oauth-app - -freeagent-sandbox: - display_name: FreeAgent (Sandbox) - categories: - - accounting - - invoicing - auth_mode: OAUTH2 - authorization_url: https://api.sandbox.freeagent.com/v2/approve_app - token_url: https://api.sandbox.freeagent.com/v2/token_endpoint - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.sandbox.freeagent.com - docs: https://nango.dev/docs/api-integrations/freeagent-sandbox - setup_guide_url: https://nango.dev/docs/api-integrations/freeagent-sandbox/how-to-register-your-own-freeagent-oauth-app - -freepik: - display_name: Freepik - categories: - - other - auth_mode: API_KEY - proxy: - base_url: https://api.freepik.com - headers: - x-freepik-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v1/resources - docs: https://nango.dev/docs/api-integrations/freepik - docs_connect: https://nango.dev/docs/api-integrations/freepik/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Freepik account. - doc_section: '#step-1-obtain-your-freepik-api-key' - example: FPSXc7b3**********************5b2a - pattern: 'FPSX[0-9a-f]{32}' - -figjam: - display_name: FigJam - categories: - - design - - productivity - alias: figma - docs: https://nango.dev/docs/integrations/all/figjam - -figma: - display_name: Figma - categories: - - design - - productivity - auth_mode: OAUTH2 - authorization_url: https://www.figma.com/oauth - token_url: https://api.figma.com/v1/oauth/token - refresh_url: https://api.figma.com/v1/oauth/refresh - token_request_auth_method: basic - scope_separator: ',' - disable_pkce: true - proxy: - base_url: https://api.figma.com - docs: https://nango.dev/docs/integrations/all/figma - -figma-scim: - display_name: Figma (SCIM) - categories: - - design - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.host}/scim/v2/${connectionConfig.tenantId} - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /Users - docs: https://nango.dev/docs/integrations/all/figma-scim - docs_connect: https://nango.dev/docs/integrations/all/figma-scim/connect - credentials: - apiKey: - type: string - title: API Token - description: The API token for your Figma account - doc_section: '#step-3-generating-your-api-token' - connection_config: - host: - type: string - title: Host - description: The Figma host for your account. - format: hostname - enum: - - www.figma.com - - figma-gov.com - order: 1 - doc_section: '#step-1-finding-your-host' - tenantId: - type: string - title: Tenant ID - description: The tenant ID of your Figma account - order: 2 - doc_section: '#step-2-finding-your-tenant-id' - -falai: - display_name: fal.ai - categories: - - productivity - - dev-tools - auth_mode: API_KEY - proxy: - headers: - authorization: Key ${apiKey} - base_url: https://queue.fal.run - verification: - method: POST - headers: - content-type: application/json - endpoints: - - /fal-ai/fast-sdxl - docs: https://nango.dev/docs/integrations/all/falai - credentials: - apiKey: - type: string - title: API Key - description: The API key for your fal.ai account - -findymail: - display_name: FindyMail - categories: - - marketing - - crm - auth_mode: API_KEY - proxy: - base_url: https://app.findymail.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/findymail - docs_connect: https://nango.dev/docs/integrations/all/findymail/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your FindyMail account - -firefish: - display_name: Firefish - scope_separator: ' ' - categories: - - crm - auth_mode: OAUTH2_CC - token_url: https://api.firefishsoftware.com/authorization/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.firefishsoftware.com - docs: https://nango.dev/docs/integrations/all/firefish - -fireflies: - display_name: Fireflies - categories: - - analytics - - communication - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.fireflies.ai - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /graphql?query=%7B__schema%7Btypes%7Bname%7D%7D%7D - docs: https://nango.dev/docs/integrations/all/fireflies - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Fireflies account - -firstbase: - display_name: Firstbase - categories: - - hr - auth_mode: API_KEY - proxy: - base_url: https://apipub.firstbasehq.com - headers: - authorization: ApiKey ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/orders?size=1 - docs: https://nango.dev/docs/api-integrations/firstbase - docs_connect: https://nango.dev/docs/api-integrations/firstbase/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Firstbase account - doc_section: '#step-1-generating-your-api-key' - -fiserv: - display_name: Fiserv (OAuth) - categories: - - banking - - payment - auth_mode: OAUTH2_CC - token_url: https://cert.api.fiservapps.com/fts-apim/oauth2/v2 - token_request_auth_method: basic - expires_in_unit: milliseconds - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.hostUrl} - docs: https://nango.dev/docs/integrations/all/fiserv - connection_config: - hostUrl: - type: string - title: Domain - description: The domain of your Fiserv account - format: hostname - prefix: https:// - -fiserv-api-key: - display_name: Fiserv (API Key) - categories: - - banking - - payment - auth_mode: API_KEY - proxy: - base_url: https://prod.emea.api.fiservapps.com - headers: - api-key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /sandbox/exp/v1/authorisations - docs: https://nango.dev/docs/integrations/all/fiserv-api-key - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Fiserv account - -fitbit: - display_name: Fitbit - categories: - - sports - auth_mode: OAUTH2 - authorization_url: https://www.fitbit.com/oauth2/authorize - token_url: https://api.fitbit.com/oauth2/token - authorization_method: header - proxy: - base_url: https://api.fitbit.com - docs: https://nango.dev/docs/integrations/all/fitbit - -fillout-api-key: - display_name: Fillout (API Key) - categories: - - surveys - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.hostname} - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v1/api/forms - webhook_routing_script: filloutWebhookRouting - docs: https://nango.dev/docs/integrations/all/fillout-api-key - docs_connect: https://nango.dev/docs/integrations/all/fillout-api-key/connect - connection_config: - hostname: - type: string - title: Hostname - description: The hostname of your Fillout account - example: api.fillout.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-hostname-and-api-key' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Fillout account - example: sk_prod_n5ZEod5AwJQCtG3ncuzgXvpSWx19joz4KMSJlC2nVul9B48zhkCLuPc9Kq97tK7smlOcMChnk1uyaUeZ5Gm4GVrUUnDMxHI7TZH_31032 - pattern: '^sk_prod_[A-Za-z0-9]+_[0-9]+$' - doc_section: '#step-1-finding-your-hostname-and-api-key' - -fillout: - display_name: Fillout (Oauth) - categories: - - surveys - auth_mode: OAUTH2 - authorization_url: https://build.fillout.com/authorize/oauth - token_url: https://server.fillout.com/public/oauth/accessToken - proxy: - base_url: ${connectionConfig.base_url} - token_response_metadata: - - base_url - webhook_routing_script: filloutWebhookRouting - docs: https://nango.dev/docs/integrations/all/fillout - connection_config: - base_url: - type: string - title: '' - description: '' - automated: true - -float: - display_name: Float - categories: - - productivity - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - user-agent: ${connectionConfig.appDetails} || App (support@nango.dev) - base_url: https://api.float.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v3/tasks - docs: https://nango.dev/docs/integrations/all/float - docs_connect: https://nango.dev/docs/integrations/all/float/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Float account - pattern: '^[a-f0-9]{16}[a-zA-Z0-9+/]+=$' - example: c9b38e5af69912d0rq9tE/fbT5/RPLk8Ua7tfHo9s6xMiCKvmCOvenR/Krc= - doc_section: '#step-1-finding-your-api-key' - - connection_config: - appDetails: - type: string - title: App Details - description: The details of your app - automated: true - -folk: - display_name: Folk - categories: - - crm - auth_mode: API_KEY - webhook_routing_script: folkWebhookRouting - webhook_user_defined_secret: true - proxy: - base_url: https://api.folk.app - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'retry-after' - verification: - method: GET - endpoints: - - /v1/users/me - webhook_allowed_query_params: - - nangoConnectionId - docs: https://nango.dev/docs/api-integrations/folk - docs_connect: https://nango.dev/docs/api-integrations/folk/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Folk account - example: 'FOLKLrHVSoYB6TaAF39aNGtEpEi3oxuo' - pattern: '^FOLK[a-zA-Z0-9]+$' - doc_section: '#step-1-generating-your-api-key' - -followupboss: - display_name: Follow Up Boss - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://app.followupboss.com/oauth/authorize - token_url: https://app.followupboss.com/oauth/token - disable_pkce: true - authorization_params: - response_type: auth_code - proxy: - base_url: https://api.followupboss.com - docs: https://nango.dev/docs/api-integrations/followupboss - setup_guide_url: https://nango.dev/docs/api-integrations/followupboss/how-to-register-your-own-followupboss-oauth-app - -fortnox: - display_name: Fortnox - categories: - - accounting - - invoicing - auth_mode: OAUTH2 - authorization_url: https://apps.fortnox.se/oauth-v1/auth - token_url: https://apps.fortnox.se/oauth-v1/token - token_request_auth_method: basic - scope_separator: ' ' - authorization_params: - response_type: code - access_type: offline - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.fortnox.se/3 - docs: https://nango.dev/docs/integrations/all/fortnox - -freshbooks: - display_name: FreshBooks - categories: - - accounting - auth_mode: OAUTH2 - authorization_url: https://auth.freshbooks.com/oauth/authorize - token_url: https://api.freshbooks.com/auth/oauth/token - authorization_params: - response_type: code - proxy: - base_url: https://api.freshbooks.com - docs: https://nango.dev/docs/integrations/all/freshbooks - -freshdesk: - display_name: FreshDesk - categories: - - support - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.freshdesk.com - verification: - headers: - content-type: application/json - endpoints: - - /api/v2/settings/helpdesk - docs: https://nango.dev/docs/api-integrations/freshdesk - docs_connect: https://nango.dev/docs/api-integrations/freshdesk/connect - credentials: - username: - type: string - title: FreshDesk API Key - description: The API Key of your FreshDesk account - doc_section: '#step-1-finding-your-freshdesk-api-key' - secret: true - password: - type: string - title: '' - description: '' - default_value: X - hidden: true - connection_config: - subdomain: - type: string - title: FreshDesk Domain - description: The subdomain of your FreshDesk account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .freshdesk.com - prefix: https:// - doc_section: '#step-2-finding-your-freshdesk-domain' - -freshsales: - display_name: Freshsales - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.bundleAlias} || https://${connectionConfig.subdomain}.freshsales.io - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/settings/leads/fields - headers: - authorization: Token token=${apiKey} - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/freshsales - docs_connect: https://nango.dev/docs/api-integrations/freshsales/connect - connection_config: - bundleAlias: - type: string - title: Bundle Alias - description: The bundle alias for your Freshsales account - prefix: https:// - example: acme.myfreshworks.com/crm/sales - doc_section: '#step-2-finding-your-bundle-alias' - subdomain: - type: string - title: '' - description: '' - default_value: '' - hidden: true # deprecating this in favor of bundleAlias - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Freshsales account - example: 4oBqA_AzM_G3xbW3TJGvrA - pattern: '[A-Za-z0-9_-]+' - doc_section: '#step-1-finding-your-freshsales-api-key' - -freshservice: - display_name: Freshservice - categories: - - support - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.freshservice.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v2/tickets - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/freshservice - docs_connect: https://nango.dev/docs/integrations/all/freshservice/connect - connection_config: - subdomain: - type: string - title: Freshservice subdomain - description: The subdomain of your Freshservice account - pattern: '^[a-z0-9_-]+$' - example: subdomain - suffix: .freshservice.com - prefix: https:// - doc_section: '#step-2-finding-your-freshservice-subdomain' - credentials: - username: - type: string - title: API key - description: The API Key of your Freshservice account - secret: true - doc_section: '#step-1-finding-your-freshservice-api-key' - password: - type: string - title: '' - description: '' - # https://api.freshservice.com/#authentication - # FreshService is using basic auth with an api key, the basic username/password was deprecated - default_value: 'X' - hidden: true - -freshteam: - display_name: Freshteam - categories: - - hr - - ats - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.accountName}.freshteam.com - headers: - authorization: Bearer ${apiKey} - accept: application/json - docs: https://nango.dev/docs/integrations/all/freshteam - docs_connect: https://nango.dev/docs/integrations/all/freshteam/connect - connection_config: - accountName: - type: string - title: Account Name - description: The account name of your Freshteam account - example: nango - format: hostname - suffix: .freshteam.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-account-name' - credentials: - apiKey: - type: string - title: API Key - description: The API key to your Freshteam account - doc_section: '#step-2-finding-your-api-key' - example: 'XtoF94LMNyKPbd5AvR1QJh' - pattern: '^[a-zA-Z0-9_!@#$%^&*()\\-+=]+$' - -freshworks: - display_name: Freshworks - categories: - - crm - - support - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.hostname}/org/oauth/v2/authorize - token_url: https://${connectionConfig.hostname}/org/oauth/v2/token - disable_pkce: true - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.bundleAlias} - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/freshworks - docs_connect: https://nango.dev/docs/api-integrations/freshworks/connect - connection_config: - hostname: - type: string - title: Freshworks Hostname - description: The hostname of your Freshworks account. - format: hostname - example: acme.myfreshworks.com - prefix: https:// - doc_section: '#step-1-finding-your-freshworks-hostname' - bundleAlias: - type: string - title: API Hostname - description: The hostname of your Freshworks product used for API calls. - format: hostname - example: acme.freshservice.com - prefix: https:// - doc_section: '#step-2-finding-your-api-hostname' - -front: - display_name: Front - categories: - - support - - ticketing - auth_mode: OAUTH2 - authorization_url: https://app.frontapp.com/oauth/authorize - token_url: https://app.frontapp.com/oauth/token - proxy: - base_url: https://api2.frontapp.com - retry: - after: - - 'retry-after' - paginate: - type: link - response_path: _results - link_path_in_response_body: _pagination.next - docs: https://nango.dev/docs/integrations/all/front - -front-api-key: - display_name: Front (API Key) - categories: - - support - - ticketing - auth_mode: API_KEY - proxy: - base_url: https://api2.frontapp.com - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'retry-after' - verification: - method: GET - endpoints: - - /me - docs: https://nango.dev/docs/api-integrations/front-api-key - docs_connect: https://nango.dev/docs/api-integrations/front-api-key/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Front API token. - example: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.**** - doc_section: '#step-1-finding-your-api-token' - -fullenrich: - display_name: FullEnrich - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://app.fullenrich.com/api - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v2/account/credits - docs: https://nango.dev/docs/api-integrations/fullenrich - docs_connect: https://nango.dev/docs/api-integrations/fullenrich/connect - credentials: - apiKey: - type: string - title: API Key - description: Your FullEnrich API key. - example: 123e4567-e89b-12d3-a456-426614174000 - format: uuid - doc_section: '#step-1-getting-your-api-key' - -gainsight-cc: - display_name: Gainsight CC - categories: - - support - - crm - auth_mode: OAUTH2_CC - token_url: https://api2-${connectionConfig.region}.insided.com/oauth2/token - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://api2-${connectionConfig.region}.insided.com - docs: https://nango.dev/docs/integrations/all/gainsight-cc - docs_connect: https://nango.dev/docs/integrations/all/gainsight-cc/connect - connection_config: - region: - type: string - title: Region - description: The region of your Gainsight account - example: eu-west-1 - pattern: '^[a-z]{2}-[a-z]+-[1-9]$' - doc_section: '#step-2-finding-your-region' - -garmin: - display_name: Garmin - categories: - - sports - auth_mode: OAUTH1 - request_url: https://connectapi.garmin.com/oauth-service/oauth/request_token - authorization_url: https://connect.garmin.com/oauthConfirm - token_url: https://connectapi.garmin.com/oauth-service/oauth/access_token - signature_method: 'HMAC-SHA1' - proxy: - base_url: https://apis.garmin.com - docs: https://nango.dev/docs/integrations/all/garmin - -gebruder-weiss: - display_name: GebrΓΌder Weiss - categories: - - erp - auth_mode: OAUTH2_CC - authorization_url: https://my.api.gw-world.com/authorize - token_url: https://my.api.gw-world.com/token - token_request_auth_method: basic - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - headers: - accept-language: en-US - base_url: https://my.api.gw-world.com - docs: https://nango.dev/docs/integrations/all/gebruder-weiss - -google-gemini: - display_name: Google Gemini - categories: - - productivity - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://generativelanguage.googleapis.com - query: - key: ${apiKey} - headers: - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/models - docs: https://nango.dev/docs/api-integrations/google-gemini - docs_connect: https://nango.dev/docs/api-integrations/google-gemini/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Gemini account - doc_section: '#step-1-generating-your-api-key' - example: 'AQ.Ab8RN6I5RF**********-0Fe3mTuqX3**' - pattern: '^[0-9A-Za-z_.\-]+$' - -gem: - display_name: Gem - categories: - - ats - auth_mode: API_KEY - proxy: - base_url: https://api.gem.com - headers: - x-api-key: ${apiKey} - x-application-secret: ${connectionConfig.appSecret} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v0/users - docs: https://nango.dev/docs/integrations/all/gem - docs_connect: https://nango.dev/docs/integrations/all/gem/connect - credentials: - apiKey: - type: string - title: Shareable Access Key - description: The Shareable Access Key for your Integration - example: Xk9t3HZbWqLp7AeGvM4sUdYjBnR2TfQxCVi81oNz - pattern: '^[a-zA-Z0-9]{40}$' - doc_section: '#step-1-finding-your-shareable-access-key' - connection_config: - appSecret: - type: string - title: '' - description: '' - hidden: true - -gerrit: - display_name: Gerrit - categories: - - dev-tools - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.host} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /config/server/version - docs: https://nango.dev/docs/integrations/all/gerrit - docs_connect: https://nango.dev/docs/integrations/all/gerrit/connect - connection_config: - host: - type: string - title: Gerrit Host - description: The host to where you Gerrit instance is hosted - pattern: '^https?:\/\/[a-z0-9.-]+(:\d+)?(\/.*)?$' - example: http://localhost:8080 - doc_section: '#step-1-finding-your-host' - order: 1 - -getty-images: - display_name: Getty Images - categories: - - design - auth_mode: OAUTH2 - authorization_url: https://authentication.gettyimages.com/oauth2/auth - token_url: https://authentication.gettyimages.com/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.gettyimages.com - headers: - api-key: ${clientId} - docs: https://nango.dev/docs/api-integrations/getty-images - setup_guide_url: https://nango.dev/docs/api-integrations/getty-images/how-to-register-your-own-getty-images-oauth-app - -grammarly: - display_name: Grammarly - categories: - - productivity - auth_mode: OAUTH2_CC - token_url: https://auth.grammarly.com/v4/api/oauth2/token - scope_separator: ',' - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.grammarly.com/ecosystem/api - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/analytics/users - docs: https://nango.dev/docs/integrations/all/grammarly - -grammarly-scim: - display_name: Grammarly SCIM - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://sso.grammarly.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/scim/Users - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/grammarly-scim - docs_connect: https://nango.dev/docs/integrations/all/grammarly-scim/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Grammarly account - doc_section: '#step-1-finding-grammarly-scim-credentials' - example: 'Xk9t3HZbWqLp7AeGvM4sUdYjBnR2TfQxCVi81oNz' - -granola: - display_name: Granola - categories: - - productivity - - knowledge-base - auth_mode: API_KEY - proxy: - base_url: https://public-api.granola.ai - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v1/notes?page_size=1 - docs: https://nango.dev/docs/api-integrations/granola - docs_connect: https://nango.dev/docs/api-integrations/granola/connect - credentials: - apiKey: - type: string - title: API Token - description: The API key for your Granola account - example: grn_2isA***************_7HRD*********************** - pattern: '^grn_[A-Za-z0-9]+_[A-Za-z0-9]+$' - doc_section: '#step-1-generating-your-granola-api-token' - -granola-mcp: - display_name: Granola (MCP) - categories: - - productivity - - knowledge-base - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://mcp-auth.granola.ai/oauth2/authorize - token_url: https://mcp-auth.granola.ai/oauth2/token - registration_url: https://mcp-auth.granola.ai/oauth2/register - default_scopes: - - offline_access - authorization_params: - response_type: code - resource: https://mcp.granola.ai/ - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - headers: - accept: application/json,text/event-stream - base_url: https://mcp.granola.ai - docs: https://nango.dev/docs/api-integrations/granola-mcp - -guru: - display_name: Guru - categories: - - knowledge-base - auth_mode: BASIC - proxy: - base_url: https://api.getguru.com/api/v1 - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /whoami - docs: https://nango.dev/docs/integrations/all/guru - docs_connect: https://nango.dev/docs/integrations/all/guru/connect - credentials: - username: - type: string - title: User/Collection ID - description: The user or collection ID of your Guru account - doc_section: '#step-1-finding-your-user-collection-id' - password: - type: string - title: User/Collection Token - description: The user or collection token of your Guru account - secret: true - format: uuid - example: 123e4567-e89b-12d3-a456-426614174000 - doc_section: '#step-2-generating-your-user-collection-token' - -guru-scim: - display_name: Guru (SCIM) - categories: - - knowledge-base - auth_mode: BASIC - proxy: - base_url: https://api.getguru.com/api/scim - headers: - content-type: application/scim+json - verification: - method: GET - endpoints: - - /v2/Users - headers: - content-type: application/scim+json - docs: https://nango.dev/docs/integrations/all/guru-scim - docs_connect: https://nango.dev/docs/integrations/all/guru-scim/connect - credentials: - username: - type: string - title: SCIM Username - description: The SCIM username for your Guru account - doc_section: '#step-1-finding-guru-scim-credentials' - password: - type: string - title: SCIM Token - description: The SCIM token for your Guru account - doc_section: '#step-1-finding-guru-scim-credentials' - -github: - display_name: GitHub (User OAuth) - categories: - - dev-tools - - support - - ticketing - auth_mode: OAUTH2 - authorization_url: https://github.com/login/oauth/authorize - token_url: https://github.com/login/oauth/access_token - proxy: - base_url: https://api.github.com - retry: - at: - - 'x-ratelimit-reset' - remaining: 'x-ratelimit-remaining' - error_code: - - '403' - - '5xx' - - '401' - - '429' - paginate: - type: link - limit_name_in_request: per_page - link_rel_in_response_header: next - docs: https://nango.dev/docs/api-integrations/github - setup_guide_url: https://nango.dev/docs/api-integrations/github/how-to-register-your-own-github-api-oauth-app - -github-app: - display_name: GitHub (App) - categories: - - dev-tools - - popular - - ticketing - alias: github - auth_mode: APP - authorization_url: ${connectionConfig.appPublicLink}/installations/new - token_url: https://api.github.com/app/installations/${connectionConfig.installation_id}/access_tokens - webhook_routing_script: githubAppWebhookRouting - docs: https://nango.dev/docs/api-integrations/github-app - setup_guide_url: https://nango.dev/docs/api-integrations/github-app/how-to-register-your-own-github-app-api-app - connection_config: - appPublicLink: - type: string - title: App Public Link - description: The public link of your GitHub App - format: uri - pattern: '^https?://.*$' - automated: true - installation_id: - type: string - title: Installation ID - description: The installation ID of your GitHub App - example: '38631545' - automated: true - -github-app-oauth: - display_name: GitHub (App OAuth) - categories: - - dev-tools - - ticketing - alias: github - auth_mode: CUSTOM - authorization_url: ${connectionConfig.appPublicLink}/installations/new - authorization_url_skip_encode: - - base_url - token_url: - OAUTH2: https://github.com/login/oauth/access_token - APP: https://api.github.com/app/installations/${connectionConfig.installation_id}/access_tokens - webhook_routing_script: githubAppOauthWebhookRouting - post_connection_script: githubAppOauthPostConnection - docs: https://nango.dev/docs/api-integrations/github-app-oauth - setup_guide_url: https://nango.dev/docs/api-integrations/github-app-oauth/how-to-register-your-own-github-app-api-oauth-app - connection_config: - appPublicLink: - type: string - title: App Public Link - description: The public link of your GitHub App - format: uri - pattern: '^https?://.*$' - automated: true - installation_id: - type: string - title: Installation ID - description: The installation ID of your GitHub App - example: '38631545' - automated: true - -github-pat: - display_name: Github (Personal Access Token) - categories: - - dev-tools - - ticketing - auth_mode: API_KEY - proxy: - base_url: https://api.github.com - retry: - at: - - 'x-ratelimit-reset' - remaining: 'x-ratelimit-remaining' - error_code: - - '403' - - '5xx' - - '401' - - '429' - headers: - authorization: Bearer ${apiKey} - x-github-api-version: ${connectionConfig.version} || 2022-11-28 - accept: application/vnd.github+json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /user - docs: https://nango.dev/docs/integrations/all/github-pat - docs_connect: https://nango.dev/docs/integrations/all/github-pat/connect - connection_config: - version: - type: string - title: '' - description: '' - automated: true - credentials: - apiKey: - type: string - title: Personal Access Token - description: The Personal Access Token to your Github account - pattern: '^(?:github_pat|ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{36,255}$' - example: 'github_pat_***********************xRIoxmseCYRHDDIOFfTOyKex' - doc_section: '#step-1-finding-your-personal-access-token' - -gitlab: - display_name: GitLab - categories: - - dev-tools - - ticketing - auth_mode: OAUTH2 - authorization_url: https://gitlab.com/oauth/authorize - token_url: https://gitlab.com/oauth/token - authorization_params: - response_type: code - proxy: - base_url: https://gitlab.com - docs: https://nango.dev/docs/integrations/all/gitlab - -gitlab-pat: - display_name: GitLab (Personal Access Token) - categories: - - dev-tools - - ticketing - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.hostname} - headers: - private-token: ${apiKey} - retry: - at: - - 'x-ratelimit-reset' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v4/users - docs: https://nango.dev/docs/integrations/all/gitlab-pat - docs_connect: https://nango.dev/docs/integrations/all/gitlab-pat/connect - credentials: - apiKey: - type: string - title: Personal Access Token - example: glpat-PMJoma_*******.***.***xwve - pattern: '^glpat-[A-Za-z0-9._-]+$' - description: The Personal Access Token for your GitLab account - doc_section: '#step-2-creating-your-personal-access-token' - connection_config: - hostname: - type: string - title: Hostname - description: The hostname of your Gitlab instance - format: hostname - example: gitlab.com - doc_section: '#step-1-finding-your-hostname' - order: 1 - -ghost-admin: - display_name: Ghost (Admin API) - categories: - - dev-tools - - design - - cms - auth_mode: JWT - signature: - protocol: HMAC - token: - signing_key: ${credentials.privateKey.secret} - expires_in_ms: 300000 - header: - alg: HS256 - kid: ${credentials.privateKey.id} - payload: - aud: /admin/ - proxy: - headers: - accept: application/json - accept-version: ${connectionConfig.version} - authorization: Ghost ${accessToken} - base_url: https://${connectionConfig.adminDomain}/ghost/api/admin/ - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /users - docs: https://nango.dev/docs/integrations/all/ghost-admin - connection_config: - adminDomain: - type: string - title: Ghost Admin Domain - description: The domain of your Ghost Admin which can be different from your main domain - example: 'mock.ghost.io' - pattern: '^([a-z0-9_-]+\.|)(ghost\.io|[a-z0-9_-]+\.[a-z]{2,})$' - order: 1 - version: - type: string - title: API Version - description: The version of the Ghost Admin API to use - example: 'v3.0' - pattern: '^v\d+\.\d+$' - order: 2 - credentials: - privateKey: - type: string - title: API Key - description: The private key for your Ghost account - pattern: '^[a-fA-F0-9]{24}:[a-fA-F0-9]{64}$' - example: 1234567890abcdef12345678:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890 - -ghost-content: - display_name: Ghost (Content API) - categories: - - dev-tools - - design - - cms - auth_mode: API_KEY - proxy: - headers: - accept-version: ${connectionConfig.version} - base_url: https://${connectionConfig.adminDomain}/ghost/api/content/ - query: - key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /tags - docs: https://nango.dev/docs/integrations/all/ghost-content - connection_config: - version: - type: string - title: API Version - description: The version of the Ghost Admin API to use - example: 'v3.0' - pattern: '^v\d+\.\d+$' - adminDomain: - type: string - title: Ghost Admin Domain - description: The domain of your Ghost Admin which can be different from your main domain - example: 'mock.ghost.io' - pattern: '^([a-z0-9_-]+\.|)(ghost\.io|[a-z0-9_-]+\.[a-z]{2,})$' - credentials: - apiKey: - type: string - title: API Key - description: The content API key for your Ghost account - pattern: '^[a-zA-Z0-9]{26}$' - example: a1b2c3d4e5f6g7h8i9j0k1l2m3 - -gong: - display_name: Gong (Basic Auth) - categories: - - communication - - marketing - - productivity - - video - auth_mode: BASIC - proxy: - base_url: https://api.gong.io - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/gong - docs_connect: https://nango.dev/docs/integrations/all/gong/connect - credentials: - username: - type: string - title: Access Key - description: Your Gong Access Key - pattern: '^[a-zA-Z0-9-]+$' - doc_section: '#step-1-finding-gong-api-key-and-api-key-secret' - password: - type: string - title: Access Key Secret - description: Your Gong Access Key Secret - default_value: '' - doc_section: '#step-1-finding-gong-api-key-and-api-key-secret' - -gong-oauth: - display_name: Gong (Oauth) - auth_mode: OAUTH2 - categories: - - communication - - marketing - - productivity - - video - - popular - authorization_url: https://app.gong.io/oauth2/authorize - token_url: https://app.gong.io/oauth2/generate-customer-token - token_response_metadata: - - api_base_url_for_customer - authorization_params: - response_type: code - access_type: offline - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - disable_pkce: true - token_request_auth_method: basic - proxy: - base_url: ${connectionConfig.api_base_url_for_customer} || https://api.gong.io - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/gong-oauth - connection_config: - api_base_url_for_customer: - type: string - title: API Base URL - description: The base URL of your Gong account - format: uri - automated: true - pattern: '^https?://.*$' - -glyphic: - display_name: Glyphic - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://api.glyphic.ai - headers: - x-api-key: ${apiKey} - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/test/ping - docs: https://nango.dev/docs/api-integrations/glyphic - docs_connect: https://nango.dev/docs/api-integrations/glyphic/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Glyphic API key - doc_section: '#step-1-getting-your-api-key' - -gamma: - display_name: Gamma - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://public-api.gamma.app - headers: - x-api-key: ${apiKey} - content-type: application/json - verification: - method: GET - headers: - accept: application/json - endpoints: - - /v1.0/folders - docs: https://nango.dev/docs/api-integrations/gamma - docs_connect: https://nango.dev/docs/api-integrations/gamma/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Gamma API key. - example: 'sk-gamma-xxxxxxxx' - pattern: '^sk-gamma-' - doc_section: '#step-1-getting-your-gamma-api-key' - -google: - display_name: Google - categories: - - communication - - dev-tools - - productivity - - social - auth_mode: OAUTH2 - authorization_url: https://accounts.google.com/o/oauth2/v2/auth - token_url: https://oauth2.googleapis.com/token - authorization_params: - response_type: code - access_type: offline - prompt: consent - proxy: - retry: - in_body: - path: error.message - value: /User-rate limit exceeded\. +Retry after (.+)/ - strategy: at - base_url: https://www.googleapis.com - paginate: - type: cursor - cursor_path_in_response: nextPageToken - limit_name_in_request: maxSize - cursor_name_in_request: pageToken - response_path: items - docs: https://nango.dev/docs/api-integrations/google - setup_guide_url: https://nango.dev/docs/api-integrations/google/how-to-register-your-own-google-api-oauth-app - webhook_routing_script: googleWebhookRouting - -google-analytics: - display_name: Google Analytics - alias: google - categories: - - analytics - docs: https://nango.dev/docs/api-integrations/google-analytics - setup_guide_url: https://nango.dev/docs/api-integrations/google-analytics/how-to-register-your-own-google-analytics-api-oauth-app - -google-bigquery: - display_name: Google BigQuery - categories: - - productivity - alias: google - proxy: - base_url: https://bigquery.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-bigquery - setup_guide_url: https://nango.dev/docs/api-integrations/google-bigquery/how-to-register-your-own-google-bigquery-api-oauth-app - -google-calendar: - display_name: Google Calendar - categories: - - popular - - productivity - alias: google - proxy: - base_url: https://www.googleapis.com - paginate: - type: cursor - cursor_path_in_response: nextPageToken - limit_name_in_request: maxSize - cursor_name_in_request: pageToken - response_path: items - retry: - error_code: - - '403' - - '5xx' - - '401' - - '429' - webhook_routing_script: googleCalendarWebhookRouting - post_connection_script: googleCalendarPostConnection - docs: https://nango.dev/docs/api-integrations/google-calendar - setup_guide_url: https://nango.dev/docs/api-integrations/google-calendar/how-to-register-your-own-google-calendar-api-oauth-app - -google-contacts: - display_name: Google Contacts - categories: - - productivity - alias: google - proxy: - base_url: https://people.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-contacts - setup_guide_url: https://nango.dev/docs/api-integrations/google-contacts/how-to-register-your-own-google-contacts-api-oauth-app - -google-chat: - display_name: Google Chat - alias: google - categories: - - productivity - proxy: - base_url: https://chat.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-chat - setup_guide_url: https://nango.dev/docs/api-integrations/google-chat/how-to-register-your-own-google-chat-api-oauth-app - -google-docs: - display_name: Google Docs - categories: - - productivity - alias: google - proxy: - base_url: https://docs.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-docs - setup_guide_url: https://nango.dev/docs/api-integrations/google-docs/how-to-register-your-own-google-docs-api-oauth-app - -google-mail: - display_name: Gmail - categories: - - popular - - productivity - alias: google - proxy: - base_url: https://gmail.googleapis.com - webhook_routing_script: gmailWebhookRouting - post_connection_script: googleMailPostConnection - docs: https://nango.dev/docs/api-integrations/google-mail - setup_guide_url: https://nango.dev/docs/api-integrations/google-mail/how-to-register-your-own-gmail-api-oauth-app - -google-maps: - display_name: Google Maps - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://maps.googleapis.com - query: - key: ${apiKey} - docs: https://nango.dev/docs/api-integrations/google-maps - docs_connect: https://nango.dev/docs/api-integrations/google-maps/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Google Maps API Key. - example: AIzaSyAY4P9A***************1YMSYBI - pattern: ^AIza[0-9A-Za-z\-_]+$ - doc_section: '#step-3-obtain-your-google-maps-api-key' - -google-search-console: - display_name: Google Search Console - alias: google - categories: - - productivity - proxy: - base_url: https://www.googleapis.com/webmasters - docs: https://nango.dev/docs/api-integrations/google-search-console - setup_guide_url: https://nango.dev/docs/api-integrations/google-search-console/how-to-register-your-own-google-search-console-oauth-app - -google-sheet: - display_name: Google Sheet - categories: - - productivity - alias: google - proxy: - base_url: https://sheets.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-sheet - setup_guide_url: https://nango.dev/docs/api-integrations/google-sheet/how-to-register-your-own-google-sheet-api-oauth-app - -google-slides: - display_name: Google Slides - categories: - - productivity - alias: google - proxy: - base_url: https://slides.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-slides - setup_guide_url: https://nango.dev/docs/api-integrations/google-slides/how-to-register-your-own-google-slides-api-oauth-app - -google-drive: - display_name: Google Drive - categories: - - knowledge-base - - popular - - storage - alias: google - docs: https://nango.dev/docs/api-integrations/google-drive - setup_guide_url: https://nango.dev/docs/api-integrations/google-drive/how-to-register-your-own-google-drive-api-oauth-app - -google-forms: - display_name: Google Forms - categories: - - productivity - alias: google - proxy: - base_url: https://forms.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-forms - setup_guide_url: https://nango.dev/docs/api-integrations/google-forms/how-to-register-your-own-google-forms-api-oauth-app - -google-tasks: - display_name: Google Tasks - categories: - - productivity - alias: google - proxy: - base_url: https://tasks.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-tasks - setup_guide_url: https://nango.dev/docs/api-integrations/google-tasks/how-to-register-your-own-google-tasks-api-oauth-app - -google-meet: - display_name: Google Meet - categories: - - communication - - productivity - alias: google - proxy: - base_url: https://meet.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-meet - setup_guide_url: https://nango.dev/docs/api-integrations/google-meet/how-to-register-your-own-google-meet-api-oauth-app - -google-ads: - display_name: Google Ads - categories: - - marketing - alias: google - token_url: https://www.googleapis.com/oauth2/v3/token - proxy: - base_url: https://googleads.googleapis.com - paginate: - type: cursor - cursor_path_in_response: nextPageToken - limit_name_in_request: pageSize - cursor_name_in_request: pageToken - response_path: results - docs: https://nango.dev/docs/api-integrations/google-ads - setup_guide_url: https://nango.dev/docs/api-integrations/google-ads/how-to-register-your-own-google-ads-api-oauth-app - -google-play: - display_name: Google Play - categories: - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://accounts.google.com/o/oauth2/auth - token_url: https://accounts.google.com/o/oauth2/token - authorization_params: - response_type: code - access_type: offline - prompt: consent - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://play.googleapis.com - docs: https://nango.dev/docs/integrations/all/google-play - -google-cloud-storage: - display_name: Google Cloud Storage - alias: google - categories: - - storage - docs: https://nango.dev/docs/api-integrations/google-cloud-storage - setup_guide_url: https://nango.dev/docs/api-integrations/google-cloud-storage/how-to-register-your-own-google-cloud-storage-api-oauth-app - -google-workspace-admin: - display_name: Google Workspace Admin - alias: google - categories: - - productivity - proxy: - base_url: https://admin.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-workspace-admin - setup_guide_url: https://nango.dev/docs/api-integrations/google-workspace-admin/how-to-register-your-own-google-workspace-admin-api-oauth-app - -google-service-account: - display_name: Google Service Account - categories: - - dev-tools - auth_mode: TWO_STEP - signature: - protocol: RSA - body_format: form - token: - signing_key: ${credentials.privateKey} - expires_in_ms: 3600000 - header: - alg: RS256 - typ: JWT - payload: - iss: ${credentials.serviceAccountEmailAddress} - scope: ${credentials.scopes} - aud: https://oauth2.googleapis.com/token - sub: ${credentials.delegatedAccessEmailAddress} - token_url: https://oauth2.googleapis.com/token - token_params: - grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer - assertion: ${token} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://www.googleapis.com - docs: https://nango.dev/docs/integrations/all/google-service-account - docs_connect: https://nango.dev/docs/integrations/all/google-service-account/connect - credentials: - serviceAccountEmailAddress: - type: string - title: Service Account Email Address - description: The email address of the service account - pattern: '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.iam\.gserviceaccount\.com$' - example: 'test@project.iam.gserviceaccount.com' - doc_section: '#step-1-create-a-service-account' - scopes: - type: string - title: Scopes - description: Scopes that your application should be granted access to - pattern: '^https://[^\s]+( https://[^\s]+)*$' - example: 'https://www.googleapis.com/auth/drive' - doc_section: '#step-4-finding-your-applications-scopes' - privateKey: - type: string - title: Private Key - description: The private key associated with your Google service account - example: '-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n-----END PRIVATE KEY-----' - pattern: '^-----BEGIN PRIVATE KEY-----\\n([A-Za-z0-9+/=\\n]+)\\n-----END PRIVATE KEY-----\\n?$' - doc_section: '#step-3-delegate-domain-wide-authority-optional-for-google-workspace' - delegatedAccessEmailAddress: - type: string - title: Delegated Access Email Address - description: The email address of the user for which the application is requesting delegated access - format: email - example: 'some.user@example.com' - optional: true - doc_section: '#step-2-generate-a-service-account-key' - -gorgias: - display_name: Gorgias - categories: - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.gorgias.com/oauth/authorize - token_url: https://${connectionConfig.subdomain}.gorgias.com/oauth/token - token_request_auth_method: basic - default_scopes: - - offline - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.gorgias.com - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/gorgias - connection_config: - subdomain: - type: string - title: Gorgias Domain - description: The subdomain of your Gorgias account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .gorgias.com - prefix: https:// - -gorgias-basic: - display_name: Gorgias (Basic Auth) - auth_mode: BASIC - categories: - - e-commerce - proxy: - base_url: https://${connectionConfig.subdomain}.gorgias.com - docs: https://nango.dev/docs/integrations/all/gorgias-basic - docs_connect: https://nango.dev/docs/integrations/all/gorgias-basic/connect - credentials: - username: - type: string - title: Username - description: Your Gorgias account Username - password: - type: string - title: API Key - description: Your Gorgias API Key - default_value: '' - doc_section: '#step-1-finding-gorgias-api-key-secret' - connection_config: - subdomain: - type: string - title: Gorgias Domain - description: The subdomain of your Gorgias account - pattern: '^[a-z0-9_-]+$' - prefix: https:// - order: 1 - -grafana: - display_name: Grafana - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.domain} - verification: - headers: - content-type: application/json - endpoints: - - /api/access-control/user/permissions - method: GET - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/grafana - docs_connect: https://nango.dev/docs/integrations/all/grafana/connect - connection_config: - domain: - type: string - title: Domain - description: Your Grafana domain - example: example.grafana.net - prefix: https:// - format: hostname - order: 1 - doc_section: '#step-1-finding-your-domain' - credentials: - apiKey: - type: string - title: Token - description: The Token for your Grafana service account - example: glsa_***************************************** - pattern: '^[A-Za-z0-9_-]+$' - doc_section: '#step-2-generating-your-service-account-token' - -grain: - display_name: Grain (OAuth) - categories: - - video - - communication - - productivity - auth_mode: OAUTH2 - authorization_url: https://grain.com/_/public-api/oauth2/authorize - token_url: https://api.grain.com/_/public-api/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://api.grain.com - docs: https://nango.dev/docs/integrations/all/grain - -grain-api-key: - display_name: Grain (API Key) - categories: - - video - - communication - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.grain.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /_/public-api/me - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/grain-api-key - credentials: - apiKey: - type: string - title: API Key - description: The personal access token to your Grain account - -greenhouse: - display_name: Greenhouse (OAuth) - categories: - - ats - auth_mode: OAUTH2 - authorization_url: https://api.greenhouse.io/oauth/authorize - token_url: https://api.greenhouse.io/oauth/token - proxy: - base_url: https://${connectionConfig.resource}.greenhouse.io - retry: - after: - - 'retry-after' - paginate: - type: link - limit_name_in_request: per_page - link_rel_in_response_header: next - docs: https://nango.dev/docs/integrations/all/greenhouse - docs_connect: https://nango.dev/docs/integrations/all/greenhouse/connect - connection_config: - resource: - type: string - title: Greenhouse API Domain - description: The Greenhouse API product domain you want to connect to - pattern: '^[a-z0-9_-]+$' - example: api - suffix: .greenhouse.io - prefix: https:// - doc_section: '#step-1-finding-your-greenhouse-api-domain' - -greenhouse-basic: - display_name: Greenhouse (Basic Auth) - categories: - - ats - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.resource}.greenhouse.io - retry: - after: - - 'retry-after' - paginate: - type: link - limit_name_in_request: per_page - link_rel_in_response_header: next - verification: - headers: - content-type: application/json - endpoints: - - /v1/candidates/ - docs: https://nango.dev/docs/integrations/all/greenhouse-basic - docs_connect: https://nango.dev/docs/integrations/all/greenhouse-basic/connect - connection_config: - resource: - type: string - title: Greenhouse API Domain - description: The Greenhouse API product domain you want to connect to - pattern: '^[a-z0-9_-]+$' - example: harvest - suffix: .greenhouse.io - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-greenhouse-api-domain' - credentials: - username: - type: string - title: API key - description: The API Key of your Greenhouse account - pattern: '^[a-zA-Z0-9-]+$' - secret: true - doc_section: '#step-2-generating-your-greenhouse-api-key' - password: - type: string - title: Password - description: Password - # https://developers.greenhouse.io/harvest.html#authentication - # Greenhouse is using basic auth with an api key - default_value: '' - hidden: true - -greenhouse-harvest: - display_name: Greenhouse (Harvest API) - auth_mode: BASIC - categories: - - ats - proxy: - base_url: https://harvest.greenhouse.io - retry: - after: - - 'retry-after' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/candidates - docs: https://nango.dev/docs/integrations/all/greenhouse-harvest - docs_connect: https://nango.dev/docs/integrations/all/greenhouse-harvest/connect - credentials: - username: - type: string - title: API key - description: The API Key of your Greenhouse account - pattern: '^[a-zA-Z0-9-]+$' - secret: true - doc_section: '#step-1-generating-your-greenhouse-api-key' - password: - type: string - title: Password - description: Password - # https://developers.greenhouse.io/harvest.html#authentication - # Greenhouse is using basic auth with an api key - default_value: '' - hidden: true - -greenhouse-harvest-partner: - display_name: Greenhouse Harvest Partner (V3) - categories: - - ats - auth_mode: OAUTH2 - authorization_url: https://auth.greenhouse.io/authorize - token_url: https://auth.greenhouse.io/token - token_request_auth_method: basic - disable_pkce: true - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://harvest.greenhouse.io - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/api-integrations/greenhouse-harvest-partner - setup_guide_url: https://nango.dev/docs/api-integrations/greenhouse-harvest-partner/how-to-register-your-own-greenhouse-harvest-partner-oauth-app - -greenhouse-harvest-oauth2-cc: - display_name: Greenhouse Harvest (Client Credentials V3) - categories: - - ats - auth_mode: OAUTH2_CC - token_url: https://auth.greenhouse.io/token?grant_type=client_credentials - token_request_auth_method: basic - body_format: json - token_params: - sub: ${connectionConfig.sub} - proxy: - base_url: https://harvest.greenhouse.io - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/api-integrations/greenhouse-harvest-oauth2-cc - docs_connect: https://nango.dev/docs/api-integrations/greenhouse-harvest-oauth2-cc/connect - connection_config: - sub: - type: string - title: User ID - description: The optional ID of the user to act on-behalf-of. - optional: true - example: '4212952002' - pattern: '^[0-9]+$' - doc_section: '#step-2-finding-your-user-id' - credentials: - client_id: - type: string - title: Client ID - description: Your Greenhouse client ID for authentication - doc_section: '#step-1-generating-your-client-credentials' - client_secret: - type: string - title: Client Secret - description: Your Greenhouse client secret for authentication - doc_section: '#step-1-generating-your-client-credentials' - -greenhouse-job-board: - display_name: Greenhouse (Job Board API) - auth_mode: BASIC - categories: - - ats - proxy: - base_url: https://boards-api.greenhouse.io - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/boards/${connectionConfig.boardToken} - docs: https://nango.dev/docs/integrations/all/greenhouse-job-board - docs_connect: https://nango.dev/docs/integrations/all/greenhouse-job-board/connect - credentials: - username: - type: string - title: API key - description: The API Key of your Greenhouse account - pattern: '^[a-zA-Z0-9-]+$' - secret: true - doc_section: '#step-2-generating-your-greenhouse-api-key' - password: - type: string - title: Password - description: Password - # https://developers.greenhouse.io/harvest.html#authentication - # Greenhouse is using basic auth with an api key - default_value: '' - hidden: true - connection_config: - boardToken: - type: string - title: Board Token - description: The Job Board URL token to your Greenhouse account - order: 1 - doc_section: '#step-1-finding-your-board-token' - -greenhouse-assessment: - display_name: Greenhouse (Assessment API) - auth_mode: BASIC - categories: - - ats - proxy: - base_url: https://${connectionConfig.baseUrl} - verification: - headers: - content-type: application/json - endpoints: - - /list_tests - docs: https://nango.dev/docs/integrations/all/greenhouse-assessment - docs_connect: https://nango.dev/docs/integrations/all/greenhouse-assessment/connect - connection_config: - baseUrl: - type: string - title: Assessment Base Url - description: The Assessment API Base Url you want to connect to - pattern: '^[a-z0-9_-]+$' - example: www.testing-partner.com - prefix: https:// - format: hostname - order: 1 - doc_section: '#step-1-obtaining-your-assessment-base-url' - credentials: - username: - type: string - title: API key - description: The API Key of your Greenhouse account - pattern: '^[a-zA-Z0-9-]+$' - secret: true - doc_section: '#step-2-obtaining-your-api-key' - password: - type: string - title: Password - description: Password - # https://developers.greenhouse.io/harvest.html#authentication - # Greenhouse is using basic auth with an api key - default_value: '' - hidden: true - -greenhouse-ingestion: - display_name: Greenhouse (Ingestion API) - auth_mode: OAUTH2 - authorization_url: https://api.greenhouse.io/oauth/authorize - token_url: https://api.greenhouse.io/oauth/token - categories: - - ats - proxy: - base_url: https://api.greenhouse.io - docs: https://nango.dev/docs/integrations/all/greenhouse-ingestion - -greenhouse-onboarding: - display_name: Greenhouse (Onboarding API) - auth_mode: BASIC - categories: - - ats - proxy: - base_url: https://onboarding-api.greenhouse.io - verification: - headers: - content-type: application/json - endpoints: - - /graphql?query=%7B__schema%7Btypes%7Bname,kind,fields%7Bname%7D%7D%7D%7D - credentials: - username: - type: string - title: Access Key - description: The Access Key to your Greenhouse Onboarding account - pattern: '^[a-zA-Z0-9-]+$' - doc_section: '#step-1-generating-your-access-and-secret-keys' - password: - type: string - title: Secret Key - description: The Secret Key to your Greenhouse Onboarding account - pattern: '^[a-zA-Z0-9-]+$' - doc_section: '#step-1-generating-your-access-and-secret-keys' - docs: https://nango.dev/docs/integrations/all/greenhouse-onboarding - docs_connect: https://nango.dev/docs/integrations/all/greenhouse-onboarding/connect - -grist: - display_name: Grist - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.environment}.getgrist.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /api/orgs - docs: https://nango.dev/docs/api-integrations/grist - docs_connect: https://nango.dev/docs/api-integrations/grist/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Grist API key - pattern: '^[a-f0-9]{40}$' - example: 980cb267c8fa52ae5b6a0a5b4977ec915add8c07 - connection_config: - environment: - type: string - title: Environment - description: The environment you want to connect to. - enum: - - team - - docs - order: 1 - doc_section: '#step-1-selecting-your-environment' - -gumroad: - display_name: Gumroad - categories: - - design - - e-commerce - - payment - auth_mode: OAUTH2 - authorization_url: https://gumroad.com/oauth/authorize - token_url: https://api.gumroad.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.gumroad.com - docs: https://nango.dev/docs/integrations/all/gumroad - -gusto: - display_name: Gusto - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://api.gusto.com/oauth/authorize - token_url: https://api.gusto.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.gusto.com - post_connection_script: gustoPostConnection - docs: https://nango.dev/docs/integrations/all/gusto - -gusto-demo: - display_name: Gusto (Demo) - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://api.gusto-demo.com/oauth/authorize - token_url: https://api.gusto-demo.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.gusto-demo.com - post_connection_script: gustoPostConnection - docs: https://nango.dev/docs/integrations/all/gusto-demo - -hackerrank-work: - display_name: HackerRank Work - categories: - - ats - auth_mode: BASIC - proxy: - base_url: https://www.hackerrank.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /x/api/v3/users?limit=10&offset=10 - docs: https://nango.dev/docs/integrations/all/hackerrank-work - docs_connect: https://nango.dev/docs/integrations/all/hackerrank-work/connect - credentials: - username: - type: string - title: API Key - description: Your HackerRank Work API Key - doc_section: '#step-1-finding-hackerrank-api-key' - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -halo-psa: - display_name: Halo PSA - categories: - - support - - ticketing - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.hostname}/auth/token - token_request_auth_method: basic - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.hostname}/api - docs: https://nango.dev/docs/api-integrations/halo-psa - docs_connect: https://nango.dev/docs/api-integrations/halo-psa/connect - connection_config: - hostname: - type: string - title: Hostname - description: Your Halo PSA hostname. - example: example.halopsa.com - format: hostname - prefix: https:// - doc_section: '#step-1-find-your-halo-api-details' - order: 1 - credentials: - client_id: - type: string - title: Client ID - description: Your Halo PSA API application Client ID - doc_section: '#step-3-create-an-api-application' - client_secret: - type: string - title: Client Secret - description: Your Halo PSA API application Client Secret - secret: true - doc_section: '#step-3-create-an-api-application' - -harvest: - display_name: Harvest - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://id.getharvest.com/oauth2/authorize - token_url: https://id.getharvest.com/api/v2/oauth2/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - headers: - user-agent: ${connectionConfig.appDetails} || App (support@nango.dev) - retry: - after: - - 'retry-after' - base_url: https://api.harvestapp.com - docs: https://nango.dev/docs/integrations/all/harvest - connection_config: - appDetails: - type: string - title: App Details - description: The details of your app - automated: true - -health-gorilla: - display_name: Health Gorilla - categories: - - other - auth_mode: OAUTH2 - authorization_url: https://api.healthgorilla.com/oauth/authorize - token_url: https://api.healthgorilla.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://healthgorilla.com - docs: https://nango.dev/docs/integrations/all/health-gorilla - -heap: - display_name: Heap - categories: - - other - auth_mode: TWO_STEP - proxy: - base_url: https://heapanalytics.com/api - token_url: https://heapanalytics.com/api/public/v0/auth_token - token_headers: - authorization: Basic ${base64(${credentials.appId}:${credentials.apiKey})} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/integrations/all/heap - docs_connect: https://nango.dev/docs/integrations/all/heap/connect - credentials: - appId: - type: string - title: App ID - description: Your Heap application ID - example: '3207896401' - pattern: '^\d+$' - doc_section: '#step-1-generating-your-api-key-and-app-id' - apiKey: - type: string - title: API Key - description: Your Heap API Key - secret: true - example: 1bc32cba-a5d6-438a-bbcc-af312f560a3c - format: uuid - doc_section: '#step-1-generating-your-api-key-and-app-id' - -hex: - display_name: Hex - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.hex.tech/api - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/hex - docs_connect: https://nango.dev/docs/api-integrations/hex/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Hex API Token. - example: hxtp_a1b2c3d4e5f6*** - pattern: '^hxt[pw]_[a-f0-9]+$' - doc_section: '#step-1-creating-your-api-token' - connection_config: - subdomain: - type: string - title: Subdomain - description: Your Hex subdomain. - pattern: '^[a-z0-9]([a-z0-9-]*[a-z0-9])?$' - example: app - doc_section: '#step-2-finding-your-subdomain' - -heyreach: - display_name: HeyReach - categories: - - social - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.heyreach.io/api - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /public/auth/CheckApiKey - docs: https://nango.dev/docs/integrations/all/heyreach - docs_connect: https://nango.dev/docs/integrations/all/heyreach/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your HeyReach account - pattern: '^[A-Za-z0-9+/]+={0,2}$' - example: 'FoVLZoM+nVyMELhqr7vH120O2FS1gZcAG5d2qs1bndg=' - doc_section: '#step-1-generating-an-api-key' - -hibob-service-user: - display_name: Hibob Service User - categories: - - hr - - popular - auth_mode: BASIC - proxy: - base_url: https://api.hibob.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/company/named-lists - retry: - at: - - 'x-ratelimit-reset' - credentials: - username: - type: string - title: Hibob ID - description: Your Hibob ID - doc_section: '#step-1-finding-your-hibob-service-user-id' - password: - type: string - title: Hibob Token - description: Your Hibob Token - default_value: '' - secret: true - doc_section: '#step-2-finding-your-hibob-token' - docs: https://nango.dev/docs/integrations/all/hibob-service-user - docs_connect: https://nango.dev/docs/integrations/all/hibob-service-user/connect - -heygen: - display_name: HeyGen - categories: - - video - auth_mode: OAUTH2 - authorization_url: https://app.heygen.com/oauth/authorize - token_url: https://api2.heygen.com/v1/oauth/token - refresh_url: https://api2.heygen.com/v1/oauth/refresh_token - proxy: - base_url: https://api2.heygen.com - docs: https://nango.dev/docs/api-integrations/heygen - setup_guide_url: https://nango.dev/docs/api-integrations/heygen/how-to-register-your-own-heygen-oauth-app - -heymarket: - display_name: Heymarket - categories: - - communication - - marketing - auth_mode: JWT - signature: - protocol: HMAC - hmac_secret_encoding: utf8 - token: - signing_key: ${credentials.apiSecretId}||${credentials.apiSecretKey} - expires_in_ms: 300000 - header: - alg: HS256 - typ: JWT - payload: - iss: ${credentials.apiSecretId} - proxy: - base_url: https://api.heymarket.com - headers: - accept: application/json - authorization: Bearer ${accessToken} - verification: - method: GET - headers: - accept: application/json - endpoints: - - /v1/team - docs: https://nango.dev/docs/api-integrations/heymarket - docs_connect: https://nango.dev/docs/api-integrations/heymarket/connect - credentials: - apiSecretId: - type: string - title: API Secret ID - description: Your Heymarket API Secret ID. - example: a0ee0000-0000-4000-8000-00000000abcd - format: uuid - doc_section: '#step-1-finding-your-api-secret-id-and-secret-key' - apiSecretKey: - type: string - title: API Secret Key - description: Your Heymarket API Secret Key. - secret: true - example: Aa0***Cc2***Ee4***Gg6***Ii8***Kk0 - pattern: ^[A-Za-z0-9]+$ - doc_section: '#step-1-finding-your-api-secret-id-and-secret-key' - -highlevel: - display_name: HighLevel - categories: - - marketing - auth_mode: OAUTH2 - authorization_url: https://marketplace.gohighlevel.com/oauth/chooselocation - token_url: https://services.leadconnectorhq.com/oauth/token - scope_separator: ' ' - proxy: - base_url: https://services.leadconnectorhq.com - disable_pkce: true - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - post_connection_script: highlevelPostConnection - webhook_routing_script: highlevelWebhookRouting - webhook_user_defined_secret: true - docs: https://nango.dev/docs/api-integrations/highlevel - setup_guide_url: https://nango.dev/docs/api-integrations/highlevel/how-to-register-your-own-highlevel-api-oauth-app - -highlevel-white-label: - display_name: HighLevel (LeadConnector) - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://marketplace.leadconnectorhq.com/oauth/chooselocation - token_url: https://services.leadconnectorhq.com/oauth/token - scope_separator: ' ' - proxy: - base_url: https://services.leadconnectorhq.com - disable_pkce: true - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - post_connection_script: highlevelPostConnection - webhook_routing_script: highlevelWebhookRouting - webhook_user_defined_secret: true - docs: https://nango.dev/docs/api-integrations/highlevel-white-label - setup_guide_url: https://nango.dev/docs/api-integrations/highlevel-white-label/how-to-register-your-own-highlevel-white-label-api-oauth-app - -holded: - display_name: Holded - categories: - - accounting - - crm - - invoicing - auth_mode: API_KEY - proxy: - base_url: https://api.holded.com/api - headers: - key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /invoicing/v1/contacts - docs: https://nango.dev/docs/integrations/all/holded - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Holded account - -hover: - display_name: Hover - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://hover.to/oauth/authorize - token_url: https://hover.to/oauth/token - disable_pkce: true - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.hover.to - docs: https://nango.dev/docs/integrations/all/hover - -huntress: - display_name: Huntress - categories: - - other - auth_mode: BASIC - proxy: - base_url: https://api.huntress.io - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/organizations - docs: https://nango.dev/docs/api-integrations/huntress - docs_connect: https://nango.dev/docs/api-integrations/huntress/connect - credentials: - username: - type: string - title: API Key - description: Your Huntress API key. - pattern: '^hk_[A-Za-z0-9]+$' - example: hk_XXXXXXXXXXXXXXXX - doc_section: '#step-1-generate-api-keys' - password: - type: string - title: API Secret - description: Your Huntress API secret. - secret: true - pattern: '^hs_[A-Za-z0-9]+$' - example: hs_XXXXXXXXXXXXXXXX - doc_section: '#step-1-generate-api-keys' - -hubspot: - display_name: HubSpot - categories: - - marketing - - support - - crm - - popular - auth_mode: OAUTH2 - authorization_url: https://app.hubspot.com/oauth/authorize - token_url: https://api.hubapi.com/oauth/v1/token - connection_configuration: - - portalId - post_connection_script: hubspotPostConnection - pre_connection_deletion_script: hubspotPreConnectionDeletion - webhook_routing_script: hubspotWebhookRouting - proxy: - retry: - remaining: 'x-hubspot-ratelimit-remaining' - base_url: https://api.hubapi.com - decompress: true - paginate: - type: cursor - cursor_path_in_response: paging.next.after - limit_name_in_request: limit - cursor_name_in_request: after - response_path: results - docs: https://nango.dev/docs/api-integrations/hubspot - setup_guide_url: https://nango.dev/docs/api-integrations/hubspot/how-to-register-your-own-hubspot-api-oauth-app - -hubspot-mcp: - display_name: HubSpot (MCP) - categories: - - marketing - - support - - crm - - mcp - auth_mode: MCP_OAUTH2 - client_registration: static - authorization_url: https://mcp.hubspot.com/oauth/authorize/user - token_url: https://mcp.hubspot.com/oauth/v3/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://mcp.hubspot.com - docs: https://nango.dev/docs/api-integrations/hubspot-mcp - setup_guide_url: https://nango.dev/docs/api-integrations/hubspot-mcp/how-to-register-your-own-hubspot-mcp-api-oauth-app - -incident-io: - display_name: Incident.io - categories: - - ticketing - auth_mode: API_KEY - proxy: - base_url: https://api.incident.io - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/identity - docs: https://nango.dev/docs/integrations/all/incident-io - docs_connect: https://nango.dev/docs/integrations/all/incident-io/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Incident.io account - example: 'inc_************************************f2c5e6a7b3d4**********' - pattern: 'inc_[a-f0-9]{64}$' - doc_section: '#step-1-generating-your-api-key' - -insightly: - display_name: Insightly - categories: - - crm - auth_mode: BASIC - proxy: - base_url: https://api.${connectionConfig.pod}.insightly.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v3.1/Contacts - docs: https://nango.dev/docs/integrations/all/insightly - connection_config: - pod: - type: string - title: Insightly Domain - description: The subdomain of your Insightly account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .insightly.com - prefix: https:// - credentials: - username: - type: string - title: API Key - description: Your Insightly API key - password: - type: string - title: '' - description: '' - hidden: true - default_value: '' - -instantly: - display_name: Instantly - categories: - - marketing - - communication - auth_mode: API_KEY - proxy: - base_url: https://api.instantly.ai/api - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/instantly - docs_connect: https://nango.dev/docs/integrations/all/instantly/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Instantly account - pattern: '^[A-Za-z0-9._=-]+$' - example: ZTQ****************************************QQ== - doc_section: '#step-1-generate-an-api-key' - -instagram: - display_name: Instagram - categories: - - marketing - - social - auth_mode: OAUTH2 - scope_separator: ',' - authorization_url: https://api.instagram.com/oauth/authorize - token_url: https://api.instagram.com/oauth/access_token - refresh_url: https://graph.instagram.com/refresh_access_token - proxy: - base_url: https://graph.instagram.com - docs: https://nango.dev/docs/api-integrations/instagram - setup_guide_url: https://nango.dev/docs/api-integrations/instagram/how-to-register-your-own-instagram-api-oauth-app - -icypeas: - display_name: Icypeas - categories: - - marketing - - crm - auth_mode: API_KEY - proxy: - base_url: https://app.icypeas.com/api - headers: - authorization: ${apiKey} - verification: - method: POST - endpoints: - - /email-search - docs: https://nango.dev/docs/integrations/all/icypeas - docs_connect: https://nango.dev/docs/integrations/all/icypeas/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Icypeas account - example: ab84bc2056614635866e4a98c153d7a1ab30541032fd433793d402f2a5db2404 - pattern: '^[a-f0-9]{64}$' - doc_section: '#step-1-finding-your-api-key' - -itglue: - display_name: IT Glue - categories: - - productivity - - other - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.itglue.com - headers: - x-api-key: ${apiKey} - content-type: application/vnd.api+json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /organizations - docs: https://nango.dev/docs/integrations/all/itglue - docs_connect: https://nango.dev/docs/integrations/all/itglue/connect - credentials: - apiKey: - type: string - title: API Key - description: Your IT Glue API key - doc_section: '#step-2-generating-your-api-key' - pattern: '^ITG\.[a-zA-Z0-9._-]+$' - example: ITG.12cca334567890_123456vasfagas7890 - connection_config: - subdomain: - type: string - title: Subdomain - description: Your IT Glue subdomain. - enum: - - api - - api.eu - - api.au - doc_section: '#step-1-finding-your-subdomain' - order: 1 - -immybot: - display_name: ImmyBot - categories: - - dev-tools - - support - auth_mode: OAUTH2_CC - body_format: form - token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token - token_params: - grant_type: client_credentials - scope: https://${connectionConfig.instanceSubdomain}.immy.bot/.default - proxy: - base_url: https://${connectionConfig.instanceSubdomain}.immy.bot - headers: - accept: application/json - docs: https://nango.dev/docs/api-integrations/immybot - docs_connect: https://nango.dev/docs/api-integrations/immybot/connect - connection_config: - tenantId: - type: string - title: Microsoft Entra Tenant ID - description: The Azure tenant ID that owns the ImmyBot app registration. - format: uuid - example: 00000000-0000-0000-0000-000000000000 - order: 1 - doc_section: '#step-1-create-or-find-your-microsoft-entra-app-registration' - instanceSubdomain: - type: string - title: ImmyBot Instance Subdomain - description: The first segment of your ImmyBot instance URL. - pattern: '^[a-z0-9][a-z0-9-]*[a-z0-9]$' - example: acme - prefix: https:// - suffix: .immy.bot - order: 2 - doc_section: '#step-6-find-your-immybot-instance-subdomain' - credentials: - client_id: - type: string - title: Client ID - description: The Application client ID from the Microsoft Entra app registration. - format: uuid - example: 00000000-0000-0000-0000-000000000000 - doc_section: '#step-1-create-or-find-your-microsoft-entra-app-registration' - client_secret: - type: string - title: Client Secret - description: The client secret value from the Microsoft Entra app registration. - secret: true - doc_section: '#step-2-create-a-client-secret' - -intercom: - display_name: Intercom - categories: - - marketing - - popular - - support - - surveys - - ticketing - auth_mode: OAUTH2 - authorization_url: https://app.${connectionConfig.region}.intercom.com/oauth || https://app.intercom.com/oauth - token_url: https://api.${connectionConfig.region}.intercom.io/auth/eagle/token || https://api.intercom.io/auth/eagle/token - proxy: - base_url: https://api.${connectionConfig.region}.intercom.io || https://api.intercom.io - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/api-integrations/intercom - setup_guide_url: https://nango.dev/docs/api-integrations/intercom/how-to-register-your-own-intercom-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/intercom/connect - pre_connection_deletion_script: intercomPreConnectionDeletion - connection_config: - region: - type: string - title: Region - description: The API region for your Intercom workspace. - enum: - - eu - - au - optional: true - doc_section: '#step-1-finding-your-region' - -intuit: - display_name: Intuit - categories: - - accounting - auth_mode: OAUTH2 - authorization_url: https://appcenter.intuit.com/connect/oauth2 - token_url: https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer - proxy: - base_url: https://quickbooks.api.intuit.com - docs: https://nango.dev/docs/integrations/all/intuit - -ironclad: - display_name: Ironclad - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://ironcladapp.com/oauth/authorize - token_url: https://${connectionConfig.subdomain}.ironcladapp.com/oauth/token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.ironcladapp.com - docs: https://nango.dev/docs/integrations/all/ironclad - docs_connect: https://nango.dev/docs/integrations/all/ironclad/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: Your Ironclad Environment Subdomain. - enum: - - na1 - - demo - - eu1 - doc_section: '#step-1-finding-your-subdomain' - -ironclad-cc: - display_name: Ironclad (Client Credentials) - categories: - - legal - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.subdomain}.ironcladapp.com/oauth/token - token_params: - grant_type: client_credentials - scope_separator: ' ' - proxy: - base_url: https://${connectionConfig.subdomain}.ironcladapp.com - headers: - x-as-user-email: ${connectionConfig.userEmail} - docs: https://nango.dev/docs/api-integrations/ironclad-cc - docs_connect: https://nango.dev/docs/api-integrations/ironclad-cc/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: Your Ironclad environment subdomain. - enum: - - na1 - - demo - - eu1 - order: 1 - userEmail: - type: string - title: User Email - description: The email of the Ironclad user on whose behalf API requests are made. - example: user@yourcompany.com - format: email - order: 2 - -jamf: - display_name: Jamf Pro (Client Credentials) - categories: - - other - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.instance}.jamfcloud.com/api/v1/oauth/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.instance}.jamfcloud.com - scope_separator: ' ' - docs: https://nango.dev/docs/integrations/all/jamf - connection_config: - instance: - type: string - title: Jamf Pro Instance - description: Your Jamf Pro instance - example: example - prefix: https:// - suffix: .jamfcloud.com - order: 1 - -jamf-basic: - display_name: Jamf Pro (Basic Auth) - categories: - - other - auth_mode: TWO_STEP - proxy: - base_url: https://${connectionConfig.instance}.jamfcloud.com - headers: - authorization: Bearer ${accessToken} - token_url: https://${connectionConfig.instance}.jamfcloud.com/api/v1/auth/token - token_headers: - authorization: Basic ${base64(${credentials.username}:${credentials.password})} - token_response: - token: token - token_expiration: expires - token_expiration_strategy: expireAt - docs: https://nango.dev/docs/integrations/all/jamf-basic - connection_config: - instance: - type: string - title: Jamf Pro Instance - description: Your Jamf Pro instance - example: example - prefix: https:// - suffix: .jamfcloud.com - order: 1 - credentials: - username: - type: string - title: Username - description: Your Jamf Pro username - password: - type: string - title: Password - description: Your Jamf Pro password - secret: true - -jamie: - display_name: Jamie - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://beta-api.meetjamie.ai - headers: - x-api-key: ${apiKey} - docs: https://nango.dev/docs/api-integrations/jamie - docs_connect: https://nango.dev/docs/api-integrations/jamie/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Jamie workspace or personal API key. - example: jk_your_api_key - pattern: '^jk_[a-zA-Z0-9_-]+$' - doc_section: '#step-1-create-an-api-key' - -jazzhr: - display_name: JazzHR - categories: - - hr - - ats - auth_mode: API_KEY - proxy: - base_url: https://api.resumatorapi.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/users?apikey=${credentials.apiKey} - query: - apikey: ${apiKey} - docs: https://nango.dev/docs/integrations/all/jazzhr - docs_connect: https://nango.dev/docs/integrations/all/jazzhr/connect - credentials: - apiKey: - type: string - title: API Key - description: Your JazzHR API Key - doc_section: '#step-1-finding-your-api-key' - -jiminny: - display_name: Jiminny - categories: - - productivity - - communication - auth_mode: API_KEY - proxy: - base_url: https://app.jiminny.${connectionConfig.region}/customer/api - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v1/me - docs: https://nango.dev/docs/api-integrations/jiminny - docs_connect: https://nango.dev/docs/api-integrations/jiminny/connect - connection_config: - region: - type: string - title: Region - description: The region your Jiminny account is hosted in. - enum: - - eu - - com - doc_section: '#step-1-find-your-region' - credentials: - apiKey: - type: string - title: API Key - description: Your Jiminny API key. - example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c - pattern: '^eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' - doc_section: '#step-2-generate-an-api-key' - -jira: - display_name: Jira (OAuth) - categories: - - popular - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://auth.atlassian.com/authorize - token_url: https://auth.atlassian.com/oauth/token - default_scopes: - - offline_access - authorization_params: - audience: api.atlassian.com - prompt: consent - connection_configuration: - - cloudId - - accountId - proxy: - base_url: https://api.atlassian.com - connection_config: - subdomain: ${connectionConfig.subdomain} - paginate: - type: link - link_rel_in_response_header: next - limit_name_in_request: limit - response_path: results - link_path_in_response_body: _links.next - post_connection_script: jiraPostConnection - webhook_routing_script: jiraWebhookRouting - docs: https://nango.dev/docs/api-integrations/jira - setup_guide_url: https://nango.dev/docs/api-integrations/jira/how-to-register-your-own-jira-api-oauth-app - connection_config: - subdomain: - type: string - title: Subdomain - optional: true - description: The subdomain of your Attlassian account - pattern: '^[a-zA-Z0-9.-]+$' - example: subdomain - suffix: .atlassian.net - prefix: https:// - -justworks: - display_name: Justworks - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://payroll.justworks.com/oauth/authorize - token_url: https://public-api.justworks.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - scope_separator: ' ' - proxy: - base_url: https://public-api.justworks.com - docs: https://nango.dev/docs/api-integrations/justworks - setup_guide_url: https://nango.dev/docs/api-integrations/justworks/how-to-register-your-own-justworks-oauth-app - -jira-basic: - display_name: Jira (Basic Auth) - categories: - - productivity - - ticketing - auth_mode: BASIC - proxy: - retry: - after: - - 'retry-after' - base_url: https://${connectionConfig.subdomain}.atlassian.net - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /rest/api/3/myself - docs: https://nango.dev/docs/integrations/all/jira-basic - connection_config: - subdomain: - type: string - title: Jira Domain - description: The subdomain of your Jira account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .atlassian.net - prefix: https:// - order: 1 - doc_section: '#step-2-finding-your-atlassian-domain' - credentials: - username: - type: string - title: Email Address - description: The Email Address of your Jira account - format: email - doc_section: '#step-3-finding-your-user-name' - password: - type: string - title: API Key - description: The API Key of your Jira account - doc_section: '#step-1-finding-atlassian-api-key' - docs_connect: https://nango.dev/docs/integrations/all/jira-basic/connect - -jira-data-center: - display_name: Jira Data Center - categories: - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.endpointURL}/rest/oauth2/latest/authorize - authorization_params: - grant_type: authorization_code - token_url: https://${connectionConfig.endpointURL}/rest/oauth2/latest/token - docs: https://nango.dev/docs/integrations/all/jira-data-center - proxy: - base_url: https://${connectionConfig.endpointURL}/rest/api/latest - connection_config: - endpointURL: - type: string - title: Domain - description: The domain of your Jira Data Center account - pattern: '^[a-zA-Z0-9.-]+(:\d+)?(/[a-zA-Z0-9._~-]+)*/?$' - prefix: https:// - example: foobar.atlassian.net - -jira-data-center-api-key: - display_name: Jira Data Center (API Key) - categories: - - productivity - - ticketing - auth_mode: API_KEY - proxy: - base_url: ${connectionConfig.baseUrl} - retry: - after: - - 'retry-after' - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/jira-data-center-api-key - docs_connect: https://nango.dev/docs/integrations/all/jira-data-center-api-key/connect - connection_config: - baseUrl: - type: string - title: Instance Base Url - description: The base Url for your Jira Data Center instance - pattern: '^(https?:\/\/)?[A-Za-z0-9.-]+(:\d+)?(\/[A-Za-z0-9._-]*)?$' - example: https://foobar.atlassian.net - doc_section: '#step-1-finding-your-instance-base-url' - order: 1 - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Jira Data Center - doc_section: '#step-2-generating-your-api-key' - -jira-data-center-basic: - display_name: Jira Data Center (Basic Auth) - categories: - - productivity - - ticketing - auth_mode: BASIC - proxy: - base_url: ${connectionConfig.baseUrl} - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/jira-data-center-basic - docs_connect: https://nango.dev/docs/integrations/all/jira-data-center-basic/connect - connection_config: - baseUrl: - type: string - title: Instance Base Url - description: The base Url for your Jira Data Center instance - pattern: '^(https?:\/\/)?[A-Za-z0-9.-]+(:\d+)?(\/[A-Za-z0-9._-]*)?$' - example: https://foobar.atlassian.net - doc_section: '#step-1-finding-your-instance-base-url' - order: 1 - credentials: - username: - type: string - title: Username - description: The username for your Jira Data Center - doc_section: '#step-2-finding-your-credentials' - password: - type: string - title: Password - description: The password for your Jira Data Center - doc_section: '#step-2-finding-your-credentials' - -jobadder: - display_name: Jobadder - categories: - - hr - - ats - auth_mode: OAUTH2 - disable_pkce: true - authorization_url: https://id.jobadder.com/connect/authorize - token_url: https://id.jobadder.com/connect/token - default_scopes: - - offline_access - authorization_params: - response_type: code - proxy: - base_url: https://api.jobadder.com - docs: https://nango.dev/docs/integrations/all/jobadder - -jobdiva: - display_name: JobDiva - categories: - - hr - - ats - auth_mode: TWO_STEP - token_url: https://api.jobdiva.com/apiv2/authenticate?clientid=${credentials.clientId}&username=${credentials.username}&password=${credentials.password} - token_request_method: GET - proxy: - base_url: https://api.jobdiva.com - token_response: - token: '' - webhook_routing_script: jobdivaWebhookRouting - webhook_user_defined_secret: true - docs: https://nango.dev/docs/integrations/all/jobdiva - docs_connect: https://nango.dev/docs/integrations/all/jobdiva/connect - credentials: - clientId: - type: string - title: Client ID - description: Your JobDiva Client ID - example: '3050' - doc_section: '#step-1-obtaining-your-client-id' - pattern: '^[0-9]{4}$' - username: - type: string - title: Username - description: Your JobDiva API username - example: username - doc_section: '#step-2-creating-an-api-user' - password: - type: string - title: Password - description: Your JobDiva API password - secret: true - example: password - doc_section: '#step-2-creating-an-api-user' - -jobber: - display_name: Jobber - categories: - - crm - - invoicing - auth_mode: OAUTH2 - authorization_url: https://api.getjobber.com/api/oauth/authorize - token_url: https://api.getjobber.com/api/oauth/token - authorization_params: - response_type: code - proxy: - headers: - x-jobber-graphql-version: ${connectionConfig.version} || 2025-01-20 - base_url: https://api.getjobber.com/api - docs: https://nango.dev/docs/integrations/all/jobber - connection_config: - version: - type: string - title: '' - description: '' - automated: true - -jobvite: - display_name: Jobvite - categories: - - ats - auth_mode: API_KEY - proxy: - base_url: https://api.jobvite.com/api - headers: - x-jvi-api: ${apiKey} - x-jvi-sc: ${connectionConfig.secretKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/candidate - docs: https://nango.dev/docs/integrations/all/jobvite - docs_connect: https://nango.dev/docs/integrations/all/jobvite/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Jobvite account - doc_section: '#step-1-getting-your-api-key-and-secret-key' - connection_config: - secretKey: - type: string - title: Secret Key - description: The secret key for your Jobvite account - secret: true - doc_section: '#step-1-getting-your-api-key-and-secret-key' - -jotform: - display_name: Jotform - categories: - - surveys - auth_mode: API_KEY - proxy: - base_url: https://api.jotform.com - headers: - apikey: ${apiKey} - docs: https://nango.dev/docs/integrations/all/jotform - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Jotform account - -jumpcloud: - display_name: JumpCloud - categories: - - iam - auth_mode: API_KEY - proxy: - base_url: https://console.jumpcloud.com/api - headers: - x-api-key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /organizations - docs: https://nango.dev/docs/integrations/all/jumpcloud - docs_connect: https://nango.dev/docs/integrations/all/jumpcloud/connect - credentials: - apiKey: - type: string - title: API Key - description: Your JumpCloud API Key. - example: jca_9mK4pL2xR8vN6qW1sT7uY3eA5bC9dF0hG2jM - pattern: '^[A-Za-z0-9_-]+$' - doc_section: '#step-1-generate-your-jumpcloud-api-key' - -helpscout-docs: - display_name: Help Scout Docs - categories: - - knowledge-base - - support - auth_mode: BASIC - proxy: - retry: - after: - - 'x-ratelimit-reset' - base_url: https://docsapi.helpscout.net - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/sites - docs: https://nango.dev/docs/integrations/all/helpscout-docs - docs_connect: https://nango.dev/docs/integrations/all/helpscout-docs/connect - credentials: - username: - type: string - title: API Key - description: Your Help Scout Docs API Key - secret: true - doc_section: '#step-1-finding-help-scout-api-key' - password: - type: string - title: '' - description: '' - default_value: 'X' - hidden: true - -helpscout-mailbox: - display_name: Help Scout Mailbox - categories: - - support - auth_mode: OAUTH2 - authorization_url: https://secure.helpscout.net/authentication/authorizeClientApplication - token_url: https://api.helpscout.net/v2/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - retry: - after: - - 'x-ratelimit-retry-after' - base_url: https://api.helpscout.net - docs: https://nango.dev/docs/integrations/all/helpscout-mailbox - -kandji: - display_name: Kandji - categories: - - support - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.kandji.io - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/kandji - docs_connect: https://nango.dev/docs/integrations/all/kandji/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain to your kandji account - doc_section: '#step-1-finding-your-subdomain' - order: 1 - credentials: - apiKey: - type: string - title: API Token - description: The API Token for your Kandji account - example: 1bc32cba-a5d6-438a-bbcc-af312f560a3c - format: uuid - doc_section: '#step-2-generating-your-api-token' - -keap: - display_name: Keap - categories: - - marketing - auth_mode: OAUTH2 - authorization_url: https://accounts.infusionsoft.com/app/oauth/authorize - token_url: https://api.infusionsoft.com/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.infusionsoft.com - docs: https://nango.dev/docs/integrations/all/keap - -keeper-scim: - display_name: Keeper (SCIM) - categories: - - productivity - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://keepersecurity.com/api/rest/scim/v2/${connectionConfig.node} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /Users - docs: https://nango.dev/docs/integrations/all/keeper-scim - docs_connect: https://nango.dev/docs/integrations/all/keeper-scim/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your node keeper account - pattern: '^[A-Za-z0-9+/=]+$' - example: 'J9b7kgdL2gf14d5F9p67zYXVrTZPTMEnl3/EmwwI9K2=' - doc_section: '#step-2-finding-your-api-key-api-token' - connection_config: - node: - type: string - title: Node - description: The node id to your Keeper account - pattern: '^\d{15}$' - example: '123435384338765' - doc_section: '#step-1-finding-your-node-id' - -kintone: - display_name: Kintone - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.kintone.com/oauth2/authorization - token_url: https://${connectionConfig.subdomain}.kintone.com/oauth2/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.kintone.com - docs: https://nango.dev/docs/integrations/all/kintone - docs_connect: https://nango.dev/docs/integrations/all/kintone/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain for your Kintone account - doc_section: '#step-1-finding-your-subdomain' - example: urdzw8p24agp - pattern: '^[a-z0-9_-]+$' - -kintone-user-api: - display_name: Kintone User API - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.kintone.com - verification: - method: GET - endpoints: - - /v1/users.json - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/kintone-user-api - docs_connect: https://nango.dev/docs/integrations/all/kintone-user-api/connect - credentials: - apiKey: - type: string - title: API Token - description: The API Token for your Kintone account - example: cy.s.api1.eyJraWQiOiJ2MSIsInR5cCI6IkpXVCIsImFsZyI6IkhTMjU2In0.eyJyYW5kIjoiNWQ4ZmNiOGYtMDk3ZC00MWNhLWJkZjAtYTAxN2ZiMDZkYjNlIiwiaXNzIjoieTkwNzgyIiwiZXhwIjoxNzU4MTg1Mzg5fQ.GUoYL6hBFGOywcfjxQB3Y3vSwEq67evDGcmVQvzPY94 - pattern: '^cy\.s\.api1\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' - doc_section: '#step-2-generating-your-api-token' - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain for your Kintone account - doc_section: '#step-1-finding-your-subdomain' - example: urdzw8p24agp - order: 1 - pattern: '^[a-z0-9_-]+$' - -konnektive: - display_name: Konnektive - categories: - - crm - - e-commerce - auth_mode: BASIC - proxy: - base_url: https://api.konnektive.com - query: - loginId: ${credentials.username} - password: ${credentials.password} - docs: https://nango.dev/docs/api-integrations/konnektive - docs_connect: https://nango.dev/docs/api-integrations/konnektive/connect - credentials: - username: - type: string - title: API Login ID - description: Your Konnektive API Login ID. - doc_section: '#step-1-find-your-api-credentials' - password: - type: string - title: API Password - description: Your Konnektive API password. - secret: true - doc_section: '#step-1-find-your-api-credentials' - -knowbe4: - display_name: KnowBe4 - categories: - - support - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.knowbe4.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/api-integrations/knowbe4 - docs_connect: https://nango.dev/docs/api-integrations/knowbe4/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your KnowBe4 account - doc_section: '#step-2-generating-your-knowbe4-api-key' - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain to your API base URL. - doc_section: '#step-1-finding-your-subdomain' - enum: - - us.api - - eu.api - - ca.api - - uk.api - - de.api - order: 1 - -klipfolio: - display_name: Klipfolio - categories: - - productivity - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://app.klipfolio.com - headers: - kf-api-key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/1.0/profile - docs: https://nango.dev/docs/integrations/all/klipfolio - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Klipfolio account - -klaviyo: - display_name: Klaviyo (API Key) - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://a.klaviyo.com - headers: - authorization: Klaviyo-API-Key ${apiKey} - revision: '2024-07-15' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/accounts - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/klaviyo - docs_connect: https://nango.dev/docs/integrations/all/klaviyo/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Klaviyo account - doc_section: '#step-1-finding-klaviyo-api-key' - -klaviyo-oauth: - display_name: Klaviyo (OAuth) - categories: - - marketing - auth_mode: OAUTH2 - authorization_url: https://www.klaviyo.com/oauth/authorize - token_url: https://a.klaviyo.com/oauth/token - token_request_auth_method: basic - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://a.klaviyo.com - headers: - revision: '2024-07-15' - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/klaviyo-oauth - -klicktipp: - display_name: KlickTipp - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.klicktipp.com - credentials: - apiKey: - type: string - title: API Key - description: Your KlickTipp API key. - example: a1b2c3d4e5f6g7h8 - pattern: '^[a-z0-9]{16}$' - secret: true - doc_section: '#step-1-getting-your-api-key' - docs: https://nango.dev/docs/api-integrations/klicktipp - docs_connect: https://nango.dev/docs/api-integrations/klicktipp/connect - -kno-commerce: - display_name: Kno Commerce - categories: - - e-commerce - auth_mode: OAUTH2_CC - token_url: https://app-api.knocommerce.com/api/oauth2/token - token_request_auth_method: basic - body_format: query - token_params: - grant_type: client_credentials - proxy: - base_url: https://app-api.knocommerce.com - docs: https://nango.dev/docs/api-integrations/kno-commerce - docs_connect: https://nango.dev/docs/api-integrations/kno-commerce/connect - credentials: - client_id: - type: string - title: Client ID - description: Your Kno Commerce API client ID - doc_section: '#step-1-creating-an-api-client' - client_secret: - type: string - title: Client Secret - description: Your Kno Commerce API client secret - secret: true - doc_section: '#step-1-creating-an-api-client' - -kustomer: - display_name: Kustomer - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.extension}.kustomerapp.com - retry: - after: - - 'x-ratelimit-reset' - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/kustomer - connection_config: - extension: - type: string - title: Kustomer Domain - description: The subdomain of your Kustomer account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .kustomerapp.com - prefix: https:// - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Kustomer account - -lagrowthmachine: - display_name: La Growth Machine - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://apiv2.lagrowthmachine.com - query: - KEY: ${apiKey} - docs: https://nango.dev/docs/integrations/all/lagrowthmachine - docs_connect: https://nango.dev/docs/integrations/all/lagrowthmachine/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your La Growth Machine account - example: 1bc32cba-a5d6-438a-bbcc-af312f560a3c - format: uuid - doc_section: '#step-1-finding-your-api-key' - -lastpass: - display_name: LastPass - categories: - - productivity - auth_mode: BASIC - proxy: - base_url: https://lastpass.com - docs: https://nango.dev/docs/integrations/all/lastpass - docs_connect: https://nango.dev/docs/integrations/all/lastpass/connect - credentials_verification_script: lastpassCredentialsVerification - credentials: - username: - type: string - title: CID - description: Your LastPass Account number - doc_section: '#step-1-finding-your-cid' - password: - type: string - title: Provhash - description: 'Your LastPass API key' - secret: true - doc_section: '#step-2-generating-your-provhash' - -lattice: - display_name: Lattice - categories: - - hr - auth_mode: API_KEY - proxy: - base_url: https://api.latticehq.com/ - headers: - authorization: Bearer ${apiKey} - accept: application/json - content-type: application/json - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/lattice - docs_connect: https://nango.dev/docs/integrations/all/lattice/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Lattice account - doc_section: '#step-1-finding-lattice-api-key' - -leadmagic: - display_name: LeadMagic - categories: - - marketing - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.leadmagic.io - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v1/credits - docs: https://nango.dev/docs/integrations/all/leadmagic - docs_connect: https://nango.dev/docs/integrations/all/leadmagic/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your LeadMagic account - example: 1e30029c105a89d36b76b879f01208d8 - pattern: '^[a-f0-9]{32}$' - doc_section: '#step-1-finding-your-api-key' - -leadfeeder: - display_name: Leadfeeder - categories: - - marketing - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.leadfeeder.com - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v1/accounts - docs: https://nango.dev/docs/api-integrations/leadfeeder - docs_connect: https://nango.dev/docs/api-integrations/leadfeeder/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key from your Leadfeeder account. - example: a3f8c2b1****************************8805 - pattern: '^[a-f0-9]{40}$' - doc_section: '#step-1-obtain-your-api-key' - -lessonly: - display_name: Lessonly - categories: - - productivity - auth_mode: BASIC - proxy: - base_url: https://api.lessonly.com/api - docs: https://nango.dev/docs/integrations/all/lessonly - credentials: - username: - type: string - title: Subdomain - description: Your Lessonly Subdomain - password: - type: string - title: API Key - description: Your Lessonly API key - secret: true - -lemlist: - display_name: lemlist - categories: - - marketing - - communication - auth_mode: BASIC - proxy: - base_url: https://api.lemlist.com - verification: - headers: - content-type: application/json - endpoints: - - /api/team - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/lemlist - docs_connect: https://nango.dev/docs/integrations/all/lemlist/connect - credentials: - username: - type: string - title: '' - description: '' - default_value: '' - hidden: true - password: - type: string - title: API Key - description: The API key for your Lemlist account - secret: true - example: a1b2c3d4e5f67890abcdefabcdefabcd - pattern: '[a-f0-9]$' - doc_section: '#step-1-generating-your-api-key' - -lever: - display_name: Lever (OAuth) - categories: - - ats - auth_mode: OAUTH2 - authorization_url: https://auth.lever.co/authorize - token_url: https://auth.lever.co/oauth/token - authorization_params: - response_type: code - audience: https://api.lever.co/v1/ - proxy: - base_url: https://api.lever.co - docs: https://nango.dev/docs/integrations/all/lever - -lever-basic: - display_name: Lever (Basic Auth) - auth_mode: BASIC - categories: - - ats - proxy: - base_url: https://api.lever.co - docs: https://nango.dev/docs/integrations/all/lever-basic - docs_connect: https://nango.dev/docs/integrations/all/lever-basic/connect - credentials: - username: - type: string - title: User name - description: The API Key of your lever account - doc_section: '#step-1-finding-lever-api-key' - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -lever-sandbox: - display_name: Lever (OAuth Sandbox) - categories: - - ats - auth_mode: OAUTH2 - authorization_url: https://sandbox-lever.auth0.com/authorize - token_url: https://sandbox-lever.auth0.com/oauth/token - authorization_params: - response_type: code - prompt: consent - audience: https://api.sandbox.lever.co/v1/ - proxy: - base_url: https://api.sandbox.lever.co - docs: https://nango.dev/docs/integrations/all/lever-sandbox - -lever-basic-sandbox: - display_name: Lever (Basic Auth Sandbox)) - categories: - - ats - auth_mode: BASIC - proxy: - base_url: https://api.sandbox.lever.co - docs: https://nango.dev/docs/integrations/all/lever-basic-sandbox - credentials: - username: - type: string - title: User name - description: The API Key of your Lever sandbox account - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -lightfield: - display_name: Lightfield - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.lightfield.app - headers: - authorization: Bearer ${apiKey} - lightfield-version: '2026-03-01' - verification: - method: GET - endpoints: - - /v1/auth/validate - docs: https://nango.dev/docs/api-integrations/lightfield - docs_connect: https://nango.dev/docs/api-integrations/lightfield/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Lightfield API key - example: sk_lf_0_... - pattern: '^sk_lf_0_[A-Za-z0-9_-]+$' - doc_section: '#step-1-create-an-api-key' - -lightspeed-retail: - display_name: Lightspeed Retail (X-Series) - categories: - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://secure.retail.lightspeed.app/connect - token_url: https://${connectionConfig.domain_prefix}.retail.lightspeed.app/api/1.0/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - redirect_uri_metadata: - - domain_prefix - disable_pkce: true - proxy: - base_url: https://${connectionConfig.domain_prefix}.retail.lightspeed.app - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/api-integrations/lightspeed-retail - setup_guide_url: https://nango.dev/docs/api-integrations/lightspeed-retail/how-to-register-your-own-lightspeed-retail-api-oauth-app - connection_config: - domain_prefix: - type: string - title: '' - description: '' - automated: true - -linear: - display_name: Linear - categories: - - popular - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://linear.app/oauth/authorize - token_url: https://api.linear.app/oauth/token - scope_separator: ',' - authorization_params: - prompt: consent - proxy: - base_url: https://api.linear.app - retry: - at: - - 'x-ratelimit-requests-reset' - remaining: 'x-ratelimit-requests-remaining' - error_code: - - '400' - - '5xx' - - '401' - - '429' - disable_pkce: true - webhook_routing_script: linearWebhookRouting - post_connection_script: linearPostConnection - pre_connection_deletion_script: linearPreConnectionDeletion - webhook_user_defined_secret: true - docs: https://nango.dev/docs/api-integrations/linear - setup_guide_url: https://nango.dev/docs/api-integrations/linear/how-to-register-your-own-linear-api-oauth-app - -linear-mcp: - display_name: Linear (MCP) - categories: - - popular - - productivity - - ticketing - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://mcp.linear.app/authorize - token_url: https://mcp.linear.app/token - registration_url: https://mcp.linear.app/register - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - docs: https://nango.dev/docs/api-integrations/linear-mcp - -linkedin: - display_name: LinkedIn - categories: - - ats - - social - auth_mode: OAUTH2 - authorization_url: https://www.linkedin.com/oauth/v2/authorization - token_url: https://www.linkedin.com/oauth/v2/accessToken - disable_pkce: true - proxy: - base_url: https://api.linkedin.com - docs: https://nango.dev/docs/api-integrations/linkedin - setup_guide_url: https://nango.dev/docs/api-integrations/linkedin/how-to-register-your-own-linkedin-api-oauth-app - -linkhut: - display_name: LinkHut - categories: - - social - auth_mode: OAUTH2 - authorization_url: https://ln.ht/_/oauth/authorize - token_url: https://api.ln.ht/v1/oauth/token - proxy: - base_url: https://api.ln.ht - docs: https://nango.dev/docs/integrations/all/linkhut - -lokalise: - display_name: Lokalise - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://app.lokalise.com/oauth2/auth - token_url: https://app.lokalise.com/oauth2/token - body_format: json - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - disable_pkce: true - proxy: - base_url: https://api.lokalise.com/api2 - docs: https://nango.dev/docs/api-integrations/lokalise - setup_guide_url: https://nango.dev/docs/api-integrations/lokalise/how-to-register-your-own-lokalise-oauth-app - -loom-scim: - display_name: Loom (SCIM) - categories: - - other - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.domain}/scim - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /Users - docs: https://nango.dev/docs/integrations/all/loom-scim - docs_connect: https://nango.dev/docs/integrations/all/loom-scim/connect - connection_config: - domain: - type: string - title: Loom SCIM Bridge URL - description: The domain for your Loom SCIM Bridge - example: scim.example.com - pattern: '^[a-zA-Z0-9.-]+$' - prefix: https:// - doc_section: '#step-4-get-your-scim-bridge-url' - credentials: - apiKey: - type: string - title: SCIM API Key - description: Your Loom SCIM API Key - secret: true - doc_section: '#step-3-retrieve-your-loom-scim-api-key' - -loops-so: - display_name: Loops.so - categories: - - marketing - - communication - auth_mode: API_KEY - proxy: - base_url: https://app.loops.so/api - headers: - accept: application/json - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/api-key - docs: https://nango.dev/docs/integrations/all/loops-so - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Loops.so account - pattern: '^[a-f0-9]{32}$' - example: d2d561f5ff80136f69b4b5a31b9fb3c9 - -loop-returns: - display_name: Loop Returns - categories: - - e-commerce - auth_mode: API_KEY - proxy: - headers: - x-authorization: ${apiKey} - base_url: https://api.loopreturns.com/api - docs: https://nango.dev/docs/integrations/all/loop-returns - docs_connect: https://nango.dev/docs/integrations/all/loop-returns/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Loop Returns account - doc_section: '#step-1-generating-your-api-key' - -looker: - display_name: Looker - categories: - - analytics - auth_mode: TWO_STEP - token_url: https://${connectionConfig.hostname}/api/4.0/login - body_format: form - token_params: - client_id: ${credentials.clientId} - client_secret: ${credentials.clientSecret} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://${connectionConfig.hostname}/api - docs: https://nango.dev/docs/api-integrations/looker - docs_connect: https://nango.dev/docs/api-integrations/looker/connect - connection_config: - hostname: - type: string - title: Looker Instance Hostname - description: Your Looker instance hostname - prefix: https:// - example: mycompany.looker.com - order: 1 - pattern: '^[a-zA-Z0-9.-]+(:[0-9]+)?$' - doc_section: '#step-1-finding-your-looker-hostname' - credentials: - clientId: - type: string - title: Client ID - description: Your Looker Client ID - doc_section: '#step-2-obtaining-your-client-credentials' - clientSecret: - type: string - title: Client Secret - description: Your Looker Client Secret - secret: true - doc_section: '#step-2-obtaining-your-client-credentials' - -looker-oauth: - display_name: Looker (OAuth) - categories: - - analytics - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.hostname}/auth - token_url: https://${connectionConfig.apiHostname}/api/token - authorization_params: - response_type: code - default_scopes: - - cors_api - body_format: json - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.apiHostname}/api - docs: https://nango.dev/docs/api-integrations/looker-oauth - setup_guide_url: https://nango.dev/docs/api-integrations/looker-oauth/how-to-register-your-own-looker-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/looker-oauth/connect - connection_config: - hostname: - type: string - title: Looker UI Hostname - description: Your Looker instance UI hostname. - format: hostname - prefix: https:// - example: mycompany.looker.com - order: 1 - doc_section: '#step-1-finding-your-looker-ui-hostname' - apiHostname: - type: string - title: Looker API Hostname - description: Your Looker API hostname including port. - pattern: '^[a-zA-Z0-9.-]+(:[0-9]+)?$' - prefix: https:// - example: mycompany.looker.com:19999 - order: 2 - doc_section: '#step-2-finding-your-looker-api-hostname' - -lucid-scim: - display_name: Lucid (SCIM) - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://users.lucid.app/scim - headers: - authorization: Bearer ${apiKey} - accept: application/json - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/Users - docs: https://nango.dev/docs/integrations/all/lucid-scim - docs_connect: https://nango.dev/docs/integrations/all/lucid-scim/connect - credentials: - apiKey: - type: string - title: API Key - description: The SCIM API key generated from the Lucid admin panel - doc_section: '#step-1-generate-the-bearer-token' - -luma: - display_name: Luma - categories: - - productivity - - ticketing - auth_mode: API_KEY - proxy: - headers: - x-luma-api-key: ${apiKey} - base_url: https://api.lu.ma - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /public/v1/user/get-self - docs: https://nango.dev/docs/integrations/all/luma - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Luma account - -lumos: - display_name: Lumos - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.lumos.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/api-integrations/lumos - docs_connect: https://nango.dev/docs/api-integrations/lumos/connect - credentials: - apiKey: - type: string - title: API Token - description: The API token to your Lumos account - example: 'lsk_example_1234' - doc_section: '#step-1-creating-your-api-token' - -listmonk: - display_name: Listmonk - categories: - - marketing - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.domain}/api - headers: - content-type: application/json - retry: - after: - - 'retry-after' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /lists - docs: https://nango.dev/docs/integrations/all/listmonk - connection_config: - domain: - type: string - title: Domain - description: The domain of your Listmonk account - format: hostname - prefix: https:// - credentials: - username: - type: string - title: API User - description: The API user to your Listmonk account - password: - type: string - title: Token - description: The token to your Listmonk account - secret: true - -listrak: - display_name: Listrak - categories: - - marketing - auth_mode: OAUTH2_CC - token_url: https://auth.listrak.com/oauth2/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.listrak.com/email - docs: https://nango.dev/docs/api-integrations/listrak - docs_connect: https://nango.dev/docs/api-integrations/listrak/connect - credentials: - client_id: - type: string - title: Client ID - description: Your Listrak API Client ID - doc_section: '#step-1-create-api-credentials' - client_secret: - type: string - title: Client Secret - description: Your Listrak API Client Secret - secret: true - doc_section: '#step-1-create-api-credentials' - -lob: - display_name: Lob - categories: - - marketing - auth_mode: BASIC - proxy: - base_url: https://api.lob.com - verification: - method: GET - endpoints: - - /v1/addresses - docs: https://nango.dev/docs/api-integrations/lob - docs_connect: https://nango.dev/docs/api-integrations/lob/connect - credentials: - username: - type: string - title: Secret API Key - description: Your Lob Secret API Key. - secret: true - example: 'live_0dc8d***************************5b0cc' - pattern: '^(test|live)_[a-f0-9]{35}$' - doc_section: '#step-1-getting-your-secret-api-key' - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -make: - display_name: Make - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.environmentUrl}/api/v2 - headers: - authorization: Token ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /users/me - docs: https://nango.dev/docs/integrations/all/make - docs_connect: https://nango.dev/docs/integrations/all/make/connect - connection_config: - environmentUrl: - type: string - title: Domain - description: The domain of your Make account - format: hostname - prefix: https:// - doc_section: '#step-2-finding-your-domain' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Make account - doc_section: '#step-1-generating-an-api-key' - -mailgun: - display_name: Mailgun - categories: - - marketing - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.region}.mailgun.net - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v4/domains - docs: https://nango.dev/docs/integrations/all/mailgun - docs_connect: https://nango.dev/docs/integrations/all/mailgun/connect - connection_config: - region: - type: string - title: Region - description: The region of your Mailgun account. - enum: - - api - - api.eu - doc_section: '#step-1-finding-your-mailgun-region' - -mailchimp: - display_name: Mailchimp - categories: - - marketing - - surveys - auth_mode: OAUTH2 - authorization_url: https://login.mailchimp.com/oauth2/authorize - token_url: https://login.mailchimp.com/oauth2/token - authorization_params: - response_type: code - proxy: - base_url: https://${connectionConfig.dc}.api.mailchimp.com - docs: https://nango.dev/docs/integrations/all/mailchimp - post_connection_script: mailchimpPostConnection - connection_config: - dc: - type: string - title: Data Center - description: The data center for your account - pattern: '^[a-z]+\d*$' - example: us6 - automated: true - -mailjet: - display_name: Mailjet - categories: - - marketing - auth_mode: BASIC - proxy: - base_url: https://api.mailjet.com - verification: - method: GET - endpoints: - - /v3/REST/myprofile - docs: https://nango.dev/docs/api-integrations/mailjet - docs_connect: https://nango.dev/docs/api-integrations/mailjet/connect - credentials: - username: - type: string - title: API Key - description: Your Mailjet API Key. - secret: true - pattern: '^[a-f0-9]{32}$' - example: 'a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6' - doc_section: '#step-1-getting-your-credentials' - password: - type: string - title: Secret Key - description: Your Mailjet Secret Key. - secret: true - pattern: '^[a-f0-9]{32}$' - example: 'f6e5d4c3b2a1f0e9d8c7b6a5f4e3d2c1' - doc_section: '#step-1-getting-your-credentials' - -mcp-generic: - display_name: MCP Server OAuth2 (Generic) - categories: - - mcp - auth_mode: MCP_OAUTH2_GENERIC - connection_config: - mcp_server_url: - type: string - title: MCP Server URL - description: The base URL of your MCP server - example: https://mcp.notion.com/mcp - pattern: '^https://[a-zA-Z0-9.-]+(?:\:[0-9]+)?(?:/.*)?$' - docs: https://nango.dev/docs/integrations/all/mcp-generic - -# Untested configuration. Please reach out if you have a test account that we can use to test it. -manatal: - display_name: Manatal - auth_mode: API_KEY - categories: - - crm - - hr - - ats - proxy: - base_url: https://api.manatal.com/open/v3 - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /users - headers: - authorization: Token ${apiKey} - paginate: - type: link - limit_name_in_request: page_size - link_path_in_response_body: next - response_path: results - docs: https://nango.dev/docs/integrations/all/manatal - docs_connect: https://nango.dev/docs/integrations/all/manatal/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Manatal account - doc_section: '#step-2-generate-an-api-key' - -marketo: - display_name: Marketo - categories: - - marketing - auth_mode: OAUTH2_CC - proxy: - base_url: https://${connectionConfig.endpointURL} - token_url: https://${connectionConfig.identityURL}/identity/oauth/token - token_params: - grant_type: client_credentials - docs: https://nango.dev/docs/integrations/all/marketo - docs_connect: https://nango.dev/docs/integrations/all/marketo/connect - connection_config: - endpointURL: - type: string - title: Domain - description: The domain of your Marketo account - format: hostname - example: xxx.mktorest.com - prefix: https:// - suffix: / - order: 1 - doc_section: '#step-3-find-your-domain-and-identity-url' - identityURL: - type: string - title: Identity URL - description: The identity URL of your Marketo account - format: hostname - prefix: https:// - example: xxx.mktorest.com - suffix: /identity/oauth/token - order: 2 - doc_section: '#step-3-find-your-domain-and-identity-url' - -mattermost: - display_name: Mattermost - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.hostname}/api - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'x-ratelimit-reset' - verification: - method: GET - endpoints: - - /v4/users/me - docs: https://nango.dev/docs/api-integrations/mattermost - docs_connect: https://nango.dev/docs/api-integrations/mattermost/connect - connection_config: - hostname: - type: string - title: Server URL - description: The hostname of your Mattermost server. - example: mattermost.example.com - pattern: '^[a-zA-Z0-9.-]+(?::[0-9]+)?$' - prefix: https:// - order: 1 - doc_section: '#step-1-find-your-mattermost-server-url' - credentials: - apiKey: - type: string - title: Personal Access Token - description: Your Mattermost personal access token. - example: 'hx3mq8n0vy6***************' - pattern: '^[a-z0-9]+$' - doc_section: '#step-2-generate-a-personal-access-token' - -malwarebytes: - display_name: Malwarebytes - categories: - - other - auth_mode: OAUTH2_CC - token_url: https://api.malwarebytes.com/oauth2/token - token_request_auth_method: basic - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.malwarebytes.com - headers: - accountid: ${connectionConfig.accountId} - connection_config: - accountId: - type: string - title: Account Id - description: Your Nebula account id - pattern: '[\da-fA-F]{8}-?[\da-fA-F]{4}-?[\da-fA-F]{4}-?[\da-fA-F]{4}-?[\da-fA-F]{12}$' - example: 9256034b-7967-4253-a5d9-260663e4fa4f - order: 1 - doc_section: '#step-1-finding-your-account-id' - - docs: https://nango.dev/docs/integrations/all/malwarebytes - docs_connect: https://nango.dev/docs/integrations/all/malwarebytes/connect - -medallia: - display_name: Medallia - categories: - - crm - - support - - surveys - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.reportingInstance}/oauth/${connectionConfig.tenantName}/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - retry: - after: - - 'x-ratelimit-reset' - base_url: https://${connectionConfig.apiHostUrl} || https://${connectionConfig.gatewayUrl}.apis.medallia.com - docs: https://nango.dev/docs/integrations/all/medallia - docs_connect: https://nango.dev/docs/integrations/all/medallia/connect - connection_config: - reportingInstance: - type: string - title: Domain - description: The base domain for your Medallia instance - format: hostname - prefix: https:// - suffix: /oauth - example: instance.medallia.com - order: 1 - doc_section: '#step-2-identifying-your-domain' - tenantName: - type: string - title: Tenant Name - description: The tenant name of your Medallia account - order: 2 - example: acme - doc_section: '#step-3-identifying-your-tenant-name' - apiHostUrl: - type: string - title: API Host URL - description: The base API endpoint (gateway URL) for your Medallia account - format: hostname - prefix: https:// - order: 3 - example: fo-acme.apis.medallia.eu - doc_section: '#step-4-identifying-your-api-host-url' - gatewayUrl: - type: string - title: '' - description: '' - default_value: '' - hidden: true # deprecating this in favor of apiHostUrl - -metabase: - display_name: Metabase - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.hostname} || https://${connectionConfig.domain}.com - headers: - x-api-key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/database - docs: https://nango.dev/docs/api-integrations/metabase - docs_connect: https://nango.dev/docs/api-integrations/metabase/connect - connection_config: - hostname: - type: string - title: Hostname - description: The Metabase hostname - example: acme.metabaseapp.com - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-metabase-hostname' - domain: - type: string - title: '' - description: '' - default_value: '' - hidden: true # deprecating this in favor of hostname - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Metabase account - example: mb_**************************kR9mZw= - pattern: '^mb_[A-Za-z0-9+/]+=*$' - doc_section: '#step-2-generating-an-api-key' - -mercury: - display_name: Mercury - categories: - - accounting - auth_mode: OAUTH2 - scope_separator: ' ' - authorization_method: header - authorization_url: https://${connectionConfig.oauth_hostname}/oauth2/auth || https://oauth2.mercury.com/oauth2/auth - token_url: https://${connectionConfig.oauth_hostname}/oauth2/token || https://oauth2.mercury.com/oauth2/token - default_scopes: - - offline_access - proxy: - base_url: https://${connectionConfig.hostname} || https://api.mercury.com - docs: https://nango.dev/docs/api-integrations/mercury - docs_connect: https://nango.dev/docs/api-integrations/mercury/connect - setup_guide_url: https://nango.dev/docs/api-integrations/mercury/how-to-register-your-own-mercury-oauth-app - connection_config: - oauth_hostname: - type: string - title: OAuth Hostname - description: Your Mercury OAuth hostname. - optional: true - enum: - - oauth2.mercury.com - - oauth2-sandbox.mercury.com - hostname: - type: string - title: API Hostname - description: Your Mercury API hostname. - optional: true - enum: - - api.mercury.com - - api-sandbox.mercury.com - -meta-marketing-api: - display_name: Meta Marketing API - categories: - - marketing - alias: facebook - docs: https://nango.dev/docs/api-integrations/meta-marketing-api - setup_guide_url: https://nango.dev/docs/api-integrations/meta-marketing-api/how-to-register-your-own-meta-marketing-api-oauth-app - -microsoft: - display_name: Microsoft - auth_mode: OAUTH2 - categories: - - communication - - dev-tools - - productivity - authorization_url: https://login.microsoftonline.com/common/oauth2/v2.0/authorize - token_url: https://login.microsoftonline.com/common/oauth2/v2.0/token - disable_pkce: true - default_scopes: - - offline_access - - .default - authorization_params: - response_type: code - response_mode: query - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://graph.microsoft.com - retry: - after: - - 'retry-after' - decompress: true - docs: https://nango.dev/docs/api-integrations/microsoft - setup_guide_url: https://nango.dev/docs/api-integrations/microsoft/how-to-register-your-own-microsoft-api-oauth-app - -microsoft-admin: - display_name: Microsoft (Admin) - auth_mode: OAUTH2 - categories: - - communication - - dev-tools - - productivity - - iam - authorization_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/adminconsent - token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token - authorization_code_param_in_callback: tenant - proxy: - base_url: https://graph.microsoft.com - retry: - after: - - 'retry-after' - decompress: true - docs: https://nango.dev/docs/integrations/all/microsoft-admin - docs_connect: https://nango.dev/docs/integrations/all/microsoft-admin/connect - connection_config: - tenantId: - type: string - title: Tenant ID - description: The unique identifier for your organization that uses Microsoft services - format: uuid - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-1-finding-your-tenant-id' - order: 1 - -microsoft-teams-bot: - display_name: Microsoft Teams Bot - auth_mode: OAUTH2 - categories: - - communication - authorization_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/authorize - token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token - disable_pkce: true - default_scopes: - - offline_access - - .default - authorization_params: - response_type: code - response_mode: query - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://smba.trafficmanager.net/teams - connection_config: - botHostTenantId: ${connectionConfig.botHostTenantId} - webhook_routing_script: microsoftTeamsWebhookRouting - post_connection_script: microsoftTeamsBotPostConnection - docs: https://nango.dev/docs/api-integrations/microsoft-teams-bot - docs_connect: https://nango.dev/docs/api-integrations/microsoft-teams-bot/connect - connection_config: - tenantId: - type: string - title: Tenant ID - description: The unique identifier for your Microsoft Entra ID tenant. - format: uuid - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-1-finding-your-tenant-id' - order: 1 - botHostTenantId: - type: string - title: '' - description: '' - automated: true - -microsoft-excel: - display_name: Microsoft Excel - categories: - - productivity - - analytics - alias: microsoft - docs: https://nango.dev/docs/integrations/all/microsoft-excel - -microsoft-oauth2-cc: - display_name: Microsoft (Client Credentials) - auth_mode: OAUTH2_CC - categories: - - communication - - dev-tools - - productivity - token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://graph.microsoft.com - webhook_routing_script: microsoftClientCredentialsWebhookRouting - webhook_user_defined_secret: true - webhook_allowed_query_params: - - validationToken - docs: https://nango.dev/docs/api-integrations/microsoft-oauth2-cc - docs_connect: https://nango.dev/docs/api-integrations/microsoft-oauth2-cc/connect - connection_config: - tenantId: - type: string - title: Tenant ID - description: The unique identifier for your organization that uses Microsoft services - format: uuid - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-1-finding-your-tenant-id' - order: 1 - -microsoft-oauth2-cc-cert: - display_name: Microsoft (Client Credentials - Certificate) - auth_mode: TWO_STEP - categories: - - communication - - dev-tools - - productivity - body_format: form - token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token - token_params: - grant_type: client_credentials - client_id: ${credentials.clientId} - scope: ${connectionConfig.oauth_scopes} - client_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer - client_assertion: ${credentials.assertion} - token_headers: - content-type: application/x-www-form-urlencoded - assertion: - type: jwt - key: ${credentials.privateKey} - lifetimeInSeconds: 3600 - header: - alg: PS256 - x5t#S256: ${credentials.certificateThumbprint} - payload: - iss: ${credentials.clientId} - sub: ${credentials.clientId} - aud: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token - jti: ${random} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://graph.microsoft.com - docs: https://nango.dev/docs/api-integrations/microsoft-oauth2-cc-cert - docs_connect: https://nango.dev/docs/api-integrations/microsoft-oauth2-cc-cert/connect - connection_config: - tenantId: - type: string - title: Tenant ID - description: The unique identifier for your organization that uses Microsoft services. - format: uuid - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-1-finding-your-tenant-id' - order: 1 - oauth_scopes: - type: string - title: Scope - description: The resource scope to request access for. - example: https://graph.microsoft.com/.default - doc_section: '#step-5-granting-api-permissions' - order: 2 - credentials: - clientId: - type: string - title: Client ID - description: The application (client) ID assigned to your app in Azure. - format: uuid - example: 11112222-bbbb-3333-cccc-4444dddd5555 - doc_section: '#step-2-registering-your-application-and-finding-your-client-id' - privateKey: - type: string - title: Private Key - description: The RSA private key (PEM format) matching the certificate uploaded to your Azure app registration. - example: "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n-----END PRIVATE KEY-----" - secret: true - doc_section: '#step-3-generating-a-certificate-and-uploading-it-to-azure' - certificateThumbprint: - type: string - title: Certificate Thumbprint (x5t#S256) - description: The base64url-encoded SHA-256 thumbprint of your certificate. - example: rCnkMH5GKJI03tRpdjBh8OG2U8I - doc_section: '#step-4-computing-the-certificate-thumbprint-x5t' - assertion: - type: string - title: '' - description: '' - automated: true - -microsoft-intune: - display_name: Microsoft Intune - categories: - - dev-tools - alias: microsoft-oauth2-cc - docs: https://nango.dev/docs/api-integrations/microsoft-intune - docs_connect: https://nango.dev/docs/api-integrations/microsoft-intune/connect - -microsoft-planner: - display_name: Microsoft Planner - categories: - - productivity - - analytics - alias: microsoft - docs: https://nango.dev/docs/api-integrations/microsoft-planner - setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-planner/how-to-register-your-own-microsoft-planner-api-oauth-app - -microsoft-powerpoint: - display_name: Microsoft PowerPoint - categories: - - productivity - alias: microsoft - docs: https://nango.dev/docs/api-integrations/microsoft-powerpoint - setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-powerpoint/how-to-register-your-own-microsoft-powerpoint-api-oauth-app - -microsoft-teams: - display_name: Microsoft Teams - categories: - - productivity - - video - - popular - alias: microsoft - webhook_routing_script: microsoftTeamsWebhookRouting - post_connection_script: microsoftTeamsPostConnection - docs: https://nango.dev/docs/api-integrations/microsoft-teams - setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-teams/how-to-register-your-own-microsoft-teams-api-oauth-app - -microsoft-people: - display_name: Microsoft People - categories: - - productivity - alias: microsoft - docs: https://nango.dev/docs/api-integrations/microsoft-people - setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-people/how-to-register-your-own-microsoft-people-api-oauth-app - -microsoft-word: - display_name: Microsoft Word - categories: - - productivity - alias: microsoft - docs: https://nango.dev/docs/api-integrations/microsoft-word - setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-word/how-to-register-your-own-microsoft-word-api-oauth-app - -microsoft-tenant-specific: - display_name: Microsoft (Tenant) - categories: - - erp - auth_mode: OAUTH2 - authorization_url: https://login.microsoftonline.com/${connectionConfig.tenant}/oauth2/v2.0/authorize - token_url: https://login.microsoftonline.com/${connectionConfig.tenant}/oauth2/v2.0/token - disable_pkce: true - default_scopes: - - offline_access - authorization_params: - response_type: code - response_mode: query - prompt: consent - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://graph.microsoft.com - docs: https://nango.dev/docs/integrations/all/microsoft-tenant-specific - connection_config: - tenant: - type: string - title: Tenant - description: The tenant of your Microsoft account - -microsoft-business-central: - display_name: Microsoft Business Central - categories: - - erp - auth_mode: OAUTH2_CC - token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.businesscentral.dynamics.com/v2.0/${connectionConfig.tenantId}/${connectionConfig.environmentName} - docs: https://nango.dev/docs/integrations/all/microsoft-business-central - docs_connect: https://nango.dev/docs/integrations/all/microsoft-business-central/connect - connection_config: - tenantId: - type: string - title: Tenant ID - description: The unique identifier for your organization that uses Microsoft services - format: uuid - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-1-finding-your-tenant-id' - order: 1 - environmentName: - type: string - title: Enrivonment Name - description: The environment name to your organization - example: production - pattern: '^[a-zA-Z0-9-_]+$' - doc_section: '#step-2-finding-your-enrivonment-name' - order: 2 - -microsoft-ads: - display_name: Microsoft Ads - alias: microsoft - categories: - - marketing - default_scopes: - - https://ads.microsoft.com/msads.manage - - offline_access - proxy: - base_url: https://clientcenter.api.bingads.microsoft.com/Api - refresh_params: - grant_type: refresh_token - scope: https://ads.microsoft.com/msads.manage - docs: https://nango.dev/docs/integrations/all/microsoft-ads - -microsoft-entra-id: - display_name: Microsoft Entra ID - categories: - - iam - alias: microsoft - docs: https://nango.dev/docs/integrations/all/microsoft-entra-id - -microsoft-power-bi: - display_name: Microsoft Power BI - categories: - - productivity - alias: microsoft - proxy: - base_url: https://api.powerbi.com - docs: https://nango.dev/docs/integrations/all/microsoft-power-bi - -maximizer: - display_name: Maximizer (Cloud) - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.region}.maximizercrmlive.com/oauth2/${connectionConfig.company_alias}/authorize - token_url: https://${connectionConfig.region}.maximizercrmlive.com/oauth2/${connectionConfig.company_alias}/token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.region}.maximizercrmlive.com - docs: https://nango.dev/docs/api-integrations/maximizer - setup_guide_url: https://nango.dev/docs/api-integrations/maximizer/how-to-register-your-own-maximizer-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/maximizer/connect - connection_config: - region: - type: string - title: Region - description: Region-specific subdomain. - enum: - - caw - - ukw - company_alias: - type: string - title: Company Alias - description: The company alias of your Maximizer cloud account. - example: acme - -maximizer-on-premise: - display_name: Maximizer (On-Premise) - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.hostname}/MaximizerWebAuthentication/OAuth2/Authorize - token_url: https://${connectionConfig.hostname}/MaximizerWebAuthentication/OAuth2/Token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.hostname} - docs: https://nango.dev/docs/api-integrations/maximizer-on-premise - setup_guide_url: https://nango.dev/docs/api-integrations/maximizer-on-premise/how-to-register-your-own-maximizer-on-premise-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/maximizer-on-premise/connect - connection_config: - hostname: - type: string - title: Hostname - description: The hostname of your Maximizer on premise instance. - example: maximizer.mycompany.com - format: hostname - -maxio: - display_name: Maxio - categories: - - payment - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.hostname} - verification: - method: GET - endpoints: - - /subscriptions.json - docs: https://nango.dev/docs/api-integrations/maxio - docs_connect: https://nango.dev/docs/api-integrations/maxio/connect - credentials: - username: - type: string - title: API Key - description: Your Maxio API Key. - doc_section: '#step-2-retrieving-your-api-key' - password: - type: string - title: '' - description: '' - default_value: 'X' - hidden: true - connection_config: - hostname: - type: string - title: Hostname - description: Your Maxio site hostname. - pattern: '^[a-zA-Z0-9-]+\.(chargify\.com|ebilling\.maxio\.com)$' - example: acme.chargify.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-hostname' - -mindbody: - display_name: Mindbody - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.mindbodyonline.com - headers: - api-key: ${apiKey} - siteid: ${connectionConfig.siteId} - authorization: ${connectionConfig.staffUserToken} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /public/v6/site/locations - docs: https://nango.dev/docs/integrations/all/mindbody - docs_connect: https://nango.dev/docs/integrations/all/mindbody/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Mindbody account - pattern: '^[a-f0-9]{32}$' - example: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4 - doc_section: '#step-2-generate-api-key' - connection_config: - siteId: - type: string - title: Site ID - description: The site ID for your Mindbody account - pattern: '^\d+$' - example: '-99' - doc_section: '#step-3-obtain-site-id-and-staff-user-token' - staffUserToken: - type: string - title: Staff User Token - description: The staff user token for your Mindbody account - pattern: '^[a-f0-9]{32}$' - example: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4 - doc_section: '#step-3-obtain-site-id-and-staff-user-token' - -minimax: - display_name: MiniMax - categories: - - productivity - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.minimaxi.chat - headers: - authorization: Bearer ${apiKey} - group-id: ${connectionConfig.groupId} - query: - GroupId: ${connectionConfig.groupId} - docs: https://nango.dev/docs/integrations/all/minimax - docs_connect: https://nango.dev/docs/integrations/all/minimax/connect - connection_config: - groupId: - type: string - title: Group ID - description: The unique identifier for your MiniMax account, linked to your account's privileges. - example: '1234567890123456789' - pattern: '^\d{19}$' - doc_section: '#step-1-retrieve-your-group-id' - credentials: - apiKey: - type: string - title: API Key - description: The API key for securely accessing the MiniMax API. - doc_section: '#step-2-generate-an-api-key' - -mip-cloud: - display_name: MIP Cloud - categories: - - accounting - auth_mode: TWO_STEP - proxy: - base_url: https://api.mip.com - headers: - authorization-token: ${accessToken} - token_url: https://${connectionConfig.domain}/api/v1/sso/mipadv/login - token_params: - username: ${credentials.username} - password: ${credentials.password} - org: ${credentials.org} - token_headers: - content-type: application/json - token_response: - token: AccessToken - docs: https://nango.dev/docs/integrations/all/mip-cloud - docs_connect: https://nango.dev/docs/integrations/all/mip-cloud/connect - credentials: - username: - type: string - title: ID - description: Your Login ID for MIP Fund Accounting - password: - type: string - title: Password - description: Your Password for MIP Fund Accounting. - secret: true - org: - type: string - title: ORG - description: The MIP Fund Accounting database you will be using. - optional: true - example: ZQXP_98421_NTO - connection_config: - domain: - type: string - title: HOST REST Service URL - description: The rest service URL for the cloud-based API service - prefix: https:// - suffix: /api/v1/sso/mipadv/login - format: hostname - -mip-on-premise: - display_name: MIP On Premise - categories: - - accounting - auth_mode: TWO_STEP - proxy: - base_url: https://api.mip.com - headers: - authorization-token: ${accessToken} - token_url: https://${connectionConfig.domain}/api/security/login - token_params: - login: ${credentials.login} - password: ${credentials.password} - org: ${credentials.org} - token_headers: - content-type: application/json - token_response: - token: AccessToken - docs: https://nango.dev/docs/integrations/all/mip-on-premise - docs_connect: https://nango.dev/docs/integrations/all/mip-on-premise/connect - credentials: - login: - type: string - title: ID - description: Your Login ID for MIP Fund Accounting - password: - type: string - title: Password - description: Your Password for MIP Fund Accounting. - secret: true - org: - type: string - title: ORG - description: The MIP Fund Accounting database you will be using. - connection_config: - domain: - type: string - title: HOST REST Service URL - description: The URL of your locally installed REST API server. - prefix: https:// - suffix: /api/security/login - format: hostname - -mixpanel: - display_name: Mixpanel - categories: - - analytics - auth_mode: BASIC - proxy: - base_url: https://mixpanel.com - credentials: - # https://developer.mixpanel.com/reference/service-accounts - username: - type: string - title: Service Account Username - description: Mixpanel Service Account Username - doc_section: '#step-1-finding-mixpanel-api-key' - password: - type: string - title: Service Account Secret - description: Mixpanel Service Account Secret - doc_section: '#step-1-finding-mixpanel-api-key' - docs: https://nango.dev/docs/integrations/all/mixpanel - docs_connect: https://nango.dev/docs/integrations/all/mixpanel/connect - -mimecast: - display_name: Mimecast - categories: - - communication - auth_mode: OAUTH2_CC - token_url: https://api.services.mimecast.com/oauth/token - body_format: form - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.services.mimecast.com - docs: https://nango.dev/docs/integrations/all/mimecast - docs_connect: https://nango.dev/docs/integrations/all/mimecast/connect - -miro: - display_name: Miro - categories: - - design - - productivity - auth_mode: OAUTH2 - authorization_url: https://miro.com/oauth/authorize - token_url: https://api.miro.com/v1/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.miro.com - docs: https://nango.dev/docs/integrations/all/miro - -miro-scim: - display_name: Miro (SCIM API) - categories: - - design - - productivity - auth_mode: API_KEY - proxy: - base_url: https://miro.com/api - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/scim/Users - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/miro-scim - docs_connect: https://nango.dev/docs/integrations/all/miro-scim/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Miro scim account - doc_section: '#step-1-finding-miro-api-key' -missive: - display_name: Missive - categories: - - productivity - auth_mode: API_KEY - proxy: - headers: - api_token: ${apiKey} - base_url: https://missiveapp.com - docs: https://nango.dev/docs/integrations/all/missive - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Missive account - -juniper-mist: - display_name: Juniper Mist - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.mist.com - headers: - authorization: Token ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v1/self - docs: https://nango.dev/docs/api-integrations/juniper-mist - docs_connect: https://nango.dev/docs/api-integrations/juniper-mist/connect - connection_config: - subdomain: - type: string - title: API Subdomain - description: The API subdomain for your Juniper Mist region - example: api - pattern: '^api(\.[a-z0-9]+)*$' - doc_section: '#step-1-finding-your-api-subdomain' - credentials: - apiKey: - type: string - title: API Token - description: Your Juniper Mist API token - doc_section: '#step-2-generating-your-api-token' - example: 3n69xDYMlT36fulLwIq7PDaDopc5W0b***************************************************************** - pattern: '^[A-Za-z0-9]{96}$' - -monday: - display_name: Monday - categories: - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://auth.monday.com/oauth2/authorize - token_url: https://auth.monday.com/oauth2/token - disable_pkce: true - authorization_params: - force_install_if_needed: true - authorization_url_replacements: - response_type: '' - proxy: - base_url: https://api.monday.com - docs: https://nango.dev/docs/api-integrations/monday - setup_guide_url: https://nango.dev/docs/api-integrations/monday/how-to-register-your-own-monday-oauth-app - -momentum-io: - display_name: Momentum.io - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.momentum.io - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v1/meetings?from=1970-01-01T00:00:00.000Z&pageSize=1 - docs: https://nango.dev/docs/integrations/all/momentum-io - docs_connect: https://nango.dev/docs/integrations/all/momentum-io/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Make account - doc_section: '#step-1-generating-an-api-key' - -modjo-ai: - display_name: Modjo AI - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.modjo.ai - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v1/users?page=1&perPage=1 - docs: https://nango.dev/docs/api-integrations/modjo-ai - docs_connect: https://nango.dev/docs/api-integrations/modjo-ai/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Modjo AI API key. - doc_section: '#step-1-generate-your-api-key' - -mollie: - display_name: Mollie - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://my.mollie.com/oauth2/authorize - token_url: https://api.mollie.com/oauth2/tokens - scope_separator: ' ' - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.mollie.com - docs: https://nango.dev/docs/api-integrations/mollie - setup_guide_url: https://nango.dev/docs/api-integrations/mollie/how-to-register-your-own-mollie-oauth-app -modmed: - display_name: ModMed - categories: - - other - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.environment}/firm/${connectionConfig.firmUrlPrefix}/ema/ws/oauth2/grant - token_params: - grant_type: password - username: ${credentials.username} - password: ${credentials.password} - token_headers: - x-api-key: ${credentials.apiKey} - accept: application/json - content-type: application/x-www-form-urlencoded - proxy: - base_url: https://${connectionConfig.environment}/firm/${connectionConfig.firmUrlPrefix} - headers: - accept: application/fhir+json - x-api-key: ${credentials.apiKey} - token_response: - token: access_token - docs: https://nango.dev/docs/api-integrations/modmed - docs_connect: https://nango.dev/docs/api-integrations/modmed/connect - connection_config: - environment: - type: string - title: Environment - description: The ModMed API environment. - enum: - - stage.ema-api.com/ema-dev - - stage.ema-api.com/ema-training - - stage.ema-api.com/ema-prod - - mmapi.ema-api.com/ema-dev - - mmapi.ema-api.com/ema-training - - mmapi.ema-api.com/ema-prod - doc_section: '#step-3-selecting-your-environment' - order: 1 - firmUrlPrefix: - type: string - title: Firm URL Prefix - description: The firm URL prefix for your practice - example: emapmsandbox01 - doc_section: '#step-2-finding-your-firm-url-prefix' - order: 2 - credentials: - username: - type: string - title: Username - description: Your API username - example: fhir_QfLlo - doc_section: '#step-1-request-access-to-modmed-sandbox' - password: - type: string - title: Password - description: Your API password - secret: true - doc_section: '#step-1-request-access-to-modmed-sandbox' - apiKey: - type: string - title: API Key - description: Your API key (x-api-key) - secret: true - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-1-request-access-to-modmed-sandbox' - -mural: - display_name: Mural - categories: - - design - auth_mode: OAUTH2 - authorization_url: https://app.mural.co/api/public/v1/authorization/oauth2 - token_url: https://app.mural.co/api/public/v1/authorization/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://app.mural.co - docs: https://nango.dev/docs/integrations/all/mural - -nable-ncentral: - display_name: N-able N-central - categories: - - support - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.serverUrl}/api/auth/authenticate - token_headers: - authorization: Bearer ${credentials.userApiToken} - accept: application/json - token_response: - token: tokens.access.token - token_expiration: tokens.access.expirySeconds - token_expiration_strategy: expireIn - proxy: - base_url: https://${connectionConfig.serverUrl}/api - verification: - method: GET - endpoints: - - /auth/validate - docs: https://nango.dev/docs/api-integrations/nable-ncentral - docs_connect: https://nango.dev/docs/api-integrations/nable-ncentral/connect - connection_config: - serverUrl: - type: string - title: N-central server URL - description: Your N-central server hostname. - example: ncentral.example.com - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-1-find-your-n-central-server-url' - credentials: - userApiToken: - type: string - title: User-API token - description: Your N-central User-API token (JWT) - pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' - example: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJOX2NlbnRyYWwifQ.c2lnbmF0dXJl - secret: true - doc_section: '#step-2-generate-a-user-api-token' - -nationbuilder: - display_name: NationBuilder - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.accountId}.nationbuilder.com/oauth/authorize - token_url: https://${connectionConfig.accountId}.nationbuilder.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - default_scopes: - - default - docs: https://nango.dev/docs/integrations/all/nationbuilder - proxy: - base_url: https://${connectionConfig.accountId}.nationbuilder.com/api - connection_config: - accountId: - type: string - title: Account ID - description: The account ID of your NationBuilder account - -namely: - display_name: Namely - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.company}.namely.com/api/v1/oauth2/authorize - token_url: https://${connectionConfig.company}.namely.com/api/v1/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.company}.namely.com/api - docs: https://nango.dev/docs/integrations/all/namely - docs_connect: https://nango.dev/docs/integrations/all/namely/connect - connection_config: - company: - type: string - title: Company - description: The name of your Namely company - example: example - doc_section: '#step-1-finding-your-company-name' - -namely-pat: - display_name: Namely (PAT) - categories: - - hr - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://${connectionConfig.company}.namely.com/api - docs: https://nango.dev/docs/integrations/all/namely-pat - docs_connect: https://nango.dev/docs/integrations/all/namely-pat/connect - connection_config: - company: - type: string - title: Company Name - description: The name of your Namely company - example: example - order: 1 - doc_section: '#step-1-finding-your-company-name' - credentials: - apiKey: - type: string - title: Personal Access Token - description: The Personal Access Token for your Namely account - doc_section: '#step-2-generating-your-personal-access-token' - -nerdio: - display_name: Nerdio - categories: - - other - auth_mode: OAUTH2_CC - token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token - token_params: - grant_type: client_credentials - scope: ${connectionConfig.scope} - proxy: - base_url: https://${connectionConfig.hostname}/rest-api - docs: https://nango.dev/docs/api-integrations/nerdio - docs_connect: https://nango.dev/docs/api-integrations/nerdio/connect - connection_config: - hostname: - type: string - title: Nerdio Instance URL - description: The hostname of your Nerdio Manager instance - format: hostname - example: web-admin-portal-3e3a4zfp4peo4.azurewebsites.net - doc_section: '#step-1-finding-your-nerdio-instance-url' - order: 1 - tenantId: - type: string - title: Azure Tenant ID - description: Your Azure Active Directory Tenant ID - format: uuid - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-2-getting-your-azure-credentials' - order: 2 - scope: - type: string - title: API Scope - description: The Application ID URI scope - example: api://g0cb288e-ff16-1861-9393-50219a19453c/.default - doc_section: '#step-3-configuring-the-api-scope' - order: 3 - credentials: - client_id: - type: string - title: Client ID - description: The Application (client) ID from your Azure App Registration - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - format: uuid - doc_section: '#step-2-getting-your-azure-credentials' - client_secret: - type: string - title: Client Secret - description: The client secret from your Azure App Registration - secret: true - doc_section: '#step-2-getting-your-azure-credentials' - -netsuite: - display_name: NetSuite (OAuth) - categories: - - accounting - - erp - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.accountId}.app.netsuite.com/app/login/oauth2/authorize.nl - authorization_params: - prompt: consent - token_url: https://${connectionConfig.accountId}.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token - default_scopes: - - rest_webservices - proxy: - base_url: https://${connectionConfig.accountId}.suitetalk.api.netsuite.com/services/rest/record/v1 - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/netsuite - connection_config: - accountId: - type: string - title: Account ID - description: The account ID of your NetSuite account - pattern: '^[a-zA-Z0-9-_]+$' - example: tstdrv231585 - -netsuite-tba: - alias: netsuite - display_name: NetSuite (TBA) - auth_mode: TBA - categories: - - accounting - - erp - - popular - docs: https://nango.dev/docs/api-integrations/netsuite-tba - setup_guide_url: https://nango.dev/docs/api-integrations/netsuite-tba/how-to-set-up-netsuite-tba-with-nango - -netsuite-client-credentials: - alias: netsuite - display_name: NetSuite (Client Credentials) - categories: - - accounting - - erp - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.accountId}.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token - token_params: - grant_type: client_credentials - client_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer - client_assertion: ${credentials.assertion} - token_headers: - content-type: application/x-www-form-urlencoded - assertion: - type: jwt - key: ${assertionOption.privateKey} - lifetimeInSeconds: 3600 - header: - alg: RS256 - kid: ${credentials.certificateId} - payload: - iss: ${credentials.clientId} - aud: https://${connectionConfig.accountId}.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token - jti: ${random} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/api-integrations/netsuite-client-credentials - docs_connect: https://nango.dev/docs/api-integrations/netsuite-client-credentials/connect - credentials: - clientId: - type: string - title: Client ID - description: The Client ID from your NetSuite integration record. - example: 1c343a716c1d****************************976dde7d8e3e2 - certificateId: - type: string - title: Certificate ID - description: The ID of the certificate registered in your NetSuite integration. - example: HRril7Vwkk********************eWT2Fgks - assertion: - type: string - title: '' - description: '' - automated: true - connection_config: - accountId: - type: string - title: Account ID - description: Your NetSuite Account ID (e.g. 1234567 or 1234567_SB1 for sandbox). - example: '1234567' - assertion_option: - privateKey: - type: string - title: Private Key - description: The RSA private key (PEM format) used to sign the JWT assertion. - example: "-----BEGIN RSA PRIVATE KEY-----\nMIIEow...\n-----END RSA PRIVATE KEY-----" - -next-cloud-ocs: - display_name: Next Cloud OCS - categories: - - storage - - productivity - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.domain}/ocs/v1.php - headers: - 'ocs-apirequest': 'true' - docs: http://nango.dev/docs/integrations/all/next-cloud-ocs - docs_connect: https://nango.dev/docs/integrations/all/next-cloud-ocs/connect - connection_config: - domain: - type: string - title: Domain - description: The domain of your Next Cloud account - format: hostname - prefix: https:// - doc_section: '#step-1-locate-your-next-cloud-domain' - -nexthink: - display_name: Nexthink - categories: - - analytics - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.instance}-login.${connectionConfig.region}.nexthink.cloud/oauth2/default/v1/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - default_scopes: - - service:integration - proxy: - base_url: https://${connectionConfig.instance}.api.${connectionConfig.region}.nexthink.cloud - docs: https://nango.dev/docs/api-integrations/nexthink - docs_connect: https://nango.dev/docs/api-integrations/nexthink/connect - credentials: - client_id: - type: string - title: Client ID - description: Your Nexthink API Client ID. - doc_section: '#step-2-create-api-credentials' - client_secret: - type: string - title: Client Secret - description: Your Nexthink API Client Secret. - secret: true - doc_section: '#step-2-create-api-credentials' - connection_config: - instance: - type: string - title: Instance Name - description: The name of your Nexthink instance. - example: acme - order: 1 - doc_section: '#step-1-locate-your-instance-name-and-region' - region: - type: string - title: Region - description: 'Your Nexthink region' - example: eu - pattern: '^(us|eu|pac|meta)$' - order: 2 - doc_section: '#step-1-locate-your-instance-name-and-region' - -ninjaone-rmm: - display_name: NinjaOne RMM - categories: - - support - auth_mode: OAUTH2_CC - token_url: https://app.ninjarmm.com/ws/oauth/token - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://app.ninjarmm.com - credentials: - client_id: - type: string - title: Client ID - description: Your NinjaOne RMM OAuth Client ID - example: KTmhkNf1_dZZVPmIQTK_lH2DCNJ - pattern: '^[A-Za-z0-9_/+-]{10,}$' - doc_section: '#step-1-create-an-oauth-client-application' - client_secret: - type: string - title: Client Secret - description: Your NinjaOne RMM OAuth Client Secret - example: 'Ilfs4crKIU1t-5bde-2OMBsB9v3LGmfg82XJO7_q9TtgTnfNRmK' - pattern: '^[A-Za-z0-9_/+-]{10,}$' - secret: true - doc_section: '#step-2-copy-your-credentials' - docs: https://nango.dev/docs/integrations/all/ninjaone-rmm - docs_connect: https://nango.dev/docs/integrations/all/ninjaone-rmm/connect - -ninjaone-rmm-oauth2: - display_name: NinjaOne RMM (OAuth2) - categories: - - support - auth_mode: OAUTH2 - authorization_url: https://app.ninjarmm.com/ws/oauth/authorize - token_url: https://app.ninjarmm.com/ws/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - scope_separator: ' ' - default_scopes: - - offline_access - proxy: - base_url: https://app.ninjarmm.com - docs: https://nango.dev/docs/api-integrations/ninjaone-rmm-oauth2 - setup_guide_url: https://nango.dev/docs/api-integrations/ninjaone-rmm-oauth2/how-to-register-your-own-ninjaone-rmm-api-oauth-app - -ninjaone-saas-backup: - display_name: NinjaOne SaaS Backup - categories: - - storage - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.apiHost}/api - headers: - x-reseller-token: ${connectionConfig.resellerToken} - x-access-token: ${apiKey} - verification: - method: GET - endpoints: - - /accounts - docs: https://nango.dev/docs/api-integrations/ninjaone-saas-backup - docs_connect: https://nango.dev/docs/api-integrations/ninjaone-saas-backup/connect - connection_config: - apiHost: - type: string - title: API Host - description: The host from your NinjaOne SaaS Backup API URL. - example: dropsuite.us - pattern: '^(dropsuite\.com|dropsuite\.(us|uk|ca)|dropsuite-au\.com|[a-z0-9.-]+\.dropsuite\.com)$' - prefix: https:// - suffix: /api - order: 1 - doc_section: '#step-1-find-your-api-credentials' - resellerToken: - type: string - title: Reseller Token - description: The Reseller Token from NinjaOne SaaS Backup API Settings. - format: uuid - order: 2 - doc_section: '#step-1-find-your-api-credentials' - credentials: - apiKey: - type: string - title: Authentication Token - description: The Authentication Token from NinjaOne SaaS Backup API Settings. - format: uuid - secret: true - doc_section: '#step-1-find-your-api-credentials' - -nocrm: - display_name: nocrm.io - categories: - - crm - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.nocrm.io - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /api/v2/ping - docs: https://nango.dev/docs/api-integrations/nocrm - docs_connect: https://nango.dev/docs/api-integrations/nocrm/connect - credentials: - apiKey: - type: string - title: API Key - description: Your nocrm.io API key - pattern: ^[a-f0-9]{48}$ - example: 4b945b************************************4991 - doc_section: '#step-2-obtaining-your-api-key' - connection_config: - subdomain: - type: string - title: Account subdomain - description: Your nocrm.io account subdomain - example: acme - prefix: https:// - pattern: '^[a-z0-9-]+$' - suffix: .nocrm.io - order: 1 - doc_section: '#step-1-finding-your-subdomain' - -northbeam: - display_name: Northbeam - categories: - - analytics - - marketing - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.northbeam.io - headers: - authorization: ${apiKey} - data-client-id: ${connectionConfig.dataClientId} - verification: - method: GET - endpoints: - - /v1/exports/attribution-models - docs: https://nango.dev/docs/api-integrations/northbeam - docs_connect: https://nango.dev/docs/api-integrations/northbeam/connect - connection_config: - subdomain: - type: string - title: API Subdomain - description: Use api for production or api-uat for testing/development. - enum: - - api - - api-uat - order: 1 - doc_section: '#step-1-getting-authentication-credentials' - dataClientId: - type: string - title: Data Client ID - description: Your Northbeam Data Client ID (UUID). - format: uuid - example: '123e4567-e89b-12d3-a456-426614174000' - doc_section: '#step-1-getting-authentication-credentials' - credentials: - apiKey: - type: string - title: API Key - description: Your Northbeam API Key. - format: uuid - example: f1c2d3a4-5b67-4c89-ae01-123456789abc - doc_section: '#step-1-getting-authentication-credentials' - -notion: - display_name: Notion - categories: - - knowledge-base - - popular - - productivity - auth_mode: OAUTH2 - authorization_url: https://api.notion.com/v1/oauth/authorize - token_url: https://api.notion.com/v1/oauth/token - authorization_params: - response_type: code - owner: user - authorization_method: header - body_format: json - webhook_routing_script: notionWebhookRouting - webhook_user_defined_secret: true - token_response_metadata: - - workspace_id - proxy: - retry: - after: - - 'retry-after' - base_url: https://api.notion.com - headers: - 'notion-version': '2022-06-28' - paginate: - type: cursor - cursor_path_in_response: next_cursor - cursor_name_in_request: start_cursor - limit_name_in_request: page_size - response_path: results - docs: https://nango.dev/docs/api-integrations/notion - setup_guide_url: https://nango.dev/docs/api-integrations/notion/how-to-register-your-own-notion-api-oauth-app - -notion-mcp: - display_name: Notion (MCP) - categories: - - knowledge-base - - productivity - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://mcp.notion.com/authorize - token_url: https://mcp.notion.com/token - registration_url: https://mcp.notion.com/register - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - docs: https://nango.dev/docs/api-integrations/notion-mcp - -notion-scim: - display_name: Notion (SCIM API) - categories: - - knowledge-base - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.notion.com/scim - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/Users - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/notion-scim - docs_connect: https://nango.dev/docs/integrations/all/notion-scim/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Notion scim account - doc_section: '#step-1-finding-your-scim-api-key-token' - -nyne-ai: - display_name: Nyne AI - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://api.nyne.ai - headers: - x-api-key: ${connectionConfig.apiKey} - x-api-secret: ${apiKey} - content-type: application/json - verification: - method: POST - headers: - content-type: application/json - endpoints: - - /person/events - data: - event: 'test' - docs: https://nango.dev/docs/api-integrations/nyne-ai - docs_connect: https://nango.dev/docs/api-integrations/nyne-ai/connect - connection_config: - apiKey: - type: string - title: API Key - description: Your Nyne AI API key. - pattern: '^[a-fA-F0-9]{32}$' - example: '48f0****************************892' - order: 1 - doc_section: '#step-1-getting-your-api-credentials' - credentials: - apiKey: - type: string - title: API Secret - description: Your Nyne AI API secret. - pattern: '^[a-fA-F0-9]{16}$' - example: '97e7********0463' - doc_section: '#step-1-getting-your-api-credentials' - -ocean-io: - display_name: Ocean.io - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.ocean.io - headers: - x-api-token: ${apiKey} - retry: - after: - - 'retry-after' - verification: - method: GET - endpoints: - - /v2/credits/balance - docs: https://nango.dev/docs/api-integrations/ocean-io - docs_connect: https://nango.dev/docs/api-integrations/ocean-io/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Ocean.io API token. - example: api_7Zs******_************************mhS - pattern: '^api_[A-Za-z0-9]+_[A-Za-z0-9]+' - doc_section: '#step-1-generate-your-api-token' - -odoo: - display_name: Odoo (OAuth) - categories: - - erp - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.serverUrl}/restapi/1.0/common/oauth2/authorize - token_url: https://${connectionConfig.serverUrl}/restapi/1.0/common/oauth2/access_token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.serverUrl} - docs: https://nango.dev/docs/integrations/all/odoo - connection_config: - serverUrl: - type: string - title: Domain - description: The domain of your Odoo account - format: hostname - prefix: https:// - -odoo-cc: - display_name: Odoo (Client Credentials) - categories: - - erp - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.serverUrl}/restapi/1.0/common/oauth2/access_token - token_params: - client_id: ${credentials.consumerId} - client_secret: ${credentials.consumerSecret} - grant_type: client_credentials - token_headers: - content-type: application/x-www-form-urlencoded - token_response: - token: access_token - token_expiration: access_token_validity - token_expiration_strategy: expireIn - proxy: - base_url: https://${connectionConfig.serverUrl}/restapi - docs: https://nango.dev/docs/integrations/all/odoo-cc - docs_connect: https://nango.dev/docs/integrations/all/odoo-cc/connect - credentials: - consumerId: - type: string - title: Consumer ID - description: Your App Consumer ID - secret: true - doc_section: '#step-2-generating-your-odoo-client-credentials' - consumerSecret: - type: string - title: Consumer Secret - description: Your App Consumer Secret - secret: true - doc_section: '#step-2-generating-your-odoo-client-credentials' - connection_config: - serverUrl: - type: string - title: Domain - description: The domain to your Odoo account - format: hostname - example: example.odoo.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-odoo-domain' - -okta: - display_name: Okta - auth_mode: OAUTH2 - categories: - - dev-tools - - iam - authorization_url: https://${connectionConfig.subdomain}.okta.com/oauth2/v1/authorize - token_url: https://${connectionConfig.subdomain}.okta.com/oauth2/v1/token - authorization_params: - response_type: code - response_mode: query - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.okta.com - retry: - at: - - 'x-rate-limit-reset' - paginate: - type: 'link' - limit_name_in_request: 'limit' - link_rel_in_response_header: 'next' - docs: https://nango.dev/docs/integrations/all/okta - connection_config: - subdomain: - type: string - title: Okta Domain - description: The subdomain of your Okta account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .okta.com - prefix: https:// - -okta-cc: - display_name: Okta (Client Credentials) - categories: - - dev-tools - - iam - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.hostname}/oauth2/v1/token || https://${connectionConfig.subdomain}.okta.com/oauth2/v1/token - token_request_auth_method: private_key_jwt - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.hostname} || https://${connectionConfig.subdomain}.okta.com - retry: - at: - - 'x-rate-limit-reset' - paginate: - type: 'link' - limit_name_in_request: 'limit' - link_rel_in_response_header: 'next' - docs: https://nango.dev/docs/api-integrations/okta-cc - docs_connect: https://nango.dev/docs/api-integrations/okta-cc/connect - credentials: - client_id: - type: string - title: Client ID - description: The Client ID of your Okta API Services application - doc_section: '#step-1-creating-your-okta-api-services-application' - client_private_key: - type: string - title: Private Key (JWK) - description: The private JWK JSON (including kid, kty, n, e, d, p, q, dp, dq, qi) whose public key is registered in your Okta API Services application - secret: true - doc_section: '#step-2-generating-and-registering-your-rsa-key-pair' - connection_config: - hostname: - type: string - title: Okta Domain - description: The full hostname of your Okta account - format: hostname - prefix: https:// - example: dev-12345678.okta.com - doc_section: '#step-3-finding-your-okta-domain' - subdomain: - type: string - title: '' - description: '' - hidden: true # deprecating this in favor of hostname - oauth_scopes: - type: string - title: Scopes - description: Space-separated list of Okta Management API scopes (e.g. okta.users.read okta.users.manage). Must be granted under Okta API Scopes on your application. - example: okta.users.read okta.users.manage okta.groups.read - doc_section: '#step-4-grant-api-scopes-to-your-application' - -okta-preview: - alias: okta - display_name: Okta (Preview) - categories: - - dev-tools - - iam - authorization_url: https://${connectionConfig.subdomain}.oktapreview.com/oauth2/v1/authorize - token_url: https://${connectionConfig.subdomain}.oktapreview.com/oauth2/v1/token - proxy: - base_url: https://${connectionConfig.subdomain}.oktapreview.com - docs: https://nango.dev/docs/integrations/all/okta-preview - connection_config: - subdomain: - type: string - title: Okta Preview Domain - description: The subdomain of your Okta Preview account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .oktapreview.com - prefix: https:// - -onlogist: - display_name: Onlogist - categories: - - other - auth_mode: API_KEY - proxy: - base_url: https://dev.portal.onlogist.com/api - headers: - authorization: ${apiKey} - docs: https://nango.dev/docs/api-integrations/onlogist - docs_connect: https://nango.dev/docs/api-integrations/onlogist/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your OnLogist account - doc_section: '#step-1-finding-your-api-key' - -one-drive: - display_name: OneDrive for Business - categories: - - knowledge-base - - storage - alias: microsoft - post_connection_script: onedrivePostConnection - docs: https://nango.dev/docs/api-integrations/one-drive - setup_guide_url: https://nango.dev/docs/api-integrations/one-drive/how-to-register-your-own-onedrive-for-business-api-oauth-app - -one-drive-personal: - display_name: OneDrive Personal - categories: - - knowledge-base - - storage - auth_mode: OAUTH2 - authorization_url: https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize - token_url: https://login.microsoftonline.com/consumers/oauth2/v2.0/token - disable_pkce: true - default_scopes: - - offline_access - authorization_params: - response_type: code - response_mode: query - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.onedrive.com - retry: - after: - - 'retry-after' - decompress: true - docs: https://nango.dev/docs/integrations/all/one-drive-personal - -one-note: - display_name: One Note - categories: - - productivity - alias: microsoft - docs: https://nango.dev/docs/integrations/all/one-note - -onelogin: - display_name: OneLogin - categories: - - dev-tools - - iam - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.subdomain}.onelogin.com/auth/oauth2/v2/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.subdomain}.onelogin.com - pre_connection_deletion_script: oneloginPreConnectionDeletion - docs: https://nango.dev/docs/integrations/all/onelogin - docs_connect: https://nango.dev/docs/integrations/all/onelogin/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: Your OneLogin subdomain - example: acme - order: 1 - prefix: https:// - suffix: .onelogin.com - doc_section: '#step-1-finding-your-subdomain' - -oomnitza: - display_name: Oomnitza - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.oomnitza.com - headers: - authorization2: ${apiKey} - content-type: application/json - verification: - method: GET - endpoints: - - /api/v3/assets/meta - docs: https://nango.dev/docs/api-integrations/oomnitza - docs_connect: https://nango.dev/docs/api-integrations/oomnitza/connect - connection_config: - subdomain: - type: string - title: Oomnitza Subdomain - description: The subdomain of your Oomnitza instance - example: mycompany - prefix: https:// - suffix: .oomnitza.com - order: 1 - doc_section: '#step-1-finding-your-subdomain' - credentials: - apiKey: - type: string - title: API Token - description: Your Oomnitza API token - doc_section: '#step-2-generating-your-api-token' - -orange-logic: - display_name: Orange Logic - categories: - - storage - auth_mode: TWO_STEP - body_format: json - token_url: https://${connectionConfig.serverUrl}/webapi/security/clientcredentialsauthentication/authenticate_46H_v1 - token_params: - client_id: ${credentials.clientId} - client_secret: ${credentials.clientSecret} - token_headers: - content-type: application/json - accept: application/json - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://${connectionConfig.serverUrl} - docs: https://nango.dev/docs/api-integrations/orange-logic - docs_connect: https://nango.dev/docs/api-integrations/orange-logic/connect - credentials: - clientId: - type: string - title: Client ID - description: The Client ID from your Orange Logic OAuth 2.0 Client Credentials. - doc_section: '#step-2-obtain-client-credentials' - clientSecret: - type: string - title: Client Secret - description: The Client Secret from your Orange Logic OAuth 2.0 Client Credentials. - secret: true - doc_section: '#step-2-obtain-client-credentials' - connection_config: - serverUrl: - type: string - title: Orange Logic Server URL - description: The base URL of your Orange Logic instance - example: mycompany.orangelogic.com - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-1-find-your-orange-logic-url' - -openai: - display_name: OpenAI - categories: - - productivity - - dev-tools - - popular - auth_mode: API_KEY - proxy: - base_url: https://api.openai.com - headers: - authorization: Bearer ${apiKey} - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/models - retry: - after: - - 'x-ratelimit-reset-requests' - docs: https://nango.dev/docs/integrations/all/openai - docs_connect: https://nango.dev/docs/integrations/all/openai/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your OpenAI account - doc_section: '#step-1-retrieve-your-openai-api-key' -openai-admin: - display_name: OpenAI (Admin) - categories: - - productivity - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.openai.com - headers: - authorization: Bearer ${apiKey} - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/organization/users - retry: - after: - - 'x-ratelimit-reset-requests' - docs: https://nango.dev/docs/integrations/all/openai-admin - docs_connect: https://nango.dev/docs/integrations/all/openai-admin/connect - credentials: - apiKey: - type: string - title: Admin Key - description: The Admin API key for your OpenAI account - doc_section: '#step-1-retrieve-your-openai-admin-key' -open-hands: - display_name: Open Hands - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://app.all-hands.dev - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/conversations - docs: https://nango.dev/docs/integrations/all/open-hands - docs_connect: https://nango.dev/docs/integrations/all/open-hands/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Open Hands account - pattern: '^[A-Za-z0-9]{32}$' - example: 'aNVlyRBLGWJgnVp1vwXN7TkO1MCYxeIDz' - doc_section: '#step-1-finding-your-api-key' - -oracle-hcm: - display_name: Oracle Fusion Cloud (HCM) - categories: - - hr - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.restServerUrl} - headers: - content-type: application/vnd.oracle.adf.resourceitem+json - docs: https://nango.dev/docs/integrations/all/oracle-hcm - docs_connect: https://nango.dev/docs/integrations/all/oracle-hcm/connect - credentials: - username: - type: string - title: Username - description: Your Oracle Cloud service username. - doc_section: '#step-2-finding-your-credentials' - password: - type: string - title: Password - description: Your Oracle Cloud service password. - doc_section: '#step-2-finding-your-credentials' - connection_config: - restServerUrl: - type: string - title: REST Server URL - description: The REST server URL for your Oracle Fusion Cloud - format: hostname - prefix: https:// - example: servername.fa.us2.oraclecloud.com - order: 1 - doc_section: '#step-1-finding-your-rest-server-url' - -oracle-cloud-identity: - display_name: Oracle Cloud Identity - categories: - - dev-tools - - iam - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.serviceInstance}.identity.oraclecloud.com/oauth2/v1/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - scope_separator: ' ' - proxy: - base_url: https://${connectionConfig.serviceInstance}.identity.oraclecloud.com - docs: https://nango.dev/docs/api-integrations/oracle-cloud-identity - docs_connect: https://nango.dev/docs/api-integrations/oracle-cloud-identity/connect - connection_config: - serviceInstance: - type: string - title: IDCS Service Instance - description: Your Oracle Identity Cloud Service instance identifier - pattern: '^idcs-[a-f0-9]{32}$' - example: idcs-1234567890abcdef1234567890abcdef - prefix: https:// - suffix: .identity.oraclecloud.com - order: 1 - doc_section: '#step-1-finding-your-service-instance' - -ordinal: - display_name: Ordinal - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://app.tryordinal.com/api - headers: - authorization: Bearer ${apiKey} - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/workspace - docs: https://nango.dev/docs/api-integrations/ordinal - docs_connect: https://nango.dev/docs/api-integrations/ordinal/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Ordinal API key. - example: ord_************* - pattern: '^ord_[A-Za-z0-9-_]+$' - doc_section: '#step-1-generating-your-api-key' - -ory: - display_name: Ory - categories: - - iam - auth_mode: OAUTH2_CC - proxy: - base_url: https://${connectionConfig.projectSlug}.projects.oryapis.com - token_url: https://${connectionConfig.projectSlug}.projects.oryapis.com/oauth2/token - scope_separator: ' ' - token_params: - grant_type: client_credentials - docs: https://nango.dev/docs/integrations/all/ory - connection_config: - projectSlug: - type: string - title: Project Slug - description: The project slug of your Ory project - -osu: - display_name: Osu - categories: - - gaming - auth_mode: OAUTH2 - authorization_url: https://osu.ppy.sh/oauth/authorize - token_url: https://osu.ppy.sh/oauth/token - default_scopes: - - identify - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://osu.ppy.sh - docs: https://nango.dev/docs/integrations/all/osu - -oura: - display_name: Oura - categories: - - sports - auth_mode: OAUTH2 - authorization_url: https://cloud.ouraring.com/oauth/authorize - token_url: https://api.ouraring.com/oauth/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.ouraring.com - docs: https://nango.dev/docs/integrations/all/oura - -outlook: - display_name: Outlook - categories: - - communication - - popular - alias: microsoft - docs: https://nango.dev/docs/api-integrations/outlook - setup_guide_url: https://nango.dev/docs/api-integrations/outlook/how-to-register-your-own-outlook-api-oauth-app - -outreach: - display_name: Outreach - categories: - - marketing - auth_mode: OAUTH2 - authorization_url: https://api.outreach.io/oauth/authorize - token_url: https://api.outreach.io/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.outreach.io - docs: https://nango.dev/docs/integrations/all/outreach - -pagerduty: - display_name: PagerDuty - categories: - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://app.pagerduty.com/oauth/authorize - token_url: https://app.pagerduty.com/oauth/token - webhook_routing_script: pagerdutyWebhookRouting - proxy: - base_url: https://api.pagerduty.com - retry: - after: - - 'ratelimit-reset' - docs: https://nango.dev/docs/integrations/all/pagerduty - -paligo: - display_name: Paligo - categories: - - cms - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.paligoapp.com - verification: - method: GET - endpoints: - - /api/v2/groups?page=1&per_page=1 - docs: https://nango.dev/docs/api-integrations/paligo - docs_connect: https://nango.dev/docs/api-integrations/paligo/connect - connection_config: - subdomain: - type: string - title: Paligo Instance Name - description: The name of your Paligo instance - example: mycompany - suffix: .paligoapp.com - prefix: https:// - order: 1 - doc_section: '#step-1-find-your-paligo-instance-name' - credentials: - username: - type: string - title: Username - description: Your Paligo account username (email address). - example: name@example.com - format: email - doc_section: '#step-3-enter-credentials-in-the-connect-ui' - password: - type: string - title: API Key - description: The API key token generated. - secret: true - pattern: '^[A-F0-9]+$' - example: 74E12F****************************9C5D6F - doc_section: '#step-2-create-an-api-key' - -pandadoc: - display_name: Pandadoc - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://app.pandadoc.com/oauth2/authorize - token_url: https://api.pandadoc.com/oauth2/access_token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.pandadoc.com - docs: https://nango.dev/docs/integrations/all/pandadoc - -pandadoc-api-key: - display_name: Pandadoc (API Key) - categories: - - legal - auth_mode: API_KEY - proxy: - base_url: https://api.pandadoc.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /public/v1/members/current - headers: - authorization: API-Key ${apiKey} - docs: https://nango.dev/docs/integrations/all/pandadoc-api-key - docs_connect: https://nango.dev/docs/integrations/all/pandadoc-api-key/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Pandadoc account - doc_section: '#step-1-generating-your-api-key' - example: 3039ba033eb1410caa0a2227158d63c9d6502cd8 - pattern: '^[a-fA-F0-9]+$' - -paddle: - display_name: Paddle - categories: - - payment - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.paddle.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/api-integrations/paddle - docs_connect: https://nango.dev/docs/api-integrations/paddle/connect - setup_guide_url: https://nango.dev/docs/api-integrations/paddle/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Paddle API key. - example: pdl_live_apikey_01kpb*********************_xRs9*********************_A40 - doc_section: '#step-1-generating-your-api-key' - connection_config: - subdomain: - type: string - title: Environment - description: Use 'api' for live or 'sandbox-api' for sandbox. - enum: - - api - - sandbox-api - doc_section: '#step-2-choose-your-environment' - order: 1 - -passportal: - display_name: Passportal - categories: - - support - auth_mode: TWO_STEP - token_url: https://${connectionConfig.base_url}/api/v2/auth/client_token - token_headers: - x-key: ${credentials.apiKey} - x-hash: ${credentials.hmacToken} - content-type: application/json - token_params: - scope: docs_api - content: ${credentials.content} - token_response: - token: access_token - token_expiration: expiry_time - token_expiration_strategy: expireAt - proxy: - base_url: https://${connectionConfig.base_url} - headers: - x-access-token: ${accessToken} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v2/documents?resultsPerPage=1 - connection_config: - base_url: - type: string - title: Passportal Base URL - description: Your Passportal base URL - example: mycompany.mypasswordapp.com - format: hostname - prefix: https:// - doc_section: '#step-1-find-your-passportal-base-url' - credentials: - apiKey: - type: string - title: API Access Key ID - description: Your Passportal API Access Key ID - example: a14e6b4923ba5027189baded6ba7b68e6fcda742008c5d57b867f43a09768ece - pattern: '^[a-fA-F0-9]{64}$' - doc_section: '#step-2-generate-api-access-key-id-and-secret-access-key' - hmacToken: - type: string - title: HMAC Token - description: Your pre-generated HMAC token, hex encoded - example: 23ec313efecb560a7f44239f6dd439ea56d18911c18b59e1150a3c7299da8202 - pattern: '^[a-fA-F0-9]{64}$' - secret: true - doc_section: '#step-3-generate-hmac-token' - content: - type: string - title: Content String - description: Plain text message used to compute the HMAC token - example: api-content-hash - doc_section: '#step-3-generate-hmac-token' - docs: https://nango.dev/docs/integrations/all/passportal - docs_connect: https://nango.dev/docs/integrations/all/passportal/connect - -paychex: - display_name: Paychex - categories: - - hr - auth_mode: OAUTH2_CC - token_url: https://api.paychex.com/auth/oauth/v2/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.paychex.com - docs: https://nango.dev/docs/integrations/all/paychex - docs_connect: https://nango.dev/docs/integrations/all/paychex/connect - credentials: - client_id: - type: string - title: API Key - description: A unique identifier for your application on Paychex - doc_section: '#step-1-generating-your-client-credentials' - client_secret: - type: string - title: Client Secret - description: A confidential key used to authenticate the identity of application (client) - doc_section: '#step-1-generating-your-client-credentials' - -paycor: - display_name: Paycor - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://hcm.paycor.com/AppActivation/Authorize - token_url: https://apis.paycor.com/sts/v1/common/token?subscription-key=${connectionConfig.subscriptionKey} - authorization_params: - response_type: code - subscription-key: ${connectionConfig.subscriptionKey} - scope_separator: ' ' - default_scopes: - - offline_access - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://apis.paycor.com - headers: - ocp-apim-subscription-key: ${connectionConfig.subscriptionKey} - docs: https://nango.dev/docs/integrations/all/paycor - docs_connect: https://nango.dev/docs/integrations/all/paycor/connect - connection_config: - subscriptionKey: - type: string - title: Subscription Key - description: The subscription key for your Paycor account - automated: true - tenantId: - type: string - title: Company ID - example: '290180' - pattern: '^\d+$' - description: The company ID for your Paycor account - doc_section: '#step-1-finding-your-company-id' - -paycor-sandbox: - display_name: Paycor (Sandbox) - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://hcm-demo.paycor.com/AppActivation/Authorize - token_url: https://apis-sandbox.paycor.com/sts/v1/common/token?subscription-key=${connectionConfig.subscriptionKey} - authorization_params: - response_type: code - subscription-key: ${connectionConfig.subscriptionKey} - scope_separator: ' ' - default_scopes: - - offline_access - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://apis-sandbox.paycor.com - headers: - ocp-apim-subscription-key: ${connectionConfig.subscriptionKey} - docs: https://nango.dev/docs/integrations/all/paycor-sandbox - docs_connect: https://nango.dev/docs/integrations/all/paycor-sandbox/connect - connection_config: - subscriptionKey: - type: string - title: Subscription Key - description: The subscription key for your Paycor sandbox account - automated: true - tenantId: - type: string - title: Company ID - example: '290180' - pattern: '^\d+$' - description: The company ID for your Paycor sandbox account - doc_section: '#step-1-finding-your-company-id' - -paycom: - display_name: Paycom - categories: - - hr - auth_mode: BASIC - proxy: - base_url: https://api.paycomonline.net - docs: https://nango.dev/docs/integrations/all/paycom - docs_connect: https://nango.dev/docs/integrations/all/paycom/connect - credentials: - username: - type: string - title: SID - description: The SID of your Paycom account - doc_section: '#step-1-finding-your-credentials' - password: - type: string - title: API Token - description: The API token of your Paycom account - doc_section: '#step-1-finding-your-credentials' - -payfit: - display_name: Payfit - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://oauth.payfit.com/authorize - token_url: https://app.pagerduty.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://partner-api.payfit.com - docs: https://nango.dev/docs/integrations/all/payfit - -paylocity-nextgen: - display_name: Paylocity (NextGen) - categories: - - hr - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.environment}.paylocity.com/public/security/v1/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.environment}.paylocity.com - connection_config: - companyId: ${connectionConfig.companyId} - docs: https://nango.dev/docs/api-integrations/paylocity-nextgen - docs_connect: https://nango.dev/docs/api-integrations/paylocity-nextgen/connect - connection_config: - environment: - type: string - title: Environment - description: Your Paylocity NextGen environment. - enum: - - dc1prodgwext - - dc1demogwext - order: 1 - doc_section: '#step-1-select-the-correct-paylocity-environment' - companyId: - type: string - title: Company ID - description: The company ID of your Paylocity account - doc_section: '#step-2-find-your-company-id' - pattern: '^[a-zA-Z0-9]+$' - example: S2222 - order: 2 - -paylocity: - display_name: Paylocity (Weblink) - categories: - - hr - auth_mode: OAUTH2_CC - proxy: - base_url: https://${connectionConfig.environment}.paylocity.com - connection_config: - companyId: ${connectionConfig.companyId} - token_url: https://${connectionConfig.environment}.paylocity.com/IdentityServer/connect/token - token_params: - grant_type: client_credentials - docs: https://nango.dev/docs/api-integrations/paylocity - docs_connect: https://nango.dev/docs/api-integrations/paylocity/connect - connection_config: - environment: - type: string - title: Paylocity Environment - enum: - - dc1demogw - - api - description: Your Paylocity Weblink environment. - order: 1 - doc_section: '#step-1-select-the-correct-paylocity-environment' - companyId: - type: string - title: Company ID - description: The company ID of your Paylocity account - doc_section: '#step-2-find-your-company-id' - pattern: '^[a-zA-Z0-9]+$' - example: S2222 - order: 2 - -paypal: - display_name: Paypal - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://www.paypal.com/signin/authorize - token_url: https://api.paypal.com/v1/oauth2/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api-m.paypal.com - docs: https://nango.dev/docs/integrations/all/paypal - -paypal-sandbox: - display_name: Paypal (Sandbox) - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://www.sandbox.paypal.com/signin/authorize - token_url: https://api-m.sandbox.paypal.com/v1/oauth2/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api-m.sandbox.paypal.com - docs: https://nango.dev/docs/integrations/all/paypal-sandbox - -pax8: - display_name: Pax8 - categories: - - other - auth_mode: OAUTH2_CC - body_format: json - token_url: https://api.pax8.com/v1/token - token_params: - grant_type: client_credentials - audience: ${connectionConfig.audience} || https://api.pax8.com - proxy: - base_url: https://api.pax8.com - docs: https://nango.dev/docs/integrations/all/pax8 - docs_connect: https://nango.dev/docs/integrations/all/pax8/connect - connection_config: - audience: - type: string - title: '' - description: '' - automated: true - -pendo: - display_name: Pendo - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://app.pendo.io - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v1/page - headers: - x-pendo-integration-key: ${apiKey} - docs: https://nango.dev/docs/integrations/all/pendo - docs_connect: https://nango.dev/docs/integrations/all/pendo/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Pendo account - doc_section: '#step-1-finding-pendo-api-key' - -pendo-oauth: - display_name: Pendo (OAuth) - categories: - - analytics - auth_mode: OAUTH2_CC - token_url: https://app.pendo.io/oauth/v1/token - token_params: - grant_type: client_credentials - default_scopes: - - read:me - body_format: form - proxy: - base_url: https://app.pendo.io - docs: https://nango.dev/docs/api-integrations/pendo-oauth - docs_connect: https://nango.dev/docs/api-integrations/pendo-oauth/connect - credentials: - client_id: - type: string - title: Client ID - description: Your Pendo OAuth client ID - doc_section: '#step-1-finding-your-pendo-oauth-credentials' - client_secret: - type: string - title: Client Secret - description: Your Pendo OAuth client secret - secret: true - doc_section: '#step-1-finding-your-pendo-oauth-credentials' - -pennylane: - display_name: Pennylane - categories: - - accounting - - banking - - invoicing - - payment - auth_mode: OAUTH2 - authorization_url: https://app.pennylane.com/oauth/authorize - token_url: https://app.pennylane.com/oauth/token - proxy: - base_url: https://app.pennylane.com - retry: - at: - - 'ratelimit-reset' - scope_separator: '+' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - authorization_url_skip_encode: - - scopes - docs: https://nango.dev/docs/integrations/all/pennylane - -pennylane-company-api: - display_name: Pennylane (Company API) - categories: - - accounting - - banking - - invoicing - - payment - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://app.pennylane.com - verification: - method: GET - headers: - accept: application/json - endpoints: - - /api/external/v2/me - retry: - at: - - 'ratelimit-reset' - docs: https://nango.dev/docs/integrations/all/pennylane-company-api - docs_connect: https://nango.dev/docs/integrations/all/pennylane-company-api/connect - credentials: - apiKey: - type: string - title: API Token - description: The company API token for your Pennylane account - pattern: '^[A-Za-z0-9_-]{43}$' - example: aZ9b4Lp3QhN7vXyK1sTcO0WfR8jMdEuD5GrIi2-H6PnU - doc_section: '#step-1-generating-your-company-api-token' - -peopledatalabs: - display_name: People Data Labs - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://api.peopledatalabs.com - query: - api_key: ${apiKey} - docs: https://nango.dev/docs/integrations/all/peopledatalabs - credentials: - apiKey: - type: string - title: API Key - description: The API key for your People Data Labs account - -perdoo: - display_name: Perdoo - categories: - - productivity - - analytics - auth_mode: API_KEY - proxy: - base_url: https://eu.perdoo.com - headers: - authorization: Bearer ${apiKey} - content-type: application/json - verification: - method: GET - endpoints: - - /user - docs: https://nango.dev/docs/api-integrations/perdoo - docs_connect: https://nango.dev/docs/api-integrations/perdoo/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Perdoo API token - example: '5037c64a83d34725a13131b9b28856c0e499887b16c84b6d9bba2756d1e61634' - pattern: '^[a-f0-9]{64}$' - doc_section: '#step-1-generating-your-api-token' - -perplexity: - display_name: Perplexity - categories: - - productivity - - dev-tools - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.perplexity.ai - docs: https://nango.dev/docs/integrations/all/perplexity - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Perplexity account - pattern: '^pplx-[a-zA-Z0-9]+$' - example: pplx-**************************** - -perimeter81: - display_name: Perimeter81 - categories: - - productivity - auth_mode: TWO_STEP - proxy: - base_url: https://api.perimeter81.com/api/rest - token_url: https://api.${connectionConfig.domain}.com/api/v1/auth/authorize - token_params: - apiKey: ${credentials.apiKey} - grantType: api_key - token_headers: - content-type: application/json - token_response: - token: data.accessToken - token_expiration: data.accessTokenExpire - token_expiration_strategy: expireAt - docs: https://nango.dev/docs/integrations/all/perimeter81 - docs_connect: https://nango.dev/docs/integrations/all/perimeter81/connect - connection_config: - domain: - type: string - title: Domain - description: The domain for Perimeter81. - enum: - - perimeter81 - - eu.sase.checkpoint - doc_section: '#step-1-finding-your-perimeter81-domain-and-perimeter81-api-key' - order: 1 - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Perimeter81 account - secret: true - -personio: - display_name: Personio (v1) - categories: - - hr - auth_mode: OAUTH2_CC - proxy: - base_url: https://api.personio.de/v1 - headers: - x-personio-partner-id: ${connectionConfig.partnerId} - x-personio-app-id: ${connectionConfig.appId} - token_url: https://api.personio.de/v1/auth - body_format: json - docs: https://nango.dev/docs/integrations/all/personio - docs_connect: https://nango.dev/docs/integrations/all/personio/connect - connection_config: - partnerId: - type: string - title: Partner ID - description: The partner ID of your Personio account - doc_section: '#step-1-finding-personio-client-id' - appId: - type: string - title: App ID - description: The app ID of your Personio account - doc_section: '#step-2-finding-personio-client-secret' - -personio-v2: - display_name: Personio (v2) - categories: - - hr - auth_mode: OAUTH2_CC - proxy: - base_url: https://api.personio.de/v2 - headers: - content-type: application/x-www-form-urlencoded - token_url: https://api.personio.de/v2/auth/token - scope_separator: ' ' - docs: https://nango.dev/docs/integrations/all/personio-v2 - token_params: - grant_type: client_credentials - -personio-recruiting: - display_name: Personio Recruiting - categories: - - hr - - ats - auth_mode: API_KEY - proxy: - base_url: https://api.personio.de/v1 - headers: - authorization: Bearer ${apiKey} - x-company-id: ${connectionConfig.companyId} - x-personio-partner-id: ${connectionConfig.partnerId} - x-personio-app-id: ${connectionConfig.appId} - verification: - method: GET - endpoints: - - /xml?language=en - base_url_override: https://${connectionConfig.company}.jobs.personio.de - headers: - accept: application/xml - content-type: xml - docs: https://nango.dev/docs/integrations/all/personio-recruiting - connection_config: - companyId: - type: string - title: Company ID - description: The company ID of your Personio account - company: - type: string - title: Company Name - description: The company name of your Personio account - partnerId: - type: string - title: Partner ID - description: The partner ID of your Personio account - appId: - type: string - title: App ID - description: The app ID of your Personio account - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Pingboard account - -pingboard: - display_name: Pingboard - categories: - - productivity - auth_mode: OAUTH2_CC - proxy: - base_url: https://app.pingboard.com/api/v2 - token_url: https://app.pingboard.com/oauth/token - scope_separator: ' ' - token_params: - grant_type: client_credentials - docs: https://nango.dev/docs/integrations/all/pingboard - -pingone: - display_name: PingOne - categories: - - dev-tools - - iam - auth_mode: OAUTH2 - authorization_url: https://auth.pingone.${connectionConfig.tld}/${connectionConfig.environmentId}/as/authorize - token_url: https://auth.pingone.${connectionConfig.tld}/${connectionConfig.environmentId}/as/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.pingone.${connectionConfig.tld} - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/pingone - docs_connect: https://nango.dev/docs/integrations/all/pingone/connect - connection_config: - tld: - type: string - title: Top Level Domain - description: The top level domain for your PingOne account. - enum: - - com - - ca - - eu - - com.au - - sg - - asia - doc_section: '#step-2-finding-your-top-level-domain' - environmentId: - type: string - title: Environment ID - order: 1 - description: The environment ID for your PingOne account - example: f2aba07d-270c-42ba-8811-01af5f63d458 - format: uuid - doc_section: '#step-1-finding-your-environment-id' - -pingone-cc: - display_name: PingOne (Client Credentials) - categories: - - dev-tools - - iam - auth_mode: OAUTH2_CC - token_url: https://auth.pingone.${connectionConfig.tld}/${connectionConfig.environmentId}/as/token - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.pingone.${connectionConfig.tld} - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/pingone-cc - docs_connect: https://nango.dev/docs/integrations/all/pingone-cc/connect - connection_config: - tld: - type: string - title: Top Level Domain - description: The top level domain for your PingOne account. - order: 2 - enum: - - com - - ca - - eu - - com.au - - sg - - asia - doc_section: '#step-3-finding-your-top-level-domain' - environmentId: - type: string - title: Environment ID - order: 1 - description: The environment ID for your PingOne account - example: f2aba07d-270c-42ba-8811-01af5f63d458 - format: uuid - doc_section: '#step-2-finding-your-environment-id' - -pinterest: - display_name: Pinterest - categories: - - design - - marketing - - social - - video - auth_mode: OAUTH2 - authorization_url: https://www.pinterest.com/oauth - token_url: https://api.pinterest.com/v5/oauth/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.pinterest.com - docs: https://nango.dev/docs/integrations/all/pinterest - -rocketlane: - display_name: Rocketlane - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.rocketlane.com/api - headers: - api-key: ${apiKey} - verification: - method: GET - endpoints: - - /1.0/users/?pageSize=1 - docs: https://nango.dev/docs/integrations/all/rocketlane - docs_connect: https://nango.dev/docs/integrations/all/rocketlane/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Rocketlane API key - pattern: ^rl-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$ - example: rl-3d2d4d87-1801-48ca-8948-8d5ed6f05df7 - doc_section: '#step-1-generating-your-api-key' - -pipedrive: - display_name: Pipedrive - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://oauth.pipedrive.com/oauth/authorize - token_url: https://oauth.pipedrive.com/oauth/token - authorization_url_skip_empty: true - token_request_auth_method: basic - disable_pkce: true - token_response_metadata: - - api_domain - proxy: - base_url: ${connectionConfig.api_domain}/api - decompress: true - paginate: - type: offset - offset_name_in_request: start - response_path: data - limit_name_in_request: limit - docs: https://nango.dev/docs/api-integrations/pipedrive - setup_guide_url: https://nango.dev/docs/api-integrations/pipedrive/how-to-register-your-own-pipedrive-oauth-app - connection_config: - api_domain: - type: string - title: '' - description: '' - automated: true - -pylon: - display_name: Pylon - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.usepylon.com - headers: - authorization: Bearer ${apiKey} - accept: '*/*' - verification: - method: GET - endpoints: - - /me - docs: https://nango.dev/docs/api-integrations/pylon - docs_connect: https://nango.dev/docs/api-integrations/pylon/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Pylon API token - doc_section: '#step-1-generating-your-api-token' - -pipedream: - display_name: Pipedream (API Key) - categories: - - dev-tools - - productivity - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.pipedream.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/users/me - docs: https://nango.dev/docs/integrations/all/pipedream - docs_connect: https://nango.dev/docs/integrations/all/pipedream/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Pipedream account - pattern: '^[a-f0-9]{32}$' - example: 9a1b2c3d4e5f67890abcdeffedcba123 - doc_section: '#step-1-finding-your-api-key' - -pipedream-oauth2-cc: - display_name: Pipedream (Client Credentials) - categories: - - dev-tools - - productivity - auth_mode: OAUTH2_CC - token_url: https://api.pipedream.com/v1/oauth/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.pipedream.com - docs: https://nango.dev/docs/integrations/all/pipedream-oauth2-cc - docs_connect: https://nango.dev/docs/integrations/all/pipedream-oauth2-cc/connect - -pivotaltracker: - display_name: Pivotal Tracker - categories: - - productivity - auth_mode: API_KEY - proxy: - headers: - x-trackertoken: ${apiKey} - base_url: https://www.pivotaltracker.com/services/v5 - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /accounts - docs: https://nango.dev/docs/integrations/all/pivotaltracker - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Pivotal Tracker account - -planning-center-online: - display_name: Planning Center Online (OAuth) - categories: - - crm - - productivity - auth_mode: OAUTH2 - authorization_url: https://api.planningcenteronline.com/oauth/authorize - token_url: https://api.planningcenteronline.com/oauth/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.planningcenteronline.com - headers: - accept: application/json - user-agent: Nango (https://nango.dev) - retry: - after: - - 'retry-after' - paginate: - type: offset - offset_name_in_request: offset - limit_name_in_request: per_page - response_path: data - docs: https://nango.dev/docs/api-integrations/planning-center-online - setup_guide_url: https://nango.dev/docs/api-integrations/planning-center-online/how-to-register-your-own-planning-center-oauth-app - -planning-center-online-pat: - display_name: Planning Center Online (Personal Access Token) - categories: - - crm - - productivity - auth_mode: BASIC - proxy: - base_url: https://api.planningcenteronline.com - headers: - accept: application/json - retry: - after: - - 'retry-after' - paginate: - type: offset - offset_name_in_request: offset - limit_name_in_request: per_page - response_path: data - verification: - method: GET - headers: - accept: application/json - user-agent: Nango (https://nango.dev) - endpoints: - - /current/v2/me - docs: https://nango.dev/docs/api-integrations/planning-center-online-pat - docs_connect: https://nango.dev/docs/api-integrations/planning-center-online-pat/connect - credentials: - username: - type: string - title: Client ID - description: The Client ID for your Planning Center Personal Access Token. - pattern: '^[a-zA-Z0-9_-]{4,128}$' - example: 01h2jk3lm4np5qrst6uvw - doc_section: '#step-2-create-a-personal-access-token' - password: - type: string - title: Secret - description: The Secret for your Planning Center Personal Access Token. - pattern: '^[a-zA-Z0-9+/=_-]{8,512}$' - example: 7f8e9d0c1b2a3847564930210fedcba9876543210fedcba9876543210 - doc_section: '#step-2-create-a-personal-access-token' - -pushpay-chms-v1: - display_name: Pushpay ChMS (v1) - categories: - - crm - - productivity - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.ccbchurch.com - retry: - after: - - 'retry-after' - credentials_verification_script: pushpayChmsV1CredentialsVerification - docs: https://nango.dev/docs/api-integrations/pushpay-chms-v1 - docs_connect: https://nango.dev/docs/api-integrations/pushpay-chms-v1/connect - connection_config: - subdomain: - type: string - title: Church subdomain - description: The subdomain for your Pushpay ChMS site. - example: yourchurch - pattern: '^[a-zA-Z0-9-]+$' - order: 1 - prefix: https:// - suffix: .ccbchurch.com - doc_section: '#step-1-finding-your-church-subdomain' - credentials: - username: - type: string - title: API username - description: The API login created in Pushpay ChMS API Admin. - doc_section: '#step-2-create-an-api-user' - password: - type: string - title: API password - description: The password for your Pushpay ChMS API user. - secret: true - doc_section: '#step-2-create-an-api-user' - -plain: - display_name: Plain - categories: - - support - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://core-api.uk.plain.com/graphql - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1?query=%7B__schema%7Btypes%7Bname,kind,fields%7Bname%7D%7D%7D%7D - docs: https://nango.dev/docs/integrations/all/plain - docs_connect: https://nango.dev/docs/integrations/all/plain/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Plain account - doc_section: '#step-1-generating-your-api-key' - -pleo: - display_name: Pleo - categories: - - payment - - invoicing - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.pleo.io/oauth/authorize - token_url: https://${connectionConfig.subdomain}.pleo.io/oauth/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.apiSubdomain}.pleo.io - docs: https://nango.dev/docs/api-integrations/pleo - docs_connect: https://nango.dev/docs/api-integrations/pleo/connect - setup_guide_url: https://nango.dev/docs/api-integrations/pleo/how-to-register-your-own-pleo-api-oauth-app - connection_config: - subdomain: - type: string - title: OAuth Subdomain - description: The OAuth subdomain for your Pleo environment. - enum: - - auth - - auth.staging - apiSubdomain: - type: string - title: API Subdomain - description: The API subdomain for your Pleo environment. - enum: - - external - - external.staging - -podium: - display_name: Podium - categories: - - communication - - marketing - auth_mode: OAUTH2 - authorization_url: https://api.podium.com/oauth/authorize - token_url: https://api.podium.com/oauth/token - scope_separator: ' ' - body_format: json - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - headers: - podium-version: ${connectionConfig.apiVersion} - content-type: application/json - base_url: https://api.podium.com - retry: - after: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/integrations/all/podium - connection_config: - apiVersion: - type: string - title: API Version - description: The API version of your Podium account - -podscribe: - display_name: Podscribe - categories: - - marketing - - analytics - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://backend.podscribe.ai - docs: https://nango.dev/docs/api-integrations/podscribe - docs_connect: https://nango.dev/docs/api-integrations/podscribe/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Podscribe account - pattern: '^[a-zA-Z0-9]+\.[a-zA-Z0-9]+\.[a-zA-Z0-9_-]+$' - example: xkPqbW**********.*********.*******T8mz - doc_section: '#step-1-generating-your-api-key' - -posthog: - display_name: PostHog - categories: - - dev-tools - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://${connectionConfig.subdomain}.posthog.com - docs: https://nango.dev/docs/api-integrations/posthog - docs_connect: https://nango.dev/docs/api-integrations/posthog/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of your PostHog cloud account. - enum: - - us - - us.i - - eu - - eu.i - order: 1 - doc_section: '#step-1-finding-your-subdomain' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your PostHog account - pattern: '^phx_[A-Za-z0-9]+$' - example: phx_1PPf***************************k3D - doc_section: '#step-2-finding-your-api-key' - -posthog-oauth: - display_name: PostHog (OAuth) - categories: - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://oauth.posthog.com/oauth/authorize/ - token_url: https://oauth.posthog.com/oauth/token/ - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.posthog.com - docs: https://nango.dev/docs/api-integrations/posthog-oauth - setup_guide_url: https://nango.dev/docs/api-integrations/posthog-oauth/how-to-register-your-own-posthog-oauth-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/posthog-oauth/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of your PostHog cloud account. - enum: - - us - - us.i - - eu - - eu.i - order: 1 - doc_section: '#step-1-finding-your-subdomain' - -prive: - display_name: Prive - categories: - - e-commerce - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - content-type: application/json - base_url: https://subs.api.tryprive.com - docs: https://nango.dev/docs/integrations/all/prive - docs_connect: https://nango.dev/docs/integrations/all/prive/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Prive account - doc_section: '#step-1-requesting-your-prive-api-key' - -prospeo: - display_name: Prospeo - categories: - - crm - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.prospeo.io - headers: - x-key: ${apiKey} - verification: - method: POST - headers: - content-type: application/json - endpoints: - - /account-information - docs: https://nango.dev/docs/api-integrations/prospeo - docs_connect: https://nango.dev/docs/api-integrations/prospeo/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Prospeo API Key - example: pk_640edfcc************************304fca5e - pattern: '^(pk_[a-f0-9]{64}|[a-f0-9]{32})$' - doc_section: '#step-1-finding-your-api-key' - -prtg-classic: - display_name: PRTG Classic - categories: - - support - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.host} - query: - apitoken: ${apiKey} - verification: - method: GET - endpoints: - - /api/table.json?content=sensors&count=1 - docs: https://nango.dev/docs/api-integrations/prtg-classic - docs_connect: https://nango.dev/docs/api-integrations/prtg-classic/connect - connection_config: - host: - type: string - title: Instance Host - description: The host of your PRTG instance - pattern: '^[A-Za-z0-9.-]+(:\d+)?$' - example: monitor.example.com - prefix: https:// - doc_section: '#step-1-finding-your-instance-host' - order: 1 - credentials: - apiKey: - type: string - title: API Key - description: The API key for your PRTG account - pattern: '^[A-Z2-7]+=*$' - example: RUTOWB5KVJCMEOWHL5MLUWMA324UGNDLPS6JKLTEDT====== - doc_section: '#step-2-finding-your-api-key' - -private-api-bearer: - display_name: Private API (Bearer Auth) - categories: - - other - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://my-private-api - docs: https://nango.dev/docs/integrations/all/private-api-bearer - docs_connect: https://nango.dev/docs/integrations/all/private-api-bearer/connect - credentials: - apiKey: - type: string - title: API Key - description: Your API Key - -private-api-basic: - display_name: Private API (Basic Auth) - categories: - - other - auth_mode: BASIC - proxy: - base_url: https://my-private-api - docs: https://nango.dev/docs/integrations/all/private-api-basic - docs_connect: https://nango.dev/docs/integrations/all/private-api-basic/connect - credentials: - username: - type: string - title: Username - description: Your username - password: - type: string - title: Password - description: Your password -private-api-generic: - display_name: Private API (Generic) - categories: - - other - auth_mode: API_KEY - proxy: - base_url: https://api.nango.dev/ - integration_config: - keyPlacement: - type: string - title: Key placement - description: Where the API key is sent on proxied requests. - enum: - - header - - query - default_value: header - warnings: - query: Sending the key as a query param can expose it in upstream, proxy, and CDN logs. Prefer a header when the API supports it. - order: 1 - keyName: - type: string - title: Key name - description: Header name or query-param name (e.g. Authorization, x-api-key, api_key). - example: Authorization - order: 2 - valueTemplate: - type: string - title: Value template - description: How the key is presented to the upstream API. Use ${apiKey} as the placeholder for the stored key. - example: Api-Key ${apiKey} - default_value: ${apiKey} - pattern: '\$\{apiKey\}' - order: 3 - baseUrl: - type: string - title: Base URL - description: Base URL of the upstream API the proxy will call. - format: uri - pattern: '^https?://' - example: https://api.example.com - order: 4 - keyLabel: - type: string - title: API key label (shown in Connect UI) - description: The label end users see for the API key field in the Connect UI. - default_value: API Key - optional: true - order: 5 - docs: https://nango.dev/docs/integrations/all/private-api-generic - docs_connect: https://nango.dev/docs/integrations/all/private-api-generic/connect - credentials: - apiKey: - type: string - title: API Key - description: Your API Key -precisefp: - display_name: PreciseFP - categories: - - crm - - productivity - auth_mode: OAUTH2 - authorization_url: https://app.precisefp.com/oauth/authorize - token_url: https://app.precisefp.com/oauth/token - authorization_params: - response_type: code - scope: '*' - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - authorization_method: header - proxy: - base_url: https://app.precisefp.com - docs: https://nango.dev/docs/integrations/all/precisefp - -practicefusion: - display_name: PracticeFusion - categories: - - other - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.baseUrl}/authorize - token_url: https://${connectionConfig.baseUrl}/token - authorization_url_skip_empty: true - authorization_params: - response_type: code - aud: https://${connectionConfig.baseUrl} - launch: ${connectionConfig.launch} - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - token_response_metadata: - - patient - - need_patient_banner - - smart_style_url - proxy: - base_url: https://${connectionConfig.baseUrl} - docs: https://nango.dev/docs/api-integrations/practicefusion - setup_guide_url: https://nango.dev/docs/api-integrations/practicefusion/how-to-register-your-own-practicefusion-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/practicefusion/connect - connection_config: - baseUrl: - type: string - title: Base URL - description: The base URL for your Practice authorization server - pattern: '^[a-zA-Z0-9.-]+\.(practice|patient)fusion\.com/.*$' - prefix: https:// - example: api.patientfusion.com/fhir/r4/v1/118b460b-8390-4754-8e4a-1dd5ee20f599/ - doc_section: '#step-1-find-your-base-url' - order: 1 - launch: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -productboard: - display_name: Productboard - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://app.productboard.com/oauth2/authorize - token_url: https://app.productboard.com/oauth2/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - headers: - x-version: '1' - base_url: https://api.productboard.com - docs: https://nango.dev/docs/integrations/all/productboard - -printful: - display_name: Printful - categories: - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://www.printful.com/oauth/authorize - token_url: https://www.printful.com/oauth/token - disable_pkce: true - authorization_url_replacements: - redirect_uri: redirect_url - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.printful.com - docs: https://nango.dev/docs/api-integrations/printful - setup_guide_url: https://nango.dev/docs/api-integrations/printful/how-to-register-your-own-printful-oauth-app - -procore: - display_name: Procore - categories: - - erp - auth_mode: OAUTH2 - authorization_url: https://login.procore.com/oauth/authorize - token_url: https://login.procore.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - post_connection_script: procorePostConnection - proxy: - headers: - procore-company-id: ${connectionConfig.companyId} - base_url: https://api.procore.com - retry: - at: - - 'x-rate-limit-reset' - docs: https://nango.dev/docs/api-integrations/procore - setup_guide_url: https://nango.dev/docs/api-integrations/procore/how-to-register-your-own-procore-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/procore/connect - connection_config: - companyId: - type: string - title: Company ID - description: Your Procore company ID - optional: true - example: '598134325779301' - pattern: '^[0-9]+$' - -provenexpert: - display_name: ProvenExpert - categories: - - marketing - auth_mode: BASIC - proxy: - base_url: https://www.provenexpert.com/api/ - verification: - method: POST - endpoints: - - v1/rating/summary/get - docs: https://nango.dev/docs/api-integrations/provenexpert - docs_connect: https://nango.dev/docs/api-integrations/provenexpert/connect - credentials: - username: - type: string - title: API ID - description: Your ProvenExpert API ID. - pattern: '^[A-Za-z0-9]{32}$' - example: '3yxp1qwZl5UAmyHZ5qRC2Sbpk5KAlEDZ' - doc_section: '#step-1-getting-your-credentials' - password: - type: string - title: API Key - description: Your ProvenExpert API Key. - secret: true - pattern: '^[A-Za-z0-9]{43}$' - example: 'M3A5NwykMKW1BRy6NRrxAwW2MzI3MxOmNRXzNzByMxW' - doc_section: '#step-1-getting-your-credentials' - -pverify: - display_name: pVerify - categories: - - other - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.apiHost}/Token - token_params: - Client_Id: ${credentials.clientId} - Client_Secret: ${credentials.clientSecret} - grant_type: client_credentials - token_headers: - content-type: application/x-www-form-urlencoded - Client-API-Id: ${credentials.clientId} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://${connectionConfig.apiHost} - headers: - client-api-id: ${credentials.clientId} - docs: https://nango.dev/docs/api-integrations/pverify - docs_connect: https://nango.dev/docs/api-integrations/pverify/connect - credentials: - clientId: - type: string - title: Client ID - description: Your pVerify Client ID. - example: f1c2d3a4-5b67-4c89-ae01-123456789abc - format: uuid - doc_section: '#step-1-getting-your-credentials' - clientSecret: - type: string - title: Client Secret - description: Your pVerify Client Secret. - secret: true - example: aB3mNpQr7sXwYz2t*************** - pattern: '^[A-Za-z0-9]+$' - doc_section: '#step-1-getting-your-credentials' - connection_config: - apiHost: - type: string - title: API Host - description: Your pVerify API hostname. - example: api.pverify.com - pattern: '^(api|testapi)\.pverify\.com$' - doc_section: '#step-1-getting-your-credentials' - -qualtrics: - display_name: Qualtrics - categories: - - surveys - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.qualtrics.com/oauth2/auth - token_url: https://${connectionConfig.subdomain}.qualtrics.com/oauth2/token - proxy: - base_url: https://${connectionConfig.subdomain}.qualtrics.com - docs: https://nango.dev/docs/integrations/all/qualtrics - connection_config: - subdomain: - type: string - title: Qualtrics Domain - description: The subdomain of your Qualtrics account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .qualtrics.com - prefix: https:// - -quentn: - display_name: Quentn - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.quentn.com/public/api - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v1/terms - docs: https://nango.dev/docs/api-integrations/quentn - docs_connect: https://nango.dev/docs/api-integrations/quentn/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Quentn API key. - secret: true - example: a1bcDeFgHi-jkLmNoPqRsTuVwXyZ0123456789AbCdE - pattern: '^[A-Za-z0-9_-]{43}$' - doc_section: '#step-1-getting-your-api-key' - connection_config: - subdomain: - type: string - title: Subdomain - description: Your Quentn account subdomain. - format: hostname - example: xk7mdf.eu-5 - suffix: .quentn.com/public/api - prefix: https:// - order: 1 - doc_section: '#step-2-finding-your-subdomain' - -quickbase: - display_name: Quickbase - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.quickbase.com/v1/ - headers: - qb-realm-hostname: ${connectionConfig.domain} - user-agent: ${connectionConfig.appDetails} || App (support@nango.dev) - authorization: QB-USER-TOKEN ${apiKey} - query: - apiKey: ${apiKey} - docs: https://nango.dev/docs/integrations/all/quickbase - docs_connect: https://nango.dev/docs/integrations/all/quickbase/connect - connection_config: - domain: - type: string - title: Realm Hostname - description: Your Quickbase Realm Hostname - example: demo.quickbase.com - format: hostname - doc_section: '#step-1-finding-your-realm-hostname' - appDetails: - type: string - title: App Details - description: The details of your app - automated: true - credentials: - apiKey: - type: string - title: User Token - description: Your User Token - pattern: '^[a-z0-9_-]+$' - example: bb_aa_xxxxxx_xxxxxxxxxxxxxxxxx - doc_section: '#step-2-finding-your-user-token' - -qualia: - display_name: Qualia - categories: - - legal - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.qualia.io/api - docs: https://nango.dev/docs/api-integrations/qualia - docs_connect: https://nango.dev/docs/api-integrations/qualia/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of the Qualia platform you want to connect to. - pattern: '^[a-z0-9-]+$' - example: connect - order: 1 - doc_section: '#step-1-finding-your-subdomain' - credentials: - username: - type: string - title: Username - description: Your Qualia organization username. - doc_section: '#step-2-finding-your-api-key' - password: - type: string - title: Password - description: Your Qualia API password. - secret: true - doc_section: '#step-2-finding-your-api-key' - -quickbooks: - display_name: Quickbooks - categories: - - accounting - - popular - auth_mode: OAUTH2 - authorization_url: https://appcenter.intuit.com/connect/oauth2 - token_url: https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer - redirect_uri_metadata: - - realmId - proxy: - connection_config: - realmId: ${connectionConfig.realmId} - base_url: https://quickbooks.api.intuit.com - docs: https://nango.dev/docs/api-integrations/quickbooks - setup_guide_url: https://nango.dev/docs/api-integrations/quickbooks/how-to-register-your-own-quickbooks-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/quickbooks/connect - connection_config: - realmId: - type: string - title: Quickbooks Realm ID - optional: true - description: The realmId of your quickbooks company - pattern: '^\d{10,19}$' - example: '9341453474484455' - doc_section: '#step-1-finding-your-realm-id' - -quickbooks-sandbox: - alias: quickbooks - display_name: Quickbooks (Sandbox) - categories: - - accounting - proxy: - connection_config: - realmId: ${connectionConfig.realmId} - base_url: https://sandbox-quickbooks.api.intuit.com - docs: https://nango.dev/docs/api-integrations/quickbooks-sandbox - setup_guide_url: https://nango.dev/docs/api-integrations/quickbooks/how-to-register-your-own-quickbooks-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/quickbooks-sandbox/connect - connection_config: - realmId: - type: string - title: Quickbooks Realm ID - optional: true - description: The realmId of your quickbooks sandbox company - pattern: '^\d{10,19}$' - example: '9341453474484455' - doc_section: '#step-1-finding-your-realm-id' - -quipteams: - display_name: Quipteams - categories: - - other - auth_mode: API_KEY - proxy: - base_url: https://api.quipteams.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /api/v1/quotes - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/api-integrations/quipteams - docs_connect: https://nango.dev/docs/api-integrations/quipteams/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Quipteams API key. - doc_section: '#step-1-finding-your-api-key' - -ragieai: - display_name: Ragie AI - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.ragie.ai - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /documents - docs: https://nango.dev/docs/integrations/all/ragieai - credentials: - apiKey: - type: string - title: API Key - description: The API key for your ragie.ai account - example: tnt_IZ56tqGVgX9_k8CKnxQ9MvQgzDXcDGgtcjXABkwusxSOR8QzwxxeA1B - pattern: '^tnt_[a-zA-Z0-9_]+$' - -ramp: - display_name: Ramp - categories: - - banking - auth_mode: OAUTH2 - authorization_url: https://app.ramp.com/v1/authorize - token_url: https://api.ramp.com/developer/v1/token - authorization_method: header - proxy: - base_url: https://api.ramp.com - docs: https://nango.dev/docs/integrations/all/ramp - -ramp-sandbox: - display_name: Ramp (Sandbox) - categories: - - banking - auth_mode: OAUTH2 - authorization_url: https://demo.ramp.com/v1/authorize - token_url: https://demo-api.ramp.com/developer/v1/token - authorization_method: header - proxy: - base_url: https://demo-api.ramp.com - docs: https://nango.dev/docs/integrations/all/ramp-sandbox - -rapidapi: - display_name: RapidAPI - categories: - - dev-tools - auth_mode: API_KEY - proxy: - headers: - x-rapidapi-key: ${apiKey} - x-rapidapi-host: ${connectionConfig.subdomain}.p.rapidapi.com - base_url: https://${connectionConfig.subdomain}.p.rapidapi.com - docs: https://nango.dev/docs/integrations/all/rapidapi - credentials: - apiKey: - type: string - title: API Key - description: The API key for your RapidAPI account - example: b7c156af2dmgh5c635305f3744bap168553jsp75193c8367ef - pattern: '^[a-zA-Z0-9]+$' - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of the Rapid API. - pattern: '^[a-z0-9_-]+$' - example: api-football-v1 - suffix: .p.rapidapi.com - prefix: https:// - -razorpay: - display_name: Razorpay - categories: - - payment - auth_mode: BASIC - proxy: - base_url: https://api.razorpay.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/orders - docs: https://nango.dev/docs/integrations/all/razorpay - docs_connect: https://nango.dev/docs/integrations/all/razorpay/connect - credentials: - username: - type: string - title: Key ID - description: Your Key ID - pattern: '^rzp_(test|live)_[A-Za-z0-9]+$' - example: 'rzp_test_*************' - doc_section: '#step-1-finding-your-key-id-and-secret' - password: - type: string - title: Key Secret - description: Your Key Secret - secret: true - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-1-finding-your-key-id-and-secret' - -read-ai: - display_name: Read.ai - categories: - - productivity - - video - auth_mode: OAUTH2 - authorization_url: https://authn.read.ai/oauth2/auth - token_url: https://authn.read.ai/oauth2/token - token_request_auth_method: basic - authorization_method: header - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.read.ai - docs: https://nango.dev/docs/api-integrations/read-ai - setup_guide_url: https://nango.dev/docs/api-integrations/read-ai/how-to-register-your-own-read-ai-oauth-app - -readwise: - display_name: Readwise - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://readwise.io/api/v2 - headers: - authorization: Token ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /auth - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/readwise - docs_connect: https://nango.dev/docs/integrations/all/readwise/connect - credentials: - apiKey: - type: string - title: Access Token - description: The Access Token for your Readwise account - example: zCDL1fUOpu4Cg3WMlMl1S7ecKsaBQlfCzw7sbVfc0wBqUJMI56 - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-1-generating-your-access-token' - -readwise-reader: - display_name: Readwise Reader - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://readwise.io/api/v3 - headers: - authorization: Token ${apiKey} - verification: - method: GET - headers: - content-type: application/json - base_url_override: https://readwise.io - endpoints: - - /api/v2/auth - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/readwise-reader - docs_connect: https://nango.dev/docs/integrations/all/readwise-reader/connect - credentials: - apiKey: - type: string - title: Access Token - description: The Access Token for your Readwise account - example: zCDL1fUOpu4Cg3WMlMl1S7ecKsaBQlfCzw7sbVfc0wBqUJMI56 - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-1-generating-your-access-token' - -recharge: - display_name: Recharge - categories: - - e-commerce - auth_mode: API_KEY - proxy: - headers: - x-recharge-access-token: ${apiKey} - base_url: https://api.rechargeapps.com - docs: https://nango.dev/docs/integrations/all/recharge - docs_connect: https://nango.dev/docs/integrations/all/recharge/connect - credentials: - apiKey: - type: string - title: API Token - description: The API Token for your Recharge account - example: sk_test_1p1_************************************************** - pattern: '^[a-zA-Z0-9_]+$' - doc_section: '#step-1-generating-your-api-token' - -recall-ai: - display_name: Recall.ai - categories: - - dev-tools - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.region}.recall.ai - headers: - authorization: ${apiKey} - verification: - method: GET - endpoints: - - /api/v2/calendar-events - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/recall-ai - docs_connect: https://nango.dev/docs/api-integrations/recall-ai/connect - connection_config: - region: - type: string - title: Region - description: The region where your Recall.ai account is hosted. - enum: - - us-east-1 - - us-west-2 - - eu-central-1 - - ap-northeast-1 - order: 1 - doc_section: '#step-1-determine-your-region' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Recall.ai account - example: 2d7843e2351dd4afa67eecfb5c723142fcb401b1 - pattern: '^[a-f0-9]{40}$' - doc_section: '#step-2-generating-your-api-key' - -recruitcrm: - display_name: Recruitcrm - categories: - - hr - - ats - auth_mode: API_KEY - proxy: - base_url: https://api.recruitcrm.io - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/candidates/search - docs: https://nango.dev/docs/integrations/all/recruitcrm - docs_connect: https://nango.dev/docs/integrations/all/recruitcrm/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Recruitcrm account - example: 9SKXL************************************** - doc_section: '#step-1-generating-your-api-key' - -recruitee: - display_name: Recruitee - categories: - - ats - auth_mode: API_KEY - proxy: - base_url: https://api.recruitee.com/c/${connectionConfig.companyId} - headers: - authorization: Bearer ${apiKey} - connection_config: - companyName: ${connectionConfig.companyName} - verification: - method: GET - endpoints: - - /departments - docs: https://nango.dev/docs/integrations/all/recruitee - docs_connect: https://nango.dev/docs/integrations/all/recruitee/connect - connection_config: - companyId: - type: string - title: Company ID - description: The Company ID for your Recruitee account - example: '126786' - pattern: '^[0-9]+$' - order: 1 - doc_section: '#step-1-finding-your-company-id-and-company-name' - companyName: - type: string - title: Company Name - description: The Company name for your Recruitee account - example: acme - optional: true - doc_section: '#step-1-finding-your-company-id-and-company-name' - credentials: - apiKey: - type: string - title: Personal API Token - description: The Personal API Token for your Recruitee account - example: 'OTlHOGlWNUFJRkErekoxd1lXMGd6dz09' - pattern: '^[A-Za-z0-9+/]+={0,2}$' - doc_section: '#step-2-generating-your-personal-api-token' - -recruiterflow: - display_name: Recruiterflow - categories: - - hr - - ats - auth_mode: API_KEY - proxy: - base_url: https://api.recruiterflow.com - headers: - rf-api-key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/external/user/list - docs: https://nango.dev/docs/integrations/all/recruiterflow - docs_connect: https://nango.dev/docs/integrations/all/recruiterflow/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Recruiterflow account - doc_section: '#step-1-generating-your-api-key' - example: 7b0c0d**************************** - pattern: '^[a-zA-Z0-9_]+$' - -render-mcp: - display_name: Render (MCP) - categories: - - dev-tools - - mcp - auth_mode: API_KEY - proxy: - base_url: https://mcp.render.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/api-integrations/render-mcp - docs_connect: https://nango.dev/docs/api-integrations/render-mcp/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Render API key from Account Settings. - doc_section: '#step-1-create-a-render-api-key' - example: rnd_**************************** - pattern: '^rnd_[A-Za-z0-9]+$' - -raindrop-mcp: - display_name: Raindrop (MCP) - categories: - - dev-tools - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://auth.raindrop.ai/oauth/2.1/authorize - token_url: https://auth.raindrop.ai/oauth/2.1/token - registration_url: https://auth.raindrop.ai/oauth/2.1/register - authorization_params: - response_type: code - resource: https://mcp.raindrop.ai/mcp - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://mcp.raindrop.ai - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/raindrop-mcp - -reddit: - display_name: Reddit - categories: - - social - auth_mode: OAUTH2 - authorization_url: https://www.reddit.com/api/v1/authorize - token_url: https://www.reddit.com/api/v1/access_token - authorization_method: header - authorization_params: - duration: permanent - proxy: - base_url: https://oauth.reddit.com - docs: https://nango.dev/docs/integrations/all/reddit - -redtail-crm-sandbox: - display_name: Redtail CRM (Sandbox) - categories: - - crm - auth_mode: TWO_STEP - token_url: https://review.crm.redtailtechnology.com/api/public/v1/authentication - token_request_method: GET - token_headers: - authorization: Basic ${base64(${credentials.apiKey}:${credentials.username}:${credentials.password})} - token_response: - token: authenticated_user.user_key - proxy: - headers: - authorization: Userkeyauth ${base64(${credentials.apiKey}:${accessToken})} - base_url: https://review.crm.redtailtechnology.com/api/public - docs: https://nango.dev/docs/integrations/all/redtail-crm-sandbox - docs_connect: https://nango.dev/docs/integrations/all/redtail-crm-sandbox/connect - credentials: - username: - type: string - title: Username - description: The username for your Redtail CRM account - doc_section: '#step-2-finding-your-credentials' - password: - type: string - title: Password - description: The password for your Redtail CRM account - secret: true - doc_section: '#step-2-finding-your-credentials' - apiKey: - type: string - title: API Key - description: The API Key for your Redtail CRM account - example: f1c2d3a4-5b67-4c89-ae01-123456789abc - format: uuid - secret: true - doc_section: '#step-1-finding-your-api-token' -refiner: - display_name: Refiner - categories: - - surveys - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.refiner.io/v1 - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /account - docs: https://nango.dev/docs/integrations/all/refiner - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Refiner account - -replicate: - display_name: Replicate - categories: - - dev-tools - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.replicate.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/account - docs: https://nango.dev/docs/integrations/all/replicate - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Replicate account - -reply-io: - display_name: Reply.io - categories: - - marketing - - communication - auth_mode: API_KEY - proxy: - base_url: https://api.reply.io - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v3/whoami - docs: https://nango.dev/docs/api-integrations/reply-io - docs_connect: https://nango.dev/docs/api-integrations/reply-io/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Reply.io account. - example: AKp2Bbuy**************** - pattern: '^[A-Za-z0-9_-]+$' - doc_section: '#step-1-finding-your-api-key' - -researchdesk: - display_name: ResearchDesk - categories: - - other - auth_mode: TWO_STEP - body_format: json - token_url: https://${connectionConfig.subdomain}.researchdesk.com/tokens - token_params: - email: ${credentials.email} - password: ${credentials.password} - token_headers: - content-type: application/json - token_response: - token: token - token_expiration: expires - token_expiration_strategy: expireAt - proxy: - base_url: https://${connectionConfig.subdomain}.researchdesk.com - headers: - authorization: Bearer ${accessToken} - docs: https://nango.dev/docs/api-integrations/researchdesk - docs_connect: https://nango.dev/docs/api-integrations/researchdesk/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of the environment to which you want to connect to. - enum: - - demand - - stage-demand - order: 1 - doc_section: '#step-1-choosing-your-subdomain' - credentials: - email: - type: string - title: Email - description: Your ResearchDesk account email - format: email - doc_section: '#step-2-finding-your-credentials' - password: - type: string - title: Password - description: Your ResearchDesk account password - secret: true - doc_section: '#step-2-finding-your-credentials' - -resend: - display_name: Resend - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://api.resend.com - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'retry-after' - verification: - method: GET - endpoints: - - /domains?limit=1 - docs: https://nango.dev/docs/api-integrations/resend - docs_connect: https://nango.dev/docs/api-integrations/resend/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Resend API key. - pattern: '^re_[A-Za-z0-9_]+$' - example: 're_HW***************************65L' - doc_section: '#step-1-getting-your-api-key' - -retell-ai: - display_name: Retell AI - categories: - - dev-tools - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.retellai.com - headers: - authorization: Bearer ${apiKey} - content-type: application/json - docs: https://nango.dev/docs/integrations/all/retell-ai - docs_connect: https://nango.dev/docs/integrations/all/retell-ai/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for Retell AI - example: key-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - doc_section: '#step-1-finding-your-retell-ai-api-key' - -revivn: - display_name: Revivn - categories: - - other - auth_mode: OAUTH2_CC - token_url: https://api.revivn.dev/oauth/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.revivn.dev - docs: https://nango.dev/docs/api-integrations/revivn - docs_connect: https://nango.dev/docs/api-integrations/revivn/connect - credentials: - client_id: - type: string - title: Client ID - description: Your Revivn OAuth2 client ID. - doc_section: '#step-1-get-your-oauth2-credentials' - client_secret: - type: string - title: Client Secret - description: Your Revivn OAuth2 client secret. - secret: true - doc_section: '#step-1-get-your-oauth2-credentials' - -ring-central: - display_name: RingCentral - categories: - - support - auth_mode: OAUTH2 - authorization_url: https://platform.ringcentral.com/restapi/oauth/authorize - token_url: https://platform.ringcentral.com/restapi/oauth/token - authorization_method: header - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://platform.ringcentral.com - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/ring-central - -ring-central-sandbox: - display_name: RingCentral (Sandbox) - categories: - - communication - auth_mode: OAUTH2 - authorization_url: https://platform.devtest.ringcentral.com/restapi/oauth/authorize - token_url: https://platform.devtest.ringcentral.com/restapi/oauth/token - authorization_method: header - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://platform.devtest.ringcentral.com - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/ring-central-sandbox - -ringover: - display_name: Ringover - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://public-api.ringover.com - headers: - authorization: ${apiKey} - docs: https://nango.dev/docs/api-integrations/ringover - docs_connect: https://nango.dev/docs/api-integrations/ringover/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Ringover API key. - example: 'a3f9e2***************************d8e9f0' - pattern: '^[a-f0-9]{40}$' - doc_section: '#step-1-generating-your-api-key' - -rippling: - display_name: Rippling - categories: - - hr - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - user-agent: Node.js/20.12.2 (linux; x64) - base_url: https://rest.ripplingapis.com - docs: https://nango.dev/docs/integrations/all/rippling - docs_connect: https://nango.dev/docs/integrations/all/rippling/connect - credentials: - apiKey: - type: string - title: API Token - description: The API Token for your Rippling account - doc_section: '#step-1-generating-your-api-token' - -rippling-shop-app: - display_name: Rippling Shop App - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://app.rippling.com/apps/PLATFORM/${connectionConfig.appName}/authorize - token_url: https://api.rippling.com/api/o/token/ - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.rippling.com - post_connection_script: ripplingShopAppPostConnection - docs: https://nango.dev/docs/integrations/all/rippling-shop-app - connection_config: - appName: - type: string - title: '' - description: '' - automated: true - -roam-scim: - display_name: Roam (SCIM API) - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.ro.am/scim - headers: - authorization: Bearer ${apiKey} - accept: application/json - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/Users - docs: https://nango.dev/docs/integrations/all/roam-scim - docs_connect: https://nango.dev/docs/integrations/all/roam-scim/connect - credentials: - apiKey: - type: string - title: SCIM API Token - description: The SCIM API token generated from your Roam organization settings. - example: rmk-uu9zt58h-EYHyLJ3ay4Mc-wuWQTOk-Y2yY-gZlW7Ys8AdVXBRZks_SGrCyZ09_IDvX9ikahdxushGYKcT77Fjw - pattern: '^rmk-[A-Za-z0-9_-]{86}$' - doc_section: '#step-1-generating-your-scim-api-token' - -robinhood-mcp: - display_name: Robinhood (MCP) - categories: - - payment - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://robinhood.com/oauth - token_url: https://api.robinhood.com/oauth2/token/ - registration_url: https://agent.robinhood.com/oauth/trading/register - authorization_params: - response_type: code - resource: https://agent.robinhood.com/mcp/trading - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://agent.robinhood.com - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/robinhood-mcp - -rock-gym-pro: - display_name: Rock Gym Pro - categories: - - crm - auth_mode: BASIC - proxy: - base_url: https://api.rockgympro.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/ping - paginate: - type: offset - offset_name_in_request: page - limit_name_in_request: limit - docs: https://nango.dev/docs/integrations/all/rock-gym-pro - credentials: - username: - type: string - title: API Username - description: Your Rock Gym Pro API username - password: - type: string - title: API Password - description: Your Rock Gym Pro API password - -roller: - display_name: Roller - categories: - - ticketing - auth_mode: OAUTH2_CC - token_url: https://api.roller.app/token - body_format: json - credentials: - client_id: - type: string - title: Client ID - description: Roller client ID - client_secret: - type: string - title: Client Secret - description: Roller client secret - proxy: - base_url: https://api.roller.app - - docs: https://nango.dev/docs/integrations/all/roller - -rocketreach: - display_name: RocketReach - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.rocketreach.co - headers: - api-key: ${apiKey} - retry: - at: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/rocketreach - docs_connect: https://nango.dev/docs/api-integrations/rocketreach/connect - credentials: - apiKey: - type: string - title: API Key - description: Your RocketReach API key. - example: 1e4dfd5***************************e3ca3a - pattern: '^[a-z0-9]+$' - doc_section: '#step-1-get-your-api-key' - -rootly: - display_name: Rootly - categories: - - dev-tools - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.rootly.com - verification: - method: GET - headers: - content-type: application/vnd.api+json - endpoints: - - /v1/users/me - docs: https://nango.dev/docs/api-integrations/rootly - docs_connect: https://nango.dev/docs/api-integrations/rootly/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Rootly account - example: rootly_db86a6β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’ - pattern: '^rootly_[a-f0-9]{64}$' - doc_section: '#step-1-generating-your-api-key' - -reapit: - display_name: Reapit Connect - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://connect.reapit.cloud/authorize - token_url: https://connect.reapit.cloud/token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://platform.reapit.cloud - headers: - api-version: ${connectionConfig.version} || 2020-01-31 - docs: https://nango.dev/docs/api-integrations/reapit - setup_guide_url: https://nango.dev/docs/api-integrations/reapit/how-to-register-your-own-reapit-oauth-app - connection_config: - version: - type: string - title: '' - description: '' - automated: true -rydoo: - display_name: Rydoo - categories: - - accounting - auth_mode: OAUTH2_CC - token_url: https://accounts.rydoo.com/connect/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.rydoo.com - docs: https://nango.dev/docs/api-integrations/rydoo - docs_connect: https://nango.dev/docs/api-integrations/rydoo/connect - credentials: - client_id: - type: string - title: Client ID - description: Your Rydoo Client ID. - client_secret: - type: string - title: Client Secret - description: Your Rydoo Client Secret. - secret: true - -segment: - display_name: Segment - categories: - - analytics - - marketing - auth_mode: OAUTH2 - authorization_url: https://id.segmentapis.com/oauth2/auth - token_url: https://id.segmentapis.com/oauth2/token - token_request_auth_method: basic - proxy: - base_url: https://api.segment.io - docs: https://nango.dev/docs/integrations/all/segment - -sage: - display_name: Sage - categories: - - accounting - - erp - auth_mode: OAUTH2 - authorization_url: https://www.sageone.com/oauth2/auth/central - token_url: https://oauth.accounting.sage.com/token - authorization_params: - filter: apiv3.1 - proxy: - base_url: https://api.accounting.sage.com - docs: https://nango.dev/docs/integrations/all/sage - -sage-200: - display_name: Sage 200 - categories: - - accounting - - erp - auth_mode: OAUTH2 - authorization_url: https://id.sage.com/authorize - token_url: https://id.sage.com/oauth/token - authorization_params: - audience: s200ukipd/sage200 - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - default_scopes: - - offline_access - scope_separator: ' ' - post_connection_script: sage200PostConnection - proxy: - base_url: https://api.columbus.sage.com/uk/${connectionConfig.edition} - headers: - x-company: ${connectionConfig.company_id} - x-site: ${connectionConfig.site_id} - docs: https://nango.dev/docs/api-integrations/sage-200 - setup_guide_url: https://nango.dev/docs/api-integrations/sage-200/how-to-register-your-own-sage-200-oauth-app - connection_config: - edition: - type: string - title: '' - description: '' - automated: true - company_id: - type: string - title: '' - description: '' - automated: true - site_id: - type: string - title: '' - description: '' - automated: true - -sage-hr: - display_name: Sage HR - categories: - - hr - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.sage.hr - headers: - x-auth-token: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/employees - docs: https://nango.dev/docs/integrations/all/sage-hr - docs_connect: https://nango.dev/docs/integrations/all/sage-hr/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Sage HR account - doc_section: '#step-1-enabling-api-access' - example: apikey**************************** - pattern: '^[a-zA-Z0-9.]+$' - connection_config: - subdomain: - type: string - title: Sage HR Subdomain - description: The subdomain of your Sage HR account - pattern: '^[a-zA-Z0-9-]+$' - example: subdomain - suffix: .sage.hr - prefix: https:// - -sage-intacct-oauth: - display_name: Sage Intacct (OAuth) - categories: - - accounting - - erp - - popular - auth_mode: OAUTH2 - authorization_url: https://api.intacct.com/ia/api/v1/oauth2/authorize - token_url: https://api.intacct.com/ia/api/v1/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.intacct.com/ia/api - docs: https://nango.dev/docs/integrations/all/sage-intacct-oauth - -sage-intacct-cc: - display_name: Sage Intacct (Client Credentials) - categories: - - accounting - - erp - auth_mode: TWO_STEP - body_format: form - token_url: https://api.intacct.com/ia/api/v1/oauth2/token - token_params: - grant_type: client_credentials - client_id: ${credentials.clientId} - client_secret: ${credentials.clientSecret} - username: ${credentials.username} - session_id: ${credentials.sessionId} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://api.intacct.com/ia/api - docs: https://nango.dev/docs/api-integrations/sage-intacct-cc - docs_connect: https://nango.dev/docs/api-integrations/sage-intacct-cc/connect - setup_guide_url: https://nango.dev/docs/api-integrations/sage-intacct-cc/connect - credentials: - clientId: - type: string - title: Client ID - description: Your Sage Intacct application Client ID. - clientSecret: - type: string - title: Client Secret - description: Your Sage Intacct application Client Secret. - secret: true - username: - type: string - title: Username - description: The Web Services user ID in userId@companyId|entityId format. Required if not using Session ID. - example: Admin@MyCompany|Central Region - optional: true - sessionId: - type: string - title: Session ID - description: A valid UI or API session ID. Required if not using Username. - secret: true - optional: true - -sage-intacct: - display_name: Sage Intacct - categories: - - accounting - - erp - auth_mode: TWO_STEP - proxy: - base_url: https://api.intacct.com/ia/xml/xmlgw.phtml - token_url: https://api.intacct.com/ia/xml/xmlgw.phtml - body_format: xml - token_params: - request: - control: - senderid: ${credentials.senderId} - password: ${credentials.senderPassword} - controlid: ${now} - uniqueid: false - dtdversion: '3.0' - includewhitespace: false - operation: - authentication: - login: - userid: ${credentials.userId} - companyid: ${credentials.companyId} - password: ${credentials.userPassword} - content: - function: - $controlid: '{{$guid}}' - getAPISession: '' - token_headers: - content-type: application/xml - token_response: - token: response.operation.result.data.api.sessionid - token_expiration: response.operation.authentication.sessiontimeout - token_expiration_strategy: expireAt - docs: https://nango.dev/docs/integrations/all/sage-intacct - docs_connect: https://nango.dev/docs/integrations/all/sage-intacct/connect - credentials: - senderId: - type: string - title: Sender ID - description: Your Sage Intacct Sender ID - doc_section: '#step-1-how-to-retrieve-the-sender-id' - senderPassword: - type: string - title: Sender Password - description: Your Sage Intacct Sender Password - secret: true - userId: - type: string - title: User ID - description: Your Sage Intacct User ID - doc_section: '#step-2-how-to-retrieve-the-user-id' - companyId: - type: string - title: Company ID - description: Your Sage Intacct Company ID - doc_section: '#step-3-how-to-retrieve-the-company-id' - userPassword: - type: string - title: User Password - description: Your Sage Intacct User Password - secret: true - -sage-people: - display_name: Sage People - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://login.salesforce.com/services/oauth2/authorize - token_url: https://login.salesforce.com/services/oauth2/token - authorization_params: - prompt: consent - default_scopes: - - offline_access - - api - proxy: - base_url: https://${connectionConfig.instance_url}/services/apexrest/spapi - headers: - accept: application/json - token_response_metadata: - - instance_url - docs: https://nango.dev/docs/integrations/all/sage-people - docs_connect: https://nango.dev/docs/integrations/all/sage-people/connect - connection_config: - instance_url: - type: string - title: Instance URL - description: The instance URL of your Salesforce account - format: uri - pattern: '^https?://.*$' - automated: true - -sap-ariba: - display_name: SAP Ariba - categories: - - erp - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.subdomain}.ariba.com/v2/oauth/token - token_params: - grant_type: openapi_2lo - token_request_auth_method: basic - body_format: form - proxy: - base_url: https://open${connectionConfig.subdomain}.ariba.com - headers: - apikey: ${connectionConfig.apiKey} - x-ariba-network-id: ${connectionConfig.anid} - retry: - after: - - retry-after - docs: https://nango.dev/docs/api-integrations/sap-ariba - docs_connect: https://nango.dev/docs/api-integrations/sap-ariba/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: Your SAP Ariba API subdomain. - example: api-eu - default_value: api - enum: - - api - - api-eu - - api.au.cloud - doc_section: '#step-1-select-your-subdomain' - order: 1 - apiKey: - type: string - title: Application Key (API Key) - description: Your SAP Ariba application's API Key. - secret: true - doc_section: '#step-2-get-your-api-key' - order: 2 - anid: - type: string - title: Ariba Network ID (ANID) - description: Your SAP Ariba Network ID. - example: AN01234567890 - pattern: '^AN[0-9]+$' - doc_section: '#step-3-find-your-anid' - order: 3 - -salesforce: - display_name: Salesforce - categories: - - crm - - popular - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.hostname}/services/oauth2/authorize || https://login.salesforce.com/services/oauth2/authorize - token_url: https://${connectionConfig.hostname}/services/oauth2/token || https://login.salesforce.com/services/oauth2/token - authorization_params: - prompt: consent - default_scopes: - - offline_access - token_response_metadata: - - instance_url - proxy: - base_url: ${connectionConfig.instance_url} - webhook_routing_script: salesforceWebhookRouting - post_connection_script: salesforcePostConnection - docs: https://nango.dev/docs/api-integrations/salesforce - setup_guide_url: https://nango.dev/docs/api-integrations/salesforce/salesforce-api-oauth-app-setup - docs_connect: https://nango.dev/docs/api-integrations/salesforce/connect - connection_config: - instance_url: - type: string - title: Instance URL - description: The instance URL of your Salesforce account - format: uri - pattern: '^https?://.*$' - automated: true - hostname: - type: string - title: Hostname - description: The hostname to your Salesforce instance - pattern: '^(?!(?:.*\.)?[Ll][Ii][Gg][Hh][Tt][Nn][Ii][Nn][Gg]\.([Ff][Oo][Rr][Cc][Ee]|[Ss][Aa][Ll][Ee][Ss][Ff][Oo][Rr][Cc][Ee])\.[Cc][Oo][Mm]$)[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$' - example: acme.my.salesforce.com - prefix: https:// - optional: true - doc_section: '#step-1-finding-your-hostname' - -salesforce-cc: - display_name: Salesforce (Client Credentials) - categories: - - crm - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.hostname}/services/oauth2/token - token_params: - grant_type: client_credentials - token_response_metadata: - - instance_url - proxy: - base_url: ${connectionConfig.instance_url} - docs: https://nango.dev/docs/api-integrations/salesforce-cc - docs_connect: https://nango.dev/docs/api-integrations/salesforce-cc/connect - token_expires_in_ms: 0 - connection_config: - instance_url: - type: string - title: '' - description: '' - automated: true - hostname: - type: string - title: Hostname - description: The hostname to your Salesforce instance - pattern: '^(?!(?:.*\.)?[Ll][Ii][Gg][Hh][Tt][Nn][Ii][Nn][Gg]\.([Ff][Oo][Rr][Cc][Ee]|[Ss][Aa][Ll][Ee][Ss][Ff][Oo][Rr][Cc][Ee])\.[Cc][Oo][Mm]$)[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$' - example: acme.my.salesforce.com - prefix: https:// - -salesforce-jwt: - display_name: Salesforce (JWT) - categories: - - crm - auth_mode: TWO_STEP - signature: - protocol: RSA - body_format: form - token: - signing_key: ${credentials.privateKey} - expires_in_ms: 3600000 - header: - alg: RS256 - typ: JWT - payload: - iss: ${credentials.clientId} - aud: https://${connectionConfig.authorizationUrl} - sub: ${credentials.username} - token_url: https://${connectionConfig.authorizationUrl}/services/oauth2/token - token_params: - grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer - assertion: ${token} - token_response: - token: access_token - token_response_metadata: - - instance_url - proxy: - base_url: ${connectionConfig.instance_url} - token_expires_in_ms: 0 - docs: https://nango.dev/docs/api-integrations/salesforce-jwt - docs_connect: https://nango.dev/docs/api-integrations/salesforce-jwt/connect - connection_config: - authorizationUrl: - type: string - title: Authorization Server URL - description: Your Salesforce authorization server URL. - format: hostname - example: 'login.salesforce.com' - doc_section: '#step-5-finding-the-authorization-server-url' - credentials: - clientId: - type: string - title: Consumer Key - example: 3MVG9dAEux2v1sLsg0e52***************CJpGsXgqg8E - description: The Consumer Key from your Salesforce Connected App. - doc_section: '#step-3-get-consumer-key-and-consumer-secret' - clientSecret: - type: string - title: Consumer Secret - example: 954F73F4C234***************9D069B8FCF83B5 - pattern: '^[A-F0-9]{64}$' - description: The Consumer Secret from your Salesforce Connected App. - doc_section: '#step-3-get-consumer-key-and-consumer-secret' - username: - type: string - title: Username - description: The Salesforce username of the user the JWT will act on behalf of. - format: email - example: john@acme.com - doc_section: '#step-6-finding-the-username' - privateKey: - type: string - title: Private Key - description: The private key that matches the certificate you uploaded to the Connected App. - example: '-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n-----END PRIVATE KEY-----' - doc_section: '#step-1-create-a-private-key-and-self-signed-digital-certificate' - -salesforce-sandbox: - display_name: Salesforce (Sandbox) - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://test.salesforce.com/services/oauth2/authorize - token_url: https://test.salesforce.com/services/oauth2/token - default_scopes: - - offline_access - token_response_metadata: - - instance_url - proxy: - base_url: ${connectionConfig.instance_url} - docs: https://nango.dev/docs/api-integrations/salesforce-sandbox - setup_guide_url: https://nango.dev/docs/api-integrations/salesforce-sandbox/how-to-register-your-own-salesforce-sandbox-api-oauth-app - connection_config: - instance_url: - type: string - title: Instance URL - description: The instance URL of your Salesforce account - format: uri - pattern: '^https?://.*$' - automated: true - -salesforce-experience-cloud: - display_name: Salesforce Experience Cloud - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.my.site.com/services/oauth2/authorize - token_url: https://${connectionConfig.subdomain}.my.site.com/services/oauth2/token - default_scopes: - - offline_access - token_response_metadata: - - instance_url - proxy: - base_url: ${connectionConfig.instance_url} - docs: https://nango.dev/docs/integrations/all/salesforce-experience-cloud - connection_config: - subdomain: - type: string - title: Salesforce Domain - description: The subdomain of your Salesforce Experience Cloud account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .my.site.com - prefix: https:// - instance_url: - type: string - title: Instance URL - description: The instance URL of your Salesforce Experience Cloud account - format: uri - pattern: '^https?://.*$' - automated: true -salesforce-cdp: - display_name: Salesforce (Data Cloud) - categories: - - storage - auth_mode: TWO_STEP - token_url: https://login.salesforce.com/services/oauth2/token - body_format: form - token_params: - grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer - assertion: ${credentials.jwt} - token_headers: - content-type: application/x-www-form-urlencoded - additional_steps: - - body_format: form - token_params: - grant_type: urn:salesforce:grant-type:external:cdp - subject_token: ${step1.access_token} - subject_token_type: urn:ietf:params:oauth:token-type:access_token - token_headers: - content-type: application/x-www-form-urlencoded - token_url: ${step1.instance_url}/services/a360/token - token_response_metadata: - - instance_url - proxy: - base_url: ${connectionConfig.instance_url} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/integrations/all/salesforce-cdp - docs_connect: https://nango.dev/docs/integrations/all/salesforce-cdp/connect - credentials: - jwt: - type: string - title: Encoded JWT - description: This is your pre-generated, encoded JSON Web Token (JWT) - secret: true - doc_section: '#step-1-generating-your-encoded-jwt' - -salesmsg: - display_name: Salesmsg (PAT) - categories: - - communication - - marketing - auth_mode: TWO_STEP - body_format: json - token_url: https://api.salesmessage.com/pub/v2.2/oauth/personal-token/refresh - token_headers: - authorization: Bearer ${credentials.apiKey} - content-type: application/json - refresh_token_headers: - authorization: Bearer ${refresh_token} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - refresh_token: access_token - proxy: - base_url: https://api.salesmessage.com/pub/ - headers: - authorization: Bearer ${accessToken} - docs: https://nango.dev/docs/api-integrations/salesmsg - docs_connect: https://nango.dev/docs/api-integrations/salesmsg/connect - credentials: - apiKey: - type: string - title: Personal Access Token - description: Your Salesmsg Personal Access Token (PAT). - example: eyJhbGciOi***.eyJzdWIiOi***.xxxxxxxxxxxx - pattern: '^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$' - doc_section: '#step-1-generating-your-personal-access-token' - -salesmsg-oauth2: - display_name: Salesmsg (OAuth2) - categories: - - communication - - marketing - auth_mode: OAUTH2 - authorization_url: https://app.salesmessage.com/auth/oauth - token_url: https://api.salesmessage.com/pub/v2.2/oauth/token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.salesmessage.com/pub/ - docs: https://nango.dev/docs/api-integrations/salesmsg-oauth2 - setup_guide_url: https://nango.dev/docs/api-integrations/salesmsg-oauth2/how-to-register-your-own-salesmsg-oauth-app - -sap-fieldglass: - display_name: SAP Fieldglass - categories: - - erp - body_format: form - auth_mode: TWO_STEP - token_url: https://${connectionConfig.domain}/api/oauth2/v2.0/token?grant_type=client_credentials&response_type=token - token_headers: - authorization: Basic ${base64(${credentials.clientId}:${credentials.clientSecret})} - X-ApplicationKey: ${credentials.appKey} - proxy: - base_url: https://${connectionConfig.domain}/api - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/integrations/all/sap-fieldglass - docs_connect: https://nango.dev/docs/integrations/all/sap-fieldglass/connect - credentials: - clientId: - type: string - title: Client ID - description: Your SAP Fieldglass application Client ID - doc_section: '#step-1-generating-an-application' - clientSecret: - type: string - title: Client secret - description: Your SAP Fieldglass application Client secret - secret: true - doc_section: '#step-1-generating-an-application' - appKey: - type: string - title: Application Key - description: Your SAP Fieldglass application key - secret: true - optional: true - doc_section: '#step-1-generating-an-application' - connection_config: - domain: - type: string - title: Domain - description: Your SAP Fieldglass environment URL - example: auth.fieldglass.net - prefix: https:// - pattern: '^(?:[a-zA-Z0-9_-]+-(?:auth\.)?fgvms\.com|auth\.fieldglass\.net|sso\.fieldglass\.eu)$' - doc_section: '#step-2-determining-your-domain' - -sap-concur: - display_name: SAP Concur - categories: - - erp - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.region}.api.concursolutions.com/oauth2/v0/token - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.region}.api.concursolutions.com - docs: https://nango.dev/docs/integrations/all/sap-concur - docs_connect: https://nango.dev/docs/integrations/all/sap-concur/connect - connection_config: - companyUUID: - type: string - title: Company UUID - description: The unique identifier for your SAP Concur company - doc_section: '#step-2-generate-company-request-token' - companyRequestToken: - type: string - title: Company Request Token - description: The request token generated for the company - doc_section: '#step-2-generate-company-request-token' - region: - type: string - title: Region - description: The SAP Concur Data Center region (e.g., `us`, `eu`, `cn`) - example: us - doc_section: '#step-3-determine-your-region' - -sap-concur-password: - display_name: SAP Concur (Password Grant) - categories: - - erp - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.region}.api.concursolutions.com/oauth2/v0/token - token_params: - grant_type: password - client_id: ${credentials.clientId} - client_secret: ${credentials.clientSecret} - username: ${credentials.username} - password: ${credentials.password} - token_headers: - content-type: application/x-www-form-urlencoded - token_response: - token: access_token - refresh_token: refresh_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://${connectionConfig.region}.api.concursolutions.com - docs: https://nango.dev/docs/api-integrations/sap-concur-password - docs_connect: https://nango.dev/docs/api-integrations/sap-concur-password/connect - credentials: - username: - type: string - title: Username - description: Your SAP Concur username or userId. - doc_section: '#step-2-get-your-user-credentials' - password: - type: string - title: Password - secret: true - description: Your SAP Concur account password. - doc_section: '#step-2-get-your-user-credentials' - clientId: - type: string - title: Client ID - description: Your OAuth application client_id supplied by App Management. - doc_section: '#step-1-get-your-client-credentials' - clientSecret: - type: string - title: Client Secret - secret: true - description: Your OAuth application client_secret supplied by App Management. - doc_section: '#step-1-get-your-client-credentials' - connection_config: - region: - type: string - title: Region - description: The SAP Concur Data Center region. - example: us - pattern: '^[a-z0-9-]+$' - order: 1 - doc_section: '#step-3-determine-your-region' - -sap-business-one: - display_name: SAP Business One - categories: - - erp - body_format: json - auth_mode: TWO_STEP - token_url: https://${connectionConfig.domain}/Login - token_params: - CompanyDB: ${connectionConfig.companyDb} - UserName: ${credentials.userName} - DBInstance: ${connectionConfig.dbInstance} - Password: ${credentials.password} - token_headers: - content-type: application/json - token_expires_in_ms: 1700000 - proxy: - base_url: https://${connectionConfig.domain} - headers: - cookie: ${credentials._cookies} - token_response: - token: SessionId - token_response_headers: - - set-cookie - docs: https://nango.dev/docs/integrations/all/sap-business-one - docs_connect: https://nango.dev/docs/integrations/all/sap-business-one/connect - connection_config: - domain: - type: string - title: Service Layer URL - prefix: https:// - suffix: /Login - pattern: '^[A-Za-z0-9.-]+(?::\d+(?:/[-A-Za-z0-9.]*)*)?$' - order: 1 - description: The base URL for your SAP Business One Service Layer - doc_section: '#step-3-finding-your-service-layer-url' - companyDb: - type: string - title: Company Database Name - description: The name of your SAP Business One company database - example: 10COR0809H - order: 2 - doc_section: '#step-2-identifying-your-company-database' - dbInstance: - type: string - title: Database Instance - description: The database server instance name - optional: true - order: 3 - example: C200@10.58.114.200:30013 - doc_section: '#step-4-finding-your-database-instance' - credentials: - userName: - type: string - title: Username - description: Your SAP Business One username - doc_section: '#step-1-obtaining-your-credentials' - password: - type: string - title: Password - description: Your SAP Business One password - secret: true - doc_section: '#step-1-obtaining-your-credentials' - -sap-success-factors: - display_name: SAP SuccessFactors - categories: - - hr - body_format: form - auth_mode: TWO_STEP - token_url: https://${connectionConfig.apiServer}/oauth/token - token_params: - company_id: ${connectionConfig.companyId} - client_id: ${credentials.apiKey} - grant_type: urn:ietf:params:oauth:grant-type:saml2-bearer - assertion: ${credentials.assertion} - new_token: true - assertion: - type: saml - key: ${assertionOption.privateKey} - issuer: www.successfactors.com - lifetimeInSeconds: '315360000' - audiences: www.successfactors.com - attributes: - api_key: ${credentials.apiKey} - use_username: true - use_email: false - external_user: false - sessionIndex: ${random} - nameIdentifier: ${assertionOption.userName} - recipient: https://${connectionConfig.apiServer}/oauth/token - token_headers: - content-type: application/x-www-form-urlencoded - proxy: - base_url: https://${connectionConfig.apiServer} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/api-integrations/sap-success-factors - docs_connect: https://nango.dev/docs/api-integrations/sap-success-factors/connect - connection_config: - apiServer: - type: string - title: API Server - description: The API Server to connect to your SAP SuccessFactors account - format: hostname - example: api41preview.sapsf.com - prefix: https:// - doc_section: '#step-1-finding-your-api-server' - order: 1 - companyId: - type: string - title: Company ID - description: The company ID of your SAP SuccessFactors account - example: SFSALES012345 - pattern: '^[A-Za-z0-9]+$' - doc_section: '#step-2-finding-your-company-id' - order: 2 - credentials: - apiKey: - type: string - title: API Key - description: The API key for your SAP SuccessFactors account - secret: true - example: YzA4MTVhMTQzZTUzMjc3NTk0ZDY2Nzc1ZmVkOA - pattern: ^[A-Za-z0-9+/]{32,44}={0,2}$ - doc_section: '#step-3-finding-your-api-key-and-private-key' - assertion: - type: string - title: '' - description: '' - automated: true - assertion_option: - userName: - type: string - title: Username - description: The username of your SAP SuccessFactors account - example: johnDoe - doc_section: '#step-4-finding-your-username' - privateKey: - type: string - title: Private Key - description: The Private Key for your SAP SuccessFactors Oauth Client - doc_section: '#step-3-finding-your-api-key-and-private-key' - -sap-odata-oauth2-cc: - display_name: SAP S/4HANA Cloud (Client Credentials) - categories: - - erp - - popular - token_request_auth_method: basic - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.subdomain}.authentication.${connectionConfig.region}.hana.ondemand.com/oauth/token - token_params: - grant_type: client_credentials - scope_separator: ',' - proxy: - base_url: https://${connectionConfig.apiServer} - docs: https://nango.dev/docs/api-integrations/sap-odata-oauth2-cc - docs_connect: https://nango.dev/docs/api-integrations/sap-odata-oauth2-cc/connect - connection_config: - subdomain: - type: string - title: Subdomain - prefix: https:// - pattern: '^[a-z0-9_-]+$' - example: acme - suffix: /hana.ondemand.com - order: 1 - description: The subdomain where your SAP S/4HANA cloud instance is hosted - doc_section: '#step-2-finding-your-subdomain' - region: - type: string - title: Region - description: The region where your SAP S/4HANA cloud instance is hosted - example: eu10 - order: 2 - doc_section: '#step-3-finding-your-region' - apiServer: - type: string - title: API Server - description: The API base URL of the SAP S/4HANA cloud API service you want to connect to - pattern: '^[A-Za-z0-9.-]+(?::\d+(?:/[-A-Za-z0-9.]*)*)?$' - prefix: https:// - format: hostname - example: eu10.cfapps.eu10.hana.ondemand.com - doc_section: '#step-4-finding-your-api-server' - order: 3 - -sap-odata-basic: - display_name: SAP S/4HANA Cloud (Basic Auth) - categories: - - erp - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.apiServer} - docs: https://nango.dev/docs/api-integrations/sap-odata-basic - docs_connect: https://nango.dev/docs/api-integrations/sap-odata-basic/connect - connection_config: - apiServer: - type: string - title: API Server - description: The API base URL of the SAP S/4HANA cloud API service you want to connect to - pattern: '^[A-Za-z0-9.-]+(?::\d+(?:/[-A-Za-z0-9.]*)*)?$' - prefix: https:// - example: eu10.cfapps.eu10.hana.ondemand.com - doc_section: '#step-2-finding-your-api-server' - order: 1 - -schwab: - display_name: Schwab - categories: - - banking - - accounting - auth_mode: OAUTH2 - authorization_url: https://api.schwabapi.com/v1/oauth/authorize - token_url: https://api.schwabapi.com/v1/oauth/token - token_request_auth_method: basic - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.schwabapi.com - docs: https://nango.dev/docs/api-integrations/schwab - setup_guide_url: https://nango.dev/docs/api-integrations/schwab/how-to-register-your-own-schwab-oauth-app - -scrapedo: - display_name: Scrape.do - categories: - - other - auth_mode: API_KEY - proxy: - base_url: https://api.scrape.do - query: - token: ${apiKey} - docs: https://nango.dev/docs/integrations/all/scrapedo - docs_connect: https://nango.dev/docs/integrations/all/scrapedo/connect - credentials: - apiKey: - type: string - title: API Token - description: The API Token for your Scrape.do account - example: 3c12d71308a346c41d10b19a2b2ac1ea5cacb53588d - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-1-finding-your-api-key' - -salesloft: - display_name: Salesloft - categories: - - marketing - auth_mode: OAUTH2 - authorization_url: https://accounts.salesloft.com/oauth/authorize - token_url: https://accounts.salesloft.com/oauth/token - proxy: - base_url: https://api.salesloft.com - docs: https://nango.dev/docs/integrations/all/salesloft - -sendgrid: - display_name: SendGrid - categories: - - marketing - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.sendgrid.com - docs: https://nango.dev/docs/integrations/all/sendgrid - docs_connect: https://nango.dev/docs/integrations/all/sendgrid/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Sendgrid account - doc_section: '#step-1-generating-your-sendgrid-api-key' - -semrush: - display_name: Semrush (v3) - categories: - - marketing - - analytics - auth_mode: API_KEY - proxy: - base_url: https://api.semrush.com - query: - key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /management/v1/projects - docs: https://nango.dev/docs/integrations/all/semrush - docs_connect: https://nango.dev/docs/integrations/all/semrush/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Semrush API key - doc_section: '#step-1-finding-your-api-key' - -sentinelone: - display_name: SentinelOne - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.hostname} - headers: - authorization: ApiToken ${apiKey} - accept: application/json - content-type: application/json - verification: - method: GET - endpoints: - - /web/api/v2.1/sites?limit=1 - docs: https://nango.dev/docs/api-integrations/sentinelone - docs_connect: https://nango.dev/docs/api-integrations/sentinelone/connect - connection_config: - hostname: - type: string - title: Hostname - description: The hostname of your SentinelOne management console - format: hostname - prefix: https:// - example: your-tenant.sentinelone.net - doc_section: '#step-2-find-your-hostname' - order: 1 - credentials: - apiKey: - type: string - title: API Token - description: The API token for your SentinelOne service user - doc_section: '#step-1-generate-your-api-token' - -sentry: - display_name: Sentry - categories: - - dev-tools - - analytics - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.hostname}/api - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/sentry - docs_connect: https://nango.dev/docs/integrations/all/sentry/connect - connection_config: - hostname: - type: string - title: Hostname - description: The Hostname of your Sentry account. - format: hostname - enum: - - sentry.io - - us.sentry.io - - eu.sentry.io - - de.sentry.io - order: 1 - doc_section: '#step-1-finding-your-hostname' - credentials: - apiKey: - type: string - title: Auth Token - description: The Authentication token for your Sentry account - example: sntryu_795225***************b9864a********************* - pattern: '^sntryu_[a-f0-9]{64}$' - doc_section: '#step-2-generating-your-sentry-auth-token' - -sentry-oauth: - display_name: Sentry (Public Integrations) - installation: outbound - categories: - - dev-tools - - analytics - auth_mode: OAUTH2 - token_url: https://sentry.io/api/0/sentry-app-installations/${connectionConfig.installation.uuid}/authorizations/ - webhook_routing_script: sentryOauthWebhookRouting - post_connection_script: sentryOauthPostConnection - authorization_code_param_in_webhook: data.installation.code - webhook_response_metadata: - - installation.uuid - proxy: - base_url: https://${connectionConfig.hostname}/api - connection_config: - actor: ${connectionConfig.actor} - docs: https://nango.dev/docs/integrations/all/sentry-oauth - docs_connect: https://nango.dev/docs/integrations/all/sentry-oauth/connect - connection_config: - hostname: - type: string - title: Hostname - description: The Hostname of your Sentry account. - format: hostname - enum: - - sentry.io - - us.sentry.io - - eu.sentry.io - - de.sentry.io - order: 1 - doc_section: '#step-1-finding-your-hostname' - actor: - type: string - title: User ID - description: The unique identifier of the user who will accept and install the public integration - doc_section: '#step-2-finding-your-user-id' - installation.uuid: - type: string - title: '' - description: '' - automated: true - -sedna: - display_name: Sedna (OAuth) - auth_mode: OAUTH2_CC - categories: - - communication - proxy: - base_url: https://${connectionConfig.tenant}.sednanetwork.com/platform - token_url: https://${connectionConfig.tenant}.sednanetwork.com/platform/oauth/token - token_params: - grant_type: client_credentials - scope_separator: ',' - docs: https://nango.dev/docs/integrations/all/sedna - connection_config: - tenant: - type: string - title: Tenant - description: The tenant name to your sedna account - -sedna-basic: - display_name: Sedna (Basic Auth) - auth_mode: BASIC - categories: - - communication - proxy: - base_url: https://${connectionConfig.tenant}.sednanetwork.com/platform - docs: https://nango.dev/docs/integrations/all/sedna-basic - connection_config: - tenant: - type: string - title: Tenant - description: The tenant name to your sedna account - -setmore: - display_name: Setmore - categories: - - productivity - auth_mode: TWO_STEP - token_request_method: GET - token_url: https://developer.setmore.com/api/v1/o/oauth2/token?refreshToken=${credentials.refreshToken} - proxy: - base_url: https://developer.setmore.com/api - token_response: - token: data.token.access_token - token_expiration: data.token.expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/integrations/all/setmore - docs_connect: https://nango.dev/docs/integrations/all/setmore/connect - credentials: - refreshToken: - type: string - title: Access Token - pattern: '^r1\/[A-Za-z0-9\-]+$' - example: r1/Ab12Cd34Ef56Gh78Ij90KlMnOpQr-StUvWxYz123456 - description: The access token provided to you by Setmore team - doc_section: '#step-1-requesting-access-to-the-api' - -sellercloud: - display_name: Sellercloud - categories: - - e-commerce - auth_mode: TWO_STEP - proxy: - base_url: ${connectionConfig.restApiEndpoint} - token_request_method: GET - token_url: https://api.sellercloud.com/api/server-by-team/?team=${credentials.teamName} - additional_steps: - - body_format: json - token_params: - Username: ${credentials.username} - Password: ${credentials.password} - token_url: ${step1.restApiEndpoint}/api/token - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - token_response_metadata: - - restApiEndpoint - docs: https://nango.dev/docs/api-integrations/sellercloud - docs_connect: https://nango.dev/docs/api-integrations/sellercloud/connect - connection_config: - restApiEndpoint: - type: string - title: '' - description: '' - automated: true - credentials: - teamName: - type: string - title: Team Name - description: Your Sellercloud team name - example: myteam - doc_section: '#step-1-finding-your-team-name' - username: - type: string - title: Username - description: Your Sellercloud username - doc_section: '#step-2-identifying-your-credentials' - password: - type: string - title: Password - description: Your Sellercloud password - secret: true - doc_section: '#step-2-identifying-your-credentials' - -sellsy: - display_name: Sellsy - auth_mode: OAUTH2 - categories: - - invoicing - - accounting - - crm - authorization_url: https://login.sellsy.com/oauth2/authorization - token_url: https://login.sellsy.com/oauth2/access-tokens - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.sellsy.com - webhook_routing_script: sellsyWebhookRouting - webhook_user_defined_secret: true - post_connection_script: sellsyPostConnection - docs: https://nango.dev/docs/integrations/all/sellsy - -sellsy-oauth2-cc: - display_name: Sellsy (Client Credentials) - auth_mode: OAUTH2_CC - categories: - - invoicing - - accounting - - crm - token_url: https://login.sellsy.com/oauth2/access-tokens - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.sellsy.com - webhook_routing_script: sellsyWebhookRouting - webhook_user_defined_secret: true - post_connection_script: sellsyPostConnection - docs: https://nango.dev/docs/integrations/all/sellsy-oauth2-cc - docs_connect: https://nango.dev/docs/integrations/all/sellsy-oauth2-cc/connect - credentials: - client_id: - type: string - title: Client ID - description: Your Client ID - client_secret: - type: string - title: Secret shopper - description: Your Secret shopper - -servicem8: - display_name: ServiceM8 - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://go.servicem8.com/oauth/authorize - token_url: https://go.servicem8.com/oauth/access_token - proxy: - base_url: https://api.servicem8.com - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - docs: https://nango.dev/docs/integrations/all/servicem8 - -signnow: - display_name: SignNow - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://app.signnow.com/authorize - token_url: https://api.signnow.com/oauth2/token - disable_pkce: true - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.signnow.com - docs: https://nango.dev/docs/integrations/all/signnow - -signnow-sandbox: - display_name: SignNow (Sandbox) - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://app-eval.signnow.com/authorize - token_url: https://api-eval.signnow.com/oauth2/token - disable_pkce: true - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api-eval.signnow.com - docs: https://nango.dev/docs/integrations/all/signnow-sandbox - -servicenow: - display_name: ServiceNow - categories: - - productivity - - popular - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.service-now.com/oauth_auth.do - token_url: https://${connectionConfig.subdomain}.service-now.com/oauth_token.do - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.service-now.com - docs: https://nango.dev/docs/integrations/all/servicenow - connection_config: - subdomain: - type: string - title: ServiceNow Domain - description: The subdomain of your ServiceNow account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .service-now.com - prefix: https:// - -servicenow-oauth2-cc: - display_name: ServiceNow (Client Credentials) - categories: - - productivity - - ticketing - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.subdomain}.service-now.com/oauth_token.do - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.subdomain}.service-now.com - docs: https://nango.dev/docs/api-integrations/servicenow-oauth2-cc - docs_connect: https://nango.dev/docs/api-integrations/servicenow-oauth2-cc/connect - connection_config: - subdomain: - type: string - title: ServiceNow Domain - description: The subdomain of your ServiceNow account - doc_section: '#step-5-enter-credentials-in-the-connect-ui' - pattern: '^[a-z0-9_-]+$' - example: dev12345 - suffix: .service-now.com - prefix: https:// - credentials: - client_id: - type: string - title: Client ID - description: The Client ID from your ServiceNow OAuth Application - doc_section: '#step-4-create-an-oauth-application' - client_secret: - type: string - title: Client Secret - description: The Client Secret from your ServiceNow OAuth Application - secret: true - doc_section: '#step-4-create-an-oauth-application' - -skio: - display_name: Skio - categories: - - e-commerce - auth_mode: API_KEY - proxy: - headers: - authorization: API ${apiKey} - base_url: https://graphql.skio.com - credentials_verification_script: skioCredentialsVerification - docs: https://nango.dev/docs/integrations/all/skio - docs_connect: https://nango.dev/docs/integrations/all/skio/connect - credentials: - apiKey: - type: string - title: API Token - description: The API Token for your Skio account - format: uuid - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-1-generating-your-api-key' - -sharepoint-online: - display_name: SharePoint Online (v2) - categories: - - storage - - communication - - popular - alias: microsoft - post_connection_script: onedrivePostConnection - docs: https://nango.dev/docs/api-integrations/sharepoint-online - setup_guide_url: https://nango.dev/docs/api-integrations/sharepoint-online/how-to-register-your-own-sharepoint-online-api-oauth-app - -sharepoint-online-oauth2-cc: - display_name: SharePoint Online (Client Credentials V2) - categories: - - storage - - communication - auth_mode: OAUTH2_CC - token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://graph.microsoft.com - docs: https://nango.dev/docs/integrations/all/sharepoint-online-oauth2-cc - docs_connect: https://nango.dev/docs/integrations/all/sharepoint-online-oauth2-cc/connect - connection_config: - tenantId: - type: string - title: Tenant ID - description: The unique identifier for your organization that uses Microsoft services - format: uuid - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-1-finding-your-tenant-id' - order: 1 - -sharepoint-online-v1: - display_name: SharePoint Online (v1) - categories: - - storage - - communication - auth_mode: TWO_STEP - token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/token - body_format: form - token_params: - client_id: ${credentials.clientId} - grant_type: client_credentials - resource: https://${connectionConfig.tenantId}.sharepoint.com - client_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer - client_assertion: ${credentials.assertion} - token_headers: - content-type: application/x-www-form-urlencoded - proxy: - base_url: https://${connectionConfig.tenantName}.sharepoint.com - headers: - accept: application/json;odata=verbose - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/integrations/all/sharepoint-online-v1 - docs_connect: https://nango.dev/docs/integrations/all/sharepoint-online-v1/connect - connection_config: - tenantId: - type: string - title: Tenant ID - description: The unique identifier for your organization that uses Microsoft services - format: uuid - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-1-finding-your-tenant-id' - order: 1 - tenantName: - type: string - title: Tenant Name - description: The initial domain name for your Microsoft services tenant - example: mycompany - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-2-finding-your-tenant-name' - order: 2 - credentials: - clientId: - type: string - title: Client ID - description: Your application Client ID - secret: true - doc_section: '#step-3-finding-your-client-id' - assertion: - type: string - title: Client Assertion - description: Your generated client assertion - secret: true - doc_section: '#step-4-generating-your-client-assertion' - -shipbob-pat: - display_name: ShipBob (Personal Access Token) - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.apiSubdomain}.shipbob.com - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'x-retry-after' - verification: - method: GET - endpoints: - - /2026-01/channel - docs: https://nango.dev/docs/api-integrations/shipbob-pat - docs_connect: https://nango.dev/docs/api-integrations/shipbob-pat/connect - connection_config: - apiSubdomain: - type: string - title: API Subdomain - description: The ShipBob API subdomain of the environment you want to connect to. - enum: - - api - - sandbox-api - doc_section: '#step-2-identify-your-api-subdomain' - credentials: - apiKey: - type: string - title: Personal Access Token - description: Your ShipBob Personal Access Token - example: 6E4647BB**************************806E464161FBB996DD8E87EEA86DB926-1 - pattern: '^[A-F0-9]{64}-\d+$' - doc_section: '#step-1-generate-your-token' - -shippo: - display_name: Shippo - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://api.goshippo.com - headers: - authorization: ShippoToken ${apiKey} - retry: - at: - - 'x-ratelimit-reset' - verification: - method: GET - endpoints: - - /parcel-templates?page=1&results=1 - docs: https://nango.dev/docs/api-integrations/shippo - docs_connect: https://nango.dev/docs/api-integrations/shippo/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Shippo API token (live or test). - pattern: '^shippo_(live|test)_[a-f0-9]+$' - example: shippo_live_e2848d36**************************** - doc_section: '#step-1-get-your-api-token' - -shipstation: - display_name: Shipstation (v1) - categories: - - e-commerce - auth_mode: BASIC - proxy: - base_url: https://ssapi.shipstation.com - retry: - after: - - 'x-rate-limit-reset' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /users - webhook_routing_script: shipstationWebhookRouting - docs: https://nango.dev/docs/integrations/all/shipstation - docs_connect: https://nango.dev/docs/integrations/all/shipstation/connect - credentials: - username: - type: string - title: API Key - description: Your ShipStation API key - example: '0ff30856c5634da1b5ce1953fdaf3dcd' - pattern: '^[a-f0-9]{32}$' - doc_section: '#step-1-finding-shipstation-api-key-and-api-secret' - password: - type: string - title: API Secret - description: Your Shipstation API secret - example: '17f1c62148b044c687f80e1060224a4e' - pattern: '^[a-f0-9]{32}$' - # https://www.shipstation.com/docs/api/requirements/#authentication - # Shipstation is using basic auth with API key and secret - doc_section: '#step-1-finding-shipstation-api-key-and-api-secret' - -shipstation-v2: - display_name: Shipstation (v2) - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://api.shipstation.com - retry: - after: - - 'retry-after' - headers: - api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v2/users?page_size=1 - webhook_routing_script: shipstationWebhookRouting - docs: https://nango.dev/docs/integrations/all/shipstation-v2 - docs_connect: https://nango.dev/docs/integrations/all/shipstation-v2/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Shipstation account - example: zEfcI+rouT0q1fjQWHBOYnsGYiax3rGDjtt3O5UhFIw - pattern: '^[A-Za-z0-9+/]+={0,2}$' - doc_section: '#step-1-generating-your-api-key' - -shopify: - display_name: Shopify (OAuth) - categories: - - e-commerce - - popular - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.myshopify.com/admin/oauth/authorize - token_url: https://${connectionConfig.subdomain}.myshopify.com/admin/oauth/access_token - proxy: - base_url: https://${connectionConfig.subdomain}.myshopify.com - headers: - x-shopify-access-token: ${accessToken} - webhook_routing_script: shopifyWebhookRouting - token_params: - expiring: 1 - docs: https://nango.dev/docs/api-integrations/shopify - setup_guide_url: https://nango.dev/docs/api-integrations/shopify/how-to-register-your-own-shopify-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/shopify/connect - connection_config: - subdomain: - type: string - title: Shopify Domain - description: The subdomain of your Shopify account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .myshopify.com - prefix: https:// - doc_section: '#step-1-finding-your-shopify-domain' - -shopify-cc: - display_name: Shopify (Client Credentials) - categories: - - e-commerce - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.subdomain}.myshopify.com/admin/oauth/access_token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.subdomain}.myshopify.com - headers: - x-shopify-access-token: ${accessToken} - docs: https://nango.dev/docs/api-integrations/shopify-cc - docs_connect: https://nango.dev/docs/api-integrations/shopify-cc/connect - connection_config: - subdomain: - type: string - title: Shopify Store Domain - description: The subdomain of the Shopify store the app is installed in. - pattern: '^[a-z0-9_-]+$' - example: my-store - suffix: .myshopify.com - prefix: https:// - order: 1 - doc_section: '#step-2-find-your-shopify-store-domain' - credentials: - client_id: - type: string - title: Client ID - description: The Client ID for your Shopify app. - doc_section: '#step-1-generating-your-client-credentials' - client_secret: - type: string - title: Client Secret - description: The Client Secret for your Shopify app. - secret: true - doc_section: '#step-1-generating-your-client-credentials' - -shopify-api-key: - display_name: Shopify (API Key) - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.myshopify.com - headers: - x-shopify-access-token: ${apiKey} - content-type: application/json - verification: - method: POST - headers: - content-type: application/json - endpoints: - - /admin/api/2024-10/graphql.json?query=%7B__schema%7Btypes%7Bname%2Ckind%2Cfields%7Bname%7D%7D%7D%7D - webhook_routing_script: shopifyWebhookRouting - webhook_user_defined_secret: true - docs: https://nango.dev/docs/integrations/all/shopify-api-key - docs_connect: https://nango.dev/docs/integrations/all/shopify-api-key/connect - connection_config: - subdomain: - type: string - title: Shopify Domain - description: The subdomain of your Shopify account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .myshopify.com - prefix: https:// - doc_section: '#step-1-finding-your-shopify-domain' - order: 1 - credentials: - apiKey: - type: string - title: API Access Token - description: The API access token generated - example: shpat_***************c03266f - pattern: '^(shpat|shpca|shppa)_[a-f0-9]{32}$' - doc_section: '#step-2-generating-your-api-access-token' - -shopify-partner: - display_name: Shopify Partner - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://partners.shopify.com/${connectionConfig.partnerId}/api/ - headers: - x-shopify-access-token: ${apiKey} - content-type: application/json - verification: - method: POST - headers: - content-type: application/json - endpoints: - - 2026-04/graphql.json - docs: https://nango.dev/docs/integrations/all/shopify-partner - docs_connect: https://nango.dev/docs/integrations/all/shopify-partner/connect - credentials: - apiKey: - type: string - title: Partner Access Token - description: The access token for your Shopify Partner account - connection_config: - partnerId: - type: string - title: Partner ID - description: Your Shopify Partner ID - -shopify-scim: - display_name: Shopify (SCIM API) - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://shopifyscim.com/scim - headers: - authorization: Bearer ${apiKey} - accept: application/json - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/Users - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/shopify-scim - docs_connect: https://nango.dev/docs/integrations/all/shopify-scim/connect - credentials: - apiKey: - type: string - title: SCIM API Token - description: The SCIM API token generated from your Shopify organization settings. - doc_section: '#step-1-generating-your-scim-api-token' - -shopvox: - display_name: ShopVox - categories: - - other - auth_mode: TWO_STEP - body_format: json - token_url: https://api.shopvox.com/v1/login - token_params: - user: ${credentials.email} - password: ${credentials.password} - token_headers: - content-type: application/json - token_response: - token: authToken - proxy: - base_url: https://api.shopvox.com/ - query: - authToken: ${accessToken} - account_id: ${credentials.raw.accountID} - docs: https://nango.dev/docs/api-integrations/shopvox - docs_connect: https://nango.dev/docs/api-integrations/shopvox/connect - credentials: - email: - type: string - title: Email - format: email - description: Your ShopVox login email. - doc_section: '#step-1-finding-your-credentials' - password: - type: string - title: Password - description: Your ShopVox login password. - secret: true - doc_section: '#step-1-finding-your-credentials' - -shopware: - display_name: Shopware (Admin API) - categories: - - e-commerce - auth_mode: OAUTH2_CC - body_format: json - token_url: https://${connectionConfig.shopwareUrl}/api/oauth/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.shopwareUrl}/api - docs: https://nango.dev/docs/api-integrations/shopware - docs_connect: https://nango.dev/docs/api-integrations/shopware/connect - credentials: - client_id: - type: string - title: Access key ID - description: The Access key ID of yout integration. - doc_section: '#step-2-create-a-shopware-integration' - client_secret: - type: string - title: Secret access key - description: The Secret access key of your integration. - secret: true - doc_section: '#step-2-create-a-shopware-integration' - connection_config: - shopwareUrl: - type: string - title: Shopware URL - description: The hostname of your Shopware instance. - example: myshop.example.com - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-1-find-your-shopware-url' - -shopworks: - display_name: ShopWorks - categories: - - other - auth_mode: TWO_STEP - body_format: json - token_url: https://${connectionConfig.hostname}/signin - token_params: - username: ${credentials.username} - password: ${credentials.password} - token_headers: - content-type: application/json - token_response: - token: id_token - token_expires_in_ms: 3600000 - proxy: - base_url: https://${connectionConfig.hostname} - headers: - authorization: ${accessToken} - docs: https://nango.dev/docs/api-integrations/shopworks - docs_connect: https://nango.dev/docs/api-integrations/shopworks/connect - connection_config: - hostname: - type: string - title: Hostname - prefix: https:// - suffix: /signin - description: The hostname of the API you want to connect to. - example: manageordersapi.com/onsite - doc_section: '#step-1-find-your-hostname' - credentials: - username: - type: string - title: Username - description: The username for your ShopWorks account. - doc_section: '#step-2-find-your-credentials' - password: - type: string - title: Password - secret: true - description: The password for your ShopWorks account. - doc_section: '#step-2-find-your-credentials' - -slab: - display_name: Slab - categories: - - productivity - - knowledge-base - auth_mode: API_KEY - proxy: - base_url: https://api.slab.com - headers: - authorization: ${apiKey} - content-type: application/json - docs: https://nango.dev/docs/api-integrations/slab - docs_connect: https://nango.dev/docs/api-integrations/slab/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Slab API token - doc_section: '#step-1-generating-your-slab-api-token' - -shortcut: - display_name: Shortcut - categories: - - dev-tools - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.app.shortcut.com - headers: - shortcut-token: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v3/member - docs: https://nango.dev/docs/integrations/all/shortcut - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Shortcut account - -simpro: - display_name: Simpro - categories: - - productivity - - invoicing - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.build}.simprosuite.com/oauth2/login - token_url: https://${connectionConfig.build}.simprosuite.com/oauth2/token - proxy: - base_url: https://${connectionConfig.build}.simprosuite.com - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - docs: https://nango.dev/docs/api-integrations/simpro - docs_connect: https://nango.dev/docs/api-integrations/simpro/connect - connection_config: - build: - type: string - title: Simpro Build Name - description: The subdomain part of your Simpro URL. - pattern: '^[a-z0-9_-]+$' - example: yourcompany - suffix: .simprosuite.com - prefix: https:// - doc_section: '#step-1-find-your-simpro-build-name' - -slack: - display_name: Slack - categories: - - popular - - productivity - auth_mode: OAUTH2 - authorization_url: https://slack.com/oauth/v2/authorize - scope_separator: ',' - alternate_access_token_response_path: authed_user - token_url: https://slack.com/api/oauth.v2.access - disable_pkce: true - token_response_metadata: - - incoming_webhook.url - - incoming_webhook.channel - - incoming_webhook.channel_id - - bot_user_id - - team.id - proxy: - base_url: https://slack.com/api - retry: - after: - - 'retry-after' - paginate: - type: cursor - cursor_path_in_response: response_metadata.next_cursor - cursor_name_in_request: cursor - limit_name_in_request: limit - webhook_routing_script: slackWebhookRouting - docs: https://nango.dev/docs/api-integrations/slack - setup_guide_url: https://nango.dev/docs/api-integrations/slack/how-to-register-your-own-slack-api-oauth-app - -slack-mcp: - display_name: Slack (MCP) - categories: - - popular - - productivity - - communication - - mcp - auth_mode: MCP_OAUTH2 - client_registration: static - authorization_url: https://slack.com/oauth/v2_user/authorize - token_url: https://slack.com/api/oauth.v2.user.access - scope_separator: ',' - alternate_access_token_response_path: authed_user - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://mcp.slack.com - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/slack-mcp - setup_guide_url: https://nango.dev/docs/api-integrations/slack-mcp/how-to-register-your-own-slack-mcp-oauth-app - -smartlead-ai: - display_name: Smartlead.ai - categories: - - communication - - marketing - auth_mode: API_KEY - proxy: - base_url: https://server.smartlead.ai/api - retry: - after: - - x-ratelimit-reset - query: - api_key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/client - docs: https://nango.dev/docs/integrations/all/smartlead-ai - docs_connect: https://nango.dev/docs/integrations/all/smartlead-ai/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Smartlead.ai account - pattern: '^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}_[a-zA-Z0-9]+$' - example: 12345678-1234-1234-1234-123456789012_abcdefg - doc_section: '#step-1-generating-your-api-key' - -sophos-central: - display_name: Sophos Central - categories: - - dev-tools - auth_mode: OAUTH2_CC - token_url: https://id.sophos.com/api/v2/oauth2/token - token_params: - grant_type: client_credentials - scope: token - body_format: form - proxy: - base_url: ${connectionConfig.dataRegion} - headers: - x-tenant-id: ${connectionConfig.tenantId} - post_connection_script: sophosCentralPostConnection - docs: https://nango.dev/docs/api-integrations/sophos-central - docs_connect: https://nango.dev/docs/api-integrations/sophos-central/connect - connection_config: - dataRegion: - type: string - title: '' - description: '' - automated: true - tenantId: - type: string - title: '' - description: '' - automated: true - -smartrecruiters-api-key: - display_name: Smartrecruiters - categories: - - ats - auth_mode: API_KEY - proxy: - base_url: https://api.smartrecruiters.com - headers: - x-smarttoken: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /feed/publications - docs: https://nango.dev/docs/integrations/all/smartrecruiters-api-key - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Smartrecruiters account - -smartsheet: - display_name: Smartsheet - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.app_host}/b/authorize || https://app.smartsheet.com/b/authorize - token_url: https://api.${connectionConfig.domain}/2.0/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.${connectionConfig.domain} - docs: https://nango.dev/docs/api-integrations/smartsheet - docs_connect: https://nango.dev/docs/api-integrations/smartsheet/connect - setup_guide_url: https://nango.dev/docs/api-integrations/smartsheet/how-to-register-your-own-smartsheet-api-oauth-app - connection_config: - app_host: - type: string - title: App Host - description: The app host used for authorization. - example: app.smartsheet.com - optional: true - pattern: '^(app\.smartsheet\.com|app\.test\.smartsheet\.com)$' - domain: - type: string - title: Domain - description: The domain where your account is hosted. - prefix: https://api. - order: 1 - enum: - - smartsheet.com - - smartsheet.eu - - smartsheet.au - - smartsheetgov.com - - test.smartsheet.com - -smugmug: - display_name: Smugmug - categories: - - storage - auth_mode: OAUTH1 - request_url: https://api.smugmug.com/services/oauth/1.0a/getRequestToken - authorization_url: https://api.smugmug.com/services/oauth/1.0a/authorize - token_url: https://api.smugmug.com/services/oauth/1.0a/getAccessToken - scope_separator: ',' - signature_method: 'PLAINTEXT' - proxy: - base_url: https://www.smugmug.com - docs: https://nango.dev/docs/integrations/all/smugmug - -snapchat: - display_name: Snapchat (Ads API) - auth_mode: OAUTH2 - categories: - - video - - social - authorization_url: https://accounts.snapchat.com/login/oauth2/authorize - disable_pkce: true - token_url: https://accounts.snapchat.com/login/oauth2/access_token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://adsapi.snapchat.com - docs: https://nango.dev/docs/integrations/all/snapchat - -snowflake: - display_name: Snowflake - categories: - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.snowflake_account_url}/oauth/authorize - token_url: https://${connectionConfig.snowflake_account_url}/oauth/token-request - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.snowflake_account_url} - post_connection_script: snowflakePostConnection - docs: https://nango.dev/docs/api-integrations/snowflake - docs_connect: https://nango.dev/docs/api-integrations/snowflake/connect - connection_config: - snowflake_account_url: - type: string - title: Domain - description: The domain of your Snowflake account. - format: hostname - example: myorg-myaccount.snowflakecomputing.com - prefix: https:// - -snowflake-jwt: - display_name: Snowflake (JWT) - categories: - - dev-tools - auth_mode: JWT - signature: - protocol: RSA - token: - signing_key: ${credentials.privateKey} - expires_in_ms: 3600000 - header: - alg: RS256 - typ: JWT - payload: - iss: ${credentials.accountIdentifier}.${credentials.userName}.${fingerprint(${credentials.privateKey})} - sub: ${credentials.accountIdentifier}.${credentials.userName} - proxy: - headers: - accept: application/json - authorization: Bearer ${accessToken} - x-snowflake-authorization-token-type: KEYPAIR_JWT - base_url: https://${connectionConfig.subdomain}.snowflakecomputing.com - verification: - method: POST - endpoints: - - /api/v2/statements - data: { 'statement': 'SELECT CURRENT_TIMESTAMP' } - headers: - x-snowflake-authorization-token-type: KEYPAIR_JWT - content-type: application/json - docs: https://nango.dev/docs/integrations/all/snowflake-jwt - docs_connect: https://nango.dev/docs/integrations/all/snowflake-jwt/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain for your Snowflake instance - example: KXOPMLU-RE00572 - order: 1 - doc_section: '#step-1-finding-your-subdomain' - credentials: - accountIdentifier: - type: string - title: Account Identifier - description: The unique identifier for your Snowflake account. - example: KXOPMLU-RE00572 - doc_section: '#step-2-finding-your-account-identifier' - userName: - type: string - title: User Name - description: The username for your Snowflake account used for authentication - example: MYUSER - doc_section: '#step-3-finding-your-user-name' - privateKey: - type: string - title: Private Key - description: The private key associated with your Snowflake account for JWT authentication - example: -----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n-----END PRIVATE KEY----- - pattern: '^-----BEGIN PRIVATE KEY-----\s*([A-Za-z0-9+/=\s]+)\s*-----END PRIVATE KEY-----$' - secret: true - doc_section: '#step-4-generating-your-private-key' - -splitwise: - display_name: Splitwise - categories: - - payment - - social - auth_mode: OAUTH2 - authorization_url: https://secure.splitwise.com/oauth/authorize - token_url: https://secure.splitwise.com/oauth/token - proxy: - base_url: https://secure.splitwise.com - docs: https://nango.dev/docs/integrations/all/splitwise - -spotify: - display_name: Spotify (OAuth) - categories: - - other - auth_mode: OAUTH2 - authorization_url: https://accounts.spotify.com/authorize - token_url: https://accounts.spotify.com/api/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.spotify.com - docs: https://nango.dev/docs/integrations/all/spotify - -spotify-oauth2-cc: - display_name: Spotify (Client Credentials) - categories: - - other - auth_mode: OAUTH2_CC - token_url: https://accounts.spotify.com/api/token - token_request_auth_method: basic - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.spotify.com - docs: https://nango.dev/docs/integrations/all/spotify-oauth2-cc - -squarespace: - display_name: Squarespace - categories: - - dev-tools - - design - auth_mode: OAUTH2 - authorization_url: https://login.squarespace.com/api/1/login/oauth/provider/authorize - token_url: https://login.squarespace.com/api/1/login/oauth/provider/tokens - token_request_auth_method: basic - scope_separator: ',' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.squarespace.com - headers: - user-agent: ${connectionConfig.customappDescription} - docs: https://nango.dev/docs/integrations/all/squarespace - connection_config: - customappDescription: - type: string - title: User Agent - description: The user agent of your custom app - -squareup: - display_name: Squareup - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://connect.squareup.com/oauth2/authorize - token_url: https://connect.squareup.com/oauth2/token - disable_pkce: true - decode_url: true - authorization_params: - response_type: code - session: false - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://connect.squareup.com - docs: https://nango.dev/docs/api-integrations/squareup - setup_guide_url: https://nango.dev/docs/api-integrations/squareup/how-to-register-your-own-squareup-oauth-app - -squareup-sandbox: - display_name: Squareup (Sandbox) - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://connect.squareupsandbox.com/oauth2/authorize - token_url: https://connect.squareupsandbox.com/oauth2/token - disable_pkce: true - authorization_params: - response_type: code - session: false - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://connect.squareupsandbox.com - docs: https://nango.dev/docs/api-integrations/squareup-sandbox - setup_guide_url: https://nango.dev/docs/api-integrations/squareup-sandbox/how-to-register-your-own-squareup-sandbox-oauth-app - -stackexchange: - display_name: Stack Exchange - categories: - - knowledge-base - - support - auth_mode: OAUTH2 - authorization_url: https://stackoverflow.com/oauth - token_url: https://stackoverflow.com/oauth/access_token/json - default_scopes: - - no_expiry - proxy: - base_url: https://api.stackexchange.com - docs: https://nango.dev/docs/integrations/all/stackexchange - -statamic: - display_name: Statamic - categories: - - cms - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.baseUrl} - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/api-integrations/statamic - docs_connect: https://nango.dev/docs/api-integrations/statamic/connect - credentials: - apiKey: - type: string - title: API token - description: The value of STATAMIC_API_AUTH_TOKEN in your Statamic .env file. - doc_section: '#step-1-enable-the-rest-api' - connection_config: - baseUrl: - type: string - title: Base URL - description: The hostname of your Statamic site. - example: mysite.example.com - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-2-find-your-base-url' - -statista: - display_name: Statista - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://api.statista.ai - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v1/statistics?q=* - docs: https://nango.dev/docs/integrations/all/statista - docs_connect: https://nango.dev/docs/integrations/all/statista/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Statista account - example: c5c28261f9ade4e34891ccf761491b94 - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-1-finding-your-api-key' - -stay-ai: - display_name: Stay AI - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://api.retextion.com/api - headers: - x-retextion-access-token: ${apiKey} - docs: https://nango.dev/docs/api-integrations/stay-ai - docs_connect: https://nango.dev/docs/api-integrations/stay-ai/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Stay AI API key. - example: 7k9***f-***da3e-***hjtb-***22cy - pattern: '^[a-z0-9]{7}-[a-z0-9]{7}-[a-z0-9]{7}-[a-z0-9]{7}$' - doc_section: '#step-1-create-a-new-api-key' - -stitch-mcp: - display_name: Stitch (MCP) - categories: - - design - - mcp - alias: google - default_scopes: - - https://www.googleapis.com/auth/cloud-platform - proxy: - base_url: https://stitch.googleapis.com - headers: - x-goog-user-project: ${connectionConfig.project_id} - connection_config: - project_id: - type: string - title: '' - description: '' - hidden: true - docs: https://nango.dev/docs/api-integrations/stitch-mcp - setup_guide_url: https://nango.dev/docs/api-integrations/stitch-mcp/how-to-register-your-own-stitch-mcp-api-oauth-app - -store-census: - display_name: StoreCensus - categories: - - e-commerce - - crm - auth_mode: API_KEY - proxy: - base_url: https://www.storecensus.com - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'retry-after' - verification: - method: GET - endpoints: - - /api/v1/apps?page=1&pageSize=1 - docs: https://nango.dev/docs/api-integrations/store-census - docs_connect: https://nango.dev/docs/api-integrations/store-census/connect - credentials: - apiKey: - type: string - title: API Key - description: Your StoreCensus API key. - doc_section: '#step-1-get-your-api-key' - -store-leads: - display_name: Store Leads - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://storeleads.app/json/api - headers: - authorization: Bearer ${apiKey} - retry: - at: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/store-leads - docs_connect: https://nango.dev/docs/api-integrations/store-leads/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Store Leads API key. - doc_section: '#step-1-generate-your-api-key' - pattern: '^[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{8}$' - example: a174****-****-****-****-****c6ee - -strava: - display_name: Strava (Mobile) - categories: - - social - - sports - auth_mode: OAUTH2 - authorization_url: https://www.strava.com/oauth/mobile/authorize - token_url: https://www.strava.com/api/v3/oauth/token - scope_separator: ',' - authorization_params: - response_type: code - approval_prompt: auto - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://www.strava.com - docs: https://nango.dev/docs/integrations/all/strava - -strava-web: - display_name: Strava (Web) - categories: - - social - - sports - auth_mode: OAUTH2 - authorization_url: https://www.strava.com/oauth/authorize - token_url: https://www.strava.com/api/v3/oauth/token - scope_separator: ',' - authorization_params: - response_type: code - approval_prompt: force - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://www.strava.com - docs: https://nango.dev/docs/integrations/all/strava-web - -streak: - display_name: Streak - categories: - - crm - auth_mode: BASIC - proxy: - base_url: https://api.streak.com/api - verification: - method: GET - endpoints: - - /v1/users/me - headers: - content-type: application/json - accept: application/json - webhook_routing_script: streakWebhookRouting - docs: https://nango.dev/docs/api-integrations/streak - docs_connect: https://nango.dev/docs/api-integrations/streak/connect - credentials: - username: - type: string - title: API Key - description: The API Key for your Streak account - example: 'strk_7SGgswz9ZJrNZp7iJmoAFjwdaym1' - pattern: '^strk_[A-Za-z0-9]+$' - doc_section: '#step-1-generating-your-api-key' - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -stripe: - display_name: Stripe Connect - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://connect.stripe.com/oauth/authorize - token_url: https://connect.stripe.com/oauth/token - proxy: - base_url: https://api.stripe.com - docs: https://nango.dev/docs/api-integrations/stripe - setup_guide_url: https://nango.dev/docs/api-integrations/stripe/how-to-register-your-own-stripe-api-oauth-app - -stripe-express: - display_name: Stripe Express - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://connect.stripe.com/express/oauth/authorize - token_url: https://connect.stripe.com/oauth/token - token_response_metadata: - - stripe_user_id - proxy: - base_url: https://api.stripe.com - docs: https://nango.dev/docs/integrations/all/stripe-express - -stripe-app: - display_name: Stripe App - categories: - - payment - - popular - auth_mode: OAUTH2 - authorization_url: https://marketplace.stripe.com/oauth/v2/authorize - token_url: https://api.stripe.com/v1/oauth/token - disable_pkce: true - proxy: - base_url: https://api.stripe.com - refresh_params: - grant_type: refresh_token - docs: https://nango.dev/docs/integrations/all/stripe-app - -stripe-app-sandbox: - display_name: Stripe App (Sandbox) - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://marketplace.stripe.com/oauth/v2/${connectionConfig.appDomain}/authorize - token_url: https://api.stripe.com/v1/oauth/token - disable_pkce: true - proxy: - base_url: https://api.stripe.com - refresh_params: - grant_type: refresh_token - docs: https://nango.dev/docs/integrations/all/stripe-app-sandbox - docs_connect: https://nango.dev/docs/integrations/all/stripe-app-sandbox/connect - connection_config: - appDomain: - type: string - title: App Domain - description: The unique identifier Stripe assigns to your app instance - doc_section: '#step-1-finding-your-app-domain' - -stripe-api-key: - display_name: Stripe (API Key) - categories: - - payment - auth_mode: BASIC - proxy: - base_url: https://api.stripe.com - headers: - stripe-context: ${connectionConfig.context} - docs: https://nango.dev/docs/api-integrations/stripe-api-key - docs_connect: https://nango.dev/docs/api-integrations/stripe-api-key/connect - credentials: - username: - type: string - title: Restricted API Key - description: Your Stripe restricted API Key - secret: true - example: rk_live_51On1GfAemfaBCd0eHq***************BV5007KeuAVcO - pattern: '^rk_[a-z]+_[A-Za-z0-9]{8}[A-Za-z0-9]+([A-Za-z0-9]{8})$' - doc_section: '#step-1-generating-your-stripe-restricted-api-key' - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - connection_config: - context: - type: string - title: Stripe Context - description: The Stripe account context - optional: true - example: acct_1aTnTtAAB0hHJ26p - pattern: '^acct_[A-Za-z0-9]{16}(\/acct_[A-Za-z0-9]{16})?$' - doc_section: '#step-2-finding-your-stripe-context' - -supabase: - display_name: Supabase - categories: - - dev-tools - - storage - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.projectUrl} - headers: - authorization: Bearer ${apiKey} - apikey: ${apiKey} - docs: https://nango.dev/docs/api-integrations/supabase - docs_connect: https://nango.dev/docs/api-integrations/supabase/connect - connection_config: - projectUrl: - type: string - title: Project URL - description: The Supabase project url you want to connect to. - example: project.supabase.co - format: hostname - prefix: https:// - doc_section: '#step-1-find-your-project-url' - credentials: - apiKey: - type: string - title: Secret Key - description: The secret key from your Supabase project. - example: sb_secret_*******************************hm - pattern: '^sb_secret_[A-Za-z0-9_]+$' - doc_section: '#step-2-finding-your-secret-key' - -supabase-mcp: - display_name: Supabase (MCP) - categories: - - dev-tools - - mcp - auth_mode: API_KEY - proxy: - base_url: https://mcp.supabase.com - headers: - authorization: Bearer ${apiKey} - content-type: application/json - verification: - method: POST - headers: - content-type: application/json - accept: application/json,text/event-stream - endpoints: - - /mcp?project_ref=${connectionConfig.projectRef} - data: - { - 'jsonrpc': '2.0', - 'id': 1, - 'method': 'initialize', - 'params': { 'protocolVersion': '2024-11-05', 'capabilities': {}, 'clientInfo': { 'name': 'nango-client', 'version': '1.0.0' } } - } - docs: https://nango.dev/docs/api-integrations/supabase-mcp - docs_connect: https://nango.dev/docs/api-integrations/supabase-mcp/connect - connection_config: - projectRef: - type: string - title: Project reference - description: Your Supabase project reference ID. - example: bvzzcafzoysezumrdvif - pattern: '^[a-z0-9]{20}$' - doc_section: '#step-1-finding-your-project-reference' - credentials: - apiKey: - type: string - title: Personal Access Token - description: Your Supabase account personal access token. - example: sbp_*******************************23d - pattern: '^sbp_[A-Za-z0-9]{40}$' - doc_section: '#step-2-obtaining-your-personal-access-token' - -supabase-mcp-oauth: - display_name: Supabase (MCP OAuth) - categories: - - dev-tools - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - registration_url: https://api.supabase.com/platform/oauth/apps/register - authorization_url: https://api.supabase.com/v1/oauth/authorize - token_url: https://api.supabase.com/v1/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://mcp.supabase.com - headers: - accept: application/json,text/event-stream - connection_config: - projectRef: ${connectionConfig.projectRef} - docs: https://nango.dev/docs/api-integrations/supabase-mcp-oauth - docs_connect: https://nango.dev/docs/api-integrations/supabase-mcp-oauth/connect - connection_config: - projectRef: - type: string - title: Project Reference - description: Your Supabase project reference ID. - example: bvzzcafzoysezumrdvif - pattern: '^[a-z0-9]{20}$' - doc_section: '#step-1-finding-your-project-reference' - -superhuman-mcp: - display_name: Superhuman (MCP) - categories: - - communication - - productivity - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://mcp.auth.mail.superhuman.com/oauth2/authorize - token_url: https://mcp.auth.mail.superhuman.com/oauth2/token - registration_url: https://mcp.auth.mail.superhuman.com/oauth2/register - default_scopes: - - offline_access - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://mcp.mail.superhuman.com - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/superhuman-mcp - -surecontact: - display_name: SureContact - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.surecontact.com - headers: - x-api-key: ${apiKey} - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/api-integrations/surecontact - docs_connect: https://nango.dev/docs/api-integrations/surecontact/connect - credentials: - apiKey: - type: string - title: API Key - description: Your SureContact API key. - example: jWkZ3QYFe7**********************************************qlp - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-1-create-an-api-key' - -survey-monkey: - display_name: SurveyMonkey - categories: - - surveys - auth_mode: OAUTH2 - authorization_url: https://api.surveymonkey.com/oauth/authorize - token_url: https://api.surveymonkey.com/oauth/token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://api.surveymonkey.com - docs: https://nango.dev/docs/integrations/all/survey-monkey - -swoogo: - display_name: Swoogo - categories: - - marketing - auth_mode: OAUTH2_CC - token_url: https://api.swoogo.com/api/v1/oauth2/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.swoogo.com - docs: https://nango.dev/docs/api-integrations/swoogo - docs_connect: https://nango.dev/docs/api-integrations/swoogo/connect - credentials: - client_id: - type: string - title: API Key - description: Your Swoogo API key. - doc_section: '#step-1-generate-your-api-credentials' - client_secret: - type: string - title: API Secret - description: Your Swoogo API secret. - secret: true - doc_section: '#step-1-generate-your-api-credentials' - -tailscale: - display_name: Tailscale (OAuth) - auth_mode: TWO_STEP - categories: - - dev-tools - - productivity - token_url: https://api.tailscale.com/api/v2/oauth/token - token_params: - client_id: ${credentials.clientId} - client_secret: ${credentials.clientSecret} - body_format: form - proxy: - base_url: https://api.tailscale.com/api - connection_config: - organizationName: ${connectionConfig.organizationName} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/integrations/all/tailscale - docs_connect: https://nango.dev/docs/integrations/all/tailscale/connect - connection_config: - organizationName: - type: string - title: Organization Name - description: Your Tailscale organization name - example: example.com - order: 1 - doc_section: '#step-1-finding-your-organization-name' - credentials: - clientId: - type: string - title: Client ID - description: Your OAuth Client ID - example: kcLBRFmtYZ11CNTRL - pattern: '^[A-Za-z0-9]+CNTRL$' - doc_section: '#step-2-generating-your-oauth-client-credentials' - clientSecret: - type: string - title: Client secret - description: Your OAuth Client secret - secret: true - example: 'tskey-client-kdC27MPR3X11CNTRL-tjtxjop8mdawckVitWkNdaBaNRtZ48GN' - pattern: '^tskey-client-[A-Za-z0-9]+CNTRL-[A-Za-z0-9]+$' - doc_section: '#step-2-generating-your-oauth-client-credentials' - -tailscale-api-key: - display_name: Tailscale (API Key) - categories: - - dev-tools - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.tailscale.com/api - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v2/tailnet/${connectionConfig.organizationName}/users - docs: https://nango.dev/docs/integrations/all/tailscale-api-key - docs_connect: https://nango.dev/docs/integrations/all/tailscale-api-key/connect - connection_config: - organizationName: - type: string - title: Organization Name - description: Your Tailscale organization name - example: example.com - order: 1 - doc_section: '#step-1-finding-your-organization-name' - credentials: - apiKey: - type: string - title: API Access Token - description: The API Access Token for your Tailscale account - example: tskey-api-k7Hpb9Lcv611CNTRL-WJ9YG52LqXJXY9oJ7RtmXJdzWkdRMgBG - pattern: '^tskey-api-[A-Za-z0-9]+CNTRL-[A-Za-z0-9]+$' - doc_section: '#step-2-generating-an-api-access-token' - -talentlms: - display_name: TalentLMS - categories: - - other - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.talentlms.com - headers: - x-api-key: ${apiKey} - x-api-version: ${connectionConfig.apiVersion} - verification: - method: GET - endpoints: - - /api/v2/users?page[size]=1 - docs: https://nango.dev/docs/api-integrations/talentlms - docs_connect: https://nango.dev/docs/api-integrations/talentlms/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of your TalentLMS account. - example: mycompany - pattern: '^[a-z0-9-]+$' - suffix: .talentlms.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-subdomain' - apiVersion: - type: string - title: '' - description: '' - default_value: '2025-01-01' - hidden: true - credentials: - apiKey: - type: string - title: API Key - description: Your TalentLMS API key. - doc_section: '#step-2-finding-your-api-key' - -tally: - display_name: Tally - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.tally.so - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /forms?limit=1 - docs: https://nango.dev/docs/api-integrations/tally - docs_connect: https://nango.dev/docs/api-integrations/tally/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Tally API key. - pattern: '^tly-[A-Za-z0-9]{32}$' - example: tly-84m**************************56Y - doc_section: '#step-1-create-an-api-key' - -tapclicks: - display_name: TapClicks - auth_mode: OAUTH2_CC - categories: - - marketing - - analytics - token_url: https://api.tapclicks.com/oauth/accesstoken - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.tapclicks.com/v2 - docs: https://nango.dev/docs/integrations/all/tapclicks - docs_connect: https://nango.dev/docs/integrations/all/tapclicks/connect - -tableau: - display_name: Tableau (PAT) - categories: - - analytics - auth_mode: TWO_STEP - token_url: https://${connectionConfig.hostname}/api/${connectionConfig.version}/auth/signin - proxy: - headers: - accept: application/json - content-type: application/json - x-tableau-auth: ${accessToken} - base_url: https://${connectionConfig.hostname}/api/${connectionConfig.version} - token_params: - credentials: - personalAccessTokenName: ${credentials.pat} - personalAccessTokenSecret: ${credentials.secret} - site: - contentUrl: ${credentials.contentUrl} - token_headers: - content-type: application/json - accept: application/json - token_response: - token: credentials.token - token_expiration: credentials.estimatedTimeToExpiration - token_expiration_strategy: expireAt - docs: https://nango.dev/docs/integrations/all/tableau - docs_connect: https://nango.dev/docs/integrations/all/tableau/connect - credentials: - pat: - type: string - title: Personal Access Token - description: Your Personal Access Token - doc_section: '#step-2-generating-your-personal-access-token' - secret: - type: string - title: Personal Access Token Secret - description: Your Personal Access Token Secret - secret: true - doc_section: '#step-2-generating-your-personal-access-token' - contentUrl: - type: string - title: Content Url - optional: true - example: test-eaec4a3fe2 - doc_section: '#step-5-finding-your-content-url' - description: Your content URL - connection_config: - hostname: - type: string - title: HostName - description: The domain of your Tableau instance - format: hostname - order: 1 - example: dub01.online.tableau.com - doc_section: '#step-3-finding-your-hostname' - prefix: https:// - version: - type: string - title: API Version - order: 2 - example: '3.26' - doc_section: '#step-4-finding-your-api-version' - description: The version of the Tableau API to use - -tanium: - display_name: Tanium - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.hostname}/api - headers: - session: ${apiKey} - content-type: application/json - verification: - method: GET - endpoints: - - /v2/session/current - docs: https://nango.dev/docs/api-integrations/tanium - docs_connect: https://nango.dev/docs/api-integrations/tanium/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Tanium API token. - doc_section: '#step-1-generate-an-api-token' - connection_config: - hostname: - type: string - title: Hostname - description: Your Tanium Cloud API hostname. - example: acme-api.cloud.tanium.com - format: hostname - prefix: https:// - doc_section: '#step-2-find-your-hostname' - order: 1 - -teamtailor: - display_name: Teamtailor - categories: - - ats - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.extension}.teamtailor.com - retry: - after: - - 'x-rate-limit-reset' - headers: - authorization: Token token=${apiKey} - x-api-version: '20210218' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/users - docs: https://nango.dev/docs/integrations/all/teamtailor - connection_config: - extension: - type: string - title: Teamtailor Domain - description: The subdomain of your Teamtailor instance - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .teamtailor.com - prefix: https:// - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Teamtailor account - -teamleader: - display_name: Teamleader Focus - categories: - - invoicing - - crm - auth_mode: OAUTH2 - authorization_url: https://focus.teamleader.eu/oauth2/authorize - token_url: https://focus.teamleader.eu/oauth2/access_token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - retry: - at: - - 'x-ratelimit-reset' - base_url: https://api.focus.teamleader.eu - docs: https://nango.dev/docs/integrations/all/teamleader - -teamwork: - display_name: Teamwork - categories: - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://www.teamwork.com/launchpad/login - token_url: https://www.teamwork.com/launchpad/v1/token.json - token_response_metadata: - - installation.apiEndPoint - proxy: - base_url: ${connectionConfig.installation.apiEndPoint} - docs: https://nango.dev/docs/integrations/all/teamwork - -telegram: - display_name: Telegram - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://api.telegram.org/bot${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /getMe - docs: https://nango.dev/docs/api-integrations/telegram - docs_connect: https://nango.dev/docs/api-integrations/telegram/connect - credentials: - apiKey: - type: string - title: Bot Token - description: Your Telegram Bot token from @BotFather. - example: 1234567890:ABCdefGHIjklMNOpqrSTUvwxYZ1234567 - pattern: '^[0-9]+:[a-zA-Z0-9_-]+$' - doc_section: '#step-1-creating-your-telegram-bot' - -tempo: - display_name: Tempo - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://api.tempo.io/oauth/authorize/redirect - token_url: https://api.tempo.io/oauth/token/ - disable_pkce: true - authorization_params: - jira_url: https://${connectionConfig.jiraSubdomain}.atlassian.net - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.tempo.io - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/tempo - setup_guide_url: https://nango.dev/docs/api-integrations/tempo/how-to-register-your-own-tempo-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/tempo/connect - connection_config: - jiraSubdomain: - type: string - title: Jira Cloud Subdomain - description: The subdomain of your Jira Cloud instance. - example: acme - pattern: '^[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?$' - doc_section: '#step-1-find-your-jira-cloud-subdomain' - order: 2 - subdomain: - type: string - title: API Subdomain - description: The subdomain of the Tempo API. - enum: - - api - - api.eu - - api.us - doc_section: '#step-2-find-your-api-subdomain' - order: 1 - -the-swarm: - display_name: The Swarm - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://bee.theswarm.com - headers: - x-api-key: ${apiKey} - verification: - method: POST - endpoints: - - /v2/profiles/search - headers: - content-type: application/json - data: - query: - match_all: {} - limit: 1 - docs: https://nango.dev/docs/api-integrations/the-swarm - docs_connect: https://nango.dev/docs/api-integrations/the-swarm/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Swarm API key from Team Settings. - example: aB3cD9eF************************wX6yZ2 - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-1-get-your-api-key' - -theirstack: - display_name: TheirStack - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.theirstack.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v0/billing/credit-balance - docs: https://nango.dev/docs/api-integrations/theirstack - docs_connect: https://nango.dev/docs/api-integrations/theirstack/connect - credentials: - apiKey: - type: string - title: API Key - description: Your TheirStack API key. - example: eyJhbGci*******.eyJ2ZX********.kWB5******** - pattern: '^eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' - doc_section: '#step-1-generate-your-api-key' - -thomson-reuters-legal-tracker: - display_name: Thomson Reuters Legal Tracker - categories: - - legal - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.hostname}/onepass/oauth2/token - token_headers: - content-type: application/x-www-form-urlencoded - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.hostname}/legal-tracker - docs: https://nango.dev/docs/api-integrations/thomson-reuters-legal-tracker - docs_connect: https://nango.dev/docs/api-integrations/thomson-reuters-legal-tracker/connect - connection_config: - hostname: - type: string - title: Hostname - description: The regional API hostname for your Thomson Reuters account. - enum: - - api.thomsonreuters.com - - api.thomsonreuters.co.uk - - api.thomsonreuters.ca - - api.thomsonreuters.au - order: 1 - credentials: - client_id: - type: string - title: Client ID - description: The client ID from the App Management. - doc_section: '#step-1-obtain-your-client-credentials' - client_secret: - type: string - title: Client Secret - description: The client secret from the App Management. - secret: true - doc_section: '#step-1-obtain-your-client-credentials' - -thomson-reuters-legal-tracker-tr-account: - display_name: Thomson Reuters Legal Tracker (TR Account) - alias: thomson-reuters-legal-tracker - categories: - - legal - auth_mode: OAUTH2_CC - token_url: https://auth.thomsonreuters.com/oauth/token - token_request_auth_method: basic - token_headers: - content-type: application/x-www-form-urlencoded - token_params: - grant_type: client_credentials - audience: 506f6a92-4fd1-43c1-bf18-4e3735ea55aa - docs: https://nango.dev/docs/api-integrations/thomson-reuters-legal-tracker-tr-account - docs_connect: https://nango.dev/docs/api-integrations/thomson-reuters-legal-tracker-tr-account/connect - credentials: - client_id: - type: string - title: Client ID - description: Your TR Account client ID. - doc_section: '#step-1-obtain-your-client-credentials' - client_secret: - type: string - title: Client Secret - description: Your TR Account client secret. - secret: true - doc_section: '#step-1-obtain-your-client-credentials' - -terraform: - display_name: Terraform - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://app.terraform.io - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'x-ratelimit-reset' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v2/organizations - docs: https://nango.dev/docs/integrations/all/terraform - docs_connect: https://nango.dev/docs/integrations/all/terraform/connect - credentials: - apiKey: - type: string - title: API Token - description: The API Token for your Terraform account - doc_section: '#step-1-generating-your-api-token' - example: VbQo**************************** - pattern: '^[a-zA-Z0-9.]{50,}$' - -ticktick: - display_name: TickTick - categories: - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://ticktick.com/oauth/authorize - token_url: https://ticktick.com/oauth/token - scope_separator: ' ' - proxy: - base_url: https://api.ticktick.com - docs: https://nango.dev/docs/integrations/all/ticktick - -tiktok-accounts: - display_name: TikTok Accounts - categories: - - social - auth_mode: OAUTH2 - authorization_url: https://www.tiktok.com/v2/auth/authorize/ - token_url: https://business-api.tiktok.com/open_api/v1.3/tt_user/oauth2/token/ - refresh_url: https://business-api.tiktok.com/open_api/v1.3/tt_user/oauth2/refresh_token/ - proxy: - base_url: https://business-api.tiktok.com/open_api/v1.3/ - authorization_params: - response_type: code - authorization_url_replacements: - client_id: client_key - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - scope_separator: ',' - docs: https://nango.dev/docs/integrations/all/tiktok-accounts - -tiktok-ads: - display_name: TikTok Ads - categories: - - social - auth_mode: OAUTH2 - authorization_url: https://business-api.tiktok.com/portal/auth - token_url: https://business-api.tiktok.com/open_api/v1.3/oauth2/access_token/ - proxy: - base_url: https://business-api.tiktok.com/open_api/v1.3/ - headers: - access-token: ${accessToken} - token_params: - grant_type: authorization_code - authorization_url_replacements: - client_id: app_id - docs: https://nango.dev/docs/integrations/all/tiktok-ads - -tiktok-personal: - display_name: TikTok Personal - categories: - - social - auth_mode: OAUTH2 - authorization_url: https://www.tiktok.com/v2/auth/authorize/ - token_url: https://open.tiktokapis.com/v2/oauth/token/ - proxy: - base_url: https://open.tiktokapis.com - retry: - at: - - 'x-ratelimit-reset' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - body_format: form - scope_separator: ',' - authorization_url_replacements: - client_id: client_key - docs: https://nango.dev/docs/integrations/all/tiktok-personal - -timely: - display_name: Timely - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://api.timelyapp.com/1.1/oauth/authorize - token_url: https://api.timelyapp.com/1.1/oauth/token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://api.timelyapp.com - docs: https://nango.dev/docs/integrations/all/timely - -thrivecart-oauth: - display_name: ThriveCart (OAuth) - categories: - - e-commerce - - payment - auth_mode: OAUTH2 - authorization_url: https://thrivecart.com/authorization/new - token_url: https://thrivecart.com/authorization/token - scope_separator: ' ' - proxy: - base_url: https://thrivecart.com/api/external - docs: https://nango.dev/docs/integrations/all/thrivecart-oauth - -thrivecart-api-key: - display_name: ThriveCart (API Key) - categories: - - e-commerce - - payment - auth_mode: API_KEY - proxy: - base_url: https://thrivecart.com/api/external - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /ping - docs: https://nango.dev/docs/integrations/all/thrivecart-api-key - credentials: - apiKey: - type: string - title: API Key - description: The API key for your ThriveCart account - example: 'ASYDV5S8-0BSO1SH2-4BH5PO7U-YF8SV3CZ' - pattern: '^[A-Z0-9]{8}-[A-Z0-9]{10}-[A-Z0-9]{8}-[A-Z0-9]{8}$' - -trakstar-hire: - display_name: Trakstar Hire - categories: - - ats - auth_mode: BASIC - proxy: - base_url: https://api.recruiterbox.com - verification: - method: GET - endpoints: - - /v2/openings - headers: - content-type: application/json - docs: https://nango.dev/docs/integrations/all/trakstar-hire - docs_connect: https://nango.dev/docs/integrations/all/trakstar-hire/connect - credentials: - username: - type: string - title: API Key - description: Your Trakstar API Key - pattern: '^[a-f0-9]+$' - example: a3f8b92c4d6e715f0a1b3c4d5e6f7890 - doc_section: '#step-1-generating-your-api-key' - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -trafft: - display_name: Trafft - categories: - - productivity - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.subdomain}.admin.trafft.com/api/v2/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.subdomain}.admin.trafft.com/api - docs: https://nango.dev/docs/integrations/all/trafft - docs_connect: https://nango.dev/docs/integrations/all/trafft/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of your Trafft instance - example: subdomain - format: hostname - prefix: https:// - suffix: .admin.trafft.com - doc_section: '#step-1-access-api-settings' - credentials: - client_id: - type: string - title: Client ID - description: Your Trafft OAuth2 Client ID. - doc_section: '#step-2-get-your-credentials' - client_secret: - type: string - title: Client Secret - description: Your Trafft OAuth2 Client Secret. - secret: true - doc_section: '#step-2-get-your-credentials' - -tremendous: - display_name: Tremendous - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://api.tremendous.com/oauth/authorize - token_url: https://api.tremendous.com/oauth/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.tremendous.com/api/v2 - docs: https://nango.dev/docs/integrations/all/tremendous - -tremendous-sandbox: - display_name: Tremendous (Sandbox) - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://testflight.tremendous.com/oauth/authorize - token_url: https://testflight.tremendous.com/oauth/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://testflight.tremendous.com/api/v2 - docs: https://nango.dev/docs/integrations/all/tremendous-sandbox - -perk: - display_name: Perk - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://app.travelperk.com/oauth2/authorize/ - token_url: https://app.travelperk.com/accounts/oauth2/token/ - disable_pkce: true - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.travelperk.com - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/perk - setup_guide_url: https://nango.dev/docs/api-integrations/perk/how-to-register-your-own-perk-api-oauth-app - -trello: - display_name: Trello - categories: - - productivity - - ticketing - auth_mode: OAUTH1 - request_url: https://trello.com/1/OAuthGetRequestToken - authorization_url: https://trello.com/1/OAuthAuthorizeToken - token_url: https://trello.com/1/OAuthGetAccessToken - signature_method: 'HMAC-SHA1' - scope_separator: ',' - authorization_params: - expiration: never - proxy: - base_url: https://api.trello.com - docs: https://nango.dev/docs/integrations/all/trello - -trello-scim: - display_name: Trello (SCIM API) - categories: - - productivity - - ticketing - auth_mode: API_KEY - proxy: - base_url: https://trello.com/scim - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/users?sortBy=displayName&count=10 - docs: https://nango.dev/docs/integrations/all/trello-scim - docs_connect: https://nango.dev/docs/integrations/all/trello-scim/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Trello scim account - doc_section: '#step-1-finding-your-trello-api-key' - -tldv: - display_name: tl;dv - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://pasta.tldv.io - headers: - x-api-key: ${apiKey} - docs: https://nango.dev/docs/integrations/all/tldv - docs_connect: https://nango.dev/docs/integrations/all/tldv/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your tl;dv account - doc_section: '#step-1-finding-your-api-key' - -trigify-io-mcp: - display_name: Trigify IO (MCP) - categories: - - dev-tools - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://clerk.trigify.io/oauth/authorize - token_url: https://clerk.trigify.io/oauth/token - registration_url: https://clerk.trigify.io/oauth/register - default_scopes: - - offline_access - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.trigify.io - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/trigify-io-mcp - -trigger-dev: - display_name: Trigger.dev - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.baseUrl} - headers: - authorization: Bearer ${apiKey} - connection_config: - environment: ${connectionConfig.environment} - projectRef: ${connectionConfig.projectRef} - triggerBranch: ${connectionConfig.triggerBranch} - docs: https://nango.dev/docs/api-integrations/trigger-dev - docs_connect: https://nango.dev/docs/api-integrations/trigger-dev/connect - connection_config: - baseUrl: - type: string - title: Hostname - description: The API hostname. - example: api.trigger.dev - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-4-set-your-base-url' - projectRef: - type: string - title: Project Ref - description: Your Trigger.dev project identifier. - example: proj_1234567890 - optional: true - doc_section: '#step-2-find-your-project-ref' - environment: - type: string - title: Environment - description: The target environment. - example: prod - optional: true - doc_section: '#step-3-find-your-environment' - triggerBranch: - type: string - title: Preview Branch - description: Target a specific preview branch for environment variable operations. - example: feature-xyz - optional: true - doc_section: '#step-5-set-your-preview-branch' - credentials: - apiKey: - type: string - title: Secret Key - description: Your Trigger.dev secret key or personal access token. - pattern: '^tr_(dev|prod|stg|preview|pat)_[a-zA-Z0-9]+$' - example: tr_dev_******************** - doc_section: '#step-1-get-your-secret-key-or-personal-access-token' - -triple-whale: - display_name: Triple Whale - categories: - - analytics - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.triplewhale.com - headers: - x-api-key: ${apiKey} - accept: application/json - verification: - method: GET - headers: - accept: application/json - content-type: application/json - endpoints: - - /api/v2/users/api-keys/me - docs: https://nango.dev/docs/api-integrations/triple-whale - docs_connect: https://nango.dev/docs/api-integrations/triple-whale/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Triple Whale API key. - example: 5ab87915-2deb-429c-a1e2-8b0495900f45 - format: uuid - doc_section: '#step-1-generating-your-api-key' - -tsheetsteam: - display_name: TSheets - categories: - - hr - - productivity - auth_mode: OAUTH2 - authorization_url: https://rest.tsheets.com/api/v1/authorize - token_url: https://rest.tsheets.com/api/v1/grant - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://rest.tsheets.com/api/v1 - docs: https://nango.dev/docs/integrations/all/tsheetsteam - -timify: - display_name: Timify - categories: - - productivity - auth_mode: TWO_STEP - body_format: json - token_url: https://${connectionConfig.subdomain}.timify.com/v1/auth/token - refresh_url: https://${connectionConfig.subdomain}.timify.com/v1/auth/refreshtoken - token_params: - appid: ${credentials.appId} - appsecret: ${credentials.appSecret} - refresh_token_params: - refreshtoken: ${refresh_token} - token_headers: - content-type: application/json - accept: application/json - token_response: - token: accessToken - token_expiration: expires - token_expiration_strategy: expireIn - refresh_token: refreshToken - proxy: - base_url: https://${connectionConfig.subdomain}.timify.com - headers: - authorization: ${accessToken} - docs: https://nango.dev/docs/api-integrations/timify - docs_connect: https://nango.dev/docs/api-integrations/timify/connect - connection_config: - subdomain: - type: string - title: Timify Subdomain - description: The subdomain of your Timify API. - pattern: '^[a-z0-9_-]+$' - example: api - order: 1 - suffix: .timify.com - prefix: https:// - doc_section: '#step-1-finding-your-subdomain' - credentials: - appId: - type: string - title: App ID - description: Your Timify app ID - doc_section: '#step-3-getting-your-credentials' - appSecret: - type: string - title: App Secret - description: Your Timify app secret - secret: true - doc_section: '#step-3-getting-your-credentials' - -toast: - display_name: Toast - categories: - - erp - auth_mode: TWO_STEP - body_format: json - token_url: https://${connectionConfig.subdomain}.toasttab.com/authentication/v1/authentication/login - token_params: - clientId: ${credentials.clientId} - clientSecret: ${credentials.clientSecret} - userAccessType: TOAST_MACHINE_CLIENT - token_headers: - content-type: application/json - token_response: - token: token.accessToken - token_expiration: token.expiresIn - token_expiration_strategy: expireIn - token_expiration_buffer: 60 - proxy: - base_url: https://${connectionConfig.subdomain}.toasttab.com - headers: - toast-restaurant-external-id: ${connectionConfig.restaurantId} - docs: https://nango.dev/docs/api-integrations/toast - docs_connect: https://nango.dev/docs/api-integrations/toast/connect - connection_config: - subdomain: - type: string - title: API Subdomain - description: The Toast API subdomain for your environment. - example: ws-api - pattern: '^[a-z0-9-]+$' - order: 1 - restaurantId: - type: string - title: Restaurant External ID - description: The Toast GUID for the restaurant to connect to. - example: 4721e7a9-b4ae-4fef-9230-b3dae186e0a4 - format: uuid - optional: true - credentials: - clientId: - type: string - title: Client ID - description: Your Toast API client identifier. - clientSecret: - type: string - title: Client Secret - description: Your Toast API client secret. - secret: true - -todoist: - display_name: Todoist - categories: - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://todoist.com/oauth/authorize - token_url: https://todoist.com/oauth/access_token - scope_separator: ',' - proxy: - base_url: https://api.todoist.com - docs: https://nango.dev/docs/integrations/all/todoist - -toggl: - display_name: Toggl Track - categories: - - productivity - auth_mode: BASIC - proxy: - base_url: https://api.track.toggl.com - verification: - method: GET - endpoints: - - /api/v9/me - retry: - after: - - 'x-toggl-quota-resets-in' - docs: https://nango.dev/docs/api-integrations/toggl - docs_connect: https://nango.dev/docs/api-integrations/toggl/connect - credentials: - username: - type: string - title: Email or API token - description: Your Toggl Track account email, or your API token when using token-based Basic Auth. - doc_section: '#step-1-choose-emailpassword-or-api-token' - password: - type: string - title: Password or api_token - description: Your Toggl Track account password, or the literal text api_token when authenticating with an API token. - secret: true - doc_section: '#step-1-choose-emailpassword-or-api-token' - -torii: - display_name: Torii - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.toriihq.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1.0/orgs/my - retry: - at: - - 'x-rate-limit-reset' - docs: https://nango.dev/docs/api-integrations/torii - docs_connect: https://nango.dev/docs/api-integrations/torii/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Torii account - doc_section: '#step-1-generating-your-api-key' - -tumblr: - display_name: Tumblr - categories: - - social - - communication - auth_mode: OAUTH2 - authorization_url: https://www.tumblr.com/oauth2/authorize - token_url: https://api.tumblr.com/v2/oauth2/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.tumblr.com/v2 - docs: https://nango.dev/docs/integrations/all/tumblr - -twitch: - display_name: Twitch - categories: - - gaming - - social - - sports - - video - auth_mode: OAUTH2 - authorization_url: https://id.twitch.tv/oauth2/authorize - token_url: https://id.twitch.tv/oauth2/token - authorization_params: - force_verify: false - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.twitch.tv - docs: https://nango.dev/docs/integrations/all/twitch - -twitter: - display_name: Twitter (v1) - categories: - - marketing - - social - auth_mode: OAUTH1 - request_url: https://api.twitter.com/oauth/request_token - authorization_url: https://api.twitter.com/oauth/authorize - token_url: https://api.twitter.com/oauth/access_token - signature_method: 'HMAC-SHA1' - request_params: - x_auth_access_type: write - proxy: - base_url: https://api.twitter.com - docs: https://nango.dev/docs/integrations/all/twitter -twitter-v2: - display_name: Twitter (v2) - categories: - - marketing - - social - auth_mode: OAUTH2 - authorization_url: https://x.com/i/oauth2/authorize - token_url: https://api.twitter.com/2/oauth2/token - token_request_auth_method: basic - authorization_params: - response_type: code - response_mode: query - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - default_scopes: - - offline.access - proxy: - base_url: https://api.twitter.com - docs: https://nango.dev/docs/api-integrations/twitter-v2 - setup_guide_url: https://nango.dev/docs/api-integrations/twitter-v2/how-to-register-your-own-twitter-v2-api-oauth-app -twitter-oauth2-cc: - display_name: Twitter (Client Credentials) - categories: - - marketing - - social - auth_mode: OAUTH2_CC - token_url: https://api.twitter.com/oauth2/token - token_request_auth_method: basic - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.twitter.com - docs: https://nango.dev/docs/integrations/all/twitter-oauth2-cc - -twinfield: - display_name: Twinfield - categories: - - accounting - auth_mode: OAUTH2 - authorization_url: https://login.twinfield.com/auth/authentication/connect/authorize - token_url: https://login.twinfield.com/auth/authentication/connect/token - authorization_params: - response_type: code - nonce: AnotherRandomStringTwinfield - refresh_params: - grant_type: refresh_token - scope_separator: ' ' - default_scopes: - - openid - - twf.user - - twf.organisation - - twf.organisationUser - - offline_access - disable_pkce: true - proxy: - base_url: https://${connectionConfig.cluster}.twinfield.com - docs: https://nango.dev/docs/integrations/all/twinfield - connection_config: - cluster: - type: string - title: Twinfield Cluster - description: The cluster to your Twinfield instance - pattern: '^[a-z0-9_-]+$' - example: accounting - suffix: .twinfield.com - prefix: https:// - -twenty-crm: - display_name: Twenty CRM - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.twenty.com/rest - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'retry-after' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /companies - docs: https://nango.dev/docs/integrations/all/twenty-crm - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Twenty CRM account - example: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyMTIxMjEyMS0yNmExLTRkODktYjQ2YS0wNDI0NTViODM3N2YiLCJ0eXBlIjoiQVBJX0tFWSIsIndvcmtzcGFjZUlkIjoiMjEyMTIxMjEtMjZhMS00ZDg5LWI0NmEtMDQyNDU1YjgzNzdmIiwiaWF0IjoxNzMxMzA5MzQwLCJleHAiOjQ4ODQ5MDU3MzksImp0aSI6ImVmZTg4MjcxLTM4OWItNDk5Mi04MjYwLWZjNGIxZmYxYjRiMSJ9.n3tohFIEBBRMsyas_agbh3-KvKXYUnjyhrYzTHYC3vc' - pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' - -twenty-crm-self-hosted: - display_name: Twenty CRM (Self Hosted) - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.domain}/rest - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'retry-after' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /companies - docs: https://nango.dev/docs/integrations/all/twenty-crm-self-hosted - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Twenty CRM account - example: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyMTIxMjEyMS0yNmExLTRkODktYjQ2YS0wNDI0NTViODM3N2YiLCJ0eXBlIjoiQVBJX0tFWSIsIndvcmtzcGFjZUlkIjoiMjEyMTIxMjEtMjZhMS00ZDg5LWI0NmEtMDQyNDU1YjgzNzdmIiwiaWF0IjoxNzMxMzA5MzQwLCJleHAiOjQ4ODQ5MDU3MzksImp0aSI6ImVmZTg4MjcxLTM4OWItNDk5Mi04MjYwLWZjNGIxZmYxYjRiMSJ9.n3tohFIEBBRMsyas_agbh3-KvKXYUnjyhrYzTHYC3vc' - pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' - connection_config: - domain: - type: string - title: Twenty CRM domain - description: The domain of your Twnety CRM instance - pattern: '^[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' - example: domain - -twilio: - display_name: Twilio - categories: - - dev-tools - - communication - auth_mode: BASIC - proxy: - base_url: https://api.twilio.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /2010-04-01/Accounts/${credentials.username}/Messages.json - docs: https://nango.dev/docs/integrations/all/twilio - docs_connect: https://nango.dev/docs/integrations/all/twilio/connect - credentials: - username: - type: string - title: Account SID - description: Your Twilio Account SID - pattern: '^AC[a-zA-Z0-9]{32}$' - doc_section: '#step-1-finding-your-account-sid' - password: - type: string - title: Auth Token - description: Your Twilio Auth Token - secret: true - doc_section: '#step-2-finding-your-auth-token' - -typeform: - display_name: Typeform - categories: - - surveys - auth_mode: OAUTH2 - authorization_url: https://api.typeform.com/oauth/authorize - token_url: https://api.typeform.com/oauth/token - disable_pkce: true - default_scopes: - - offline - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.typeform.com - docs: https://nango.dev/docs/integrations/all/typeform - -typefully: - display_name: Typefully - categories: - - analytics - - communication - - social - auth_mode: API_KEY - proxy: - base_url: https://api.typefully.com - headers: - x-api-key: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/notifications/ - docs: https://nango.dev/docs/integrations/all/typefully - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Typefully account - -typefully-v2: - display_name: Typefully (API v2) - categories: - - analytics - - communication - - social - auth_mode: API_KEY - proxy: - base_url: https://api.typefully.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v2/me - retry: - at: - - 'x-ratelimit-user-reset' - - 'x-ratelimit-socialset-reset' - docs: https://nango.dev/docs/api-integrations/typefully-v2 - docs_connect: https://nango.dev/docs/api-integrations/typefully-v2/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Typefully v2 API key. - example: 'aNVlyR********************YxeIDz' - pattern: '^[A-Za-z0-9]{32}$' - doc_section: '#step-1-generating-your-api-key' - -uber: - display_name: Uber - categories: - - other - auth_mode: OAUTH2 - authorization_url: https://login.uber.com/oauth/v2/authorize - token_url: https://login.uber.com/oauth/v2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.uber.com - docs: https://nango.dev/docs/integrations/all/uber - -ukg-pro-wfm: - display_name: UKG Pro (Workforce Management) - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://welcome-us.ukg.net/authorize - token_url: https://welcome-us.ukg.net/oauth/token - scope_separator: ' ' - authorization_params: - response_type: code - audience: https://wfm.ukg.net/api - realm: ${connectionConfig.tenantName} - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.hostname}/api - docs: https://nango.dev/docs/integrations/all/ukg-pro-wfm - docs_connect: https://nango.dev/docs/integrations/all/ukg-pro-wfm/connect - connection_config: - hostname: - type: string - title: Tenant URL - description: The tenant URL of your UKG Pro instance - format: hostname - example: wfm.us1.ukg.com - suffix: /api - prefix: https:// - doc_section: '#step-1-finding-your-tenant-url-and-tenant-name' - tenantName: - type: string - title: Tenant Name - description: The tenant name of your UKG Pro instance - example: wfm - doc_section: '#step-1-finding-your-tenant-url-and-tenant-name' - -ukg-pro: - display_name: UKG Pro - categories: - - hr - - popular - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.hostname} - headers: - content-type: application/json - us-customer-api-key: ${connectionConfig.customerApiKey} - docs: https://nango.dev/docs/integrations/all/ukg-pro - docs_connect: https://nango.dev/docs/integrations/all/ukg-pro/connect - credentials: - username: - type: string - title: Service Account Username - description: The username for your UKG Pro service account - doc_section: '#step-2-creating-a-web-service-account' - password: - type: string - title: Service Account Password - description: The password generated for your UKG Pro service account - doc_section: '#step-2-creating-a-web-service-account' - secret: true - connection_config: - customerApiKey: - type: string - order: 2 - title: Customer API Key - description: Your UKG Pro Customer API Key found in Service Account Administration - doc_section: '#step-1-finding-your-customer-api-key' - secret: true - hostname: - type: string - order: 1 - title: Hostname - description: The tenant URL of your UKG Pro instance - format: hostname - example: servicet.ultipro.com - prefix: https:// - doc_section: '#step-3-finding-your-hostname' - -ukg-pro-cc: - display_name: UKG Pro HCM (Client Credentials) - categories: - - hr - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.identityServer}/signin/oauth2/t/${connectionConfig.tenantId}/access_token - body_format: form - token_headers: - content-type: application/x-www-form-urlencoded - accept: application/json - token_params: - grant_type: client_credentials - proxy: - retry: - after: - - 'retry-after' - base_url: https://${connectionConfig.hostname} - docs: https://nango.dev/docs/api-integrations/ukg-pro-cc - docs_connect: https://nango.dev/docs/api-integrations/ukg-pro-cc/connect - credentials: - client_id: - type: string - title: Client ID - description: Unique identifier of the identity client provided by UKG customer support. - doc_section: '#step-1-getting-the-credentials-from-ukg-support' - client_secret: - type: string - title: Client Secret - description: Client secret associated with the client ID provided by UKG customer support. - secret: true - doc_section: '#step-1-getting-the-credentials-from-ukg-support' - connection_config: - identityServer: - type: string - title: Identity Server - description: Identity server for your tenant. - format: hostname - example: signin.ukg.net - order: 1 - doc_section: '#step-1-getting-the-credentials-from-ukg-support' - tenantId: - type: string - title: Tenant - description: Tenant value from your UKG Pro Recruiting URL. - example: UO32145HGOGOG - pattern: '^[a-zA-Z0-9]+$' - order: 3 - doc_section: '#step-2-identify-tenant-and-recruiting-application-domain' - hostname: - type: string - title: Recruiting Application Domain - description: Recruiting application domain from your UKG Pro Recruiting URL. - format: hostname - example: recruiting.example.ultipro.com - prefix: https:// - order: 2 - doc_section: '#step-2-identify-tenant-and-recruiting-application-domain' - -ukg-ready: - display_name: UKG Ready - categories: - - hr - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.hostname}/ta/rest/v2/companies/${connectionConfig.realmId}/oauth2/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.hostname} - docs: https://nango.dev/docs/integrations/all/ukg-ready - docs_connect: https://nango.dev/docs/integrations/all/ukg-ready/connect - connection_config: - realmId: - type: string - title: Company ID - description: A unique identifier for your company. - example: '23444234' - doc_section: '#step-3-finding-your-company-id' - hostname: - type: string - title: Hostname - description: The hostname to your UKG Ready instance - format: hostname - example: secure.us.rdy.ukg - suffix: /ta - prefix: https:// - doc_section: '#step-4-finding-your-hostname' -unanet: - display_name: Unanet - categories: - - crm - - erp - - accounting - auth_mode: BASIC - proxy: - headers: - x-compass-firm-id: ${connectionConfig.firmId} - x-compass-api-key: ${connectionConfig.apiKey} - base_url: https://compass.cosential.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/projects - docs: https://nango.dev/docs/integrations/all/unanet - docs_connect: https://nango.dev/docs/integrations/all/unanet/connect - connection_config: - firmId: - type: string - title: Firm ID - description: The firm ID of your Unanet instance - doc_section: '#step-2-finding-the-firm-id' - apiKey: - type: string - title: API Key - description: The API key of your Unanet instance - secret: true - doc_section: '#step-3-finding-the-api-key' - credentials: - username: - type: string - title: User name - description: Your Unanet username - doc_section: '#step-1-finding-username-and-password' - password: - type: string - title: Password - description: Your Unanet password - default_value: '' - doc_section: '#step-1-finding-username-and-password' - -unauthenticated: - display_name: Unauthenticated - categories: - - other - auth_mode: NONE - webhook_routing_script: unauthenticatedWebhookRouting - docs: https://nango.dev/docs/integrations/all/unauthenticated - -unipile: - display_name: Unipile - categories: - - crm - - marketing - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.unipile.com:${connectionConfig.port} - headers: - x-api-key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v1/accounts - docs: https://nango.dev/docs/integrations/all/unipile - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Unipile instance - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of your Unipile instance - pattern: '^[a-z0-9_-]+$' - example: api1 - suffix: .unipile.com - prefix: https:// - port: - type: string - title: Port - description: The port of your Unipile instance - pattern: '^[0-9]+$' - example: '13113' - -upsales: - display_name: Upsales - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://integration.upsales.com - query: - token: ${apiKey} - retry: - at: - - 'x-ratelimit-reset' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v2/users - docs: https://nango.dev/docs/api-integrations/upsales - docs_connect: https://nango.dev/docs/api-integrations/upsales/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Upsales API Token - doc_section: '#step-1-finding-your-api-token' - -vercel: - display_name: Vercel - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.vercel.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/user - docs: https://nango.dev/docs/api-integrations/vercel - docs_connect: https://nango.dev/docs/api-integrations/vercel/connect - credentials: - apiKey: - type: string - title: Token - description: The Token for your Vercel account. - pattern: '^vcp_[A-Za-z0-9]+$' - example: 'vcp_6ppUxFRd****r1sc53a' - doc_section: '#step-1-finding-your-token' - -vercel-mcp: - display_name: Vercel (MCP) - categories: - - dev-tools - - mcp - auth_mode: MCP_OAUTH2 - client_registration: static - authorization_url: https://vercel.com/oauth/authorize - token_url: https://vercel.com/api/login/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - default_scopes: - - offline_access - proxy: - headers: - accept: application/json,text/event-stream - base_url: https://mcp.vercel.com - docs: https://nango.dev/docs/api-integrations/vercel-mcp - setup_guide_url: https://nango.dev/docs/api-integrations/vercel-mcp/how-to-register-your-own-vercel-mcp-oauth-app - -vimeo: - display_name: Vimeo (OAuth) - categories: - - video - auth_mode: OAUTH2 - authorization_url: https://api.vimeo.com/oauth/authorize - token_url: https://api.vimeo.com/oauth/access_token - token_request_auth_method: basic - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://api.vimeo.com - docs: https://nango.dev/docs/integrations/all/vimeo - -vimeo-basic: - display_name: Vimeo (Basic Auth) - categories: - - video - auth_mode: BASIC - proxy: - base_url: https://api.vimeo.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - / - docs: https://nango.dev/docs/integrations/all/vimeo-basic - -valley-api-key: - display_name: Valley (API Key) - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.joinvalley.co/api - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v1/auth/verify-api-key - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/integrations/all/valley-api-key - docs_connect: https://nango.dev/docs/integrations/all/valley-api-key/connect - credentials: - apiKey: - type: string - title: API Key - example: valley_a3f4c8d2e1b9a7**********************************************c5d8e2f1 - pattern: '^valley_[a-f0-9]{64}$' - description: The API key for your Valley account - doc_section: '#step-1-verifying-your-api-key' - -valley: - display_name: Valley (OAuth) - categories: - - marketing - auth_mode: TWO_STEP - body_format: json - token_url: https://api.joinvalley.co/api/v1/auth/get-token - refresh_url: https://api.joinvalley.co/api/v1/auth/refresh-token - token_params: - email: ${credentials.email} - password: ${credentials.password} - refresh_token_params: - refresh_token: ${refresh_token} - token_headers: - content-type: application/json - proxy: - base_url: https://api.joinvalley.co/api/ - headers: - authorization: Bearer ${accessToken} - retry: - at: - - 'x-ratelimit-reset' - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - refresh_token: refresh_token - docs: https://nango.dev/docs/integrations/all/valley - docs_connect: https://nango.dev/docs/integrations/all/valley/connect - credentials: - email: - type: string - title: Email - description: Your Valley email address - format: email - doc_section: '#step-1-getting-your-credentials' - password: - type: string - title: Password - description: Your Valley password - doc_section: '#step-1-getting-your-credentials' - -vanta: - display_name: Vanta - categories: - - dev-tools - auth_mode: OAUTH2_CC - token_url: https://api.vanta.com/oauth/token - token_params: - grant_type: client_credentials - body_format: json - proxy: - base_url: https://api.vanta.com - docs: https://nango.dev/docs/api-integrations/vanta - docs_connect: https://nango.dev/docs/api-integrations/vanta/connect - -veeva-vault: - display_name: Veeva Vault - categories: - - crm - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.subdomain}.veevavault.com/api/${connectionConfig.version}/auth - token_params: - username: ${credentials.username} - password: ${credentials.password} - token_headers: - content-type: application/x-www-form-urlencoded - accept: application/json - token_response: - token: sessionId - proxy: - base_url: https://${connectionConfig.subdomain}.veevavault.com/api/${connectionConfig.version} - headers: - authorization: ${accessToken} - accept: application/json - docs: https://nango.dev/docs/api-integrations/veeva-vault - docs_connect: https://nango.dev/docs/api-integrations/veeva-vault/connect - credentials: - username: - type: string - title: Username - description: Your Vault user name assigned by your administrator - doc_section: '#step-2-obtaining-your-credentials' - password: - type: string - title: Password - description: Your Vault password associated with your assigned Vault user name - secret: true - doc_section: '#step-2-obtaining-your-credentials' - connection_config: - subdomain: - type: string - title: Vault DNS (subdomain) - description: The Vault DNS subdomain of the Veeva Vault you want to connect to - example: myvault - prefix: https:// - suffix: veevavault.com - order: 1 - doc_section: '#step-1-finding-your-vault-dns-subdomain' - version: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -vtex: - display_name: VTEX - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.accountName}.vtexcommercestable.com.br - headers: - x-vtex-api-appkey: ${connectionConfig.appKey} - x-vtex-api-apptoken: ${apiKey} - docs: https://nango.dev/docs/api-integrations/vtex - docs_connect: https://nango.dev/docs/api-integrations/vtex/connect - connection_config: - accountName: - type: string - title: Account Name - description: Your VTEX store account name. - example: mystore - pattern: '^[a-zA-Z0-9_-]+$' - suffix: .vtexcommercestable.com.br - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-account-name' - appKey: - type: string - title: App Key - description: Your VTEX application key. - example: vtexappkey-mystore-ABCDEF - secret: true - pattern: '^vtexappkey-[a-zA-Z0-9_-]+-[A-Z0-9]+$' - order: 2 - doc_section: '#step-2-generating-an-api-key' - credentials: - apiKey: - type: string - title: App Token - description: The application token associated with your VTEX App Key. - example: ZNWDC************************************LXPNX - pattern: '^[A-Z]+$' - doc_section: '#step-2-generating-an-api-key' - -videoask: - display_name: VideoAsk - categories: - - video - auth_mode: OAUTH2 - authorization_url: https://auth.videoask.com/authorize - token_url: https://auth.videoask.com/oauth/token - disable_pkce: true - default_scopes: - - openid - - profile - - email - - offline_access - authorization_params: - response_type: code - audience: https://api.videoask.com/ - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.videoask.com - webhook_routing_script: videoaskWebhookRouting - webhook_user_defined_secret: true - docs: https://nango.dev/docs/api-integrations/videoask - setup_guide_url: https://nango.dev/docs/api-integrations/videoask/how-to-register-your-own-videoask-api-oauth-app - -wappalyzer: - display_name: Wappalyzer - categories: - - marketing - - analytics - auth_mode: API_KEY - proxy: - base_url: https://api.wappalyzer.com - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v2/credits/balance/ - docs: https://nango.dev/docs/api-integrations/wappalyzer - docs_connect: https://nango.dev/docs/api-integrations/wappalyzer/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Wappalyzer API key. - doc_section: '#step-1-get-your-api-key' - -wakatime: - display_name: Wakatime - categories: - - analytics - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://wakatime.com/oauth/authorize - token_url: https://wakatime.com/oauth/token - proxy: - base_url: https://wakatime.com - docs: https://nango.dev/docs/integrations/all/wakatime - -walmart: - display_name: Walmart Marketplace - categories: - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://login.account.wal-mart.com/authorize - authorization_params: - clientType: ${connectionConfig.clientType} - nonce: ${random} - disable_pkce: true - authorization_url_replacements: - response_type=: responseType= - client_id=: clientId= - redirect_uri=: redirectUri= - token_url: https://marketplace.walmartapis.com/v3/token - redirect_uri_metadata: - - sellerId - proxy: - base_url: https://marketplace.walmartapis.com - headers: - wm_qos.correlation_id: ${random} - wm_sec.access_token: ${accessToken} - docs: https://nango.dev/docs/api-integrations/walmart - setup_guide_url: https://nango.dev/docs/api-integrations/walmart/how-to-register-your-own-walmart-marketplace-oauth-app - connection_config: - clientType: - type: string - title: '' - description: '' - default_value: seller - hidden: true - -wave-accounting: - display_name: Wave Accounting - categories: - - accounting - auth_mode: OAUTH2 - authorization_url: https://api.waveapps.com/oauth2/authorize - token_url: https://api.waveapps.com/oauth2/token/ - proxy: - base_url: https://gql.waveapps.com - docs: https://nango.dev/docs/integrations/all/wave-accounting - -wealthbox: - display_name: Wealthbox - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://app.crmworkspace.com/oauth/authorize - token_url: https://app.crmworkspace.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.crmworkspace.com - docs: https://nango.dev/docs/integrations/all/wealthbox - -webflow: - display_name: Webflow - categories: - - dev-tools - - design - - cms - auth_mode: OAUTH2 - authorization_url: https://webflow.com/oauth/authorize - token_url: https://api.webflow.com/oauth/access_token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://api.webflow.com - docs: https://nango.dev/docs/integrations/all/webflow - -webex: - display_name: Webex - categories: - - communication - auth_mode: OAUTH2 - scope_separator: ' ' - authorization_url: https://webexapis.com/v1/authorize - token_url: https://webexapis.com/v1/access_token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://webexapis.com - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/webex - -webinarjam: - display_name: WebinarJam - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.webinarjam.com/webinarjam - query: - api_key: ${apiKey} - verification: - method: POST - headers: - content-type: application/x-www-form-urlencoded - endpoints: - - /webinars - docs: https://nango.dev/docs/api-integrations/webinarjam - docs_connect: https://nango.dev/docs/api-integrations/webinarjam/connect - credentials: - apiKey: - type: string - title: API Key - description: Your WebinarJam API key. - example: b7e2d4f1-8a3c-4e6b-9d5f-1a2b3c4d5e6f - format: uuid - doc_section: '#step-1-getting-your-api-key' - -wejam: - display_name: WeJam AI - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.wejam.ai - headers: - x-api-key: ${apiKey} - docs: https://nango.dev/docs/api-integrations/wejam - docs_connect: https://nango.dev/docs/api-integrations/wejam/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your WeJam account. - doc_section: '#step-1-getting-your-api-key' - pattern: '^[a-f0-9]+$' - example: c0c1fc3f**************************************************************************************** - -whatsapp-business: - display_name: WhatsApp Business - categories: - - communication - - marketing - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - content-type: application/json - base_url: https://graph.facebook.com - verification: - headers: - content-type: application/json - endpoints: - - /v21.0/me - method: GET - docs: https://nango.dev/docs/api-integrations/whatsapp-business - setup_guide_url: https://nango.dev/docs/api-integrations/whatsapp-business/how-to-register-your-own-whatsapp-business-api-oauth-app - credentials: - apiKey: - type: string - title: API Key - description: The access token to your whatsapp account - pattern: '^[a-zA-Z0-9]+$' - -whoop: - display_name: Whoop - categories: - - sports - auth_mode: OAUTH2 - authorization_url: https://api.prod.whoop.com/oauth/oauth2/auth - token_url: https://api.prod.whoop.com/oauth/oauth2/token - authorization_params: - response_type: code - proxy: - base_url: https://api.prod.whoop.com/ - retry: - after: - - 'x-ratelimit-reset' - paginate: - type: cursor - offset_name_in_request: nextToken - limit_name_in_request: limit - docs: https://nango.dev/docs/integrations/all/whoop - -wildix-pbx: - display_name: Wildix PBX - categories: - - communication - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.wildixin.com/authorization/oauth2 - token_url: https://${connectionConfig.subdomain}.wildixin.com/authorization/oauth2Token - authorization_params: - response_type: code - redirect_uri_metadata: - - subdomain - docs: https://nango.dev/docs/integrations/all/wildix-pbx - proxy: - base_url: https://${connectionConfig.subdomain}.wildixin.com - connection_config: - subdomain: - type: string - title: Wildix Domain - description: The subdomain of your Wildix instance - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .wildixin.com - prefix: https:// - -wiza: - display_name: Wiza - categories: - - crm - - marketing - auth_mode: API_KEY - proxy: - base_url: https://wiza.co/api - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /meta/credits - docs: https://nango.dev/docs/integrations/all/wiza - docs_connect: https://nango.dev/docs/integrations/all/wiza/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Wiza API key - pattern: '^[a-f0-9]{64}$' - example: 6e0f838beb0a09d35f3f56b52b1344b262ecc713aab41456485d12c5f6edaef7 - doc_section: '#step-1-getting-your-api-key' - -wordpress: - display_name: WordPress - categories: - - dev-tools - - design - - cms - auth_mode: OAUTH2 - authorization_url: https://public-api.wordpress.com/oauth2/authorize - token_url: https://public-api.wordpress.com/oauth2/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://public-api.wordpress.com/rest/v1 - docs: https://nango.dev/docs/integrations/all/wordpress - -wordpress-mcp: - display_name: WordPress.com (MCP) - categories: - - cms - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://public-api.wordpress.com/oauth2-1/authorize - token_url: https://public-api.wordpress.com/oauth2-1/token - registration_url: https://public-api.wordpress.com/oauth2-1/register - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://public-api.wordpress.com/wpcom - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/wordpress-mcp - -wiseagent: - display_name: Wiseagent - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://sync.thewiseagent.com/WiseAuth/auth - token_url: https://sync.thewiseagent.com/WiseAuth/token - body_format: json - disable_pkce: true - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://sync.thewiseagent.com - docs: https://nango.dev/docs/api-integrations/wiseagent - setup_guide_url: https://nango.dev/docs/api-integrations/wiseagent/how-to-register-your-own-wiseagent-oauth-app - -woocommerce: - display_name: WooCommerce - categories: - - e-commerce - - dev-tools - - design - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.storeURL} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /wp-json/wc/v3/customers - docs: https://nango.dev/docs/integrations/all/woocommerce - docs_connect: https://nango.dev/docs/integrations/all/woocommerce/connect - connection_config: - storeURL: - type: string - title: Domain - description: The domain of your WooCommerce store - credentials: - username: - type: string - title: User name - description: Your woocommerce Consumer Key - doc_section: '#step-1-finding-your-woocommerce-consumer-key' - password: - type: string - title: Password - description: Your woocommerce Consumer Secret - default_value: '' - doc_section: '#step-2-finding-your-woocommerce-consumer-secret' - -workable: - display_name: Workable (API Key) - categories: - - ats - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://${connectionConfig.subdomain}.workable.com - retry: - at: - - 'x-rate-limit-reset' - post_connection_script: workablePostConnection - docs: https://nango.dev/docs/integrations/all/workable - docs_connect: https://nango.dev/docs/integrations/all/workable/connect - connection_config: - subdomain: - type: string - title: Workable Domain - description: The subdomain of your Workable account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .workable.com - prefix: https:// - optional: true - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Workable account - doc_section: '#step-1-finding-workable-api-key' - -workable-oauth: - display_name: Workable (OAuth) - categories: - - ats - auth_mode: OAUTH2 - authorization_url: https://www.workable.com/oauth/authorize - token_url: https://www.workable.com/oauth/token - scope_separator: '+' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.workable.com - retry: - at: - - 'x-rate-limit-reset' - docs: https://nango.dev/docs/integrations/all/workable-oauth - connection_config: - subdomain: - type: string - title: Workable Domain - description: The subdomain of your Workable account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .workable.com - prefix: https:// - -workday: - display_name: Workday - categories: - - hr - - popular - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.hostname}/ccx/service/${connectionConfig.tenant} - docs: https://nango.dev/docs/integrations/all/workday - docs_connect: https://nango.dev/docs/integrations/all/workday/connect - connection_config: - hostname: - type: string - title: Hostname - description: The hostname of your Workday account - format: hostname - example: wd3-impl-services1.workday.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-hostname' - tenant: - type: string - title: Tenant - description: The tenant of your Workday account - example: acme - order: 2 - doc_section: '#step-2-finding-your-tenant' - credentials: - username: - type: string - example: ISU Nango@acme - title: Username - description: Workday API Username - pattern: '^[^@]+@[^@]+$' - doc_section: '#step-4-generating-your-username' - password: - type: string - title: Password - description: Workday API Password - doc_section: '#step-5-finding-your-password' - -workday-adaptive-planning-basic: - display_name: Workday Adaptive Planning (Basic Auth) - categories: - - accounting - auth_mode: BASIC - proxy: - base_url: https://api.adaptiveplanning.com/api/rest - docs: https://nango.dev/docs/api-integrations/workday-adaptive-planning-basic - docs_connect: https://nango.dev/docs/api-integrations/workday-adaptive-planning-basic/connect - credentials: - username: - type: string - title: Username - description: Your Workday Adaptive Planning username. - doc_section: '#step-1-find-your-username-and-password' - password: - type: string - title: Password - description: Your Workday Adaptive Planning password. - secret: true - doc_section: '#step-1-find-your-username-and-password' - -workday-oauth: - display_name: Workday (OAuth) - categories: - - hr - auth_mode: OAUTH2 - token_request_auth_method: basic - authorization_url: https://${connectionConfig.authorizationDomain}/${connectionConfig.tenant}/authorize - token_url: https://${connectionConfig.tokenDomain}/ccx/oauth2/${connectionConfig.tenant}/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.tokenDomain}/ccx/api - docs: https://nango.dev/docs/api-integrations/workday-oauth - docs_connect: https://nango.dev/docs/api-integrations/workday-oauth/connect - connection_config: - authorizationDomain: - type: string - title: Authorization Domain - description: The domain used to authorize your Workday account - format: hostname - example: impl.workday.com - prefix: https:// - order: 1 - suffix: /mytenant - doc_section: '#step-1-finding-your-authorization-domain' - tokenDomain: - type: string - title: Token Domain - description: The domain used to obtain the token for your Workday account - format: hostname - example: wd3-impl-services1.workday.com - prefix: https:// - order: 2 - suffix: /ccx - doc_section: '#step-2-finding-your-token-domain' - tenant: - type: string - title: Tenant - description: The tenant of your Workday account - example: yourtenant - order: 2 - doc_section: '#step-3-finding-your-tenant' - -workos: - display_name: WorkOS - categories: - - productivity - - iam - auth_mode: API_KEY - proxy: - base_url: https://api.workos.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /organizations?limit=1 - docs: https://nango.dev/docs/api-integrations/workos - docs_connect: https://nango.dev/docs/api-integrations/workos/connect - credentials: - apiKey: - type: string - title: API Key - description: Your WorkOS API key - pattern: '^sk_[A-Za-z0-9_]+$' - example: sk_test_a2V5XzAxS0cyS********************************************NUSlZ - doc_section: '#step-1-obtaining-your-workos-api-key' -workday-refresh-token: - display_name: Workday (Refresh Token Auth) - categories: - - hr - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.tokenDomain}/ccx/oauth2/${connectionConfig.tenant}/token - token_params: - grant_type: refresh_token - refresh_token: ${credentials.refreshToken} - token_headers: - content-type: application/x-www-form-urlencoded - authorization: Basic ${base64(${credentials.clientId}:${credentials.clientSecret})} - token_response: - token: access_token - token_expires_in_ms: 3600000 - proxy: - base_url: https://${connectionConfig.tokenDomain}/ccx/api - docs: https://nango.dev/docs/api-integrations/workday-refresh-token - docs_connect: https://nango.dev/docs/api-integrations/workday-refresh-token/connect - connection_config: - tokenDomain: - type: string - title: Token Domain - description: The domain used to obtain the token for your Workday account - format: hostname - example: wd3-impl-services1.workday.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-token-domain' - tenant: - type: string - title: Tenant - description: The tenant of your Workday account - example: mytenant - order: 2 - doc_section: '#step-2-finding-your-tenant' - credentials: - clientId: - type: string - title: Client ID - description: Your Workday API Client ID - doc_section: '#step-3-registering-an-api-client' - clientSecret: - type: string - title: Client Secret - description: Your Workday API Client Secret - secret: true - doc_section: '#step-3-registering-an-api-client' - refreshToken: - type: string - title: Refresh Token - description: Your Workday refresh token for the Integration System User - secret: true - doc_section: '#step-4-generating-a-refresh-token' - -workday-cc: - display_name: Workday (Client Credentials) - categories: - - hr - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.tokenDomain}/ccx/oauth2/${connectionConfig.tenant}/token - token_params: - grant_type: client_credentials - tenant_alias: ${connectionConfig.tenant} - token_headers: - content-type: application/x-www-form-urlencoded - authorization: ID ${base64(${credentials.clientId}:${credentials.clientSecret})} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://${connectionConfig.tokenDomain}/ccx/api - docs: https://nango.dev/docs/api-integrations/workday-cc - docs_connect: https://nango.dev/docs/api-integrations/workday-cc/connect - connection_config: - tokenDomain: - type: string - title: Token Domain - description: The hostname of your Workday tenant. - format: hostname - example: wd3-impl-services1.workday.com - prefix: https:// - order: 1 - doc_section: '#step-2-finding-your-token-domain' - tenant: - type: string - title: Tenant - description: The tenant name of your Workday account. - example: mytenant - order: 2 - doc_section: '#step-3-finding-your-tenant' - credentials: - clientId: - type: string - title: Client ID - description: Your Workday API Client ID. - doc_section: '#step-5-register-an-api-client' - clientSecret: - type: string - title: Client Secret - description: Your Workday API Client Secret. - secret: true - doc_section: '#step-5-register-an-api-client' - -workday-adaptive-planning: - display_name: Workday Adaptive Planning - categories: - - accounting - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.host}/ccx/oauth2/${connectionConfig.tenant}/token - token_params: - grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer - assertion: ${credentials.assertion} - token_headers: - content-type: application/x-www-form-urlencoded - assertion: - type: jwt - key: ${credentials.privateKey} - lifetimeInSeconds: 300 - header: - alg: RS256 - typ: JWT - payload: - iss: ${credentials.clientId} - sub: ${credentials.isu} - aud: wd - additional_steps: - - token_request_method: GET - token_url: https://${connectionConfig.host}/ccx/api/planning/v1/${connectionConfig.tenant}/adaptiveAPIAccessToken - token_headers: - authorization: Bearer ${step1.access_token} - token_response: - token: adaptiveAPIAccessToken - proxy: - base_url: https://api.adaptiveplanning.com - docs: https://nango.dev/docs/api-integrations/workday-adaptive-planning - docs_connect: https://nango.dev/docs/api-integrations/workday-adaptive-planning/connect - connection_config: - host: - type: string - title: Host - description: The hostname of your Workday account. - format: hostname - example: wd3-impl-services1.workday.com - prefix: https:// - order: 1 - tenant: - type: string - title: Tenant - description: The tenant of your Workday account. - example: mytenant - order: 2 - credentials: - clientId: - type: string - title: Client ID - description: The Client ID from the Workday API Client registration. - isu: - type: string - title: ISU Username - description: The Integration System User (ISU) username. - assertion: - type: string - title: '' - description: '' - automated: true - privateKey: - type: string - title: Private Key - description: The RSA private key (PEM format) used to sign the JWT. - secret: true - -workpath: - display_name: Workpath - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://connect.workpath.com/api - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v3/kpis - docs: https://nango.dev/docs/api-integrations/workpath - docs_connect: https://nango.dev/docs/api-integrations/workpath/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Workpath API Token. - doc_section: '#step-1-getting-your-api-token' - -wrike: - display_name: Wrike - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://login.wrike.com/oauth2/authorize/v4 - token_url: https://login.wrike.com/oauth2/token - scope_separator: ',' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - token_response_metadata: - - host - proxy: - base_url: https://${connectionConfig.host}/api/v4 - docs: https://nango.dev/docs/integrations/all/wrike - connection_config: - host: - type: string - title: Domain - description: The domain of your Wrike account - format: hostname - prefix: https:// - -wise-api-key: - display_name: Wise (API Key) - categories: - - banking - - payment - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.wise.com - verification: - method: GET - endpoints: - - /v1/profiles - docs: https://nango.dev/docs/api-integrations/wise-api-key - docs_connect: https://nango.dev/docs/api-integrations/wise-api-key/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Wise Personal API Token - example: 12345678-1234-1234-1234-123456789abc - pattern: '^[a-f0-9-]{36}$' - doc_section: '#step-1-generating-your-api-token' -xai: - display_name: xAI - categories: - - productivity - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.x.ai - headers: - authorization: Bearer ${apiKey} - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/api-key - docs: https://nango.dev/docs/integrations/all/xai - docs_connect: https://nango.dev/docs/integrations/all/xai/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your xAI account - example: xai-****************************************************** - pattern: 'xai-[A-Za-z0-9]+$' - doc_section: '#step-1-generating-your-api-key' - -xero: - display_name: Xero - categories: - - accounting - - popular - auth_mode: OAUTH2 - authorization_url: https://login.xero.com/identity/connect/authorize - token_url: https://identity.xero.com/connect/token - authorization_params: - response_type: code - default_scopes: - - offline_access - - openid - proxy: - base_url: https://api.xero.com - retry: - after: - - 'retry-after' - post_connection_script: xeroPostConnection - webhook_routing_script: xeroWebhookRouting - webhook_user_defined_secret: true - docs: https://nango.dev/docs/api-integrations/xero - setup_guide_url: https://nango.dev/docs/api-integrations/xero/how-to-register-your-own-xero-api-oauth-app - -xero-oauth2-cc: - display_name: Xero (Client Credentials) - categories: - - accounting - auth_mode: OAUTH2_CC - token_url: https://identity.xero.com/connect/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.xero.com - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/xero-oauth2-cc - docs_connect: https://nango.dev/docs/integrations/all/xero-oauth2-cc/connect - -yahoo: - display_name: Yahoo - categories: - - social - auth_mode: OAUTH2 - authorization_url: https://api.login.yahoo.com/oauth2/request_auth - token_url: https://api.login.yahoo.com/oauth2/get_token - proxy: - base_url: https://${connectionConfig.apiDomain} - docs: https://nango.dev/docs/integrations/all/yahoo - connection_config: - apiDomain: - type: string - title: API Domain - description: The domain to the API you want to connect to - format: hostname - example: fantasysports.yahooapis.com - prefix: https:// - -yotpo: - display_name: Yotpo - categories: - - e-commerce - auth_mode: TWO_STEP - proxy: - base_url: https://api.yotpo.com - headers: - x-yotpo-token: ${accessToken} - token_url: https://api.yotpo.com/core/v3/stores/${connectionConfig.storeId}/access_tokens - token_params: - secret: ${credentials.apiSecret} - token_headers: - content-type: application/json - token_response: - token: access_token - docs: https://nango.dev/docs/integrations/all/yotpo - docs_connect: https://nango.dev/docs/integrations/all/yotpo/connect - connection_config: - storeId: - type: string - title: App Key - description: Your Yotpo Store Key. - pattern: '^[A-Za-z0-9]{40}$' - doc_section: '#step-1-retrieving-your-app-key' - example: rvR3359XuCuuuEgCgcHNrQ9TE8zwC5dMzWMULHZm - order: 1 - credentials: - apiSecret: - type: string - title: Secret Key - description: Your Yotpo app's secret key. - secret: true - example: tHrwXaIBaWETHLRwxWaNktfYeEteyTcSjiNJY4IH - doc_section: '#step-2-generating-your-secret-key' - pattern: '^[A-Za-z0-9]{40}$' - -youcanbook-me: - display_name: YouCanBookMe - categories: - - productivity - auth_mode: BASIC - proxy: - base_url: https://api.youcanbook.me - connection_config: - subdomain: ${connectionConfig.subdomain} - verification: - method: GET - endpoints: - - /v1/profiles - docs: https://nango.dev/docs/api-integrations/youcanbook-me - docs_connect: https://nango.dev/docs/api-integrations/youcanbook-me/connect - credentials: - username: - type: string - title: Account ID - description: Your YouCanBookMe Account ID. - format: uuid - example: 78c3430e-21f5-483b-8e26-84cd6dabf7a6 - doc_section: '#step-1-finding-your-account-id-and-api-key' - password: - type: string - title: API Key - description: Your YouCanBookMe API key. - pattern: '^ak_[A-Za-z0-9_-]+$' - example: ak_xxxxxxxxxxxxxxxxxxxxx - secret: true - doc_section: '#step-1-finding-your-account-id-and-api-key' - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of your YouCanBookMe booking page. - example: mycompany - doc_section: '#step-2-finding-your-subdomain' - -yandex: - display_name: Yandex - categories: - - social - auth_mode: OAUTH2 - authorization_url: https://oauth.yandex.com/authorize - token_url: https://oauth.yandex.com/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://translate.yandex.net - docs: https://nango.dev/docs/integrations/all/yandex - -youtube: - display_name: YouTube - alias: google - categories: - - video - docs: https://nango.dev/docs/api-integrations/youtube - setup_guide_url: https://nango.dev/docs/api-integrations/youtube/how-to-register-your-own-youtube-api-oauth-app - -zapier: - display_name: Zapier - categories: - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://api.zapier.com/v2/authorize - token_url: https://zapier.com/oauth/token - disable_pkce: true - scope_separator: ' ' - proxy: - base_url: https://api.zapier.com - authorization_params: - response_type: code - response_mode: query - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - docs: https://nango.dev/docs/api-integrations/zapier - setup_guide_url: https://nango.dev/docs/api-integrations/zapier/how-to-register-your-own-zapier-oauth-app - -zapier-nla: - display_name: Zapier NLA - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://nla.zapier.com/oauth/authorize/ - token_url: https://nla.zapier.com/oauth/token/ - proxy: - base_url: https://nla.zapier.com - docs: https://nango.dev/docs/integrations/all/zapier-nla - -zapier-scim: - display_name: Zapier (SCIM API) - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://zapier.com/scim/v2 - headers: - authorization: Bearer ${apiKey} - accept: application/json, application/scim+json - content-type: application/json - retry: - after: - - 'retry-after' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /Users - docs: https://nango.dev/docs/integrations/all/zapier-scim - docs_connect: https://nango.dev/docs/integrations/all/zapier-scim/connect - credentials: - apiKey: - type: string - title: SCIM API Token - description: The SCIM API token generated from the Provision tab in your Zapier account. - doc_section: '#getting-your-scim-api-token' - -zendesk: - display_name: Zendesk - categories: - - popular - - support - - ticketing - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.zendesk.com/oauth/authorizations/new - token_url: https://${connectionConfig.subdomain}.zendesk.com/oauth/tokens - proxy: - base_url: https://${connectionConfig.subdomain}.zendesk.com - retry: - after: - - 'retry-after' - paginate: - type: link - limit_name_in_request: per_page - link_path_in_response_body: next_page - docs: https://nango.dev/docs/api-integrations/zendesk - setup_guide_url: https://nango.dev/docs/api-integrations/zendesk/how-to-register-your-own-zendesk-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/zendesk/connect - connection_config: - subdomain: - type: string - title: Zendesk Domain - description: The subdomain of your Zendesk account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .zendesk.com - prefix: https:// - doc_section: '#step-1-finding-your-subdomain' - -zendesk-api-key: - display_name: Zendesk (API Token) - categories: - - support - - ticketing - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.zendesk.com - headers: - authorization: 'Basic ${base64(${credentials.username}/token:${credentials.password})}' - retry: - after: - - 'retry-after' - verification: - method: GET - endpoints: - - /api/v2/users.json?per_page=1&page=1 - docs: https://nango.dev/docs/api-integrations/zendesk-api-key - docs_connect: https://nango.dev/docs/api-integrations/zendesk-api-key/connect - connection_config: - subdomain: - type: string - title: Zendesk Domain - description: The subdomain of your Zendesk account. - pattern: '^[a-z0-9_-]+$' - example: acme - suffix: .zendesk.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-subdomain' - credentials: - username: - type: string - title: Email Address - description: Your Zendesk account email address. - format: email - doc_section: '#step-3-generate-an-api-token' - password: - type: string - title: API Token - description: Your Zendesk API token. - example: 'SDMWuOoZ******************************9CMz' - pattern: '^[A-Za-z0-9]+$' - doc_section: '#step-3-generate-an-api-token' - -zendesk-sell: - display_name: Zendesk Sell - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://api.getbase.com/oauth2/authorize - token_url: https://api.getbase.com/oauth2/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.getbase.com - docs: https://nango.dev/docs/integrations/all/zendesk-sell - -zenefits: - display_name: Zenefits - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://secure.zenefits.com/oauth2/platform-authorize - token_url: https://secure.zenefits.com/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.zenefits.com - docs: https://nango.dev/docs/integrations/all/zenefits - -zigpoll: - display_name: Zigpoll - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://v1.zigpoll.com - headers: - authorization: ${apiKey} - verification: - method: GET - endpoints: - - /me - docs: https://nango.dev/docs/api-integrations/zigpoll - docs_connect: https://nango.dev/docs/api-integrations/zigpoll/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Zigpoll private API key. - format: uuid - example: 3f7b2d4e-****-****-****-************ - doc_section: '#step-1-get-your-api-token' - -zoho: - display_name: Zoho - categories: - - accounting - auth_mode: OAUTH2 - authorization_url: https://accounts.zoho.${connectionConfig.extension}/oauth/v2/auth || https://accounts.zoho.com/oauth/v2/auth - token_url: https://accounts.zoho.${connectionConfig.extension}/oauth/v2/token || ${connectionConfig.accounts-server}/oauth/v2/token - authorization_params: - prompt: consent - access_type: offline - redirect_uri_metadata: - - accounts-server - token_response_metadata: - - api_domain - proxy: - base_url: https://www.zohoapis.${connectionConfig.extension} || ${connectionConfig.api_domain} - paginate: - type: offset - response_path: data - offset_name_in_request: page - limit_name_in_request: per_page - post_connection_script: zohoPostConnection - docs: https://nango.dev/docs/integrations/all/zoho - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - accounts-server: - type: string - title: '' - description: '' - automated: true - -zoho-books: - display_name: Zoho Books - categories: - - accounting - alias: zoho - docs: https://nango.dev/docs/integrations/all/zoho-books - docs_connect: https://nango.dev/docs/integrations/all/zoho-books/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho Books account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - -zoho-crm: - display_name: Zoho CRM - categories: - - crm - alias: zoho - docs: https://nango.dev/docs/api-integrations/zoho-crm - setup_guide_url: https://nango.dev/docs/api-integrations/zoho-crm/how-to-register-your-own-zoho-crm-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/zoho-crm/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho CRM account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - -zoho-calendar: - display_name: Zoho Calendar - categories: - - productivity - alias: zoho - proxy: - base_url: https://calendar.zoho.com/api - docs: https://nango.dev/docs/integrations/all/zoho-calendar - docs_connect: https://nango.dev/docs/integrations/all/zoho-calendar/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho Calendar account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - -zoho-desk: - display_name: Zoho Desk - categories: - - support - - ticketing - alias: zoho - proxy: - base_url: https://desk.zoho.com/api - docs: https://nango.dev/docs/integrations/all/zoho-desk - docs_connect: https://nango.dev/docs/integrations/all/zoho-desk/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho Desk account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - -zoho-inventory: - display_name: Zoho Inventory - categories: - - e-commerce - alias: zoho - docs: https://nango.dev/docs/integrations/all/zoho-inventory - docs_connect: https://nango.dev/docs/integrations/all/zoho-inventory/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho Inventory account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - -zoho-invoice: - display_name: Zoho Invoice - categories: - - invoicing - alias: zoho - docs: https://nango.dev/docs/integrations/all/zoho-invoice - docs_connect: https://nango.dev/docs/integrations/all/zoho-invoice/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho Invoice account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - -zoho-mail: - display_name: Zoho Mail - categories: - - productivity - - communication - alias: zoho - proxy: - base_url: https://mail.zoho.${connectionConfig.extension} - docs: https://nango.dev/docs/integrations/all/zoho-mail - docs_connect: https://nango.dev/docs/integrations/all/zoho-mail/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho Mail account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - -zoho-bigin: - display_name: Zoho Bigin - categories: - - crm - alias: zoho - docs: https://nango.dev/docs/integrations/all/zoho-bigin - docs_connect: https://nango.dev/docs/integrations/all/zoho-bigin/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho Bigin account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - -zoho-people: - display_name: Zoho People - categories: - - hr - alias: zoho - proxy: - base_url: https://people.zoho.com - docs: https://nango.dev/docs/integrations/all/zoho-people - docs_connect: https://nango.dev/docs/integrations/all/zoho-people/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho People account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - -zoho-recruit: - display_name: Zoho Recruit - alias: zoho - categories: - - ats - proxy: - base_url: https://recruit.zoho.${connectionConfig.extension}/recruit - docs: https://nango.dev/docs/integrations/all/zoho-recruit - docs_connect: https://nango.dev/docs/integrations/all/zoho-recruit/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho Recruit account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - -zoom: - display_name: Zoom - categories: - - video - auth_mode: OAUTH2 - authorization_url: https://zoom.us/oauth/authorize - token_url: https://zoom.us/oauth/token - scope_separator: ',' - authorization_params: - response_type: code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.zoom.us/v2 - paginate: - type: cursor - cursor_path_in_response: next_page_token - cursor_name_in_request: next_page_token - limit_name_in_request: page_size - docs: https://nango.dev/docs/api-integrations/zoom - setup_guide_url: https://nango.dev/docs/api-integrations/zoom/how-to-register-your-own-zoom-api-oauth-app - -zoominfo: - display_name: ZoomInfo - categories: - - crm - - marketing - auth_mode: OAUTH2_CC - proxy: - retry: - after: - - 'x-ratelimit-reset' - base_url: https://api.zoominfo.com - token_url: https://api.zoominfo.com/authenticate - token_request_auth_method: custom - body_format: json - docs: https://nango.dev/docs/integrations/all/zoominfo - docs_connect: https://nango.dev/docs/integrations/all/zoominfo/connect - -snipe-it: - display_name: Snipe-IT - categories: - - productivity - - other - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.hostname}/api/ - headers: - authorization: Bearer ${apiKey} - accept: application/json - content-type: application/json - credentials_verification_script: snipeItCredentialsVerification - docs: https://nango.dev/docs/integrations/all/snipe-it - docs_connect: https://nango.dev/docs/integrations/all/snipe-it/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Snipe-IT API token - doc_section: '#step-1-create-an-api-token' - pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' - connection_config: - hostname: - type: string - title: Domain - format: hostname - description: Your Snipe-IT hostname (e.g., yourcompany) - example: yourcompany - suffix: .snipe-it.io - prefix: https:// - doc_section: '#step-2-finding-your-domain' - order: 1 - -zorus: - display_name: Zorus - categories: - - other - auth_mode: API_KEY - proxy: - base_url: https://developer.zorustech.com - headers: - authorization: Impersonation ${apiKey} - zorus-api-version: '1.0' - verification: - method: POST - headers: - content-type: application/json - endpoints: - - /api/customers/search - data: { 'page': 1, 'pageSize': 1 } - docs: https://nango.dev/docs/api-integrations/zorus - docs_connect: https://nango.dev/docs/api-integrations/zorus/connect - credentials: - apiKey: - type: string - title: API Token - description: The API token generated from the Zorus Portal. - doc_section: '#step-1-generating-your-api-token' - example: 1_a1b2c3d4-e5f6-7890-abcd-1234567890ab - pattern: '^[0-9]+_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$' - -zuora: - display_name: Zuora - categories: - - erp - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.subdomain}.zuora.com/oauth/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.subdomain}.zuora.com - retry: - after: - - 'ratelimit-reset' - docs: https://nango.dev/docs/integrations/all/zuora - docs_connect: https://nango.dev/docs/integrations/all/zuora/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The Subdomain to your Zuora Base URL - suffix: .zuora.com - prefix: https:// - example: rest.test - doc_section: '#step-1-finding-your-zuora-subdomain' - order: 1 +# yaml-language-server: $schema=./../../scripts/validation/providers/schema.json +1password-events: + display_name: 1Password (Events API) + categories: + - iam + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.domain} + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /api/v2/auth/introspect + docs: https://nango.dev/docs/api-integrations/1password-events + docs_connect: https://nango.dev/docs/api-integrations/1password-events/connect + connection_config: + domain: + type: string + title: Events API Domain + description: The regional Events API domain for your 1Password account. + order: 1 + enum: + - events.1password.com + - events.1password.ca + - events.1password.eu + credentials: + apiKey: + type: string + title: Bearer Token + description: Your 1Password Events Reporting bearer token + pattern: '^eyJ[a-zA-Z0-9_-]+\.ey[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+$' + example: eyJhbGciOiJF*************.*************CJ9.eyJ**************************************************.*********** + doc_section: '#step-2-generate-a-bearer-token' + +1password-scim: + display_name: 1Password (SCIM) + categories: + - iam + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.domain}/scim + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /Users + docs: https://nango.dev/docs/integrations/all/1password-scim + docs_connect: https://nango.dev/docs/integrations/all/1password-scim/connect + connection_config: + domain: + type: string + title: 1Password SCIM Bridge URL + description: The domain for your 1Password SCIM Bridge. Note this URL is a service hosted in your infrastructure so needs to be setup already by your IT team. Please see the instructions for more info. + example: scim.example.com + pattern: '^[a-zA-Z0-9.-]+$' + prefix: https:// + doc_section: '#step-2-get-your-scim-bridge-url' + credentials: + apiKey: + type: string + title: API Key + description: Your 1Password SCIM API Key + secret: true + doc_section: '#step-1-retrieve-your-1password-scim-api-key' + +1password-users: + display_name: 1Password (Users API) + categories: + - iam + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.domain}/v1beta1/users/oauth2/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.domain}/v1beta1/accounts/${connectionConfig.accountId} + docs: https://nango.dev/docs/api-integrations/1password-users + docs_connect: https://nango.dev/docs/api-integrations/1password-users/connect + connection_config: + domain: + type: string + title: API Domain + description: The regional API domain for your 1Password account. + enum: + - api.1password.com + - api.1password.ca + - api.1password.eu + order: 1 + accountId: + type: string + title: Account ID + description: Your 1Password account ID. + example: XLQMR47VZPBKJHSGWNCYFDE3T9 + pattern: '^[A-Z0-9]{26}$' + order: 2 + credentials: + client_id: + type: string + title: Client ID + description: Your 1Password OAuth application Client ID. + format: uuid + example: 5ab87915-2deb-429c-a1e2-8b0495900f45 + doc_section: '#step-3-obtain-your-client-credentials' + client_secret: + type: string + title: Client Secret + description: Your 1Password OAuth application Client Secret. + secret: true + doc_section: '#step-3-obtain-your-client-credentials' + +3cx: + display_name: 3CX + categories: + - communication + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.domain}/connect/token + token_params: + client_id: ${credentials.clientId} + client_secret: ${credentials.clientSecret} + grant_type: client_credentials + token_headers: + content-type: application/x-www-form-urlencoded + accept: application/json + token_response: + token: access_token + token_expires_in_ms: 3600000 + proxy: + base_url: https://${connectionConfig.domain}/xapi + docs: https://nango.dev/docs/api-integrations/3cx + docs_connect: https://nango.dev/docs/api-integrations/3cx/connect + credentials: + clientId: + type: string + title: Client ID + description: The Client ID from your 3CX API integration + doc_section: '#step-2-create-api-integration' + clientSecret: + type: string + title: API Key + description: The API Key generated when creating your 3CX API integration + secret: true + doc_section: '#step-2-create-api-integration' + connection_config: + domain: + type: string + title: 3CX Domain + description: Your 3CX instance domain + example: mycompany.3cx.us + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-1-find-your-3cx-domain' + +8x8: + display_name: 8x8 + categories: + - communication + auth_mode: OAUTH2_CC + token_url: https://api.8x8.com/oauth/v2/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.8x8.com + docs: https://nango.dev/docs/api-integrations/8x8 + docs_connect: https://nango.dev/docs/api-integrations/8x8/connect + credentials: + client_id: + type: string + title: Client ID + description: Your 8x8 API Client ID from the Admin Console + doc_section: '#step-1-obtaining-your-client-credentials' + client_secret: + type: string + title: Client Secret + description: Your 8x8 API Client Secret from the Admin Console + secret: true + doc_section: '#step-1-obtaining-your-client-credentials' + +absorb-lms: + display_name: Absorb LMS + categories: + - other + auth_mode: OAUTH2 + disable_pkce: true + authorization_url: https://${connectionConfig.portalRoute}/oauth/authorize + token_url: https://${connectionConfig.portalRoute}/oauth/token + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + authorization_params: + response_type: code + proxy: + base_url: https://${connectionConfig.portalRoute} + headers: + x-api-version: ${connectionConfig.apiVersion} + x-api-key: ${connectionConfig.restApiKey} + docs: https://nango.dev/docs/api-integrations/absorb-lms + docs_connect: https://nango.dev/docs/api-integrations/absorb-lms/connect + setup_guide_url: https://nango.dev/docs/api-integrations/absorb-lms/how-to-register-your-own-absorb-lms-api-oauth-app + connection_config: + portalRoute: + type: string + title: Hostname + description: The hostname of your Absorb LMS portal. + example: mycompany.myabsorb.com + prefix: https:// + format: hostname + order: 1 + doc_section: '#step-1-finding-your-portal-route' + restApiKey: + type: string + title: REST API Key + description: Your Absorb LMS REST API Private Key. + secret: true + order: 2 + doc_section: '#step-2-finding-your-rest-api-key' + apiVersion: + type: string + title: '' + description: '' + default_value: 'v1' + hidden: true + +accelo: + display_name: Accelo + categories: + - invoicing + - ticketing + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.api.accelo.com/oauth2/v0/authorize + token_url: https://${connectionConfig.subdomain}.api.accelo.com/oauth2/v0/token + scope_separator: ',' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.api.accelo.com + docs: https://nango.dev/docs/api-integrations/accelo + setup_guide_url: https://nango.dev/docs/api-integrations/accelo/how-to-register-your-own-accelo-api-oauth-app + connection_config: + subdomain: + type: string + title: Accelo Domain + description: The subdomain of your Accelo account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .api.accelo.com + prefix: https:// + +active-campaign: + display_name: ActiveCampaign + categories: + - marketing + - communication + auth_mode: API_KEY + proxy: + headers: + api-token: ${apiKey} + base_url: https://${connectionConfig.hostname}/api + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /3/users/me + docs: https://nango.dev/docs/integrations/all/active-campaign + docs_connect: https://nango.dev/docs/integrations/all/active-campaign/connect + connection_config: + hostname: + type: string + title: Hostname + description: The Hostname for your ActiveCampaign account + format: hostname + prefix: https:// + example: company.activehosted.com + doc_section: '#step-1-finding-your-hostname' + order: 1 + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your ActiveCampaign account + pattern: '^[a-f0-9]{72}$' + example: b4f1a7c9d8e56320a9db472fe6c8351f2e0a4d98b7f6c3e5d9a2f4701b3e8d6c3455abbe + doc_section: '#step-2-finding-your-api-key' + +acuity-scheduling: + display_name: Acuity Scheduling + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://acuityscheduling.com/oauth2/authorize + token_url: https://acuityscheduling.com/oauth2/token + default_scopes: + - api-v1 + proxy: + base_url: https://acuityscheduling.com/api/v1 + docs: https://nango.dev/docs/integrations/all/acuity-scheduling + +acumatica: + display_name: Acumatica + categories: + - erp + - accounting + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.instanceUrl}/identity/connect/token + token_params: + grant_type: password + username: ${connectionConfig.username} + password: ${connectionConfig.password} + proxy: + base_url: https://${connectionConfig.instanceUrl} + docs: https://nango.dev/docs/api-integrations/acumatica + docs_connect: https://nango.dev/docs/api-integrations/acumatica/connect + setup_guide_url: https://nango.dev/docs/api-integrations/acumatica/connect + connection_config: + instanceUrl: + type: string + title: Instance URL + description: The hostname of your Acumatica ERP instance. + format: hostname + example: mycompany.acumatica.com + prefix: https:// + doc_section: '#step-6-identify-your-instance-url' + order: 1 + username: + type: string + title: Username + description: The username of an Acumatica ERP user. + doc_section: '#step-7-enter-credentials-in-the-connect-ui' + order: 2 + password: + type: string + title: Password + description: The password for the specified Acumatica ERP username. + secret: true + doc_section: '#step-7-enter-credentials-in-the-connect-ui' + order: 3 + credentials: + client_id: + type: string + title: Client ID + description: The client ID assigned to your application, including the tenant suffix. + example: 88358B02-A48D-A50E-F710-39C1636C30F6@MyTenant + doc_section: '#step-5-save-to-activate' + client_secret: + type: string + title: Client Secret + description: The client secret created for your application in Acumatica ERP. + secret: true + doc_section: '#step-3-add-a-client-secret' + +addepar: + display_name: Addepar (OAuth) + categories: + - analytics + auth_mode: OAUTH2 + authorization_url: https://id.addepar.com/oauth2/authorize + disable_pkce: true + token_url: https://api.addepar.com/public/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + headers: + addepar-firm: ${connectionConfig.firmId} + retry: + after: + - 'x-ratelimit-retry-after' + base_url: https://api.addepar.com + docs: https://nango.dev/docs/integrations/all/addepar + docs_connect: https://nango.dev/docs/integrations/all/addepar/connect + connection_config: + firmId: + type: string + title: Firm ID + description: Your Addepar Firm ID + pattern: '^[0-9]+$' + doc_section: '#step-1-finding-your-firm-id' + +addepar-basic: + display_name: Addepar (Basic Auth) + categories: + - analytics + auth_mode: BASIC + proxy: + headers: + addepar-firm: ${connectionConfig.firmId} + retry: + after: + - 'x-ratelimit-retry-after' + base_url: https://${connectionConfig.subdomain}.addepar.com/api + docs: https://nango.dev/docs/integrations/all/addepar-basic + docs_connect: https://nango.dev/docs/integrations/all/addepar-basic/connect + credentials: + username: + type: string + title: API Key + description: Your Addepar API Key + example: 5ab87915-2deb-429c-a1e2-8b0495900f45 + format: uuid + doc_section: '#step-4-generating-an-api-key-and-secret' + password: + type: string + title: API Secret + description: Your Addepar API Secret + example: zidcISqfSGh05JsWwuY9ZdSCkXrhANHvCX0U0gkE + pattern: '^[A-Za-z0-9]{40}$' + doc_section: '#step-4-generating-an-api-key-and-secret' + connection_config: + subdomain: + type: string + title: Firm Domain + description: Your Addepar Firm domain + pattern: '^[a-z0-9_-]+$' + example: myfirm + order: 1 + doc_section: '#step-1-finding-your-firm-domain' + firmId: + type: string + title: Firm ID + description: Your Addepar Firm ID + pattern: '^[0-9]+$' + order: 2 + doc_section: '#step-2-finding-your-firm-id' + +adobe: + display_name: Adobe + categories: + - design + auth_mode: OAUTH2 + authorization_url: https://ims-na1.adobelogin.com/ims/authorize/v2 + token_url: https://ims-na1.adobelogin.com/ims/token/v3 + default_scopes: + - offline_access + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://ims-na1.adobelogin.com/ims + docs: https://nango.dev/docs/integrations/all/adobe + +adobe-umapi: + display_name: UMAPI (Adobe User Management API) + categories: + - other + auth_mode: OAUTH2_CC + token_url: https://ims-na1.adobelogin.com/ims/token/v2 + scope_separator: ',' + token_params: + grant_type: client_credentials + proxy: + headers: + x-api-key: ${connectionConfig.clientId} + retry: + after: + - 'retry-after' + base_url: https://usermanagement.adobe.io + docs: https://nango.dev/docs/integrations/all/adobe-umapi + post_connection_script: adobeUmapiPostConnection + docs_connect: https://nango.dev/docs/integrations/all/adobe-umapi/connect + connection_config: + clientId: + type: string + title: '' + description: '' + automated: true + +adobe-workfront: + display_name: Adobe Workfront + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.hostname}/integrations/oauth2/authorize + token_url: https://${connectionConfig.hostname}/integrations/oauth2/api/v1/token + authorization_method: header + body_format: json + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.hostname}/attask/api + docs: https://nango.dev/docs/integrations/all/adobe-workfront + docs_connect: https://nango.dev/docs/integrations/all/adobe-workfront/connect + connection_config: + hostname: + type: string + title: Hostname + prefix: https:// + pattern: '^[a-zA-Z0-9-]+\.my\.workfront(\.adobe)?\.com$' + description: The hostname of your Adobe Workfront account + example: acme.my.workfront.com + +adobe-commerce: + display_name: Adobe Commerce + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.storeDomain}/rest/${connectionConfig.storeCode} + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/api-integrations/adobe-commerce + docs_connect: https://nango.dev/docs/api-integrations/adobe-commerce/connect + connection_config: + storeDomain: + type: string + title: Store Domain + description: The domain of your Adobe Commerce store + format: hostname + prefix: https:// + example: yourstore.com + doc_section: '#step-1-finding-your-store-domain' + order: 1 + storeCode: + type: string + title: Store Code + description: The store code for your Adobe Commerce store + example: default + doc_section: '#step-2-finding-your-store-code' + order: 2 + credentials: + apiKey: + type: string + title: Access Token + example: 3pgsytnpxbyz0waujkw9qllcjb79s379 + pattern: '^[a-z0-9]{32}$' + description: Your Adobe Commerce access token + doc_section: '#step-3-obtaining-your-access-token' + +adp: + display_name: ADP + auth_mode: OAUTH2_CC + categories: + - hr + proxy: + base_url: https://api.adp.com + token_url: https://accounts.adp.com/auth/oauth/v2/token + token_params: + grant_type: client_credentials + require_client_certificate: true + docs: https://nango.dev/docs/integrations/all/adp + docs_connect: https://nango.dev/docs/integrations/all/adp/connect + credentials: + client_certificate: + type: string + title: Client Public Certificate + description: The public certificate (in PEM format) used for Mutual TLS (mTLS) authentication. + example: '-----BEGIN CERTIFICATE-----\\nMIIDdzCCAl+gAwIBAgIEUzZrZDANBgkqhkiG9w0BAQsFADBv\\n...\\n-----END CERTIFICATE-----' + pattern: '^-----BEGIN CERTIFICATE-----\s*([A-Za-z0-9+/=\s]+)\s*-----END CERTIFICATE-----$' + secret: true + doc_section: '#step-2-generating-the-private-key-and-certificate-signing-request' + client_private_key: + type: string + title: Client Private Key + description: The private key (in PEM format) associated with the client certificate, + example: '-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASC...\\n-----END PRIVATE KEY-----' + pattern: '^-----BEGIN PRIVATE KEY-----\s*([A-Za-z0-9+/=\s]+)\s*-----END PRIVATE KEY-----$' + secret: true + doc_section: '#step-2-generating-the-private-key-and-certificate-signing-request' + +adp-lyric: + alias: adp + display_name: ADP Lyric + categories: + - hr + docs: https://nango.dev/docs/integrations/all/adp-lyric + docs_connect: https://nango.dev/docs/integrations/all/adp-lyric/connect + +adp-run: + alias: adp + display_name: RUN Powered by ADP + categories: + - hr + docs: https://nango.dev/docs/integrations/all/adp-run + docs_connect: https://nango.dev/docs/integrations/all/adp-run/connect + +adp-workforce-now: + alias: adp + display_name: ADP Workforce Now + categories: + - hr + docs: https://nango.dev/docs/integrations/all/adp-workforce-now + docs_connect: https://nango.dev/docs/integrations/all/adp-workforce-now/connect + +adp-workforce-now-next-gen: + alias: adp + display_name: ADP Workforce Now Next Generation + categories: + - hr + docs: https://nango.dev/docs/integrations/all/adp-workforce-now-next-gen + docs_connect: https://nango.dev/docs/integrations/all/adp-workforce-now-next-gen/connect + +adyen: + display_name: Adyen + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://ca-${connectionConfig.environment}.adyen.com/ca/ca/oauth/connect.shtml + token_url: https://oauth-${connectionConfig.environment}.adyen.com/v1/token + scope_separator: ' ' + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.resource}-${connectionConfig.environment}.adyen.com + docs: https://nango.dev/docs/integrations/all/adyen + connection_config: + environment: + type: string + title: Environment + description: The environment to use. + enum: + - live + - test + resource: + type: string + title: Resource + description: The resource to use for your various requests + pattern: '^[a-z0-9_-]+$' + example: kyc + suffix: -(live|test).adyen.com + prefix: https:// + +adyntel: + display_name: Adyntel + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.adyntel.com + body: + api_key: ${apiKey} + email: ${connectionConfig.email} + verification: + method: POST + endpoints: + - /domain-keywords + headers: + content-type: application/json + data: + company_domain: example.com + docs: https://nango.dev/docs/api-integrations/adyntel + docs_connect: https://nango.dev/docs/api-integrations/adyntel/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key from your Adyntel dashboard. + example: hd-f66446a8**************-6 + pattern: '^hd-[a-f0-9]+-[a-z0-9]+$' + doc_section: '#step-1-obtain-your-api-key' + connection_config: + email: + type: string + title: Email + description: The login email address for your Adyntel account. + format: email + example: you@company.com + doc_section: '#step-2-find-your-email-address' + +ahrefs: + display_name: Ahrefs + categories: + - marketing + - analytics + auth_mode: OAUTH2 + authorization_url: https://app.ahrefs.com/web/oauth/authorize + token_url: https://ahrefs.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + body_format: form + proxy: + base_url: https://api.ahrefs.com + docs: https://nango.dev/docs/api-integrations/ahrefs + setup_guide_url: https://nango.dev/docs/api-integrations/ahrefs/how-to-register-your-own-ahrefs-api-oauth-app + +affinity: + display_name: Affinity (v1) + categories: + - crm + auth_mode: BASIC + proxy: + base_url: https://api.affinity.co + verification: + method: GET + endpoints: + - /auth/whoami + retry: + at: + - 'x-ratelimit-limit-user' + - 'x-ratelimit-limit-org-reset' + webhook_routing_script: affinityWebhookRouting + docs: https://nango.dev/docs/integrations/all/affinity + docs_connect: https://nango.dev/docs/integrations/all/affinity/connect + credentials: + username: + type: string + title: '' + description: '' + default_value: '' + hidden: true + password: + type: string + title: API Key + description: Your Affinity API Key + pattern: '^[A-Za-z0-9_-]+$' + example: 'nrlW2KR5m-qUCA-rTqKb_EUK1swERlenqn70KNMMrTM' + # https://api-docs.affinity.co/#introduction + # Affinity v1 uses basic auth with an api key + doc_section: '#step-1-generating-your-api-key' + +affinity-v2: + display_name: Affinity (v2) + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.affinity.co + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v2/auth/whoami + retry: + at: + - 'x-ratelimit-limit-user' + - 'x-ratelimit-limit-org-reset' + docs: https://nango.dev/docs/integrations/all/affinity-v2 + docs_connect: https://nango.dev/docs/integrations/all/affinity-v2/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Affinity account + pattern: '^[A-Za-z0-9_-]+$' + example: 'nrlW2KR5m-qUCA-rTqKb_EUK1swERlenqn70KNMMrTM' + doc_section: '#step-1-generating-your-api-key' + +agentline: + display_name: AgentLine + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://api.agentline.cloud + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v1/agents + docs: https://nango.dev/docs/api-integrations/agentline + docs_connect: https://nango.dev/docs/api-integrations/agentline/connect + credentials: + apiKey: + type: string + title: API Key + description: Your AgentLine API key. + pattern: '^sk_live_[a-zA-Z0-9_]+$' + doc_section: '#step-1-finding-your-api-key' + +agiloft: + display_name: Agiloft + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.hostname}/ewws/oauth + token_url: https://${connectionConfig.hostname}/ewws/otoken + token_params: + grant_type: authorization_code + proxy: + base_url: https://${connectionConfig.hostname} + docs: https://nango.dev/docs/api-integrations/agiloft + docs_connect: https://nango.dev/docs/api-integrations/agiloft/connect + setup_guide_url: https://nango.dev/docs/api-integrations/agiloft/how-to-register-your-own-agiloft-api-oauth-app + connection_config: + hostname: + type: string + title: Hostname + description: The hostname of your Agiloft instance. + format: hostname + prefix: https:// + example: example.agiloft.com + order: 1 + doc_section: '#step-1-find-your-hostname' + +agiloft-cc: + display_name: Agiloft (Client Credentials) + categories: + - productivity + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.hostname}/ewws/otoken + body_format: form + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.hostname} + docs: https://nango.dev/docs/api-integrations/agiloft-cc + docs_connect: https://nango.dev/docs/api-integrations/agiloft-cc/connect + connection_config: + hostname: + type: string + title: Hostname + description: The hostname of your Agiloft instance. + format: hostname + prefix: https:// + example: example.agiloft.com + order: 1 + doc_section: '#step-2-find-your-hostname' + credentials: + client_id: + type: string + title: Client ID + description: The Client ID from your Agiloft API application settings. + doc_section: '#step-1-create-an-api-application-and-get-your-credentials' + client_secret: + type: string + title: Client Secret + description: The Client Secret from your Agiloft API application settings. + secret: true + doc_section: '#step-1-create-an-api-application-and-get-your-credentials' + +aimfox: + display_name: Aimfox + categories: + - surveys + auth_mode: API_KEY + proxy: + base_url: https://api.aimfox.com/api + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v2/campaigns + docs: https://nango.dev/docs/integrations/all/aimfox + docs_connect: https://nango.dev/docs/integrations/all/aimfox/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Aimfox account + format: uuid + example: 123e4567-e89b-12d3-a456-426614174000 + doc_section: '#step-1-generating-your-api-key' + +aimfox-oauth: + display_name: Aimfox (OAuth) + categories: + - surveys + auth_mode: OAUTH2 + authorization_url: https://id.aimfox.com/realms/aimfox-prod/protocol/openid-connect/auth + token_url: https://id.aimfox.com/realms/aimfox-prod/protocol/openid-connect/token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.aimfox.com/api + docs: https://nango.dev/docs/integrations/all/aimfox-oauth + +aircall: + display_name: Aircall (OAuth) + categories: + - support + auth_mode: OAUTH2 + authorization_url: https://dashboard.aircall.io/oauth/authorize + token_url: https://api.aircall.io/v1/oauth/token + authorization_params: + response_type: code + scope: public_api + token_params: + grant_type: authorization_code + proxy: + base_url: https://api.aircall.io + retry: + at: + - 'x-aircallapi-reset' + paginate: + type: link + link_path_in_response_body: meta.next_page_link + response_path: results + docs: https://nango.dev/docs/integrations/all/aircall + +aircall-basic: + alias: aircall + display_name: Aircall (Basic Auth) + categories: + - support + auth_mode: BASIC + proxy: + base_url: https://api.aircall.io + retry: + at: + - 'x-aircallapi-reset' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/ping + paginate: + type: link + link_path_in_response_body: meta.next_page_link + response_path: results + docs_connect: https://nango.dev/docs/integrations/all/aircall-basic/connect + docs: https://nango.dev/docs/integrations/all/aircall-basic + credentials: + username: + type: string + title: API ID + description: The Application ID (API ID) for your Aircall account + pattern: '^[a-zA-Z0-9_-]+$' + doc_section: '#step-1-finding-your-admin-api-key-api-token-and-application-id-api-id' + password: + type: string + title: API Token + description: The Admin API Key (API Token) for your Aircall account + pattern: '^[a-zA-Z0-9_-]+$' + secret: true + doc_section: '#step-1-finding-your-admin-api-key-api-token-and-application-id-api-id' +airtable: + display_name: Airtable + categories: + - popular + - productivity + auth_mode: OAUTH2 + authorization_url: https://airtable.com/oauth2/v1/authorize + token_url: https://airtable.com/oauth2/v1/token + authorization_method: header + auth: + response_type: code + proxy: + base_url: https://api.airtable.com + webhook_routing_script: airtableWebhookRouting + docs: https://nango.dev/docs/api-integrations/airtable + setup_guide_url: https://nango.dev/docs/api-integrations/airtable/how-to-register-your-own-airtable-api-oauth-app + +airtable-pat: + display_name: Airtable (Personal Access Token) + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.airtable.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/airtable-pat + docs_connect: https://nango.dev/docs/integrations/all/airtable-pat/connect + credentials: + apiKey: + type: string + title: Personal Access Token + description: The Personal Access Token for your Airtable account + example: 'patoXxYzA1B2C3D4Ef.98a7b6c5d4e3f2g1h0i9j8k7l6m5n4o3p2q1r0s9t8u7v6w5x4y3z2a1b0cdef' + pattern: '^[a-zA-Z0-9\.]+$' + doc_section: '#step-1-generating-your-personal-access-token' + +autodesk: + display_name: Autodesk + categories: + - design + auth_mode: OAUTH2 + authorization_url: https://developer.api.autodesk.com/authentication/v2/authorize + token_url: https://developer.api.autodesk.com/authentication/v2/token + scope_separator: ' ' + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://developer.api.autodesk.com + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/autodesk + +autotask: + display_name: AutoTask + categories: + - support + - ticketing + auth_mode: API_KEY + webhook_routing_script: autotaskWebhookRouting + webhook_user_defined_secret: true + proxy: + base_url: https://${connectionConfig.subdomain}.autotask.net/atservicesrest + headers: + apiintegrationcode: ${connectionConfig.apiIntegrationCode} + username: ${connectionConfig.username} + secret: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1.0/Companies/entityinformation + docs: https://nango.dev/docs/integrations/all/autotask + docs_connect: https://nango.dev/docs/integrations/all/autotask/connect + connection_config: + subdomain: + type: string + title: AutoTask API Zone + description: The zone subdomain for your Autotask instance (e.g., webservices3, webservices1, etc.) + example: webservices3 + doc_section: '#step-1-finding-your-autotask-api-zone' + apiIntegrationCode: + type: string + title: API Integration Code + description: The tracking identifier assigned to your API-only user (27-character string) + example: ASHJKLFDKAHKASLFH85LSA905H + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-3-configure-the-api-user' + username: + type: string + title: API Username + description: The email address of your API-only user account + example: apiuser@example.com + format: email + doc_section: '#step-3-configure-the-api-user' + credentials: + apiKey: + type: string + title: API Secret + pattern: '^[A-Za-z0-9@#$~*]+$' + description: The secret for your API-only user account + doc_section: '#step-4-generate-api-secret' + +algolia: + display_name: Algolia + categories: + - search + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.APP_ID}.algolia.net + headers: + x-algolia-application-id: ${connectionConfig.APP_ID} + x-algolia-api-key: ${apiKey} + verification: + headers: + content-type: application/json + endpoints: + - /1/keys/${credentials.apiKey} + docs: https://nango.dev/docs/integrations/all/algolia + docs_connect: https://nango.dev/docs/integrations/all/algolia/connect + connection_config: + APP_ID: + type: string + title: Application ID + description: The application ID for your Algolia account + example: ERBSOWZO32 + pattern: '^[A-Z0-9]{10}$' + order: 1 + doc_section: '#step-1-finding-your-application-id' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Algolia account + example: c5c28261f9ade4e34891ccf761491b94 + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-2-finding-your-admin-api-key' + +altrata: + display_name: Altrata + categories: + - analytics + auth_mode: TWO_STEP + token_url: https://api-auth.altrata.com/oauth2/token?grant_type=client_credentials + body_format: form + token_headers: + authorization: Basic ${base64(${credentials.username}:${credentials.password})} + x-api-key: ${credentials.apiKey} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://${connectionConfig.hostname} + headers: + x-api-key: ${credentials.apiKey} + docs: https://nango.dev/docs/api-integrations/altrata + docs_connect: https://nango.dev/docs/api-integrations/altrata/connect + connection_config: + hostname: + type: string + title: Service Hostname + description: The Altrata service hostname to connect to. + example: events.altrata.com + format: hostname + pattern: '^(matching|profile|events|relationships)\.altrata\.com$' + order: 1 + doc_section: '#step-2-choose-a-service-hostname' + credentials: + apiKey: + type: string + title: API Key + description: Your Altrata API key. + secret: true + example: mN3pQv8wLc2jXs5rKt4bGy6uFd1eAh7Z******* + pattern: '^[A-Za-z0-9]+$' + doc_section: '#step-1-obtain-your-credentials' + username: + type: string + title: Username + description: Your Altrata account username. + example: john_doe + doc_section: '#step-1-obtain-your-credentials' + password: + type: string + title: Password + description: Your Altrata account password. + secret: true + doc_section: '#step-1-obtain-your-credentials' + +amazon: + display_name: Amazon + categories: + - dev-tools + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://www.amazon.com/ap/oa + token_url: https://api.amazon.${connectionConfig.extension}/auth/o2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.amazon.com + docs: https://nango.dev/docs/api-integrations/amazon + setup_guide_url: https://nango.dev/docs/api-integrations/amazon/how-to-register-your-own-amazon-api-oauth-app + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension for your Amazon account + example: com + pattern: '^[a-z.]+$' + +amazon-selling-partner: + display_name: Amazon Selling Partner + categories: + - dev-tools + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.domain}/apps/authorize/consent + token_url: https://api.amazon.com/auth/o2/token + authorization_code_param_in_callback: spapi_oauth_code + disable_pkce: true + authorization_params: + application_id: ${connectionConfig.applicationId} + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + redirect_uri_metadata: + - selling_partner_id + proxy: + base_url: https://${connectionConfig.subdomain}-${connectionConfig.region}.amazon.com || https://sellingpartnerapi-${connectionConfig.region}.amazon.com + headers: + x-amz-access-token: ${accessToken} + docs: https://nango.dev/docs/api-integrations/amazon-selling-partner + docs_connect: https://nango.dev/docs/api-integrations/amazon-selling-partner/connect + setup_guide_url: https://nango.dev/docs/api-integrations/amazon-selling-partner/how-to-register-your-own-amazon-selling-partner-api-oauth-app + connection_config: + applicationId: + type: string + title: Application ID + description: The unique identifier for your Amazon Selling Partner application. + example: 'amzn1.sellerapps.app.0bf296b5-36a6-4942-a13e-EXAMPLEfcd28' + pattern: '^[a-zA-Z0-9.-]+$' + doc_section: '#step-1-finding-your-app-id' + order: 1 + domain: + type: string + title: Authorization Domain + description: The domain representing the Amazon platform you are integrating with. + example: sellercentral.amazon.com + pattern: '^[a-z0-9.-]+\.amazon\.[a-z.]+$' + prefix: https:// + suffix: /apps + doc_section: '#step-2-finding-your-authorization-domain' + order: 2 + subdomain: + type: string + title: Proxy BaseUrl Subdomain + description: The subdomain prefix for the Amazon Selling Partner API endpoint. + doc_section: '#step-3-finding-your-proxy-baseurl-subdomain' + order: 3 + enum: + - sellingpartnerapi + - sandbox.sellingpartnerapi + region: + type: string + title: Proxy BaseUrl Region + description: The geographical region associated with the Amazon marketplace. + enum: + - na + - eu + - fe + doc_section: '#step-4-finding-your-proxy-baseurl-region' + order: 4 + +amazon-selling-partner-beta: + display_name: Amazon Selling Partner (Beta) + categories: + - dev-tools + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.domain}/apps/authorize/consent + token_url: https://api.amazon.com/auth/o2/token + authorization_code_param_in_callback: spapi_oauth_code + disable_pkce: true + authorization_params: + application_id: ${connectionConfig.applicationId} + version: beta + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + redirect_uri_metadata: + - selling_partner_id + proxy: + base_url: https://sandbox.sellingpartnerapi-${connectionConfig.region}.amazon.com + headers: + x-amz-access-token: ${accessToken} + docs: https://nango.dev/docs/api-integrations/amazon-selling-partner-beta + docs_connect: https://nango.dev/docs/api-integrations/amazon-selling-partner-beta/connect + setup_guide_url: https://nango.dev/docs/api-integrations/amazon-selling-partner-beta/how-to-register-your-own-amazon-selling-partner-beta-api-oauth-app + connection_config: + applicationId: + type: string + title: Application ID + description: The unique identifier for your Amazon Selling Partner application. + example: 'amzn1.sellerapps.app.0bf296b5-36a6-4942-a13e-EXAMPLEfcd28' + pattern: '^[a-zA-Z0-9.-]+$' + doc_section: '#step-1-finding-your-app-id' + order: 1 + domain: + type: string + title: Domain + description: The domain representing the Amazon platform you are integrating with. + example: sellercentral.amazon.com + pattern: '^[a-z0-9.-]+\.amazon\.[a-z.]+$' + prefix: https:// + suffix: /apps + doc_section: '#step-2-finding-your-authorization-domain' + order: 2 + region: + type: string + title: Proxy BaseUrl Region + description: The geographical region associated with the Amazon marketplace. + enum: + - na + - eu + - fe + doc_section: '#step-3-finding-your-proxy-baseurl-region' + order: 3 + +a-leads: + display_name: A-Leads + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.a-leads.co/gateway + headers: + x-api-key: ${apiKey} + docs: https://nango.dev/docs/integrations/all/a-leads + docs_connect: https://nango.dev/docs/integrations/all/a-leads/connect + credentials: + apiKey: + type: string + title: API Key + description: Your A-Leads API key + doc_section: '#step-1-obtain-your-api-key' + example: a3f8b2e1********************d9c4 + pattern: '^[a-f0-9]{32}$' + +anrok: + display_name: Anrok + categories: + - legal + auth_mode: API_KEY + proxy: + base_url: https://api.anrok.com + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/anrok + docs_connect: https://nango.dev/docs/integrations/all/anrok/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Anrok account + doc_section: '#step-1-finding-your-api-key' + +amplitude: + display_name: Amplitude (Event Streaming API) + categories: + - analytics + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.hostname} || https://amplitude.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/2/events/list + docs: https://nango.dev/docs/api-integrations/amplitude + docs_connect: https://nango.dev/docs/api-integrations/amplitude/connect + credentials: + username: + type: string + title: API Key + example: 64371a39e74ad915af75674c0696e356 + pattern: '^[a-f0-9]{32}$' + description: Your Amplitude API Key + password: + type: string + title: Secret Key + example: 6GhPfVz47PKJGSLcDDc9jL5E4Mn + description: Your Amplitude secret key + connection_config: + hostname: + type: string + title: Hostname + description: The hostname associated with your server residency. + optional: true + enum: + - amplitude.com + - analytics.eu.amplitude.com + +amplitude-mcp: + display_name: Amplitude (MCP US) + categories: + - analytics + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://mcp.amplitude.com/authorize + token_url: https://mcp.amplitude.com/token + registration_url: https://mcp.amplitude.com/register + default_scopes: + - offline_access + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://mcp.amplitude.com + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/amplitude-mcp + +amplitude-mcp-eu: + display_name: Amplitude (MCP EU) + categories: + - analytics + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://mcp.eu.amplitude.com/authorize + token_url: https://mcp.eu.amplitude.com/token + registration_url: https://mcp.eu.amplitude.com/register + default_scopes: + - offline_access + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://mcp.eu.amplitude.com + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/amplitude-mcp-eu + +anthropic: + display_name: Anthropic + categories: + - productivity + - dev-tools + - popular + auth_mode: API_KEY + proxy: + base_url: https://api.anthropic.com + headers: + x-api-key: ${apiKey} + anthropic-version: ${connectionConfig.version} + content-type: application/json + retry: + after: + - 'retry-after' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - v1/models + docs: https://nango.dev/docs/integrations/all/anthropic + connection_config: + version: + type: string + title: API Version + description: The version of the Anthropic API to use + pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}$' + example: '2023-06-01' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Anthropic account + +anthropic-admin: + display_name: Anthropic Administrator + categories: + - productivity + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.anthropic.com + headers: + x-api-key: ${apiKey} + anthropic-version: ${connectionConfig.version} + content-type: application/json + retry: + after: + - 'retry-after' + verification: + headers: + content-type: application/json + method: GET + endpoints: + - /v1/organizations/users + docs: https://nango.dev/docs/integrations/all/anthropic-admin + connection_config: + version: + type: string + title: API Version + description: The version of the Anthropic API to use + pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}$' + example: '2023-06-01' + credentials: + apiKey: + type: string + title: API Key + description: The Admin API key for your Anthropic account + +anvil: + display_name: Anvil + categories: + - legal + - productivity + auth_mode: BASIC + proxy: + base_url: https://app.useanvil.com + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/anvil + docs_connect: https://nango.dev/docs/api-integrations/anvil/connect + credentials: + username: + type: string + title: API Key + description: Your Anvil API key + pattern: '^[A-Za-z0-9]+$' + example: rj8T3fa************************* + doc_section: '#step-1-finding-your-api-key' + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +apaleo: + display_name: Apaleo + categories: + - erp + auth_mode: OAUTH2 + authorization_url: https://identity.apaleo.com/connect/authorize + token_url: https://identity.apaleo.com/connect/token + scope_separator: ' ' + token_params: + grant_type: authorization_code + authorization_params: + response_type: code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.apaleo.com + headers: + content-type: application/json + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/apaleo + +apify: + display_name: Apify + categories: + - dev-tools + - analytics + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.apify.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/apify + docs_connect: https://nango.dev/docs/integrations/all/apify/connect + credentials: + apiKey: + type: string + title: API Token + description: The API token for your Apify account + example: apify_api_***************************nt4w + pattern: '^apify_api_[A-Za-z0-9]+$' + doc_section: '#step-1-generating-your-api-key' + +apollo: + display_name: Apollo (API Key) + categories: + - marketing + auth_mode: API_KEY + proxy: + headers: + x-api-key: ${apiKey} + base_url: https://app.apollo.io/api + docs: https://nango.dev/docs/api-integrations/apollo + docs_connect: https://nango.dev/docs/api-integrations/apollo/connect + credentials_verification_script: apolloCredentialsVerification + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Apollo account + example: eh_3LUIFtj04rG4KF_FoFw + doc_section: '#step-1-finding-your-api-key' + +apollo-oauth: + display_name: Apollo (OAuth) + categories: + - marketing + auth_mode: OAUTH2 + authorization_url: https://app.apollo.io + token_url: https://app.apollo.io/api/v1/oauth/token + authorization_url_fragment: oauth/authorize + body_format: json + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://app.apollo.io/api + docs: https://nango.dev/docs/integrations/all/apollo-oauth + +apple-app-store: + display_name: Apple App Store + categories: + - e-commerce + auth_mode: APP_STORE + token_url: https://api.appstoreconnect.apple.com/v1/apps + authorization_params: + audience: appstoreconnect-v1 + proxy: + base_url: https://api.appstoreconnect.apple.com + docs: https://nango.dev/docs/integrations/all/apple-app-store + +apple-business-manager: + display_name: Apple Business Manager + categories: + - productivity + auth_mode: TWO_STEP + body_format: form + token_url: https://account.apple.com/auth/oauth2/v2/token + token_params: + grant_type: client_credentials + client_id: ${credentials.clientId} + client_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer + client_assertion: ${credentials.assertion} + scope: business.api + token_headers: + content-type: application/x-www-form-urlencoded + assertion: + type: jwt + key: ${assertionOption.privateKey} + lifetimeInSeconds: 15552000 + header: + alg: ES256 + kid: ${credentials.keyId} + payload: + iss: ${credentials.clientId} + sub: ${credentials.clientId} + aud: https://account.apple.com/auth/oauth2/v2/token + jti: ${random} + proxy: + base_url: https://api-business.apple.com + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/api-integrations/apple-business-manager + docs_connect: https://nango.dev/docs/api-integrations/apple-business-manager/connect + credentials: + clientId: + type: string + title: Client ID + description: The Client ID generated when you create an API account. + doc_section: '#step-2-note-your-credentials' + keyId: + type: string + title: Key ID + description: The Key ID generated when you create an API account. + doc_section: '#step-2-note-your-credentials' + assertion: + type: string + title: '' + description: '' + automated: true + assertion_option: + privateKey: + type: string + title: Private Key + description: The EC private key (PEM format) used to sign the client assertion JWT. + doc_section: '#step-1-create-an-api-account-and-generate-a-private-key' + +appstle-subscriptions: + display_name: Appstle Subscriptions + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://subscription-admin.appstle.com + headers: + x-api-key: ${apiKey} + docs: https://nango.dev/docs/integrations/all/appstle-subscriptions + docs_connect: https://nango.dev/docs/integrations/all/appstle-subscriptions/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Appstle Subscriptions API Key + secret: true + doc_section: '#step-1-finding-your-api-key' + example: lBfFAdbxUxyv6jYRgOmrEVNkijCKD10T + pattern: ^[a-zA-Z0-9]+$ + +asana: + display_name: Asana + categories: + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://app.asana.com/-/oauth_authorize + token_url: https://app.asana.com/-/oauth_token + token_params: + grant_type: authorization_code + auth: + response_type: code + default_scopes: + - default + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://app.asana.com + retry: + after: + - 'retry-after' + paginate: + type: cursor + cursor_path_in_response: next_page.offset + cursor_name_in_request: offset + response_path: data + limit_name_in_request: limit + docs: https://nango.dev/docs/api-integrations/asana + setup_guide_url: https://nango.dev/docs/api-integrations/asana/how-to-register-your-own-asana-api-oauth-app + +asana-mcp: + display_name: Asana (MCP) + categories: + - productivity + - ticketing + - mcp + auth_mode: MCP_OAUTH2 + client_registration: static + authorization_url: https://app.asana.com/-/oauth_authorize + token_url: https://app.asana.com/-/oauth_token + authorization_params: + response_type: code + resource: https://mcp.asana.com/v2 + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + default_scopes: + - default + proxy: + headers: + accept: application/json,text/event-stream + base_url: https://mcp.asana.com/ + docs: https://nango.dev/docs/api-integrations/asana-mcp + setup_guide_url: https://nango.dev/docs/api-integrations/asana-mcp/how-to-register-your-own-asana-mcp-oauth-app + +asana-scim: + display_name: Asana (SCIM API) + categories: + - productivity + - ticketing + auth_mode: API_KEY + proxy: + base_url: https://app.asana.com/api + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /1.0/scim/Users + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/asana-scim + docs_connect: https://nango.dev/docs/integrations/all/asana-scim/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Asana scim account + doc_section: '#step-1-finding-asana-api-key' + +ashby: + display_name: Ashby + categories: + - ats + - popular + auth_mode: BASIC + proxy: + base_url: https://api.ashbyhq.com + verification: + method: POST + headers: + content-type: application/json + endpoints: + - apiKey.info + docs: https://nango.dev/docs/integrations/all/ashby + docs_connect: https://nango.dev/docs/integrations/all/ashby/connect + credentials: + username: + type: string + title: API Key + description: The API Key of your Ashby account + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +atlas-so: + display_name: Atlas.so + categories: + - support + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.atlas.so/v1 + docs: https://nango.dev/docs/integrations/all/atlas-so + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Atlas.so account + +atlassian: + display_name: Atlassian + categories: + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://auth.atlassian.com/authorize + token_url: https://auth.atlassian.com/oauth/token + default_scopes: + - offline_access + authorization_params: + response_type: code + audience: api.atlassian.com + prompt: consent + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.atlassian.com + docs: https://nango.dev/docs/integrations/all/atlassian + +atlassian-admin: + display_name: Atlassian Cloud Admin + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.atlassian.com + retry: + at: + - 'x-ratelimit-reset' + headers: + authorization: Bearer ${apiKey} + connection_config: + organizationId: ${connectionConfig.organizationId} + docs: https://nango.dev/docs/integrations/all/atlassian-admin + docs_connect: https://nango.dev/docs/integrations/all/atlassian-admin/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Atlassian account + example: ATCTT3xFfGN0_a1B2-c3D4_E5F6-G7H8I9JKLMNOPQRSTUVWXYZ1234567890=DEADBEEF + pattern: '^ATCTT3xFfGN0[\w\-]+=[A-Z0-9]{8}$' + doc_section: '#step-1-generating-your-api-key' + connection_config: + organizationId: + type: string + title: Atlassian Organization Id + optional: true + description: The organization ID of your Atlassian account + pattern: '^[a-f0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$' + example: '9fa3d2b7-k9l3-4bq1-z3d8-7x1m0a9e2b76' + doc_section: '#step-1-generating-your-api-key' + +atlassian-government-cloud: + display_name: Atlassian Government Cloud + categories: + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://auth.atlassian-us-gov-mod.com/authorize + token_url: https://auth.atlassian-us-gov-mod.com/oauth/token + default_scopes: + - offline_access + authorization_params: + audience: api.atlassian-us-gov-mod.com + prompt: consent + proxy: + base_url: https://api.atlassian-us-gov-mod.com + connection_config: + subdomain: ${connectionConfig.subdomain} + retry: + at: + - 'x-ratelimit-reset' + post_connection_script: atlassianGovernmentCloudPostConnection + docs: https://nango.dev/docs/integrations/all/atlassian-government-cloud + docs_connect: https://nango.dev/docs/integrations/all/atlassian-government-cloud/connect + connection_config: + subdomain: + type: string + title: Subdomain + optional: true + description: The subdomain of your Atlassian Government Cloud account + pattern: '^[a-zA-Z0-9.-]+$' + example: acme + suffix: .atlassian-us-gov-mod.net + prefix: https:// + +atlassian-service-account-api-token: + display_name: Atlassian Service Account (API Token) + categories: + - dev-tools + auth_mode: BASIC + proxy: + base_url: https://api.atlassian.com + retry: + at: + - 'x-ratelimit-reset' + connection_config: + cloudId: ${connectionConfig.cloudId} + post_connection_script: atlassianServicAccountPostConnection + docs: https://nango.dev/docs/api-integrations/atlassian-service-account-api-token + docs_connect: https://nango.dev/docs/api-integrations/atlassian-service-account-api-token/connect + connection_config: + cloudId: + type: string + title: Cloud ID + description: Your Atlassian Cloud ID + example: '12345678-1234-1234-1234-123456789012' + format: uuid + doc_section: '#step-1-finding-your-cloud-id' + order: 1 + credentials: + username: + type: string + title: Service Account Email + description: The email address of your Atlassian service account + example: bot@serviceaccount.atlassian.com + format: email + doc_section: '#step-2-finding-your-service-account-email' + password: + type: string + title: API Token + description: Your Atlassian service account API token + secret: true + example: ATSTT3xFfGF07SUw*******************************RvxLUHWs8ZV58TfHI=610694C8 + pattern: '^[A-Za-z0-9_-]{40,}=[A-Fa-f0-9]{8}$' + doc_section: '#step-3-creating-an-api-token' + +atlassian-service-account-oauth2: + display_name: Atlassian Service Account (OAuth 2.0) + categories: + - dev-tools + auth_mode: OAUTH2_CC + token_url: https://auth.atlassian.com/oauth/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.atlassian.com + retry: + at: + - 'x-ratelimit-reset' + connection_config: + subdomain: ${connectionConfig.subdomain} + post_connection_script: atlassianServicAccountPostConnection + docs: https://nango.dev/docs/api-integrations/atlassian-service-account-oauth2 + docs_connect: https://nango.dev/docs/api-integrations/atlassian-service-account-oauth2/connect + connection_config: + subdomain: + type: string + title: Subdomain + optional: true + description: The subdomain of your Attlassian account + pattern: '^[a-zA-Z0-9.-]+$' + example: subdomain + suffix: .atlassian.net + prefix: https:// + doc_section: '#step-2-finding-your-subdomain' + credentials: + client_id: + type: string + title: Client ID + description: The OAuth 2.0 client ID from your service account credential + doc_section: '#step-1-creating-oauth-client-credentials' + client_secret: + type: string + title: Client Secret + description: The OAuth 2.0 client secret from your service account credential + secret: true + doc_section: '#step-1-creating-oauth-client-credentials' + +attention: + display_name: Attention + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.attention.tech + headers: + authorization: Bearer ${apiKey} + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/conversations?size=1 + docs: https://nango.dev/docs/api-integrations/attention + docs_connect: https://nango.dev/docs/api-integrations/attention/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Attention API key. + example: eyJhbGciOi***.eyJzdWIiOi***.xxxxxxxxxxxx + pattern: '^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$' + doc_section: '#step-1-obtaining-your-api-key' + +attio: + display_name: Attio + categories: + - crm + - popular + auth_mode: OAUTH2 + authorization_url: https://app.attio.com/authorize + token_url: https://app.attio.com/oauth/token + token_params: + grant_type: authorization_code + auth: + response_type: code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.attio.com + retry: + after: + - 'retry-after' + post_connection_script: attioPostConnection + webhook_routing_script: attioWebhookRouting + webhook_user_defined_secret: true + docs: https://nango.dev/docs/api-integrations/attio + setup_guide_url: https://nango.dev/docs/api-integrations/attio/how-to-register-your-own-attio-api-oauth-app + +attio-mcp: + display_name: Attio (MCP) + categories: + - crm + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://app.attio.com/oidc/authorize + token_url: https://app.attio.com/oidc/token + registration_url: https://app.attio.com/oauth/register + scope_separator: '+' + authorization_url_skip_encode: + - scopes + authorization_params: + response_type: code + resource: https://mcp.attio.com/mcp + registration_params: + response_types: + - code + grant_types: + - authorization_code + - refresh_token + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://mcp.attio.com + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/attio-mcp + +auth0: + display_name: Auth0 + categories: + - iam + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.auth0.com/authorize + token_url: https://${connectionConfig.subdomain}.auth0.com/oauth/token + authorization_params: + response_type: code + response_mode: query + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + docs: https://nango.dev/docs/integrations/all/auth0 + proxy: + base_url: https://${connectionConfig.subdomain}.auth0.com + connection_config: + subdomain: + type: string + title: Auth0 Domain + description: The subdomain of your Auth0 account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .auth0.com + prefix: https:// + +auth0-cc: + display_name: Auth0 (Client Credentials) + categories: + - iam + auth_mode: OAUTH2_CC + body_format: json + token_url: https://${connectionConfig.hostname}/oauth/token + token_params: + grant_type: client_credentials + audience: ${connectionConfig.audience} + organization: ${connectionConfig.organization} + docs: https://nango.dev/docs/integrations/all/auth0-cc + docs_connect: https://nango.dev/docs/integrations/all/auth0-cc/connect + proxy: + base_url: https://${connectionConfig.hostname} + connection_config: + hostname: + type: string + title: HostName + description: Your Auth0 host name + format: hostname + prefix: https:// + doc_section: '#step-2-finding-your-hostname' + audience: + type: string + title: Audience + description: The audience for the token + example: https://api.example.com/foobar + doc_section: '#step-3-finding-your-audience' + organization: + type: string + title: Organization + description: The organization name you want the request to be associated with + example: example + optional: true + doc_section: '#step-4-finding-your-organization' + +auvik: + display_name: Auvik + categories: + - support + auth_mode: BASIC + proxy: + base_url: https://auvikapi.${connectionConfig.region}.my.auvik.com + verification: + method: GET + endpoints: + - /v1/authentication/verify + credentials: + username: + type: string + title: User Name / Account Email + description: Auvik User Name (usually an individual user's email address) + doc_section: '#step-1-generate-an-api-key' + password: + type: string + title: API Key + description: Auvik API Key (separate from the user's password) + secret: true + # API key is a base64 encoded string + pattern: '^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{4}|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}={2})$' + example: 'aJ7EjSEDD+7+JqlQ1NtUXyY/3/05GGWwfF7vBbPd0Iy8HG1s' + doc_section: '#step-1-generate-an-api-key' + connection_config: + region: + type: string + title: Region + description: The region of your Auvik account (visible in your browser address bar when logging into the Auvik web UI). + doc_section: '#step-2-determine-your-region' + enum: + - us1 + - us2 + - eu1 + docs: https://nango.dev/docs/integrations/all/auvik + docs_connect: https://nango.dev/docs/integrations/all/auvik/connect + +avanan: + display_name: Avanan + categories: + - other + auth_mode: TWO_STEP + token_request_method: GET + token_url: https://${connectionConfig.subdomain}.avanan.net/v1.0/auth + token_headers: + x-av-app-id: ${credentials.appId} + x-av-req-id: ${random} + x-av-date: '${now:YYYY-MM-DDTHH:mm:ss}' + x-av-sig: '${sha256Hex(${base64(${random}${credentials.appId}${now:YYYY-MM-DDTHH:mm:ss}${credentials.secretKey})})}' + token_response: + token: '' + token_expires_in_ms: 3_600_000 + proxy: + base_url: https://${connectionConfig.subdomain}.avanan.net + headers: + x-av-app-id: ${credentials.appId} + x-av-token: ${accessToken} + x-av-req-id: ${random} + x-av-date: '${now:YYYY-MM-DDTHH:mm:ss}' + x-av-sig: '${sha256Hex(${base64(${random}${credentials.appId}${now:YYYY-MM-DDTHH:mm:ss}${endpoint}${credentials.secretKey})})}' + docs: https://nango.dev/docs/api-integrations/avanan + docs_connect: https://nango.dev/docs/api-integrations/avanan/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The Avanan API subdomain for your region. + order: 1 + doc_section: '#step-1-finding-your-subdomain' + enum: + - smart-api-production-1-us + - smart-api-production-1-eu + - smart-api-production-1-ca + - smart-api-production-5-ap + - smart-api-production-1-euw2 + - smart-api-production-1-mec1 + - smart-api-production-1-aps1 + credentials: + appId: + type: string + title: Client ID + description: Your Avanan Client ID from Avanan Support. + example: 9k8m****************ht3w + pattern: '^[a-z0-9]+$' + doc_section: '#step-2-getting-your-client-id-and-secret-key' + secretKey: + type: string + title: Secret Key + description: Your Avanan Secret Key from Avanan Support. + example: 3k9t****************************0uj5gtrpqlz8x2nvy + pattern: '^[a-z0-9]+$' + secret: true + doc_section: '#step-2-getting-your-client-id-and-secret-key' + +availity: + display_name: Availity + categories: + - other + auth_mode: OAUTH2_CC + token_url: https://api.availity.com/v1/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.availity.com + docs: https://nango.dev/docs/api-integrations/availity + docs_connect: https://nango.dev/docs/api-integrations/availity/connect + credentials: + client_id: + type: string + title: API Key + description: Your application API Key + doc_section: '#step-1-obtaining-your-client-credentials' + client_secret: + type: string + title: Secret + description: Your application Secret + secret: true + doc_section: '#step-1-obtaining-your-client-credentials' + +avalara: + display_name: Avalara + categories: + - legal + auth_mode: BASIC + proxy: + headers: + x-avalara-client: ${connectionConfig.avalaraClient} + content-type: application/json + base_url: https://rest.avatax.com/api/v2 + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /utilities/subscriptions + docs: https://nango.dev/docs/integrations/all/avalara + docs_connect: https://nango.dev/docs/integrations/all/avalara/connect + credentials: + username: + type: string + title: User Name / Account ID + description: Avalara User Name / Account ID + doc_section: '#step-1-finding-your-pair-keys' + password: + type: string + title: Avalara Password / License Key + description: Your Password / License Key + # https://developer.avalara.com/avatax/authentication-in-rest/ + # Avalara is using basic auth with combination of (username and password) + # or (Account ID and License Key) + doc_section: '#step-1-finding-your-pair-keys' + connection_config: + avalaraClient: + type: string + title: Avalara Client + description: The Avalara client for your Avalara account + doc_section: '#step-2-generating-an-avalara-client' + +avalara-sandbox: + display_name: Avalara (Sandbox) + categories: + - legal + auth_mode: BASIC + proxy: + headers: + x-avalara-client: ${connectionConfig.avalaraClient} + content-type: application/json + base_url: https://sandbox-rest.avatax.com/api/v2 + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /utilities/subscriptions + docs: https://nango.dev/docs/integrations/all/avalara-sandbox + docs_connect: https://nango.dev/docs/integrations/all/avalara-sandbox/connect + credentials: + username: + type: string + title: User Name / Account ID + description: Avalara User Name / Account ID + doc_section: '#step-1-finding-your-pair-keys' + password: + type: string + title: Password / License Key + description: Avalara Password / License Key + # https://developer.avalara.com/avatax/authentication-in-rest/ + # Avalara is using basic auth with combination of (username and password) + # or (Account ID and License Key) + doc_section: '#step-1-finding-your-pair-keys' + connection_config: + avalaraClient: + type: string + title: Avalara Client + description: The Avalara client for your Avalara account + doc_section: '#step-2-generating-an-avalara-client' + +avoma: + display_name: Avoma + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.avoma.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/users + docs: https://nango.dev/docs/integrations/all/avoma + docs_connect: https://nango.dev/docs/integrations/all/avoma/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Avoma account + pattern: '^[a-z0-9]{10,}:[a-z0-9]{10,}$' + example: '1awcbx0njh:02k6er2pld4q5irffn23' + doc_section: '#step-1-generating-your-api-key' + +axiom: + display_name: Axiom + categories: + - dev-tools + - analytics + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.axiom.co + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/api-integrations/axiom + docs_connect: https://nango.dev/docs/api-integrations/axiom/connect + connection_config: + subdomain: + type: string + title: Edge / region subdomain + description: The subdomain of the API you would wish to connect to. + enum: + - api + - us-east-1.aws.edge + - eu-central-1.aws.edge + order: 1 + doc_section: '#step-1-finding-your-subdomain' + credentials: + apiKey: + type: string + title: API Token + description: Your Axiom API token. + example: 'xaat-********-****-****-****-********8ec6' + pattern: '^xaat-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$' + doc_section: '#step-2-generating-your-api-token' + +aws: + display_name: AWS + categories: + - dev-tools + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.auth.${connectionConfig.extension}.amazoncognito.com/oauth2/authorize + token_url: https://${connectionConfig.subdomain}.auth.${connectionConfig.extension}.amazoncognito.com/oauth2/token + token_params: + grant_type: authorization_code + auth: + response_type: code + refresh_params: + grant_type: refresh_token + default_scopes: + - openid + proxy: + base_url: https://cognito-${apiSubdomain}.amazonaws.com + docs: https://nango.dev/docs/integrations/all/aws + connection_config: + subdomain: + type: string + title: Cognito Domain Prefix + description: The prefix of your Cognito User Pool domain. + pattern: '^[a-z0-9_-]+$' + example: my-app-pool + prefix: https:// + suffix: .auth + extension: + type: string + title: Cognito Region + description: The AWS region where your Cognito User Pool is hosted. + example: eu-north-1 + pattern: '^[a-z0-9-]+$' + prefix: auth. + suffix: .amazoncognito.com + apiSubdomain: + type: string + title: Cognito API Subdomain + description: The Cognito API subdomain. + example: idp.eu-north-1 + pattern: '^[a-z0-9.-]+$' + suffix: .amazonaws.com + prefix: https://cognito- + +aws-iam: + display_name: AWS IAM + categories: + - dev-tools + - iam + auth_mode: BASIC + proxy: + base_url: https://iam.amazonaws.com + headers: + authorization: '${awsSigV4(${credentials.username}, ${credentials.password}, us-east-1, iam)}' + x-amz-date: '${now:YYYYMMDDTHHmmss[Z]}' + connection_config: + region: ${connectionConfig.region} + retry: + at: + - 'x-ratelimit-reset' + credentials_verification_script: awsIamCredentialsVerification + docs: https://nango.dev/docs/api-integrations/aws-iam + docs_connect: https://nango.dev/docs/api-integrations/aws-iam/connect + credentials: + username: + type: string + title: AWS Access Key ID + description: Your Access Key ID + doc_section: '#step-1-finding-your-pair-keys' + password: + type: string + title: AWS Secret Access Key + description: Your Secret Access Key + # https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html + # aws-iam is using basic auth with AWS Access Key ID and Secret Access Key + doc_section: '#step-1-finding-your-pair-keys' + connection_config: + region: + type: string + title: Region + description: The region to where your AWS account is hosted + example: us-east-1 + pattern: '^[a-z0-9-]+$' + doc_section: '#step-2-finding-your-region-host' + +aws-inspector2: + display_name: AWS Inspector2 + categories: + - dev-tools + auth_mode: BASIC + proxy: + base_url: https://inspector2.${connectionConfig.region}.amazonaws.com + headers: + authorization: '${awsSigV4(${credentials.username}, ${credentials.password}, ${connectionConfig.region}, inspector2, inspector2.${connectionConfig.region}.amazonaws.com)}' + x-amz-date: '${now:YYYYMMDDTHHmmss[Z]}' + retry: + at: + - 'x-ratelimit-reset' + credentials_verification_script: awsIamCredentialsVerification + docs: https://nango.dev/docs/api-integrations/aws-inspector2 + docs_connect: https://nango.dev/docs/api-integrations/aws-inspector2/connect + credentials: + username: + type: string + title: AWS Access Key ID + description: Your Access Key ID. + password: + type: string + title: AWS Secret Access Key + description: Your Secret Access Key. + connection_config: + region: + type: string + title: Region + description: The AWS region where Inspector2 is enabled. + example: us-east-1 + prefix: https://inspector2. + suffix: .amazonaws.com + pattern: '^[a-z0-9-]+$' + +aws-multi-service: + display_name: AWS Multi-Service + categories: + - dev-tools + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.service}.${connectionConfig.region}.amazonaws.com + headers: + authorization: '${awsSigV4(${credentials.username}, ${credentials.password}, ${connectionConfig.region}, ${connectionConfig.service}, ${connectionConfig.service}.${connectionConfig.region}.amazonaws.com)}' + x-amz-date: '${now:YYYYMMDDTHHmmss[Z]}' + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/api-integrations/aws-multi-service + docs_connect: https://nango.dev/docs/api-integrations/aws-multi-service/connect + credentials: + username: + type: string + title: AWS Access Key ID + description: Your Access Key ID. + example: AKIAI***MPLE + pattern: '^[A-Za-z0-9]+$' + password: + type: string + title: AWS Secret Access Key + description: Your Secret Access Key. + example: wJalr***EKEY + pattern: '^[A-Za-z0-9+/]+$' + connection_config: + service: + type: string + title: AWS Service + description: The AWS service you want to connect to. + example: athena + pattern: '^[a-z0-9-]+$' + order: 2 + region: + type: string + title: Region + description: The AWS region where the service is available. + example: us-east-1 + pattern: '^[a-z0-9-]+$' + order: 1 + +aws-scim: + display_name: AWS (SCIM) + categories: + - dev-tools + - iam + auth_mode: API_KEY + proxy: + base_url: ${connectionConfig.scimEndpoint} + headers: + authorization: Bearer ${apiKey} + accept: application/json + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /Users + docs: https://nango.dev/docs/integrations/all/aws-scim + docs_connect: https://nango.dev/docs/integrations/all/aws-scim/connect + credentials: + apiKey: + type: string + title: SCIM Access Token + description: The SCIM Access Token generated from your AWS IAM Identity Center + example: 878374852-dea1-47d5-9ae0-4d00a0bdbb13:ff7d4f04-7385-4add-befe-a9ed18341d0d:l6uepDQrHfNOiOYXZ7HYZL8hlvsYHSG7Cnx104tkRLmDbO8l/p5GxLv6Id5BCLicmjeKvhrlqrPvL6VMcAnJS6oitQrz3ZiZr18rnybzyISRlyjxktYtIK1R80YJXBH6U7NSvwGsu5gDbUZDGlCDeh+FFhL8tmUuHytvxuhz3jNhsh&8X9xiLBg=:ICn/+PhEST+8/pizxTmoA0DW9JcQTL4EVRh0z6DpJwQ4vFQ+iwAxNjh16SHdUovAJyMjT+TPDwI8gN63DLE+9EV+lcV+i2H/OTDE4x7L18WRz3ndMf/4dY98mJ41qRYBgh63Pi8PdXkAex2l8HJLMkzjjPirN+8DCBfPVKK+z/nCc04RXWIz6XOmqwgB1sV5jwfAxPhuV6vqgVosoSngSw7Y2Zon70PiI5UbTTZffF6QWFU7i9b3dgMMDAH6f9vm11EB6YpJt/XC74L1pDvKXiSzhel7b7dYzGvrXK0rN29cnjn0o58VYCOgk9c05p/nRsEaSs2Y/v7BqgxXUvI+Aw== + pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}:[A-Za-z0-9+/]+=*:[A-Za-z0-9+/]+=*$' + doc_section: '#step-2-setting-up-automatic-provisioning' + connection_config: + scimEndpoint: + type: string + title: SCIM Endpoint + description: The SCIM Endpoint mentioned in the AWS IAM Identity Center + example: 'https://scim.ap-south-1.amazonaws.com/lSweb811432-ac8a-4a86-8332-f29hha4f5650/scim/v2' + format: uri + pattern: '^https://.*\/.*\/scim\/v2$' + order: 1 + doc_section: '#step-2-setting-up-automatic-provisioning' + +aws-sigv4: + display_name: AWS SigV4 Proxy + categories: + - storage + auth_mode: AWS_SIGV4 + proxy: + base_url: https://${connectionConfig.service}.${connectionConfig.region}.amazonaws.com + docs: https://nango.dev/docs/integrations/all/aws-sigv4 + docs_connect: https://nango.dev/docs/integrations/all/aws-sigv4/connect + credentials: + role_arn: + type: string + title: IAM Role ARN + description: The ARN of the IAM role your customer creates via your onboarding template. + example: arn:aws:iam::123456789012:role/NangoAccessRole + doc_section: '#step-1-provide-the-role-arn' + connection_config: + region: + type: string + title: AWS Region (optional) + description: Override the region if it differs from the integration default set by the integration owner. + example: us-east-1 + optional: true + doc_section: '#step-3-enter-connection-details' + service: + type: string + title: '' + description: '' + automated: true + integration_config: + service: + type: string + title: AWS Service + description: The AWS service requests are signed for (e.g. s3, execute-api). + example: s3 + pattern: ^[a-z0-9-]+$ + order: 1 + defaultRegion: + type: string + title: Default AWS Region + description: Region used to sign requests when a connection does not specify one. + example: us-east-1 + optional: true + order: 2 + stsMode: + type: string + title: STS Mode + description: How temporary AWS credentials are issued. + enum: + - builtin + - custom + default_value: builtin + optional: true + order: 3 + awsAccessKeyId: + type: string + title: AWS Access Key ID + description: Access key for the IAM principal Nango uses to call STS AssumeRole. + secret: true + optional: true + visible_when: + field: stsMode + equals: builtin + order: 4 + awsSecretAccessKey: + type: string + title: AWS Secret Access Key + description: Secret access key paired with the access key ID above. + secret: true + optional: true + visible_when: + field: stsMode + equals: builtin + order: 5 + stsEndpointUrl: + type: string + title: STS Endpoint URL + description: HTTPS endpoint that issues temporary AWS credentials. + format: uri + pattern: ^https:// + example: https://sts.example.com/assume + optional: true + visible_when: + field: stsMode + equals: custom + order: 6 + stsAuthType: + type: string + title: STS Auth Type + description: How Nango authenticates to the custom STS endpoint. + enum: + - none + - api_key + - basic + default_value: none + optional: true + visible_when: + field: stsMode + equals: custom + order: 7 + stsAuthHeader: + type: string + title: STS Auth Header + description: Header name used to send the API key to the custom STS endpoint. + default_value: x-api-key + optional: true + visible_when: + field: stsAuthType + equals: api_key + order: 8 + stsApiKey: + type: string + title: STS API Key + description: API key value sent to the custom STS endpoint. + secret: true + visible_when: + field: stsAuthType + equals: api_key + order: 9 + stsAuthUsername: + type: string + title: STS Username + description: Username for basic auth to the custom STS endpoint. + optional: true + visible_when: + field: stsAuthType + equals: basic + order: 10 + stsAuthPassword: + type: string + title: STS Password + description: Password for basic auth to the custom STS endpoint. + secret: true + visible_when: + field: stsAuthType + equals: basic + order: 11 + +azure-blob-storage: + categories: + - storage + display_name: Azure Blob Storage + alias: microsoft + default_scopes: + - offline_access + - https://storage.azure.com/.default + proxy: + base_url: https://${connectionConfig.accountName}.blob.core.windows.net + headers: + x-ms-version: ${connectionConfig.version} || 2025-05-05 + docs: https://nango.dev/docs/integrations/all/azure-blob-storage + docs_connect: https://nango.dev/docs/integrations/all/azure-blob-storage/connect + connection_config: + accountName: + type: string + title: Account Name + description: The name of the Azure Storage account you want to connect to. + example: nangoStorage + doc_section: '#step-1-finding-your-account-name' + version: + type: string + title: '' + description: '' + automated: true + +azure-devops: + display_name: Azure DevOps + categories: + - dev-tools + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.organizationUrl} + docs: https://nango.dev/docs/integrations/all/azure-devops + docs_connect: https://nango.dev/docs/integrations/all/azure-devops/connect + # Azure DevOps returns a 202 when the credentials are invalid, + # so we need to explicitly check for this and return respective error message + credentials_verification_script: azureDevopsCredentialsVerification + connection_config: + organizationUrl: + type: string + title: Organization URL + description: The URL of your Azure DevOps organization + example: dev.azure.com/myorg or myorg.visualstudio.com + doc_section: '#step-1-finding-your-organization-url' + prefix: https:// + credentials: + username: + type: string + title: '' + description: '' + default_value: '' + hidden: true + password: + type: string + title: Personal Access Token + description: The Personal Access Token of your Azure DevOps account + doc_section: '#step-2-creating-a-personal-access-token' + +bamboohr: + display_name: BambooHR (OAuth) + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.bamboohr.com/authorize.php + token_url: https://${connectionConfig.subdomain}.bamboohr.com/token.php + authorization_params: + response_type: code + request: authorize + token_params: + grant_type: authorization_code + request: token + refresh_params: + grant_type: refresh_token + request: token + proxy: + base_url: https://api.bamboohr.com/api/gateway.php/${connectionConfig.subdomain} + docs: https://nango.dev/docs/api-integrations/bamboohr + setup_guide_url: https://nango.dev/docs/api-integrations/bamboohr/how-to-register-your-own-bamboohr-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/bamboohr/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of your BambooHR account + pattern: '^[a-z0-9_-]+$' + example: acme + suffix: .bamboohr.com + prefix: https:// + order: 1 + +bamboohr-basic: + display_name: BambooHR (Basic Auth) + categories: + - hr + auth_mode: BASIC + proxy: + base_url: https://api.bamboohr.com/api/gateway.php/${connectionConfig.subdomain} + verification: + headers: + content-type: application/json + method: GET + endpoints: + - /v1/meta/fields + docs: https://nango.dev/docs/integrations/all/bamboohr-basic + docs_connect: https://nango.dev/docs/integrations/all/bamboohr-basic/connect + connection_config: + subdomain: + type: string + title: BambooHR Domain + description: The subdomain of your BambooHR account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .bamboohr.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-subdomain' + credentials: + username: + type: string + title: API key + description: The API Key of your BambooHR account + pattern: '^[a-f0-9]{40}$' + example: 59d783083fb25565aba21744e6bba90de8634de0 + secret: true + doc_section: '#step-2-finding-your-api-key' + password: + type: string + title: Password + description: Password + # https://documentation.bamboohr.com/docs/getting-started + # Bamboo HR is using basic auth with an api key + default_value: x + hidden: true + +basecamp: + display_name: Basecamp + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://launchpad.37signals.com/authorization/new + token_url: https://launchpad.37signals.com/authorization/token + authorization_params: + type: web_server + token_params: + type: web_server + refresh_params: + type: refresh + proxy: + base_url: https://3.basecampapi.com/${connectionConfig.accountId} + headers: + user-agent: ${connectionConfig.appDetails} || App (support@nango.dev) + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/basecamp + docs_connect: https://nango.dev/docs/integrations/all/basecamp/connect + post_connection_script: basecampPostConnection + connection_config: + appDetails: + type: string + title: App Details + description: The details of your app + automated: true + accountId: + type: string + title: Account ID + description: Your Account ID + optional: true + example: '5899981' + pattern: '^[0-9]+$' + doc_section: '#step-1-finding-your-account-id' + +battlenet: + display_name: Battle.net + categories: + - gaming + auth_mode: OAUTH2 + authorization_url: https://oauth.battle.${connectionConfig.extension}/authorize + token_url: https://oauth.battle.${connectionConfig.extension}/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://${connectionConfig.apiDomain} + docs: https://nango.dev/docs/integrations/all/battlenet + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Battle.net account. + enum: + - com + - cn + - net + order: 1 + apiDomain: + type: string + title: API Domain + description: The domain to where you will access your API. + enum: + - us.api.blizzard.com + - eu.api.blizzard.com + - kr.api.blizzard.com + - tw.api.blizzard.com + - gateway.battlenet.com.cn + +beehiiv: + display_name: Beehiiv + categories: + - communication + - marketing + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.beehiiv.com/v2/publications/${connectionConfig.publicationId} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /posts + docs: https://nango.dev/docs/integrations/all/beehiiv + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Beehiiv account + example: 8ab3sjxqvHzyUnP9JhvlfT6C0wsbgr5XQrpaZZjxJkYBPy6sntvT1M2Lk94VQeRb + pattern: '^[a-zA-Z0-9]{64}$' + connection_config: + publicationId: + type: string + title: Publication Id + description: The prefixed ID of the publication object + example: pub_a3d1b49e-2a5d-4f4b-97c8-8f32e1d2f7b9 + pattern: '^(pub_[0-9a-fA-F\-]+)$' + +bettercontact: + display_name: BetterContact + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://app.bettercontact.rocks + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /api/v2/account + docs: https://nango.dev/docs/api-integrations/bettercontact + docs_connect: https://nango.dev/docs/api-integrations/bettercontact/connect + credentials: + apiKey: + type: string + title: API Key + description: Your BetterContact API key + example: f1a9b2c3d4e5f6g7h8i9j0 + pattern: '^[a-z0-9]+$' + doc_section: '#step-1-generating-your-api-key' + +bliro: + display_name: Bliro + categories: + - communication + auth_mode: OAUTH2_CC + body_format: json + token_url: https://accounts.bliro.io/oauth/token + token_params: + grant_type: client_credentials + audience: https://api.bliro.io + proxy: + base_url: https://api.bliro.io + docs: https://nango.dev/docs/api-integrations/bliro + docs_connect: https://nango.dev/docs/api-integrations/bliro/connect + credentials: + client_id: + type: string + title: Client ID + description: Your Bliro client application Client ID. + doc_section: '#step-1-creating-a-client-application' + client_secret: + type: string + title: Client Secret + description: Your Bliro client application Client Secret. + secret: true + doc_section: '#step-1-creating-a-client-application' + +bigchange: + display_name: BigChange + categories: + - productivity + auth_mode: OAUTH2_CC + token_url: https://api.bigchange.com/auth/tokens + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.bigchange.com + headers: + customer-id: ${connectionConfig.customer_id} + docs: https://nango.dev/docs/api-integrations/bigchange + docs_connect: https://nango.dev/docs/api-integrations/bigchange/connect + connection_config: + customer_id: + type: string + title: BigChange Customer ID + description: Your numeric BigChange Customer ID. + example: '5690' + pattern: '^[0-9]+$' + doc_section: '#step-2-find-your-bigchange-customer-id' + credentials: + client_id: + type: string + title: Client ID + description: Your BigChange Partner API client_id. + client_secret: + type: string + title: Client Secret + description: Your BigChange Partner API client_secret. + secret: true + +bigcommerce: + display_name: BigCommerce + categories: + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://login.bigcommerce.com/oauth2/authorize + token_url: https://login.bigcommerce.com/oauth2/token + scope_separator: ' ' + authorization_params: + response_type: code + context: stores/${connectionConfig.storeHash} + account_uuid: ${connectionConfig.accountUuid} + token_params: + context: stores/${connectionConfig.storeHash} + grant_type: authorization_code + proxy: + base_url: https://api.bigcommerce.com/stores/${connectionConfig.storeHash} + docs: https://nango.dev/docs/integrations/all/bigcommerce + connection_config: + storeHash: + type: string + title: Store Hash + description: The store hash of your BigCommerce account + pattern: '^[a-zA-Z0-9]+$' + accountUuid: + type: string + title: Account UUID + description: The account UUID of your BigCommerce account + format: uuid + example: 123e4567-e89b-12d3-a456-426614174000 + +bill-sandbox: + display_name: Bill (Connect API Sandbox) + categories: + - payment + auth_mode: BILL + token_url: https://gateway.stage.bill.com/connect/v3/login + proxy: + base_url: https://gateway.stage.bill.com/connect + docs: https://nango.dev/docs/integrations/all/bill-sandbox + docs_connect: https://nango.dev/docs/integrations/all/bill-sandbox/connect + +bill: + display_name: Bill (Connect API) + categories: + - payment + auth_mode: BILL + token_url: https://gateway.prod.bill.com/connect/v3/login + proxy: + base_url: https://gateway.prod.bill.com/connect + docs: https://nango.dev/docs/integrations/all/bill + +bing-webmasters: + display_name: Bing Webmasters + categories: + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://www.bing.com/webmasters/oauth/authorize + token_url: https://www.bing.com/webmasters/oauth/token + refresh_url: https://www.bing.com/webmasters/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_token_params: + grant_type: refresh_token + proxy: + base_url: https://www.bing.com/webmaster/api.svc/json + docs: https://nango.dev/docs/api-integrations/bing-webmasters + setup_guide_url: https://nango.dev/docs/api-integrations/bing-webmasters/how-to-register-your-own-bing-webmasters-api-oauth-app + +bitbucket: + display_name: Bitbucket + categories: + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://bitbucket.org/site/oauth2/authorize + token_url: https://bitbucket.org/site/oauth2/access_token + proxy: + base_url: https://api.bitbucket.org + docs: https://nango.dev/docs/integrations/all/bitbucket + +bitdefender: + display_name: Bitdefender + categories: + - other + auth_mode: BASIC + proxy: + base_url: ${connectionConfig.ACCESS_URL} + retry: + after: + - 'retry-after' + credentials_verification_script: bitdefenderCredentialsVerification + docs: https://nango.dev/docs/integrations/all/bitdefender + docs_connect: https://nango.dev/docs/integrations/all/bitdefender/connect + credentials: + username: + type: string + title: API Key + description: The API Key of your Bitdefender account + doc_section: '#step-1-finding-your-api-key' + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + connection_config: + ACCESS_URL: + type: string + title: Access URL + description: The access URL of your Bitdefender account + example: https://api.bitdefender.com + format: uri + pattern: '^https://.*' + doc_section: '#step-1-finding-your-api-key' + +bitly: + display_name: Bitly + categories: + - marketing + - social + auth_mode: OAUTH2 + authorization_url: https://bitly.com/oauth/authorize + token_url: https://api-ssl.bitly.com/oauth/access_token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://api-ssl.bitly.com + docs: https://nango.dev/docs/integrations/all/bitly + +blackbaud: + display_name: Blackbaud + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://app.blackbaud.com/oauth/authorize + token_url: https://oauth2.sky.blackbaud.com/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.sky.blackbaud.com + docs: https://nango.dev/docs/integrations/all/blackbaud + +blackbaud-basic: + display_name: Blackbaud (Basic Auth) + categories: + - crm + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.hostName} + headers: + content-type: application/soap+xml; charset=utf-8 + docs: https://nango.dev/docs/integrations/all/blackbaud-basic + docs_connect: https://nango.dev/docs/integrations/all/blackbaud-basic + connection_config: + hostName: + type: string + title: Host Name + description: Your Blackbaud host name + example: https://altrurig01bo3.blackbaudhosting.com + pattern: '^https?:\/\/[a-z0-9.-]+(:\d+)?(\/.*)?$' + order: 1 + doc_section: '#step-1-finding-your-host-name' + credentials: + username: + type: string + title: Username + description: Your Username + doc_section: '#step-3-finding-your-username' + password: + type: string + title: Password + description: Your Password + doc_section: '#step-2-finding-your-password' + +blandai: + display_name: BlandAI + categories: + - support + auth_mode: API_KEY + proxy: + base_url: https://api.bland.ai + headers: + authorization: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - v1/calls + docs: https://nango.dev/docs/integrations/all/blandai + credentials: + apiKey: + type: string + title: API Key + description: The API key for your BlandAI account + +bird: + display_name: Bird + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.bird.com + headers: + authorization: AccessKey ${apiKey} + connection_config: + workspaceId: ${connectionConfig.workspaceId} + docs: https://nango.dev/docs/api-integrations/bird + docs_connect: https://nango.dev/docs/api-integrations/bird/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of your Bird API instance + example: api + suffix: .bird.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-subdomain' + workspaceId: + type: string + title: Workspaces Id + description: The Workspaces Id of your Bird + format: uuid + order: 2 + example: 332bb273-0caf-4240-a5b6-8046b5d3074f + doc_section: '#step-3-finding-your-workspace-id' + credentials: + apiKey: + type: string + title: Access Key + description: Your Bird access key + example: 6BPC******************Rzh3F4x + pattern: '^[A-Za-z0-9]+$' + doc_section: '#step-2-creating-an-access-key' + +boldsign: + display_name: BoldSign + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://account.boldsign.com/connect/authorize + token_url: https://account.boldsign.com/connect/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.boldsign.com + docs: https://nango.dev/docs/integrations/all/boldsign + +boondmanager: + display_name: BoondManager + categories: + - erp + auth_mode: OAUTH2 + authorization_url: https://ui.boondmanager.com/api/oauth2/authorize + token_url: https://ui.boondmanager.com/api/oauth2/token + proxy: + base_url: https://ui.boondmanager.com/api + docs: https://nango.dev/docs/api-integrations/boondmanager + setup_guide_url: https://nango.dev/docs/api-integrations/boondmanager/how-to-register-your-own-boondmanager-api-oauth-app + +box: + display_name: Box + categories: + - knowledge-base + - storage + auth_mode: OAUTH2 + authorization_url: https://account.box.com/api/oauth2/authorize + token_url: https://api.box.com/oauth2/token + proxy: + base_url: https://api.box.com + docs: https://nango.dev/docs/api-integrations/box + setup_guide_url: https://nango.dev/docs/api-integrations/box/how-to-register-your-own-box-api-oauth-app + +booking-com: + display_name: Booking.com + categories: + - e-commerce + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.environmentType}-xml.booking.com + docs: https://nango.dev/docs/integrations/all/booking-com + connection_config: + environmentType: + type: string + title: Environment Type + description: The environment type for your various requests. + enum: + - secure-supply + - supply + credentials: + username: + type: string + title: Machine Account Username + description: The username for your Booking.com machine account + password: + type: string + title: Machine Account Password + description: The password for your Booking.com machine account + +braintree: + display_name: Braintree + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://api.braintreegateway.com/oauth/connect + token_url: https://api.braintreegateway.com/oauth/access_tokens + scope_separator: ',' + authorization_method: header + body_format: json + token_params: + grant_type: authorization_code + redirect_uri_metadata: + - merchantId + proxy: + base_url: https://api.braintreegateway.com + docs: https://nango.dev/docs/integrations/all/braintree + +braintree-sandbox: + display_name: Braintree (Sandbox) + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://api.sandbox.braintreegateway.com/oauth/connect + token_url: https://api.sandbox.braintreegateway.com/oauth/access_tokens + scope_separator: ',' + authorization_method: header + body_format: json + token_params: + grant_type: authorization_code + redirect_uri_metadata: + - merchantId + proxy: + base_url: https://api.sandbox.braintreegateway.com + docs: https://nango.dev/docs/integrations/all/braintree-sandbox + +braze: + display_name: Braze + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://rest.${connectionConfig.instanceUrl} + headers: + authorization: Bearer ${apiKey} + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/integrations/all/braze + docs_connect: https://nango.dev/docs/integrations/all/braze/connect + connection_config: + instanceUrl: + type: string + title: Instance URL + description: The REST API URL of your Braze instance + example: iad-02.braze.com + format: hostname + prefix: https://rest. + order: 1 + doc_section: '#step-1-finding-your-instance-url' + credentials: + apiKey: + type: string + title: API Key + description: The API key to your Braze account + doc_section: '#step-2-finding-your-api-key' + +brevo-api-key: + display_name: Brevo + categories: + - marketing + auth_mode: API_KEY + proxy: + headers: + api-key: ${apiKey} + base_url: https://api.brevo.com/v3 + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /account + docs: https://nango.dev/docs/integrations/all/brevo-api-key + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Brevo account + +breezy-hr: + display_name: Breezy HR + categories: + - hr + - ats + auth_mode: TWO_STEP + body_format: json + token_url: https://api.breezy.hr/v3/signin + token_params: + email: ${credentials.email} + password: ${credentials.password} + token_headers: + content-type: application/json + token_response: + token: access_token + proxy: + base_url: https://api.breezy.hr + headers: + authorization: ${accessToken} + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/integrations/all/breezy-hr + docs_connect: https://nango.dev/docs/integrations/all/breezy-hr/connect + credentials: + email: + type: string + title: Email + description: The email address associated with your Breezy HR account + format: email + doc_section: '#step-1-finding-your-credentials' + password: + type: string + title: Password + description: The password for your Breezy HR account + secret: true + doc_section: '#step-1-finding-your-credentials' + +brex: + display_name: Brex (OAuth) + categories: + - banking + auth_mode: OAUTH2 + authorization_url: https://accounts-api.brex.com/oauth2/default/v1/authorize + token_url: https://accounts-api.brex.com/oauth2/default/v1/token + default_scopes: + - openid + - offline_access + proxy: + base_url: https://platform.brexapis.com + docs: https://nango.dev/docs/api-integrations/brex + setup_guide_url: https://nango.dev/docs/api-integrations/brex/how-to-register-your-own-brex-oauth-app + +brex-api-key: + display_name: Brex (API Key) + categories: + - banking + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://platform.brexapis.com + docs: https://nango.dev/docs/api-integrations/brex-api-key + docs_connect: https://nango.dev/docs/api-integrations/brex-api-key/connect + credentials: + apiKey: + type: string + title: API Token + description: The API Token to your Brex account + example: bxt_vRUwQT3snBmA1IDVq5iK1kXc4N0bhxr377z4 + pattern: '^bxt_[a-zA-Z0-9]+$' + doc_section: '#step-1-finding-your-api-token' + +brex-staging: + display_name: Brex (Staging OAuth) + categories: + - banking + auth_mode: OAUTH2 + authorization_url: https://accounts-api.staging.brexapps.com/oauth2/default/v1/authorize + token_url: https://accounts-api.staging.brexapps.com/oauth2/default/v1/token + proxy: + base_url: https://platform.staging.brexapps.com + docs: https://nango.dev/docs/api-integrations/brex-staging + setup_guide_url: https://nango.dev/docs/api-integrations/brex-staging/how-to-register-your-own-brex-staging-oauth-app + +brightcrowd: + display_name: BrightCrowd + categories: + - social + auth_mode: OAUTH2_CC + token_url: https://bcb-staging.auth.us-east-1.amazoncognito.com/oauth2/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.brightcrowd.com/partner + paginate: + type: cursor + cursor_path_in_response: nextPageToken + cursor_name_in_request: pageToken + docs: https://nango.dev/docs/integrations/all/brightcrowd + docs_connect: https://nango.dev/docs/integrations/all/brightcrowd/connect + +builder-io-private: + display_name: Builder.io (Private) + categories: + - dev-tools + - design + - cms + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.domain} + headers: + authorization: Bearer ${apiKey} + verification: + method: POST + headers: + content-type: application/json + endpoints: + - /api/v1/write/page + docs: https://nango.dev/docs/api-integrations/builder-io-private + docs_connect: https://nango.dev/docs/api-integrations/builder-io-private/connect + connection_config: + domain: + type: string + title: Domain + description: The domain used to access your Builder.io write API. + example: builder.io + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-api-domain' + credentials: + apiKey: + type: string + title: API Key + description: The private key for your Builder.io account. + pattern: '^bpk-[a-f0-9]+$' + example: bpk-**************************** + doc_section: '#step-2-finding-your-api-key' + +builder-io-public: + display_name: Builder.io (Public) + categories: + - dev-tools + - design + - cms + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.domain} + query: + apiKey: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v1/content/page + docs: https://nango.dev/docs/api-integrations/builder-io-public + docs_connect: https://nango.dev/docs/api-integrations/builder-io-public/connect + connection_config: + domain: + type: string + title: Domain + description: The domain used to access your Builder.io content API. + example: cdn.builder.io + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-api-domain' + credentials: + apiKey: + type: string + title: API Key + description: The public api key for your Builder.io account. + pattern: '^[a-zA-Z0-9]+$' + example: bb209fb71eh2412dbe0114bdae18fd15 + doc_section: '#step-2-finding-your-api-key' + +buildium: + display_name: Buildium + categories: + - accounting + - crm + - payment + auth_mode: API_KEY + proxy: + base_url: https://api.buildium.com + headers: + x-buildium-client-id: ${connectionConfig.clientId} + x-buildium-client-secret: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/rentals + docs: https://nango.dev/docs/integrations/all/buildium + docs_connect: https://nango.dev/docs/integrations/all/buildium/connect + connection_config: + clientId: + type: string + title: Client ID + description: Your API Key Client ID + pattern: '^[a-f0-9-]+$' + example: a228f0e7-b4a3-4150-b9ae-8552fc2880d3 + doc_section: '#step-2-finding-your-client-id-and-secret' + order: 1 + credentials: + apiKey: + type: string + title: Secret + description: The Secret for your Buildium account + pattern: '^[A-Za-z0-9+/]+$' + example: uOq2p+xlgpFdijfV/HqY+EvYpZKHRwlyhGuAVbJIxXs + doc_section: '#step-2-finding-your-client-id-and-secret' + +builtwith: + display_name: BuiltWith + categories: + - dev-tools + - analytics + - crm + - marketing + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://api.builtwith.com + query: + KEY: ${apiKey} + docs: https://nango.dev/docs/integrations/all/builtwith + docs_connect: https://nango.dev/docs/integrations/all/builtwith/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your BuiltWith account + example: 1bc32cba-a5d6-438a-bbcc-af312f560a3c + format: uuid + doc_section: '#step-1-finding-your-api-key' + +buffer: + display_name: Buffer + categories: + - marketing + - social + auth_mode: OAUTH2 + authorization_url: https://auth.buffer.com/auth + token_url: https://auth.buffer.com/token + scope_separator: ' ' + authorization_params: + response_type: code + prompt: consent + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + default_scopes: + - offline_access + proxy: + base_url: https://api.buffer.com + docs: https://nango.dev/docs/api-integrations/buffer + setup_guide_url: https://nango.dev/docs/api-integrations/buffer/how-to-register-your-own-buffer-oauth-app + +bullhorn: + display_name: Bullhorn + categories: + - hr + - ats + auth_mode: OAUTH2 + authorization_url: https://auth-west.bullhornstaffing.com/oauth/authorize + token_url: https://auth-west.bullhornstaffing.com/oauth/token + disable_pkce: true + authorization_params: + response_type: code + username: ${connectionConfig.username} + password: ${connectionConfig.password} + action: Login + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: ${connectionConfig.restUrl} + headers: + bhresttoken: ${accessToken} + post_connection_script: bullhornPostConnection + token_response_metadata: + - restUrl + refresh_token_response_metadata: + - restUrl + docs: https://nango.dev/docs/integrations/all/bullhorn + docs_connect: https://nango.dev/docs/integrations/all/bullhorn/connect + connection_config: + restUrl: + type: string + title: '' + description: '' + automated: true + username: + type: string + title: Username + description: Your API Username + doc_section: '#step-1-obtain-your-api-credentials' + password: + type: string + title: Password + description: Your API Password + secret: true + doc_section: '#step-1-obtain-your-api-credentials' + +cal-com-v1: + display_name: Cal.com (v1) + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.cal.com/v1 + query: + apiKey: ${apiKey} + retry: + at: + - 'x-ratelimit-reset' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /me + docs: https://nango.dev/docs/integrations/all/cal-com-v1 + docs_connect: https://nango.dev/docs/integrations/all/cal-com-v1/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Cal.com account + pattern: '^cal_[a-zA-Z0-9_]+$' + example: cal_xxxxxx + doc_section: '#step-1-finding-your-api-key' +cal-com-v2: + display_name: Cal.com (v2) + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.cal.com/v2 + headers: + authorization: Bearer ${apiKey} + paginate: + type: cursor + cursor_name_in_request: cursor + cursor_path_in_response: data.data.nextCursor + limit_name_in_request: limit + retry: + at: + - 'x-ratelimit-reset' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /me + webhook_routing_script: calComWebhookRouting + webhook_user_defined_secret: true + webhook_allowed_query_params: + - nangoConnectionId + docs: https://nango.dev/docs/api-integrations/cal-com-v2 + docs_connect: https://nango.dev/docs/api-integrations/cal-com-v2/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Cal.com account + pattern: '^cal_[a-zA-Z0-9_]+$' + example: cal_xxxxxx + doc_section: '#step-1-finding-your-api-key' + +cal-com-oauth: + display_name: Cal.com (OAuth) + categories: + - productivity + auth_mode: OAUTH2 + body_format: json + authorization_url: https://app.cal.com/auth/oauth2/authorize + token_url: https://api.cal.com/v2/auth/oauth2/token + disable_pkce: true + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.cal.com + retry: + at: + - 'x-ratelimit-reset' + webhook_routing_script: calComWebhookRouting + webhook_user_defined_secret: true + webhook_allowed_query_params: + - nangoConnectionId + docs: https://nango.dev/docs/api-integrations/cal-com-oauth + setup_guide_url: https://nango.dev/docs/api-integrations/cal-com-oauth/how-to-register-your-own-cal-com-oauth-app + +calendly: + display_name: Calendly + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://auth.calendly.com/oauth/authorize + token_url: https://auth.calendly.com/oauth/token + authorization_params: + response_type: code + proxy: + base_url: https://api.calendly.com + paginate: + type: link + link_path_in_response_body: pagination.next_page + retry: + at: + - 'x-ratelimit-reset' + token_response_metadata: + - owner + post_connection_script: calendlyPostConnection + webhook_routing_script: calendlyWebhookRouting + webhook_user_defined_secret: true + docs: https://nango.dev/docs/api-integrations/calendly + setup_guide_url: https://nango.dev/docs/api-integrations/calendly/how-to-register-your-own-calendly-api-oauth-app + +callrail: + display_name: Callrail + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.callrail.com + headers: + authorization: Token token=${apiKey} + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v3/a.json + docs_connect: https://nango.dev/docs/integrations/all/callrail/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Callrail account + pattern: '^[a-f0-9]{32}$' + example: '4f3c12efb9659a0b5c123b568745dbf9' + doc_section: '#step-1-finding-your-api-key' + docs: https://nango.dev/docs/integrations/all/callrail + +canny: + display_name: Canny + categories: + - support + auth_mode: API_KEY + proxy: + base_url: https://canny.io/api/v1 + query: + apiKey: ${apiKey} + verification: + method: POST + headers: + content-type: application/json + endpoints: + - /boards/list + docs: https://nango.dev/docs/integrations/all/canny + docs_connect: https://nango.dev/docs/integrations/all/canny/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Canny account + example: a1f5937c-82df-bd29-4e3a-7b6fda8c54d1 + pattern: '^[a-zA-Z0-9-]+$' + doc_section: '#step-1-finding-your-api-key' + +candis: + display_name: Candis + categories: + - accounting + auth_mode: OAUTH2 + authorization_url: https://id.my.candis.io/auth/realms/candis/protocol/openid-connect/auth + token_url: https://id.my.candis.io/auth/realms/candis/protocol/openid-connect/token + token_request_auth_method: basic + scope_separator: ' ' + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.candis.io + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/candis + setup_guide_url: https://nango.dev/docs/api-integrations/candis/how-to-register-your-own-candis-oauth-app + post_connection_script: candisPostConnection + +canva: + display_name: Canva + categories: + - design + auth_mode: OAUTH2 + authorization_url: https://www.canva.com/api/oauth/authorize + token_url: https://api.canva.com/rest/v1/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.canva.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /rest/v1/users/me + docs: https://nango.dev/docs/integrations/all/canva + token_request_auth_method: basic + +canva-mcp: + display_name: Canva (MCP) + categories: + - design + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://mcp.canva.com/authorize + token_url: https://mcp.canva.com/token + registration_url: https://mcp.canva.com/register + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://mcp.canva.com + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/canva-mcp + +canvas-lms: + display_name: Canvas LMS + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.hostname}/login/oauth2/auth + token_url: https://${connectionConfig.hostname}/login/oauth2/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.hostname} + docs: https://nango.dev/docs/api-integrations/canvas-lms + setup_guide_url: https://nango.dev/docs/api-integrations/canvas-lms/how-to-register-your-own-canvas-lms-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/canvas-lms/connect + connection_config: + hostname: + type: string + title: Canvas Install URL + description: The base URL of your Canvas instance + example: canvas.instructure.com + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-canvas-install-url' + +canva-scim: + display_name: Canva (SCIM API) + categories: + - design + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://www.canva.com/_scim + headers: + authorization: Bearer ${apiKey} + accept: application/json + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/Users + docs: https://nango.dev/docs/integrations/all/canva-scim + docs_connect: https://nango.dev/docs/integrations/all/canva-scim/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Canva scim account + doc_section: '#step-1-finding-canva-api-key' + +certn: + display_name: Certn + categories: + - legal + auth_mode: API_KEY + proxy: + base_url: https://api.certn.co + headers: + authorization: Bearer ${apiKey} + paginate: + type: link + link_path_in_response_body: next + response_path: results + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v2/teams + docs: https://nango.dev/docs/integrations/all/certn + docs_connect: https://nango.dev/docs/integrations/all/certn + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Certn account + doc_section: '#step-1-creating-an-api-key' + +certn-partner: + display_name: Certn Partner + categories: + - legal + auth_mode: OAUTH2_CC + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.certn.co + paginate: + type: offset + offset_name_in_request: page + response_path: data + limit_name_in_request: limit + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v2/teams + docs: https://nango.dev/docs/integrations/all/certn-partner + +chargebee: + display_name: Chargebee + categories: + - payment + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.chargebee.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v2/business_entities + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/chargebee + docs_connect: https://nango.dev/docs/integrations/all/chargebee/connect + connection_config: + subdomain: + type: string + title: Chargebee Domain + description: The subdomain of your Chargebee account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .chargebee.com + prefix: https:// + doc_section: '#step-1-creating-an-api-key' + credentials: + username: + type: string + title: API Key + description: The API key for your Chargebee account + pattern: '^[a-zA-Z0-9_-]+$' + secret: true + password: + type: string + title: Password + description: Password + # https://apidocs.chargebee.com/docs/api/auth?lang=curl + # Chargebee is using basic auth with an api key + default_value: '' + hidden: true + +chatarmin: + display_name: Chatarmin + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://api.chatarmin.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /api/public/contacts?limit=1 + docs: https://nango.dev/docs/api-integrations/chatarmin + docs_connect: https://nango.dev/docs/api-integrations/chatarmin/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Chatarmin API key. + +chattermill: + display_name: Chattermill + categories: + - support + - analytics + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.chattermill.com + headers: + authorization: Bearer ${apiKey} + accept: application/json + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/projects + docs: https://nango.dev/docs/integrations/all/chattermill + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Chattermill account + connection_config: + subdomain: + type: string + title: Chattermill subdomain + description: The subdomain for your api requests. + enum: + - app + - api + - backend + +checkhq: + display_name: Check + categories: + - accounting + auth_mode: API_KEY + proxy: + base_url: https://api.checkhq.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/checkhq + docs_connect: https://nango.dev/docs/integrations/all/checkhq/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your CheckHQ account + doc_section: '#step-1-finding-check-api-token' + +checkr-partner: + display_name: Checkr Partner + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://partners.checkr.com/authorize/${connectionConfig.client_id} + token_url: https://api.checkr.com/oauth/tokens + disable_pkce: true + token_params: + grant_type: authorization_code + proxy: + retry: + at: + - 'x-ratelimit-reset' + base_url: https://api.checkr.com + token_response_metadata: + - checkr_account_id + webhook_routing_script: checkrPartnerWebhookRouting + post_connection_script: checkrPartnerPostConnection + docs: https://nango.dev/docs/integrations/all/checkr-partner + connection_config: + client_id: + type: string + title: Client ID + description: The client ID of your Checkr Partner account + +checkr-partner-staging: + display_name: Checkr Partner (Staging) + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://partners.checkrhq-staging.net/authorize/${connectionConfig.client_id} + token_url: https://api.checkr-staging.com/oauth/tokens + disable_pkce: true + token_params: + grant_type: authorization_code + proxy: + retry: + at: + - 'x-ratelimit-reset' + base_url: https://api.checkr-staging.com + token_response_metadata: + - checkr_account_id + webhook_routing_script: checkrPartnerWebhookRouting + post_connection_script: checkrPartnerPostConnection + docs: https://nango.dev/docs/integrations/all/checkr-partner-staging + connection_config: + client_id: + type: string + title: Client ID + description: The client ID of your Checkr Partner account + +checkout-com: + display_name: Checkout.com + categories: + - payment + auth_mode: OAUTH2_CC + token_url: https://access.checkout.com/connect/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + headers: + content-type: application/json + accept: application/json + base_url: https://api.checkout.com + docs: https://nango.dev/docs/integrations/all/checkout-com + docs_connect: https://nango.dev/docs/integrations/all/checkout-com/connect + +checkout-com-sandbox: + display_name: Checkout.com (Sandbox) + categories: + - payment + auth_mode: OAUTH2_CC + token_url: https://access.sandbox.checkout.com/connect/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + headers: + content-type: application/json + accept: application/json + base_url: https://api.sandbox.checkout.com + docs: https://nango.dev/docs/integrations/all/checkout-com-sandbox + docs_connect: https://nango.dev/docs/integrations/all/checkout-com-sandbox/connect + +chorus: + display_name: Chorus + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://chorus.ai + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v1/users/me + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/chorus + docs_connect: https://nango.dev/docs/integrations/all/chorus/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Chorus account + doc_section: '#step-1-generating-your-chorus-api-key' + +cin7-core: + display_name: Cin7 Core + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://inventory.dearsystems.com/externalapi + headers: + api-auth-accountid: ${connectionConfig.accountId} + api-auth-applicationkey: ${apiKey} + verification: + method: GET + endpoints: + - /v2/me + docs: https://nango.dev/docs/api-integrations/cin7-core + docs_connect: https://nango.dev/docs/api-integrations/cin7-core/connect + connection_config: + accountId: + type: string + title: Account ID + description: Your Cin7 Core Account ID. + doc_section: '#step-1-find-your-account-id-and-api-application-key' + example: a1b2c3d4-****-****-****-ef1234567890 + format: uuid + credentials: + apiKey: + type: string + title: API Application Key + description: Your Cin7 Core API Application Key. + secret: true + pattern: '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$' + doc_section: '#step-1-find-your-account-id-and-api-application-key' + example: 6d6f4999-****-****-****-4e4ed450df0f + +circle-so: + display_name: Circle.so + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://app.circle.so + headers: + authorization: Token ${apiKey} + docs: https://nango.dev/docs/integrations/all/circle-so + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Circle.so account + +circleback-mcp: + display_name: Circleback (MCP) + categories: + - productivity + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://app.circleback.ai/api/oauth/authorize + token_url: https://app.circleback.ai/api/oauth/access-token + registration_url: https://app.circleback.ai/api/oauth/register + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://app.circleback.ai/api/ + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/circleback-mcp + +clari-copilot: + display_name: Clari Copilot + categories: + - marketing + auth_mode: API_KEY + proxy: + headers: + x-api-key: ${apiKey} + x-api-password: ${connectionConfig.API_PASSWORD} + base_url: https://rest-api.copilot.clari.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /calls + docs: https://nango.dev/docs/integrations/all/clari-copilot + connection_config: + API_PASSWORD: + type: string + title: API Password + description: The API password of your Clari Copilot account + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Clari Copilot account + +clay: + display_name: Clay + categories: + - crm + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.clay.com + headers: + authorization: ${apiKey} + verification: + method: GET + endpoints: + - /v3/my-workspaces + connection_config: + workspaceId: ${connectionConfig.workspaceId} + docs: https://nango.dev/docs/api-integrations/clay + docs_connect: https://nango.dev/docs/api-integrations/clay/connect + connection_config: + workspaceId: + type: string + title: Workspace ID + description: The ID of your Clay workspace. + example: '10608232' + pattern: '^\d+$' + doc_section: '#step-2-finding-your-workspace-id' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Clay account. + example: 7de4ba****e439d39**** + pattern: '^[a-f0-9]+$' + doc_section: '#step-1-finding-your-api-key' + +cleverreach: + display_name: CleverReach + categories: + - marketing + auth_mode: OAUTH2 + authorization_url: https://rest.cleverreach.com/oauth/authorize.php + token_url: https://rest.cleverreach.com/oauth/token.php + authorization_params: + response_type: code + grant: basic + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://rest.cleverreach.com + docs: https://nango.dev/docs/api-integrations/cleverreach + setup_guide_url: https://nango.dev/docs/api-integrations/cleverreach/how-to-register-your-own-cleverreach-api-oauth-app + +clickhouse: + display_name: ClickHouse + categories: + - dev-tools + auth_mode: BASIC + proxy: + base_url: https://api.clickhouse.cloud + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/organizations + docs: https://nango.dev/docs/api-integrations/clickhouse + docs_connect: https://nango.dev/docs/api-integrations/clickhouse/connect + credentials: + username: + type: string + title: Key ID + description: Your ClickHouse Cloud API Key ID. + pattern: '^[a-zA-Z0-9]+$' + example: 'Mlx1****************' + doc_section: '#step-1-create-an-api-key' + password: + type: string + title: Key Secret + description: Your ClickHouse Cloud API Key Secret. + secret: true + pattern: '^[a-zA-Z0-9]+$' + example: '4b1d2i7O**********************************' + doc_section: '#step-1-create-an-api-key' + +clicksend: + display_name: ClickSend + categories: + - communication + auth_mode: BASIC + proxy: + base_url: https://rest.clicksend.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v3/account + docs: https://nango.dev/docs/integrations/all/clicksend + docs_connect: https://nango.dev/docs/integrations/all/clicksend/connect + credentials: + username: + type: string + title: Username + description: Your ClickSend account username + doc_section: '#step-1-finding-your-username-and-api-key' + password: + type: string + title: API Key + description: Your ClickSend API Key + secret: true + doc_section: '#step-1-finding-your-username-and-api-key' + +clickup: + display_name: ClickUp + categories: + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://app.clickup.com/api + token_url: https://api.clickup.com/api/v2/oauth/token + proxy: + base_url: https://api.clickup.com + docs: https://nango.dev/docs/api-integrations/clickup + setup_guide_url: https://nango.dev/docs/api-integrations/clickup/how-to-register-your-own-clickup-api-oauth-app + +clio: + display_name: Clio + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.hostname}/oauth/authorize + token_url: https://${connectionConfig.hostname}/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.hostname} + docs: https://nango.dev/docs/api-integrations/clio + docs_connect: https://nango.dev/docs/api-integrations/clio/connect + setup_guide_url: https://nango.dev/docs/api-integrations/clio/how-to-register-your-own-clio-api-oauth-app + connection_config: + hostname: + type: string + title: Hostname + description: The hostname for your Clio region (e.g. app.clio.com for US, eu.app.clio.com for EU, ca.app.clio.com for CA, au.app.clio.com for AU). + default_value: app.clio.com + format: hostname + enum: + - app.clio.com + - eu.app.clio.com + - ca.app.clio.com + - au.app.clio.com + order: 1 + doc_section: '#step-1-finding-your-hostname' + +cloudbeds: + display_name: Cloudbeds + categories: + - other + auth_mode: OAUTH2 + authorization_url: https://api.cloudbeds.com/api/v1.3/oauth + token_url: https://api.cloudbeds.com/api/v1.3/access_token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.cloudbeds.com + docs: https://nango.dev/docs/api-integrations/cloudbeds + setup_guide_url: https://nango.dev/docs/api-integrations/cloudbeds/how-to-register-your-own-cloudbeds-oauth-app + +cloudtalk: + display_name: CloudTalk + categories: + - communication + auth_mode: BASIC + proxy: + base_url: https://my.cloudtalk.io/api + retry: + at: + - 'x-cloudtalkapi-resettime' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /contacts/index.json?limit=1 + docs: https://nango.dev/docs/api-integrations/cloudtalk + docs_connect: https://nango.dev/docs/api-integrations/cloudtalk/connect + credentials: + username: + type: string + title: ID + description: Your CloudTalk API Access ID. + pattern: '^[A-Za-z0-9.%@?_-]+$' + example: 'E1ZH****************RRM' + doc_section: '#step-1-getting-your-api-credentials' + password: + type: string + title: Key + description: Your CloudTalk API Access Key. + secret: true + pattern: '^[A-Za-z0-9.%@?_-]+$' + example: 'bQI*******************************eZ' + doc_section: '#step-1-getting-your-api-credentials' + +clerk: + display_name: Clerk + categories: + - dev-tools + - iam + auth_mode: API_KEY + proxy: + base_url: https://api.clerk.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/jwks + docs: https://nango.dev/docs/integrations/all/clerk + docs_connect: https://nango.dev/docs/integrations/all/clerk/connect + credentials: + apiKey: + type: string + title: Secret Key + description: Your Clerk Secret Key (starts with sk_test_ or sk_live_) + secret: true + pattern: '^sk_(test|live)_[a-zA-Z0-9]+$' + example: 'sk_test_abcdefghijklmnop123456789' + doc_section: '#step-1-retrieve-your-clerk-secret-key' + +cloudentity: + display_name: Cloudentity + auth_mode: OAUTH2_CC + categories: + - iam + token_url: https://${connectionConfig.tenantID}.${connectionConfig.regionID}.authz.cloudentity.io/${connectionConfig.tenantID}/${connectionConfig.workspaceID}/oauth2/token + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.tenantID}.${connectionConfig.regionID}.authz.cloudentity.io/${connectionConfig.tenantID}/${connectionConfig.workspaceID} + docs: https://nango.dev/docs/integrations/all/cloudentity + docs_connect: https://nango.dev/docs/integrations/all/cloudentity/connect + connection_config: + tenantID: + type: string + title: Tenant ID + description: The tenant ID of your Cloudentity account + doc_section: '#step-2-retrieving-the-tenant-id' + regionID: + type: string + title: Region ID + description: The region ID of your Cloudentity account + doc_section: '#step-3-retrieving-the-region-id' + workspaceID: + type: string + title: Workspace ID + description: The workspace ID of your Cloudentity account + doc_section: '#step-4-retrieving-the-workspace-id' + +cloudflare: + display_name: Cloudflare + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.cloudflare.com/client + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/cloudflare + docs_connect: https://nango.dev/docs/api-integrations/cloudflare/connect + credentials: + apiKey: + type: string + title: API Token + description: The API token for your Cloudflare user or account + example: lGlHlGZN3iPR9z7CupZlMB3nzMpTCdfxeUPNj_pf + pattern: '^[a-zA-Z0-9_-]+$' + +cloudflare-mcp: + display_name: Cloudflare (MCP) + categories: + - dev-tools + - mcp + auth_mode: MCP_OAUTH2_GENERIC + proxy: + base_url: ${connectionConfig.mcp_server_url} + headers: + accept: application/json,text/event-stream + connection_config: + mcp_server_url: + type: string + title: Worker URL + description: The full URL of your Cloudflare Worker MCP server. + example: https://my-mcp.myusername.workers.dev + pattern: '^https://[a-zA-Z0-9.-]+(?:\:[0-9]+)?(?:/.*)?$' + doc_section: '#step-1-finding-your-worker-url' + docs: https://nango.dev/docs/api-integrations/cloudflare-mcp + docs_connect: https://nango.dev/docs/api-integrations/cloudflare-mcp/connect + +clover: + display_name: Clover + categories: + - e-commerce + auth_mode: OAUTH2 + body_format: json + authorization_url: https://${connectionConfig.authorizeHost}/oauth/v2/authorize + token_url: https://${connectionConfig.apiHost}/oauth/v2/token + refresh_url: https://${connectionConfig.apiHost}/oauth/v2/refresh + disable_pkce: true + authorization_params: + response_type: code + refresh_params: + grant_type: refresh_token + redirect_uri_metadata: + - merchant_id + - employee_id + proxy: + base_url: https://${connectionConfig.apiHost} + docs: https://nango.dev/docs/api-integrations/clover + setup_guide_url: https://nango.dev/docs/api-integrations/clover/how-to-register-your-own-clover-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/clover/connect + connection_config: + authorizeHost: + type: string + title: Authorization Host + description: The Clover authorization hostname for your region. + enum: + - www.clover.com + - www.eu.clover.com + - www.la.clover.com + - sandbox.dev.clover.com + apiHost: + type: string + title: API Host + description: The Clover API hostname for your region. + enum: + - api.clover.com + - api.eu.clover.com + - api.la.clover.com + - apisandbox.dev.clover.com + +close: + display_name: Close + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://app.close.com/oauth2/authorize + token_url: https://api.close.com/oauth2/token/ + authorization_params: + response_type: code + default_scopes: + - offline_access + proxy: + base_url: https://api.close.com/api + docs: https://nango.dev/docs/integrations/all/close + +coda: + display_name: Coda + categories: + - knowledge-base + - productivity + auth_mode: API_KEY + proxy: + base_url: https://coda.io/apis/v1 + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /whoami + docs: https://nango.dev/docs/integrations/all/coda + docs_connect: https://nango.dev/docs/integrations/all/coda/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Coda account + doc_section: '#step-1-creating-an-api-key' + +codeclimate: + display_name: Code Climate + categories: + - dev-tools + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.domain} + headers: + accept: application/vnd.api+json + authorization: Token token=${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/user + docs: https://nango.dev/docs/integrations/all/codeclimate + docs_connect: https://nango.dev/docs/integrations/all/codeclimate/connect + connection_config: + domain: + type: string + title: Domain + description: The domain of your Code Climate account + format: hostname + prefix: https:// + doc_section: '#step-1-obtaining-the-domain-url' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Code Climate account + doc_section: '#step-2-creating-an-api-key' +codegen: + display_name: Codegen + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.codegen.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/organizations + docs: https://nango.dev/docs/integrations/all/codegen + docs_connect: https://nango.dev/docs/integrations/all/codegen/connect + credentials: + apiKey: + type: string + title: API Token + description: The API Key for your Codegen account + pattern: '^sk-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$' + example: 'sk-897bd628-de64-4018-8e3b-c6f717ca3e1d' + doc_section: '#step-1-finding-your-api-key' + +commercetools: + display_name: Commercetools + categories: + - e-commerce + auth_mode: OAUTH2_CC + token_url: https://auth.${connectionConfig.region}.${connectionConfig.cloudProvider}.commercetools.com/oauth/token + token_request_auth_method: basic + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.${connectionConfig.region}.${connectionConfig.cloudProvider}.commercetools.com/${connectionConfig.projectKey} + headers: + authorization: Bearer ${accessToken} + docs: https://nango.dev/docs/integrations/all/commercetools + docs_connect: https://nango.dev/docs/integrations/all/commercetools/connect + connection_config: + region: + type: string + title: Region + description: The region of your Commercetools account. Use the full region identifier (e.g., 'us-central1' for GCP or 'us-east-2' for AWS). + example: us-central1 + pattern: '^[a-z]+-[a-z0-9-]+$' + doc_section: '#step-3-identify-your-region-and-cloud-provider' + projectKey: + type: string + title: Project Key + description: The project key of your Commercetools account + example: demo-project-slug + pattern: '^[a-zA-Z0-9-_]+$' + doc_section: '#step-2-save-the-api-environment-variables' + cloudProvider: + type: string + title: Cloud Provider + description: Cloud provider used to host your Commercetools project (e.g., 'gcp' or 'aws'). + enum: + - gcp + - aws + doc_section: '#step-3-identify-your-region-and-cloud-provider' + +crowdstrike: + display_name: CrowdStrike + categories: + - dev-tools + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.baseUrl}/oauth2/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.baseUrl} + retry: + after: + - 'x-ratelimit-retryafter' + docs: https://nango.dev/docs/integrations/all/crowdstrike + docs_connect: https://nango.dev/docs/integrations/all/crowdstrike/connect + connection_config: + baseUrl: + type: string + title: Base URL + description: The CrowdStrike API base URL for your cloud environment + example: api.crowdstrike.com + pattern: '^api(?:\.[a-z0-9-]+)*\.crowdstrike\.(?:com|mil)$' + prefix: https:// + doc_section: '#step-1-creating-an-api-client' + order: 1 + +companycam: + display_name: CompanyCam + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.companycam.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/company + docs: https://nango.dev/docs/integrations/all/companycam + credentials: + apiKey: + type: string + title: Access Token + description: The Access Token for your CompanyCam company + +constant-contact: + display_name: Constant Contact + categories: + - marketing + auth_mode: OAUTH2 + authorization_url: https://authz.constantcontact.com/oauth2/default/v1/authorize + token_url: https://authz.constantcontact.com/oauth2/default/v1/token + disable_pkce: true + scope_separator: ' ' + default_scopes: + - offline_access + proxy: + base_url: https://api.cc.email + docs: https://nango.dev/docs/api-integrations/constant-contact + setup_guide_url: https://nango.dev/docs/api-integrations/constant-contact/how-to-register-your-own-constant-contact-oauth-app + +conductorone: + display_name: ConductorOne + categories: + - productivity + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.hostname}/auth/v1/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.hostname}/api + docs: https://nango.dev/docs/api-integrations/conductorone + docs_connect: https://nango.dev/docs/api-integrations/conductorone/connect + connection_config: + hostname: + type: string + title: Hostname + description: The hostname extracted from your Client ID + example: acme.conductor.one + format: hostname + order: 1 + doc_section: '#step-2-obtaining-your-hostname' + credentials: + client_id: + type: string + title: Client ID + description: Your ConductorOne Client ID + example: strange-hydra-68836@acme.conductor.one/pcc + doc_section: '#step-1-obtaining-your-client-credentials' + client_secret: + type: string + title: Client Secret + description: Your ConductorOne Client Secret + example: 'secret-token:conductorone.com:v1:eyJrdHkiOiJPS1AiLCJjcnYiOiJFZDI1NTE5IiwieCI6IkMySEx5Y0d6eUhfZDQwcjJvejZoNkpqdndvRVFBZ0FTRVc2eDB6emh6Y2MiLCJkIjoiLTgzVkxXUVUtZVhQY0ZCWVhDb2NpU29XVmhrYnRXUm9zdkZUZ3JqcXNVbyJ9' + doc_section: '#step-1-obtaining-your-client-credentials' + +copper: + display_name: Copper (OAuth) + categories: + - crm + auth_mode: OAUTH2 + proxy: + base_url: https://api.copper.com/developer_api + default_scopes: + - developer/v1/all + authorization_url: https://app.copper.com/oauth/authorize + token_url: https://app.copper.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + docs: https://nango.dev/docs/integrations/all/copper + +copper-api-key: + display_name: Copper (API Key) + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.copper.com/developer_api + headers: + x-pw-accesstoken: ${apiKey} + x-pw-application: developer_api + x-pw-useremail: ${connectionConfig.userEmail} + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/account + docs_connect: https://nango.dev/docs/integrations/all/copper-api-key/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Copper account + pattern: '^[a-f0-9]{32}$' + example: '4f3c12efb9659a0b5c123b568745dbf9' + doc_section: '#step-1-finding-copper-api-key' + connection_config: + userEmail: + type: string + title: User Email + description: Email address of the user who generated the token + docs: https://nango.dev/docs/integrations/all/copper-api-key + +connectwise-psa: + display_name: ConnectWise PSA + categories: + - support + - ticketing + auth_mode: BASIC + webhook_routing_script: connectwisePsaWebhookRouting + proxy: + base_url: https://${connectionConfig.hostname}/v4_6_release/apis/3.0 || https://${connectionConfig.subdomain}.myconnectwise.net/v4_6_release/apis/3.0 + headers: + accept: application/vnd.connectwise.com+json; version=${connectionConfig.apiVersion} + clientid: ${connectionConfig.clientId} + docs: https://nango.dev/docs/api-integrations/connectwise-psa + docs_connect: https://nango.dev/docs/api-integrations/connectwise-psa/connect + connection_config: + hostname: + type: string + title: Hostname + description: The full ConnectWise PSA hostname. + example: api-na.myconnectwise.net + format: hostname + prefix: https:// + suffix: /v4_6_release/apis/3.0 + subdomain: + type: string + title: '' + description: '' + default_value: '' + hidden: true # deprecating this in favor of hostname + apiVersion: + type: string + title: Api version + description: The API version to connect to ConnectWise PSA + clientId: + type: string + title: Client ID + description: The Client ID assigned to your integration + credentials: + username: + type: string + title: Username + description: The ConnectWise PSA CompanyId followed by either the Public Key, Integrator Username, or MemberId + password: + type: string + title: Password + description: Your ConnectWise PSA private key, integrator password, or member hash + +connectwise-psa-staging: + display_name: ConnectWise PSA (Staging) + categories: + - support + - ticketing + auth_mode: BASIC + webhook_routing_script: connectwisePsaWebhookRouting + proxy: + base_url: https://api-staging.connectwisedev.com/v4_6_release/apis/3.0 + headers: + accept: application/vnd.connectwise.com+json; version=${connectionConfig.apiVersion} + clientid: ${connectionConfig.clientId} + docs: https://nango.dev/docs/integrations/all/connectwise-psa-staging + connection_config: + apiVersion: + type: string + title: Api version + description: The API version to connect to ConnectWise PSA + clientId: + type: string + title: Client ID + description: The Client ID assigned to your integration + +connectwise-rmm: + display_name: ConnectWise RMM + categories: + - support + auth_mode: OAUTH2_CC + body_format: json + token_url: https://openapi.service.${connectionConfig.subdomain}/v1/token + token_params: + grant_type: client_credentials + scope_separator: ' ' + proxy: + base_url: https://openapi.service.${connectionConfig.subdomain} + docs: https://nango.dev/docs/api-integrations/connectwise-rmm + docs_connect: https://nango.dev/docs/api-integrations/connectwise-rmm/connect + connection_config: + subdomain: + type: string + title: API Subdomain + description: The ConnectWise RMM OpenAPI subdomain for your region. + enum: + - itsupport247.net + - euplatform.connectwise.com + - auplatform.connectwise.com + doc_section: '#step-1-find-your-api-subdomain' + credentials: + client_id: + type: string + title: Client ID + description: Your ConnectWise RMM OAuth client ID + example: '6500023' + pattern: '^[A-Za-z0-9._-]+$' + doc_section: '#step-2-create-api-credentials' + client_secret: + type: string + title: Client Secret + description: Your ConnectWise RMM OAuth client secret + secret: true + pattern: '^[A-Za-z0-9._~+/=-]{8,}$' + doc_section: '#step-2-create-api-credentials' + +conta-azul: + display_name: Conta Azul + categories: + - accounting + - erp + auth_mode: OAUTH2 + authorization_url: https://auth.contaazul.com/login + token_url: https://auth.contaazul.com/oauth2/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + scope_separator: ' ' + proxy: + base_url: https://api-v2.contaazul.com + disable_pkce: true + docs: https://nango.dev/docs/api-integrations/conta-azul + setup_guide_url: https://nango.dev/docs/api-integrations/conta-azul/how-to-register-your-own-conta-azul-api-oauth-app + +confluence: + display_name: Confluence + categories: + - knowledge-base + - popular + alias: jira + docs: https://nango.dev/docs/api-integrations/confluence + setup_guide_url: https://nango.dev/docs/api-integrations/confluence/how-to-register-your-own-confluence-api-oauth-app + +confluence-basic: + display_name: Confluence (Basic Auth) + categories: + - knowledge-base + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.atlassian.net + headers: + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /wiki/api/v2/spaces + docs: https://nango.dev/docs/integrations/all/confluence-basic + docs_connect: https://nango.dev/docs/integrations/all/confluence-basic/connect + connection_config: + subdomain: + type: string + title: Confluence Subdomain + description: The subdomain of your Confluence account + pattern: '^[a-z0-9_-]+$' + example: subdomain + suffix: .atlassian.net + prefix: https:// + order: 1 + doc_section: '#step-2-finding-your-atlassian-domain' + credentials: + username: + type: string + title: Email Address + format: email + description: The email address for your Confluence account + doc_section: '#step-1-getting-your-api-token' + password: + type: string + title: API token + description: The API token for your Confluence account + secret: true + doc_section: '#step-1-getting-your-api-token' + +confluence-data-center: + display_name: Confluence Data Center + categories: + - productivity + - ticketing + alias: jira-data-center + proxy: + retry: + after: + - 'retry-after' + base_url: https://${connectionConfig.endpointURL} + docs: https://nango.dev/docs/integrations/all/confluence-data-center + docs_connect: https://nango.dev/docs/integrations/all/confluence-data-center/connect + connection_config: + endpointURL: + type: string + title: Domain + description: The domain of your Confluence Data Center instance + prefix: https:// + pattern: '^[a-zA-Z0-9.-]+(:\d+(/[a-zA-Z0-9.-]*)?)?$' + example: confluence.company.com + doc_section: '#step-1-finding-your-domain' + +contentful: + display_name: Contentful + categories: + - dev-tools + - design + - cms + auth_mode: OAUTH2 + authorization_url: https://be.contentful.com/oauth/authorize + token_url: https://be.contentful.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.contentful.com + retry: + after: + - x-contentful-ratelimit-reset + docs: https://nango.dev/docs/integrations/all/contentful + connection_config: + subdomain: + type: string + title: Contentful Domain + description: The subdomain of your Contentful account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .contentful.com + prefix: https:// + +contentstack: + display_name: Contentstack + categories: + - cms + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.contentstack.com/apps/${connectionConfig.appId}/authorize + token_url: https://${connectionConfig.subdomain}.contentstack.com/apps-api/apps/token + docs: https://nango.dev/docs/integrations/all/contentstack + proxy: + base_url: https://${connectionConfig.apiDomain} + connection_config: + subdomain: + type: string + title: Contentstack Domain + description: The subdomain of your Contentstack account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .contentstack.com + prefix: https:// + order: 2 + appId: + type: string + title: App ID + description: The app ID of your Contentstack account + order: 1 + apiDomain: + type: string + title: API Domain + description: The domain to where you will access your API + pattern: '^[a-z0-9_-]+$' + example: eu-api.contentstack.com + prefix: https:// + order: 3 + +coros: + display_name: Coros + categories: + - sports + auth_mode: OAUTH2 + authorization_url: https://open.coros.com/oauth2/authorize + token_url: https://open.coros.com/oauth2/accesstoken + refresh_url: https://open.coros.com/oauth2/refresh-token + authorization_params: + response_type: code + token_response_metadata: + - openId + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://open.coros.com + docs: https://nango.dev/docs/integrations/all/coros + +coros-sandbox: + display_name: Coros (Sandbox) + categories: + - sports + auth_mode: OAUTH2 + authorization_url: https://opentest.coros.com/oauth2/authorize + token_url: https://opentest.coros.com/oauth2/accesstoken + refresh_url: https://opentest.coros.com/oauth2/refresh-token + authorization_params: + response_type: code + token_response_metadata: + - openId + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://opentest.coros.com + docs: https://nango.dev/docs/integrations/all/coros-sandbox + +coupa-compass: + display_name: Coupa Compass + categories: + - payment + - invoicing + auth_mode: OAUTH2_CC + scope_separator: ' ' + token_url: https://${connectionConfig.instanceDomain}/oauth2/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.instanceDomain} + docs: https://nango.dev/docs/integrations/all/coupa-compass + connection_config: + instanceDomain: + type: string + title: Instance Domain + description: The domain of your Coupa Compass account + format: hostname + prefix: https:// + +cyberimpact: + display_name: Cyberimpact + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.cyberimpact.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /ping + docs: https://nango.dev/docs/integrations/all/cyberimpact + docs_connect: https://nango.dev/docs/integrations/all/cyberimpact/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Cyberimpact account + pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' + example: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...' + doc_section: '#step-1-creating-a-cyberimpact-api-key' + +customer-io: + display_name: Customer.io + categories: + - marketing + - analytics + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.customer.io + docs: https://nango.dev/docs/api-integrations/customer-io + docs_connect: https://nango.dev/docs/api-integrations/customer-io/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The region where your Customer.io instance is hosted. + enum: + - cdp + - cdp-eu + order: 1 + doc_section: '#step-2-choose-your-subdomain' + credentials: + username: + type: string + title: API Key + description: Your Customer.io Pipelines API key. + pattern: '^[a-f0-9]{20}$' + example: 36c7a4***********ab022a3 + doc_section: '#step-1-getting-authentication-credentials' + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +cursor: + display_name: Cursor + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.cursor.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v0/me + docs: https://nango.dev/docs/integrations/all/cursor + docs_connect: https://nango.dev/docs/integrations/all/cursor/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Cursor account + doc_section: '#step-1-finding-api-key' + example: key_9164000970ca2f15c999047a0e2b7e03127885be41198616a6975af08b28239b + pattern: '^(key_[a-f0-9]{64}|crsr_[a-f0-9]{64})$' + +cursor-admin: + display_name: Cursor Admin + categories: + - dev-tools + auth_mode: BASIC + proxy: + base_url: https://api.cursor.com + verification: + method: GET + endpoints: + - /teams/members + docs: https://nango.dev/docs/integrations/all/cursor-admin + docs_connect: https://nango.dev/docs/integrations/all/cursor-admin/connect + credentials: + username: + type: string + title: API key + description: The API Key of your Greenhouse account + example: key_9164000970ca2f15c999047a0e2b7e03127885be41198616a6975af08b28239b + pattern: '^(key_[a-f0-9]{64}|crsr_[a-f0-9]{64})$' + secret: true + doc_section: '#step-1-finding-api-key' + password: + type: string + title: Password + description: Password + default_value: '' + hidden: true + +databricks-account: + display_name: Databricks (Account Level) + categories: + - analytics + auth_mode: OAUTH2_CC + token_url: https://accounts.cloud.databricks.com/oidc/accounts/${connectionConfig.accountId}/v1/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://accounts.cloud.databricks.com/api/2.0/accounts/${connectionConfig.accountId} + docs: https://nango.dev/docs/integrations/all/databricks-account + connection_config: + accountId: + type: string + title: Account ID + description: The ID to your account + format: uuid + example: 123e4567-e89b-12d3-a456-426614174000 + +databricks-workspace: + display_name: Databricks (Workspace Level) + categories: + - analytics + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.databricksInstance}/oidc/v1/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.databricksInstance}/api/2.0/ + docs: https://nango.dev/docs/integrations/all/databricks-workspace + connection_config: + databricksInstance: + type: string + title: Databricks Instance + description: The instance to your databricks deployment + pattern: '^[a-z0-9_-]+(\.[a-z0-9_-]+)*$' + example: dbc-a1b2345c-d6e7.cloud.databricks.com + +# Untested configuration. Please reach out if you have a test account that we can use to test it. +datev: + display_name: Datev + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://login.datev.de/openid/authorize + token_url: https://api.datev.de/token + token_request_auth_method: basic + scope_separator: ' ' + default_scopes: + - openid + authorization_params: + response_type: code id_token + response_mode: query + nonce: AnotherRandomStringDatev + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.datev.de + docs: https://nango.dev/docs/integrations/all/datev + +datacandy: + display_name: DataCandy + categories: + - payment + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.application_url}/api2 + query: + application_key: ${connectionConfig.application_key} + accesskey: ${connectionConfig.access_key} + verification: + method: GET + endpoints: + - /merchant?application_key=${connectionConfig.application_key}&accesskey=${connectionConfig.access_key}&limit=1 + connection_config: + application_url: + type: string + title: Application URL + description: The application URL for DataCandy + example: app.datacandy.com + format: hostname + application_key: + type: string + title: Application Key + description: The application key required for read data access + example: c4f9375f9834b4e7f0a528cc65c055702bf5f24a + access_key: + type: string + title: Access Key + description: The access key required for read data access + example: '3CLJII' + credentials: + username: + type: string + title: Username + description: DataCandy username + password: + type: string + title: Password + description: DataCandy password + secret: true + docs: https://nango.dev/docs/integrations/all/datacandy + +datadog: + display_name: Datadog + categories: + - analytics + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.${connectionConfig.siteParameter}/api + headers: + dd-api-key: ${apiKey} + dd-application-key: ${connectionConfig.applicationKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/validate + retry: + after: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/api-integrations/datadog + docs_connect: https://nango.dev/docs/api-integrations/datadog/connect + connection_config: + siteParameter: + type: string + title: Site Parameter + description: The Datadog site for your account. + enum: + - datadoghq.com + - us3.datadoghq.com + - us5.datadoghq.com + - datadoghq.eu + - ddog-gov.com + - ap1.datadoghq.com + order: 1 + doc_section: '#step-1-finding-your-datadog-domain' + applicationKey: + type: string + title: Application Key + description: The application key required for read data access. + pattern: '^[A-Za-z0-9_]+$' + example: '5d8a7b3f2dc8bce1b234e7f1a1ac54728dbf9e4a7' + doc_section: '#step-3-datadog-application-key' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Datadog account. + pattern: '^[a-f0-9]{32}$' + example: '4f3c12efb9659a0b5c123b568745dbf9' + doc_section: '#step-2-datadog-api-key' + +dayforce: + display_name: Dayforce + categories: + - hr + auth_mode: TWO_STEP + body_format: form + proxy: + base_url: https://${connectionConfig.clientHostname}/api || https://www.dayforcehcm.com/api + forward_headers_on_redirect: true + token_url: https://${connectionConfig.identityHostname}/connect/token || https://dfid.dayforcehcm.com/connect/token + token_params: + grant_type: password + companyId: ${connectionConfig.companyId} + username: ${credentials.username} + password: ${credentials.password} + client_id: Dayforce.HCMAnywhere.Client + token_headers: + content-type: application/x-www-form-urlencoded + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/api-integrations/dayforce + docs_connect: https://nango.dev/docs/api-integrations/dayforce/connect + credentials: + username: + type: string + title: Username + description: Your Dayforce account username. + doc_section: '#step-2-configure-your-dayforce-user' + password: + type: string + title: Password + description: Your Dayforce account password. + doc_section: '#step-2-configure-your-dayforce-user' + connection_config: + companyId: + type: string + title: Company ID + description: The company ID for your Dayforce account. + doc_section: '#step-1-finding-your-company-id' + clientHostname: + type: string + title: API hostname + description: Hostname for the Dayforce API, leave empty for production. + format: hostname + prefix: https:// + suffix: /api + optional: true + example: test.dayforcehcm.com + doc_section: '#step-4-identifying-your-client-host' + identityHostname: + type: string + title: Identity hostname + description: Hostname for the Dayforce Identity token endpoint, leave empty for production. + format: hostname + optional: true + prefix: https:// + suffix: /connect/token + example: dfid.dayforcehcm.com + doc_section: '#step-3-identifying-your-identity-host' + +datto-rmm: + display_name: Datto RMM + categories: + - support + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.platform}-api.centrastage.net/auth/oauth/authorize + token_url: https://${connectionConfig.platform}-api.centrastage.net/auth/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + token_request_auth_method: basic + disable_pkce: true + proxy: + base_url: https://${connectionConfig.platform}-api.centrastage.net/api + docs: https://nango.dev/docs/integrations/all/datto-rmm + docs_connect: https://nango.dev/docs/integrations/all/datto-rmm/connect + connection_config: + platform: + type: string + title: Platform + description: The Datto RMM platform (region) for your account. + enum: + - pinotage + - merlot + - concord + - vidal + - zinfandel + - syrah + order: 1 + doc_section: '#step-2-select-your-platform' + +datto-rmm-password-grant: + display_name: Datto RMM (Password Grant) + categories: + - support + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.platform}-api.centrastage.net/auth/oauth/token + token_params: + grant_type: password + username: ${credentials.username} + password: ${credentials.password} + token_headers: + authorization: Basic ${base64(${credentials.default_username}:${credentials.default_password})} + proxy: + base_url: https://${connectionConfig.platform}-api.centrastage.net/api + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/integrations/all/datto-rmm-password-grant + docs_connect: https://nango.dev/docs/integrations/all/datto-rmm-password-grant/connect + connection_config: + platform: + type: string + title: Platform + description: The Datto RMM platform (region) for your account. + enum: + - pinotage + - merlot + - concord + - vidal + - zinfandel + - syrah + order: 1 + doc_section: '#step-2-select-your-platform' + credentials: + default_username: + type: string + title: '' + description: '' + default_value: 'public-client' + hidden: true + default_password: + type: string + title: '' + description: '' + default_value: 'public' + hidden: true + username: + type: string + title: API Key + pattern: '^[A-Z0-9]{32}$' + example: 'AB7KLM90PQW4XJ8H2TUVN1YZ3R5C6FDG' + doc_section: '#step-1-enable-api-access-and-generate-api-keys' + description: Your Datto RMM API Key + password: + type: string + title: API Secret Key + pattern: '^[A-Z0-9]{32}$' + example: '9XQ7MZB4H1L2WKC0RDFTPY5J8VUNSG3E' + doc_section: '#step-1-enable-api-access-and-generate-api-keys' + description: Your Datto RMM Secret Key + +deel: + display_name: Deel + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://app.deel.com/oauth2/authorize + token_url: https://app.deel.com/oauth2/tokens + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.letsdeel.com + docs: https://nango.dev/docs/integrations/all/deel + +deel-sandbox: + display_name: Deel (Sandbox) + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://demo.deel.com/oauth2/authorize + token_url: https://demo.deel.com/oauth2/tokens + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api-sandbox.demo.deel.com + docs: https://nango.dev/docs/integrations/all/deel-sandbox + +devin: + display_name: Devin + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.devin.ai + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/sessions + docs: https://nango.dev/docs/integrations/all/devin + docs_connect: https://nango.dev/docs/integrations/all/devin/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Devin account + pattern: '^apk_user_[A-Za-z0-9+/=]+$' + example: 'apk_user_dGVzdF9vcmdfeDY1NzRBUElLRVl8Njc1OTdjNDQzMjFhOTZlODhlMmE4MTI0X29yZ194NnB5QlVJa042anVKWWtMOjQ3NzQxYTVmYWE5MTRiNjQ5' + doc_section: '#step-1-finding-your-api-key' + +demodesk: + display_name: DemoDesk + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://demodesk.com + headers: + api-key: ${apiKey} + docs: https://nango.dev/docs/api-integrations/demodesk + docs_connect: https://nango.dev/docs/api-integrations/demodesk/connect + credentials: + apiKey: + type: string + title: API Key + description: Your DemoDesk API key + doc_section: '#step-1-obtaining-your-api-key' + +dialpad: + display_name: Dialpad + categories: + - communication + auth_mode: OAUTH2 + authorization_url: https://dialpad.com/oauth2/authorize + token_url: https://dialpad.com/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://dialpad.com + docs: https://nango.dev/docs/integrations/all/dialpad + +dialpad-sandbox: + display_name: Dialpad (Sandbox) + categories: + - communication + auth_mode: OAUTH2 + authorization_url: https://sandbox.dialpad.com/oauth2/authorize + token_url: https://sandbox.dialpad.com/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://sandbox.dialpad.com + docs: https://nango.dev/docs/integrations/all/dialpad-sandbox + +dialpad-wfm: + display_name: Dialpad WFM + categories: + - hr + auth_mode: API_KEY + proxy: + base_url: https://api.teamsurfboard.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/api-integrations/dialpad-wfm + docs_connect: https://nango.dev/docs/api-integrations/dialpad-wfm/connect + credentials: + apiKey: + type: string + title: Access Token + description: The access token for your account. + secret: true + doc_section: '#step-1-obtain-your-access-token' + +diffbot: + display_name: Diffbot + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://api.diffbot.com + query: + token: ${apiKey} + verification: + method: GET + endpoints: + - /v4/account + docs: https://nango.dev/docs/api-integrations/diffbot + docs_connect: https://nango.dev/docs/api-integrations/diffbot/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Diffbot API token. + example: c4f82a1b********************e7d3 + pattern: '^[a-f0-9]{32}$' + doc_section: '#step-1-obtain-your-api-token' + +digitalocean: + display_name: DigitalOcean + categories: + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://cloud.digitalocean.com/v1/oauth/authorize + token_url: https://cloud.digitalocean.com/v1/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.digitalocean.com + docs: https://nango.dev/docs/integrations/all/digitalocean + +digits: + display_name: Digits + categories: + - accounting + auth_mode: OAUTH2 + authorization_url: https://connect.digits.com/v1/oauth/authorize + token_url: https://connect.digits.com/v1/oauth/token + body_format: json + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://connect.digits.com + docs: https://nango.dev/docs/api-integrations/digits + setup_guide_url: https://nango.dev/docs/api-integrations/digits/how-to-register-your-own-digits-api-oauth-app + +digits-mcp: + display_name: Digits (MCP) + categories: + - accounting + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://api.digits.com/oauth/authorize + token_url: https://api.digits.com/oauth/token + registration_url: https://api.digits.com/oauth/register + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.digits.com + docs: https://nango.dev/docs/api-integrations/digits-mcp + +discolike: + display_name: DiscoLike + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.discolike.com + headers: + x-discolike-key: ${apiKey} + verification: + method: GET + endpoints: + - /v1/count + docs: https://nango.dev/docs/api-integrations/discolike + docs_connect: https://nango.dev/docs/api-integrations/discolike/connect + credentials: + apiKey: + type: string + title: API Key + description: Your DiscoLike API key. + doc_section: '#step-1-obtain-your-api-key' + example: 123e4567-e89b-12d3-a456-426614174000 + format: uuid + +discord: + display_name: Discord + categories: + - gaming + - social + auth_mode: OAUTH2 + authorization_url: https://discord.com/api/oauth2/authorize + token_url: https://discord.com/api/oauth2/token + authorization_params: + response_type: code + proxy: + base_url: https://discord.com + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/discord + setup_guide_url: https://nango.dev/docs/api-integrations/discord/how-to-register-your-own-discord-api-oauth-app + +discourse: + display_name: Discourse + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.defaultHost} + retry: + after: + - 'retry-after' + headers: + api-username: ${connectionConfig.apiUsername} + api-key: ${apiKey} + accept: application/json + docs: https://nango.dev/docs/integrations/all/discourse + connection_config: + defaultHost: + type: string + title: Domain + description: The domain of your Discourse account + format: hostname + prefix: https:// + apiUsername: + type: string + title: API Username + description: The API username of your Discourse account + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Discourse account + +crisp: + display_name: Crisp + categories: + - communication + - support + auth_mode: BASIC + proxy: + base_url: https://api.crisp.chat + headers: + x-crisp-tier: plugin + verification: + method: GET + endpoints: + - /v1/plugin/connect/account + docs: https://nango.dev/docs/integrations/all/crisp + docs_connect: https://nango.dev/docs/integrations/all/crisp/connect + credentials: + username: + type: string + title: Token Identifier + description: The identifier part of your Crisp token keypair + example: 123e4567-e89b-12d3-a456-426614174000 + format: uuid + doc_section: '#step-1-generating-your-token-keypair' + password: + type: string + title: Token Key + pattern: '^[a-f0-9]{64}$' + example: a3f5c8d2b9e4713f2c0a7b4d5e6f8c9b1a2d3e4f5b6c7d8e9f0a1b2c3d4e5f6a7 + description: The key part of your Crisp token keypair + doc_section: '#step-1-generating-your-token-keypair' + +crisp-plugin-install: + display_name: Crisp (Plugin Install) + categories: + - communication + - support + auth_mode: INSTALL_PLUGIN + auth_type: BASIC + redirect_uri_metadata: + - website_id + proxy: + base_url: https://api.crisp.chat + headers: + x-crisp-tier: plugin + verification: + method: GET + endpoints: + - /v1/plugin/connect/account + docs: https://nango.dev/docs/api-integrations/crisp-plugin-install + setup_guide_url: https://nango.dev/docs/api-integrations/crisp-plugin-install/how-to-register-your-own-crisp-plugin + +crunchbase: + display_name: Crunchbase + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.crunchbase.com/ + headers: + x-cb-user-key: ${apiKey} + verification: + method: GET + endpoints: + - /v4/data/autocompletes?query=instantly&limit=1 + docs: https://nango.dev/docs/api-integrations/crunchbase + docs_connect: https://nango.dev/docs/api-integrations/crunchbase/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Crunchbase API key. + doc_section: '#step-1-get-your-api-key' + pattern: '^[a-zA-Z0-9]{32}$' + example: 0f9c************************5336 + +dixa: + display_name: Dixa + categories: + - support + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.apiType}.dixa.io + headers: + authorization: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/agents + base_url_override: https://dev.dixa.io + docs: https://nango.dev/docs/integrations/all/dixa + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Dixa account + connection_config: + apiType: + type: string + title: API Type + description: The Dixa API type to use for requests. + enum: + - dev + - exports + +document360: + display_name: Document360 + categories: + - knowledge-base + auth_mode: API_KEY + proxy: + headers: + api_token: ${apiKey} + base_url: https://api.document360.com + docs: https://nango.dev/docs/integrations/all/document360 + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Document360 account + +docusign: + display_name: DocuSign + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://account.docusign.com/oauth/auth + token_url: https://account.docusign.com/oauth/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://www.docusign.net + post_connection_script: docusignPostConnection + docs: https://nango.dev/docs/integrations/all/docusign + +docusign-sandbox: + display_name: DocuSign (Sandbox) + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://account-d.docusign.com/oauth/auth + token_url: https://account-d.docusign.com/oauth/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://demo.docusign.net + post_connection_script: docusignPostConnection + docs: https://nango.dev/docs/integrations/all/docusign-sandbox + +docuware: + display_name: DocuWare + categories: + - productivity + auth_mode: TWO_STEP + token_url: https://${connectionConfig.domain}/DocuWare/Platform/Home/IdentityServiceInfo + body_format: form + token_request_method: GET + token_headers: + content-type: application/x-www-form-urlencoded + additional_steps: + - body_format: form + token_url: ${step1.IdentityServiceUrl}/.well-known/openid-configuration + token_request_method: GET + - body_format: form + token_url: ${step2.token_endpoint} + token_headers: + content-type: application/x-www-form-urlencoded + token_params: + grant_type: password + scope: docuware.platform + client_id: docuware.platform.net.client + username: ${credentials.username} + password: ${credentials.password} + proxy: + base_url: https://${connectionConfig.domain}/DocuWare/Platform + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/integrations/all/docuware + docs_connect: https://nango.dev/docs/integrations/all/docuware/connect + connection_config: + domain: + type: string + title: Domain + description: The domain to your DocuWare account + format: hostname + prefix: https:// + example: example.docuware.cloud + order: 1 + doc_section: '#step-1-finding-your-domain' + credentials: + username: + type: string + title: Username + description: The Username to your DocuWare account + doc_section: '#step-2-finding-your-credentials' + password: + type: string + title: Password + secret: true + description: The Password to your DocuWare account + doc_section: '#step-2-finding-your-credentials' + +domo: + display_name: Domo + categories: + - productivity + - other + auth_mode: OAUTH2_CC + token_url: https://api.domo.com/oauth/token + scope_separator: ',' + token_params: + grant_type: client_credentials + token_request_auth_method: basic + proxy: + base_url: https://api.domo.com + docs: https://nango.dev/docs/api-integrations/domo + docs_connect: https://nango.dev/docs/api-integrations/domo/connect + credentials: + client_id: + type: string + title: Your Client ID + description: The Client ID of your API client + format: uuid + example: 123e4567-e89b-12d3-a456-426614174000 + doc_section: '#step-1-creating-your-api-client' + client_secret: + type: string + title: Your Client Secret + secret: true + example: a14e6b49******************************768ece + pattern: '^[a-fA-F0-9]{64}$' + description: The Client secret of your API client + doc_section: '#step-1-creating-your-api-client' + +dropbox: + display_name: Dropbox + categories: + - knowledge-base + - storage + auth_mode: OAUTH2 + authorization_url: https://www.dropbox.com/oauth2/authorize + token_url: https://api.dropboxapi.com/oauth2/token + authorization_params: + token_access_type: offline + proxy: + base_url: https://api.dropboxapi.com + docs: https://nango.dev/docs/api-integrations/dropbox + setup_guide_url: https://nango.dev/docs/api-integrations/dropbox/how-to-register-your-own-dropbox-api-oauth-app + +dropbox-sign: + display_name: Dropbox Sign + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://app.hellosign.com/oauth/authorize + token_url: https://app.hellosign.com/oauth/token + authorization_url_skip_empty: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + refresh_url: https://app.hellosign.com/oauth/token?refresh + proxy: + retry: + at: + - 'x-ratelimit-reset' + base_url: https://api.hellosign.com + docs: https://nango.dev/docs/integrations/all/dropbox-sign + +drchrono: + display_name: DrChrono + categories: + - other + auth_mode: OAUTH2 + authorization_url: https://app.drchrono.com/o/authorize/ + token_url: https://app.drchrono.com/o/token/ + authorization_url_skip_empty: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://app.drchrono.com + docs: https://nango.dev/docs/integrations/all/drchrono + +drata: + display_name: Drata + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://public-api.drata.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/api-integrations/drata + docs_connect: https://nango.dev/docs/api-integrations/drata/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Drata API key + +cisco-duo-admin: + display_name: Cisco Duo Admin API + categories: + - iam + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.hostname} + headers: + date: '${now:ddd, DD MMM YYYY HH:mm:ss ZZ}' + authorization: "Basic ${base64(${credentials.username}:${hmacSha1Hex(${now:ddd, DD MMM YYYY HH:mm:ss ZZ}\n${method}\n${host}\n${path}\n${params}, ${credentials.password})})}" + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/cisco-duo-admin + docs_connect: https://nango.dev/docs/api-integrations/cisco-duo-admin/connect + connection_config: + hostname: + type: string + title: API Hostname + description: Your Duo API hostname. + example: api-xxxxxxxx.duosecurity.com + pattern: 'api-[a-z0-9]+\.duosecurity\.com' + order: 1 + credentials: + username: + type: string + title: Integration Key + description: Your Duo application's integration key. + example: DIWJ8X6**********TQ1 + pattern: 'DI[A-Z0-9]{18}' + password: + type: string + title: Secret Key + description: Your Duo application's secret key. + example: Zh5eGm**************************zLJ4Ep + pattern: '[A-Za-z0-9]{40}' + +contactout: + display_name: ContactOut + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.contactout.com + headers: + authorization: basic + token: ${apiKey} + retry: + after: + - 'retry-after' + verification: + method: GET + endpoints: + - /v1/stats + docs: https://nango.dev/docs/integrations/all/contactout + docs_connect: https://nango.dev/docs/integrations/all/contactout/connect + credentials: + apiKey: + type: string + title: API Key + example: ab7KxYpR1qLmN9Zs3TvUeFgH + description: Your ContactOut API Key + +drupal: + display_name: Drupal + categories: + - dev-tools + - design + - cms + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.baseUrl}/rest_api/access_token + token_params: + client_id: ${credentials.clientId} + client_secret: ${credentials.clientSecret} + username: ${credentials.userName} + grant_type: client_credentials + token_headers: + content-type: application/x-www-form-urlencoded + accept: application/json + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://${connectionConfig.baseUrl} + docs: https://nango.dev/docs/integrations/all/drupal + docs_connect: https://nango.dev/docs/integrations/all/drupal/connect + credentials: + clientId: + type: string + title: Client ID + description: Your Client ID + secret: true + doc_section: '#step-3-generating-your-drupal-client-credentials' + clientSecret: + type: string + title: Client Secret + description: Your Client Secret + secret: true + doc_section: '#step-3-generating-your-drupal-client-credentials' + userName: + type: string + title: User Name + description: Your Drupal User Name + doc_section: '#step-2-finding-your-drupal-user-name' + connection_config: + baseUrl: + type: string + title: Base Url + description: Your Drupal base url + example: example.drupal.com + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-drupal-base-url' + +dualentry-mcp: + display_name: Dualentry (MCP) + categories: + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://api.dualentry.com/mcp/authorize + token_url: https://api.dualentry.com/mcp/token + registration_url: https://api.dualentry.com/mcp/register + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.dualentry.com + docs: https://nango.dev/docs/api-integrations/dualentry-mcp + +dynatrace: + display_name: Dynatrace + categories: + - analytics + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.environmentId}.live.dynatrace.com + headers: + authorization: Api-Token ${apiKey} + docs: https://nango.dev/docs/api-integrations/dynatrace + docs_connect: https://nango.dev/docs/api-integrations/dynatrace/connect + connection_config: + environmentId: + type: string + title: Environment ID + description: Your Dynatrace environment ID. + pattern: '^[a-z0-9]+$' + example: mew08*** + order: 1 + doc_section: '#step-1-find-your-environment-id' + credentials: + apiKey: + type: string + title: API Token + description: Your Dynatrace API token. + pattern: '^dt0[a-z]\d+\.[A-Z0-9]+\.[A-Z0-9]+$' + example: dt0s01.ST2EY72KQINMH5***********.G3DFPBEJYMODIDAEX454M7YWB*************************** + doc_section: '#step-2-generate-an-api-token' + +dynatrace-oauth: + display_name: Dynatrace (OAuth) + categories: + - analytics + - dev-tools + auth_mode: OAUTH2_CC + token_url: https://sso.dynatrace.com/sso/oauth2/token + scope_separator: ' ' + token_params: + grant_type: client_credentials + resource: urn:dtaccount:${connectionConfig.accountUuid} + proxy: + base_url: https://api.dynatrace.com + docs: https://nango.dev/docs/api-integrations/dynatrace-oauth + docs_connect: https://nango.dev/docs/api-integrations/dynatrace-oauth/connect + connection_config: + accountUuid: + type: string + title: Account UUID + description: Your Dynatrace account UUID. + example: 9a8b7c6d-1234-5678-abcd-ef0123456789 + format: uuid + order: 1 + doc_section: '#step-1-find-your-account-uuid' + credentials: + client_id: + type: string + title: Client ID + description: Your Dynatrace OAuth client ID. + example: dt0s03.**************** + doc_section: '#step-2-create-an-oauth-client' + client_secret: + type: string + title: Client Secret + description: Your Dynatrace OAuth client secret. + secret: true + example: dt0s03.5NJ******.GYWJPBF****************** + doc_section: '#step-2-create-an-oauth-client' + +emarsys: + display_name: Emarsys Core API (WSSE) + categories: + - marketing + auth_mode: SIGNATURE + signature: + protocol: WSSE + proxy: + base_url: https://api.emarsys.net + headers: + content-type: application/json + x-wsse: ${accessToken} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v2/settings + retry: + at: + - 'x-ratelimit-reset' + token: + expires_in_ms: 300000 + docs: https://nango.dev/docs/integrations/all/emarsys + credentials: + username: + type: string + title: ID + description: The ID of your Emarsys WSSE API Credentials + pattern: '^[a-zA-Z0-9_-]+$' + password: + type: string + title: Client Secret + description: The Client Secret of your Emarsys WSSE API Credentials + pattern: '^[a-zA-Z0-9-]+$' + +emarsys-oauth: + display_name: Emarsys (OAuth) + categories: + - marketing + auth_mode: OAUTH2_CC + token_url: https://auth.emarsys.net/oauth2/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.emarsys.net + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/integrations/all/emarsys-oauth + docs_connect: https://nango.dev/docs/integrations/all/emarsys-oauth/connect + +employment-hero: + display_name: Employment Hero + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://oauth.employmenthero.com/oauth2/authorize + token_url: https://oauth.employmenthero.com/oauth2/token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.employmenthero.com/api + docs: https://nango.dev/docs/integrations/all/employment-hero + +ebay: + display_name: eBay + categories: + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://auth.ebay.com/oauth2/authorize + token_url: https://api.ebay.com/identity/v1/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + token_request_auth_method: basic + proxy: + base_url: https://api.ebay.com/ + docs: https://nango.dev/docs/integrations/all/ebay + +ebay-sandbox: + display_name: eBay (Sandbox) + categories: + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://auth.sandbox.ebay.com/oauth2/authorize + token_url: https://api.sandbox.ebay.com/identity/v1/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + token_request_auth_method: basic + proxy: + base_url: https://api.sandbox.ebay.com/ + docs: https://nango.dev/docs/integrations/all/ebay-sandbox + +easypost: + display_name: EasyPost + categories: + - e-commerce + auth_mode: BASIC + proxy: + base_url: https://api.easypost.com + docs: https://nango.dev/docs/api-integrations/easypost + docs_connect: https://nango.dev/docs/api-integrations/easypost/connect + credentials: + username: + type: string + title: API Key + description: Your EasyPost API key. + pattern: '^EZ(AK|TK)[a-zA-Z0-9]+$' + example: EZTK****************************PCHxBDQG3lpZjneEFUxKmg + doc_section: '#step-1-get-your-api-key' + password: + type: string + title: '' + description: '' + hidden: true + default_value: '' + +e-conomic: + display_name: e-conomic + categories: + - accounting + auth_mode: BASIC + proxy: + base_url: https://restapi.e-conomic.com + headers: + content-type: application/json + docs: https://nango.dev/docs/integrations/all/e-conomic + credentials: + username: + type: string + title: Private Token + description: The Private Token for your e-conomic account + password: + type: string + title: Agreement Grant Token + description: The Agreement Grant Token for your e-conomic account + +ecu360: + display_name: ECU360 (Test) + categories: + - other + auth_mode: TWO_STEP + body_format: json + token_url: https://apim-test.ecu360.com/auth/v1/authenticate + token_params: + userName: ${credentials.userName} + password: ${credentials.password} + isEncrypted: false + mfaToken: '' + token_headers: + ecu360-api-key: ${credentials.apiKey} + content-type: application/json + token_response: + token: jwtToken + token_expires_in_ms: 900000 + proxy: + base_url: https://apim-test.ecu360.com + docs: https://nango.dev/docs/api-integrations/ecu360 + docs_connect: https://nango.dev/docs/api-integrations/ecu360/connect + credentials: + apiKey: + type: string + title: API Key + description: Your ECU360 API Key + secret: true + doc_section: '#step-2-obtaining-your-api-key' + userName: + type: string + title: Username + description: Your ECU360 username + doc_section: '#step-1-finding-your-credentials' + password: + type: string + title: Password + description: Your ECU360 password + secret: true + doc_section: '#step-1-finding-your-credentials' + +ecu360-production: + display_name: ECU360 (Production) + categories: + - other + alias: ecu360 + token_url: https://apim.ecu360.com/auth/v1/authenticate + proxy: + base_url: https://apim.ecu360.com + docs: https://nango.dev/docs/api-integrations/ecu360-production + docs_connect: https://nango.dev/docs/api-integrations/ecu360-production/connect + +egnyte: + display_name: Egnyte + categories: + - storage + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.egnyte.com/puboauth/token + token_url: https://${connectionConfig.subdomain}.egnyte.com/puboauth/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.egnyte.com/pubapi + docs: https://nango.dev/docs/integrations/all/egnyte + connection_config: + subdomain: + type: string + title: Egnyte Domain + description: The subdomain of your Egnyte account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .egnyte.com + prefix: https:// + +elevenlabs: + display_name: Eleven Labs + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.elevenlabs.io + headers: + xi-api-key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/user + docs: https://nango.dev/docs/integrations/all/elevenlabs + credentials: + apiKey: + type: string + title: API Key + description: The API key for your ElevenLabs account + +elevio: + display_name: Elevio + categories: + - knowledge-base + - support + auth_mode: API_KEY + proxy: + base_url: https://api.elev.io + headers: + x-api-key: ${apiKey} + authorization: Bearer ${connectionConfig.jwt} + docs: https://nango.dev/docs/integrations/all/elevio + credentials: + apiKey: + type: string + title: API Key + description: The API key to your Elevio account + pattern: '\b[a-f0-9]{40}\b' + example: 'x12z67890dd34t8gq5j01ycc75912348' + connection_config: + jwt: + type: string + title: JWT + description: The JWT to your Elevio account + pattern: '^[A-Za-z0-9-_]+\.([A-Za-z0-9-_]+\.[A-Za-z0-9-_]+)$' + +entrata: + display_name: Entrata + categories: + - other + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.entrata.com + docs: https://nango.dev/docs/integrations/all/entrata + connection_config: + subdomain: + type: string + title: Entrata Domain + description: The subdomain of your Entrata account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .entrata.com + prefix: https:// + +envoy: + display_name: Envoy + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://app.envoy.com/a/auth/v0/authorize + token_url: https://app.envoy.com/a/auth/v0/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.envoy.com + docs: https://nango.dev/docs/integrations/all/envoy + +epc-gov-uk: + display_name: Energy Performance Certificates (Gov.UK) + categories: + - other + auth_mode: API_KEY + proxy: + base_url: https://api.get-energy-performance-data.communities.gov.uk + headers: + authorization: Bearer ${apiKey} + accept: application/json + verification: + method: GET + endpoints: + - /api/codes + docs: https://nango.dev/docs/api-integrations/epc-gov-uk + docs_connect: https://nango.dev/docs/api-integrations/epc-gov-uk/connect + credentials: + apiKey: + type: string + title: API Key + description: The API bearer token of your account. + pattern: '^[A-Za-z0-9]{64}$' + example: 'a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2' + doc_section: '#step-2-finding-your-api-key' + +epic-games: + display_name: Epic Games + categories: + - gaming + auth_mode: OAUTH2 + authorization_url: https://www.epicgames.com/id/authorize + token_url: https://api.epicgames.dev/epic/oauth/v1/token + authorization_method: header + proxy: + base_url: https://api.epicgames.dev + docs: https://nango.dev/docs/integrations/all/epic-games + +evaluagent: + display_name: EvaluAgent + categories: + - support + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.region}.evaluagent.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/ping + docs: https://nango.dev/docs/integrations/all/evaluagent + connection_config: + region: + type: string + title: Region + description: The region of your EvaluAgent account. + enum: + - api + - api.us-east + - api.aus + credentials: + username: + type: string + title: Access Key Id + description: The Access Key ID for your EvaluAgent account + pattern: '^[a-zA-Z0-9-]+$' + password: + type: string + title: Secret Key + description: The Secret Key for your EvaluAgent account + pattern: '^[a-zA-Z0-9-]+$' + +eventbrite: + display_name: Eventbrite + categories: + - marketing + auth_mode: OAUTH2 + authorization_url: https://www.eventbrite.com/oauth/authorize + token_url: https://www.eventbrite.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://www.eventbriteapi.com + docs: https://nango.dev/docs/integrations/all/eventbrite + +everflow: + display_name: Everflow + categories: + - marketing + - analytics + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.eflow.team + headers: + x-eflow-api-key: ${apiKey} + docs: https://nango.dev/docs/api-integrations/everflow + docs_connect: https://nango.dev/docs/api-integrations/everflow/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: Your Everflow API subdomain. + enum: + - api + - api-eu + order: 1 + doc_section: '#step-2-find-your-subdomain' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Everflow account. + doc_section: '#step-1-generate-your-api-key' + +etsy: + display_name: Etsy + categories: + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://www.etsy.com/oauth/connect + token_url: https://api.etsy.com/v3/public/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.etsy.com + headers: + x-api-key: ${clientId}:${clientSecret} + docs: https://nango.dev/docs/api-integrations/etsy + setup_guide_url: https://nango.dev/docs/api-integrations/etsy/how-to-register-your-own-etsy-api-oauth-app + +exa: + display_name: Exa + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://api.exa.ai + headers: + x-api-key: ${apiKey} + docs: https://nango.dev/docs/integrations/all/exa + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Exa account + +exact-online: + display_name: Exact Online + categories: + - accounting + - erp + auth_mode: OAUTH2 + authorization_url: https://start.exactonline.${connectionConfig.extension}/api/oauth2/auth + token_url: https://start.exactonline.${connectionConfig.extension}/api/oauth2/token + authorization_method: header + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + token_expiration_buffer: 30 + proxy: + base_url: https://start.exactonline.${connectionConfig.extension}/ + headers: + accept: application/json + retry: + at: + - 'x-ratelimit-minutely-reset' + - 'x-ratelimit-reset' + error_code: + - '429' + - '503' + paginate: + type: link + link_path_in_response_body: d.__next + docs: https://nango.dev/docs/integrations/all/exact-online + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Exact Online account. + enum: + - nl + - be + - de + - fr + - es + - co.uk + - com + +exist: + display_name: Exist + categories: + - other + auth_mode: OAUTH2 + authorization_url: https://exist.io/oauth2/authorize + token_url: https://exist.io/oauth2/access_token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://exist.io/ + paginate: + type: link + link_path_in_response_body: next + docs: https://nango.dev/docs/integrations/all/exist + +expensify: + display_name: Expensify + categories: + - productivity + auth_mode: BASIC + proxy: + base_url: https://integrations.expensify.com/Integration-Server/ + headers: + content-type: application/x-www-form-urlencoded + credentials: + username: + type: string + title: Partner User ID + description: Your unique account identifier of Expensify + doc_section: '#step-1-finding-your-partneruserid-and-partnerusersecret' + password: + type: string + title: Partner User Secret + description: Unique secret for your account + doc_section: '#step-1-finding-your-partneruserid-and-partnerusersecret' + credentials_verification_script: expensifyCredentialsVerification + docs: https://nango.dev/docs/integrations/all/expensify + docs_connect: https://nango.dev/docs/integrations/all/expensify/connect + +factorial: + display_name: Factorial + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://api.factorialhr.com/oauth/authorize + token_url: https://api.factorialhr.com/oauth/token + disable_pkce: true + proxy: + base_url: https://api.factorialhr.com/api + docs: https://nango.dev/docs/integrations/all/factorial + +fairing: + display_name: Fairing + categories: + - marketing + - analytics + auth_mode: API_KEY + proxy: + base_url: https://app.fairing.co/api + headers: + authorization: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /questions + docs: https://nango.dev/docs/integrations/all/fairing + docs_connect: https://nango.dev/docs/integrations/all/fairing/connect + credentials: + apiKey: + type: string + title: Secret Token + description: The Secret Token for your Fairing account + pattern: '^[A-Za-z0-9_-]{64}$' + example: '3UjYpDjuk70Lt7AxC4M1x_7XvxoxkeX-OV7uTahJowilqLb2eLLvrtlvCGZgku1q' + doc_section: '#step-1-finding-your-secret-token' + +facebook: + display_name: Facebook + categories: + - marketing + - social + auth_mode: OAUTH2 + authorization_url: https://www.facebook.com/v22.0/dialog/oauth + token_url: https://graph.facebook.com/v22.0/oauth/access_token + proxy: + base_url: https://graph.facebook.com + docs: https://nango.dev/docs/api-integrations/facebook + setup_guide_url: https://nango.dev/docs/api-integrations/facebook/how-to-register-your-own-facebook-api-oauth-app + +fanvue: + display_name: Fanvue + categories: + - other + auth_mode: OAUTH2 + authorization_url: https://auth.fanvue.com/oauth2/auth + token_url: https://auth.fanvue.com/oauth2/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + default_scopes: + - offline_access + - offline + scope_separator: ' ' + proxy: + base_url: https://api.fanvue.com + headers: + x-fanvue-api-version: ${connectionConfig.version} || 2025-06-26 + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/fanvue + connection_config: + version: + type: string + title: '' + description: '' + automated: true + +fiber-ai: + display_name: Fiber AI + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://api.fiber.ai + query: + apiKey: ${apiKey} + verification: + method: GET + endpoints: + - /v1/get-org-credits + docs: https://nango.dev/docs/api-integrations/fiber-ai + docs_connect: https://nango.dev/docs/api-integrations/fiber-ai/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Fiber AI API key. + doc_section: '#step-1-getting-your-api-key' + +fathom: + display_name: Fathom + categories: + - communication + - video + auth_mode: API_KEY + proxy: + base_url: https://api.fathom.ai + headers: + x-api-key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /external/v1/teams + webhook_routing_script: fathomWebhookRouting + webhook_user_defined_secret: true + docs: https://nango.dev/docs/integrations/all/fathom + docs_connect: https://nango.dev/docs/integrations/all/fathom/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Fathom account + +fathom-oauth: + display_name: Fathom (OAuth) + categories: + - communication + - video + auth_mode: OAUTH2 + authorization_url: https://fathom.video/external/v1/oauth2/authorize + token_url: https://fathom.video/external/v1/oauth2/token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + webhook_routing_script: fathomWebhookRouting + webhook_user_defined_secret: true + proxy: + base_url: https://api.fathom.ai + retry: + at: + - 'ratelimit-reset' + docs: https://nango.dev/docs/api-integrations/fathom-oauth + setup_guide_url: https://nango.dev/docs/api-integrations/fathom-oauth/how-to-register-your-own-fathom-oauth-app + +fellow: + display_name: Fellow + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.fellow.app/api + headers: + x-api-key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/me + docs: https://nango.dev/docs/api-integrations/fellow + docs_connect: https://nango.dev/docs/api-integrations/fellow/connect + connection_config: + subdomain: + type: string + title: Workspace Subdomain + description: The subdomain of your Fellow workspace + pattern: '^[a-z0-9_-]+$' + example: myworkspace + order: 1 + doc_section: '#step-1-finding-your-workspace-subdomain' + credentials: + apiKey: + type: string + title: API Key + description: Your Fellow API Key + example: ab84bc2056614635866e4a98c153d7a1ab30541032fd433793d402f2a5db2404 + pattern: '^[a-f0-9]{64}$' + doc_section: '#step-2-generating-your-api-key' + +fern: + display_name: Fern (Public API) + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.baseUrl} + headers: + fern_api_key: ${apiKey} + docs: https://nango.dev/docs/api-integrations/fern + docs_connect: https://nango.dev/docs/api-integrations/fern/connect + credentials: + apiKey: + type: string + title: Fern API key + description: Your Fern API key. + doc_section: '#step-1-generate-your-fern-api-key' + connection_config: + baseUrl: + type: string + title: Docs URL + description: The domain of your Fern docs site. + example: docs.example.com + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-2-find-your-docs-url' + +freeagent: + display_name: FreeAgent + categories: + - accounting + - invoicing + auth_mode: OAUTH2 + authorization_url: https://api.freeagent.com/v2/approve_app + token_url: https://api.freeagent.com/v2/token_endpoint + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.freeagent.com + docs: https://nango.dev/docs/api-integrations/freeagent + setup_guide_url: https://nango.dev/docs/api-integrations/freeagent/how-to-register-your-own-freeagent-oauth-app + +freeagent-sandbox: + display_name: FreeAgent (Sandbox) + categories: + - accounting + - invoicing + auth_mode: OAUTH2 + authorization_url: https://api.sandbox.freeagent.com/v2/approve_app + token_url: https://api.sandbox.freeagent.com/v2/token_endpoint + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.sandbox.freeagent.com + docs: https://nango.dev/docs/api-integrations/freeagent-sandbox + setup_guide_url: https://nango.dev/docs/api-integrations/freeagent-sandbox/how-to-register-your-own-freeagent-oauth-app + +freepik: + display_name: Freepik + categories: + - other + auth_mode: API_KEY + proxy: + base_url: https://api.freepik.com + headers: + x-freepik-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v1/resources + docs: https://nango.dev/docs/api-integrations/freepik + docs_connect: https://nango.dev/docs/api-integrations/freepik/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Freepik account. + doc_section: '#step-1-obtain-your-freepik-api-key' + example: FPSXc7b3**********************5b2a + pattern: 'FPSX[0-9a-f]{32}' + +figjam: + display_name: FigJam + categories: + - design + - productivity + alias: figma + docs: https://nango.dev/docs/integrations/all/figjam + +figma: + display_name: Figma + categories: + - design + - productivity + auth_mode: OAUTH2 + authorization_url: https://www.figma.com/oauth + token_url: https://api.figma.com/v1/oauth/token + refresh_url: https://api.figma.com/v1/oauth/refresh + token_request_auth_method: basic + scope_separator: ',' + disable_pkce: true + proxy: + base_url: https://api.figma.com + docs: https://nango.dev/docs/integrations/all/figma + +figma-scim: + display_name: Figma (SCIM) + categories: + - design + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.host}/scim/v2/${connectionConfig.tenantId} + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /Users + docs: https://nango.dev/docs/integrations/all/figma-scim + docs_connect: https://nango.dev/docs/integrations/all/figma-scim/connect + credentials: + apiKey: + type: string + title: API Token + description: The API token for your Figma account + doc_section: '#step-3-generating-your-api-token' + connection_config: + host: + type: string + title: Host + description: The Figma host for your account. + format: hostname + enum: + - www.figma.com + - figma-gov.com + order: 1 + doc_section: '#step-1-finding-your-host' + tenantId: + type: string + title: Tenant ID + description: The tenant ID of your Figma account + order: 2 + doc_section: '#step-2-finding-your-tenant-id' + +falai: + display_name: fal.ai + categories: + - productivity + - dev-tools + auth_mode: API_KEY + proxy: + headers: + authorization: Key ${apiKey} + base_url: https://queue.fal.run + verification: + method: POST + headers: + content-type: application/json + endpoints: + - /fal-ai/fast-sdxl + docs: https://nango.dev/docs/integrations/all/falai + credentials: + apiKey: + type: string + title: API Key + description: The API key for your fal.ai account + +findymail: + display_name: FindyMail + categories: + - marketing + - crm + auth_mode: API_KEY + proxy: + base_url: https://app.findymail.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/findymail + docs_connect: https://nango.dev/docs/integrations/all/findymail/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your FindyMail account + +firefish: + display_name: Firefish + scope_separator: ' ' + categories: + - crm + auth_mode: OAUTH2_CC + token_url: https://api.firefishsoftware.com/authorization/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.firefishsoftware.com + docs: https://nango.dev/docs/integrations/all/firefish + +fireflies: + display_name: Fireflies + categories: + - analytics + - communication + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.fireflies.ai + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /graphql?query=%7B__schema%7Btypes%7Bname%7D%7D%7D + docs: https://nango.dev/docs/integrations/all/fireflies + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Fireflies account + +firstbase: + display_name: Firstbase + categories: + - hr + auth_mode: API_KEY + proxy: + base_url: https://apipub.firstbasehq.com + headers: + authorization: ApiKey ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/orders?size=1 + docs: https://nango.dev/docs/api-integrations/firstbase + docs_connect: https://nango.dev/docs/api-integrations/firstbase/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Firstbase account + doc_section: '#step-1-generating-your-api-key' + +fiserv: + display_name: Fiserv (OAuth) + categories: + - banking + - payment + auth_mode: OAUTH2_CC + token_url: https://cert.api.fiservapps.com/fts-apim/oauth2/v2 + token_request_auth_method: basic + expires_in_unit: milliseconds + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.hostUrl} + docs: https://nango.dev/docs/integrations/all/fiserv + connection_config: + hostUrl: + type: string + title: Domain + description: The domain of your Fiserv account + format: hostname + prefix: https:// + +fiserv-api-key: + display_name: Fiserv (API Key) + categories: + - banking + - payment + auth_mode: API_KEY + proxy: + base_url: https://prod.emea.api.fiservapps.com + headers: + api-key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /sandbox/exp/v1/authorisations + docs: https://nango.dev/docs/integrations/all/fiserv-api-key + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Fiserv account + +fitbit: + display_name: Fitbit + categories: + - sports + auth_mode: OAUTH2 + authorization_url: https://www.fitbit.com/oauth2/authorize + token_url: https://api.fitbit.com/oauth2/token + authorization_method: header + proxy: + base_url: https://api.fitbit.com + docs: https://nango.dev/docs/integrations/all/fitbit + +fillout-api-key: + display_name: Fillout (API Key) + categories: + - surveys + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.hostname} + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v1/api/forms + webhook_routing_script: filloutWebhookRouting + docs: https://nango.dev/docs/integrations/all/fillout-api-key + docs_connect: https://nango.dev/docs/integrations/all/fillout-api-key/connect + connection_config: + hostname: + type: string + title: Hostname + description: The hostname of your Fillout account + example: api.fillout.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-hostname-and-api-key' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Fillout account + example: sk_prod_n5ZEod5AwJQCtG3ncuzgXvpSWx19joz4KMSJlC2nVul9B48zhkCLuPc9Kq97tK7smlOcMChnk1uyaUeZ5Gm4GVrUUnDMxHI7TZH_31032 + pattern: '^sk_prod_[A-Za-z0-9]+_[0-9]+$' + doc_section: '#step-1-finding-your-hostname-and-api-key' + +fillout: + display_name: Fillout (Oauth) + categories: + - surveys + auth_mode: OAUTH2 + authorization_url: https://build.fillout.com/authorize/oauth + token_url: https://server.fillout.com/public/oauth/accessToken + proxy: + base_url: ${connectionConfig.base_url} + token_response_metadata: + - base_url + webhook_routing_script: filloutWebhookRouting + docs: https://nango.dev/docs/integrations/all/fillout + connection_config: + base_url: + type: string + title: '' + description: '' + automated: true + +float: + display_name: Float + categories: + - productivity + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + user-agent: ${connectionConfig.appDetails} || App (support@nango.dev) + base_url: https://api.float.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v3/tasks + docs: https://nango.dev/docs/integrations/all/float + docs_connect: https://nango.dev/docs/integrations/all/float/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Float account + pattern: '^[a-f0-9]{16}[a-zA-Z0-9+/]+=$' + example: c9b38e5af69912d0rq9tE/fbT5/RPLk8Ua7tfHo9s6xMiCKvmCOvenR/Krc= + doc_section: '#step-1-finding-your-api-key' + + connection_config: + appDetails: + type: string + title: App Details + description: The details of your app + automated: true + +folk: + display_name: Folk + categories: + - crm + auth_mode: API_KEY + webhook_routing_script: folkWebhookRouting + webhook_user_defined_secret: true + proxy: + base_url: https://api.folk.app + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'retry-after' + verification: + method: GET + endpoints: + - /v1/users/me + webhook_allowed_query_params: + - nangoConnectionId + docs: https://nango.dev/docs/api-integrations/folk + docs_connect: https://nango.dev/docs/api-integrations/folk/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Folk account + example: 'FOLKLrHVSoYB6TaAF39aNGtEpEi3oxuo' + pattern: '^FOLK[a-zA-Z0-9]+$' + doc_section: '#step-1-generating-your-api-key' + +followupboss: + display_name: Follow Up Boss + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://app.followupboss.com/oauth/authorize + token_url: https://app.followupboss.com/oauth/token + disable_pkce: true + authorization_params: + response_type: auth_code + proxy: + base_url: https://api.followupboss.com + docs: https://nango.dev/docs/api-integrations/followupboss + setup_guide_url: https://nango.dev/docs/api-integrations/followupboss/how-to-register-your-own-followupboss-oauth-app + +fortnox: + display_name: Fortnox + categories: + - accounting + - invoicing + auth_mode: OAUTH2 + authorization_url: https://apps.fortnox.se/oauth-v1/auth + token_url: https://apps.fortnox.se/oauth-v1/token + token_request_auth_method: basic + scope_separator: ' ' + authorization_params: + response_type: code + access_type: offline + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.fortnox.se/3 + docs: https://nango.dev/docs/integrations/all/fortnox + +freshbooks: + display_name: FreshBooks + categories: + - accounting + auth_mode: OAUTH2 + authorization_url: https://auth.freshbooks.com/oauth/authorize + token_url: https://api.freshbooks.com/auth/oauth/token + authorization_params: + response_type: code + proxy: + base_url: https://api.freshbooks.com + docs: https://nango.dev/docs/integrations/all/freshbooks + +freshdesk: + display_name: FreshDesk + categories: + - support + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.freshdesk.com + verification: + headers: + content-type: application/json + endpoints: + - /api/v2/settings/helpdesk + docs: https://nango.dev/docs/api-integrations/freshdesk + docs_connect: https://nango.dev/docs/api-integrations/freshdesk/connect + credentials: + username: + type: string + title: FreshDesk API Key + description: The API Key of your FreshDesk account + doc_section: '#step-1-finding-your-freshdesk-api-key' + secret: true + password: + type: string + title: '' + description: '' + default_value: X + hidden: true + connection_config: + subdomain: + type: string + title: FreshDesk Domain + description: The subdomain of your FreshDesk account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .freshdesk.com + prefix: https:// + doc_section: '#step-2-finding-your-freshdesk-domain' + +freshsales: + display_name: Freshsales + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.bundleAlias} || https://${connectionConfig.subdomain}.freshsales.io + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/settings/leads/fields + headers: + authorization: Token token=${apiKey} + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/freshsales + docs_connect: https://nango.dev/docs/api-integrations/freshsales/connect + connection_config: + bundleAlias: + type: string + title: Bundle Alias + description: The bundle alias for your Freshsales account + prefix: https:// + example: acme.myfreshworks.com/crm/sales + doc_section: '#step-2-finding-your-bundle-alias' + subdomain: + type: string + title: '' + description: '' + default_value: '' + hidden: true # deprecating this in favor of bundleAlias + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Freshsales account + example: 4oBqA_AzM_G3xbW3TJGvrA + pattern: '[A-Za-z0-9_-]+' + doc_section: '#step-1-finding-your-freshsales-api-key' + +freshservice: + display_name: Freshservice + categories: + - support + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.freshservice.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v2/tickets + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/freshservice + docs_connect: https://nango.dev/docs/integrations/all/freshservice/connect + connection_config: + subdomain: + type: string + title: Freshservice subdomain + description: The subdomain of your Freshservice account + pattern: '^[a-z0-9_-]+$' + example: subdomain + suffix: .freshservice.com + prefix: https:// + doc_section: '#step-2-finding-your-freshservice-subdomain' + credentials: + username: + type: string + title: API key + description: The API Key of your Freshservice account + secret: true + doc_section: '#step-1-finding-your-freshservice-api-key' + password: + type: string + title: '' + description: '' + # https://api.freshservice.com/#authentication + # FreshService is using basic auth with an api key, the basic username/password was deprecated + default_value: 'X' + hidden: true + +freshteam: + display_name: Freshteam + categories: + - hr + - ats + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.accountName}.freshteam.com + headers: + authorization: Bearer ${apiKey} + accept: application/json + docs: https://nango.dev/docs/integrations/all/freshteam + docs_connect: https://nango.dev/docs/integrations/all/freshteam/connect + connection_config: + accountName: + type: string + title: Account Name + description: The account name of your Freshteam account + example: nango + format: hostname + suffix: .freshteam.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-account-name' + credentials: + apiKey: + type: string + title: API Key + description: The API key to your Freshteam account + doc_section: '#step-2-finding-your-api-key' + example: 'XtoF94LMNyKPbd5AvR1QJh' + pattern: '^[a-zA-Z0-9_!@#$%^&*()\\-+=]+$' + +freshworks: + display_name: Freshworks + categories: + - crm + - support + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.hostname}/org/oauth/v2/authorize + token_url: https://${connectionConfig.hostname}/org/oauth/v2/token + disable_pkce: true + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.bundleAlias} + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/freshworks + docs_connect: https://nango.dev/docs/api-integrations/freshworks/connect + connection_config: + hostname: + type: string + title: Freshworks Hostname + description: The hostname of your Freshworks account. + format: hostname + example: acme.myfreshworks.com + prefix: https:// + doc_section: '#step-1-finding-your-freshworks-hostname' + bundleAlias: + type: string + title: API Hostname + description: The hostname of your Freshworks product used for API calls. + format: hostname + example: acme.freshservice.com + prefix: https:// + doc_section: '#step-2-finding-your-api-hostname' + +front: + display_name: Front + categories: + - support + - ticketing + auth_mode: OAUTH2 + authorization_url: https://app.frontapp.com/oauth/authorize + token_url: https://app.frontapp.com/oauth/token + proxy: + base_url: https://api2.frontapp.com + retry: + after: + - 'retry-after' + paginate: + type: link + response_path: _results + link_path_in_response_body: _pagination.next + docs: https://nango.dev/docs/integrations/all/front + +front-api-key: + display_name: Front (API Key) + categories: + - support + - ticketing + auth_mode: API_KEY + proxy: + base_url: https://api2.frontapp.com + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'retry-after' + verification: + method: GET + endpoints: + - /me + docs: https://nango.dev/docs/api-integrations/front-api-key + docs_connect: https://nango.dev/docs/api-integrations/front-api-key/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Front API token. + example: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.**** + doc_section: '#step-1-finding-your-api-token' + +fullenrich: + display_name: FullEnrich + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://app.fullenrich.com/api + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v2/account/credits + docs: https://nango.dev/docs/api-integrations/fullenrich + docs_connect: https://nango.dev/docs/api-integrations/fullenrich/connect + credentials: + apiKey: + type: string + title: API Key + description: Your FullEnrich API key. + example: 123e4567-e89b-12d3-a456-426614174000 + format: uuid + doc_section: '#step-1-getting-your-api-key' + +gainsight-cc: + display_name: Gainsight CC + categories: + - support + - crm + auth_mode: OAUTH2_CC + token_url: https://api2-${connectionConfig.region}.insided.com/oauth2/token + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://api2-${connectionConfig.region}.insided.com + docs: https://nango.dev/docs/integrations/all/gainsight-cc + docs_connect: https://nango.dev/docs/integrations/all/gainsight-cc/connect + connection_config: + region: + type: string + title: Region + description: The region of your Gainsight account + example: eu-west-1 + pattern: '^[a-z]{2}-[a-z]+-[1-9]$' + doc_section: '#step-2-finding-your-region' + +garmin: + display_name: Garmin + categories: + - sports + auth_mode: OAUTH1 + request_url: https://connectapi.garmin.com/oauth-service/oauth/request_token + authorization_url: https://connect.garmin.com/oauthConfirm + token_url: https://connectapi.garmin.com/oauth-service/oauth/access_token + signature_method: 'HMAC-SHA1' + proxy: + base_url: https://apis.garmin.com + docs: https://nango.dev/docs/integrations/all/garmin + +gebruder-weiss: + display_name: GebrΓΌder Weiss + categories: + - erp + auth_mode: OAUTH2_CC + authorization_url: https://my.api.gw-world.com/authorize + token_url: https://my.api.gw-world.com/token + token_request_auth_method: basic + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + headers: + accept-language: en-US + base_url: https://my.api.gw-world.com + docs: https://nango.dev/docs/integrations/all/gebruder-weiss + +google-gemini: + display_name: Google Gemini + categories: + - productivity + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://generativelanguage.googleapis.com + query: + key: ${apiKey} + headers: + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/models + docs: https://nango.dev/docs/api-integrations/google-gemini + docs_connect: https://nango.dev/docs/api-integrations/google-gemini/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Gemini account + doc_section: '#step-1-generating-your-api-key' + example: 'AQ.Ab8RN6I5RF**********-0Fe3mTuqX3**' + pattern: '^[0-9A-Za-z_.\-]+$' + +gem: + display_name: Gem + categories: + - ats + auth_mode: API_KEY + proxy: + base_url: https://api.gem.com + headers: + x-api-key: ${apiKey} + x-application-secret: ${connectionConfig.appSecret} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v0/users + docs: https://nango.dev/docs/integrations/all/gem + docs_connect: https://nango.dev/docs/integrations/all/gem/connect + credentials: + apiKey: + type: string + title: Shareable Access Key + description: The Shareable Access Key for your Integration + example: Xk9t3HZbWqLp7AeGvM4sUdYjBnR2TfQxCVi81oNz + pattern: '^[a-zA-Z0-9]{40}$' + doc_section: '#step-1-finding-your-shareable-access-key' + connection_config: + appSecret: + type: string + title: '' + description: '' + hidden: true + +gerrit: + display_name: Gerrit + categories: + - dev-tools + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.host} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /config/server/version + docs: https://nango.dev/docs/integrations/all/gerrit + docs_connect: https://nango.dev/docs/integrations/all/gerrit/connect + connection_config: + host: + type: string + title: Gerrit Host + description: The host to where you Gerrit instance is hosted + pattern: '^https?:\/\/[a-z0-9.-]+(:\d+)?(\/.*)?$' + example: http://localhost:8080 + doc_section: '#step-1-finding-your-host' + order: 1 + +getty-images: + display_name: Getty Images + categories: + - design + auth_mode: OAUTH2 + authorization_url: https://authentication.gettyimages.com/oauth2/auth + token_url: https://authentication.gettyimages.com/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.gettyimages.com + headers: + api-key: ${clientId} + docs: https://nango.dev/docs/api-integrations/getty-images + setup_guide_url: https://nango.dev/docs/api-integrations/getty-images/how-to-register-your-own-getty-images-oauth-app + +grammarly: + display_name: Grammarly + categories: + - productivity + auth_mode: OAUTH2_CC + token_url: https://auth.grammarly.com/v4/api/oauth2/token + scope_separator: ',' + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.grammarly.com/ecosystem/api + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/analytics/users + docs: https://nango.dev/docs/integrations/all/grammarly + +grammarly-scim: + display_name: Grammarly SCIM + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://sso.grammarly.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/scim/Users + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/grammarly-scim + docs_connect: https://nango.dev/docs/integrations/all/grammarly-scim/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Grammarly account + doc_section: '#step-1-finding-grammarly-scim-credentials' + example: 'Xk9t3HZbWqLp7AeGvM4sUdYjBnR2TfQxCVi81oNz' + +granola: + display_name: Granola + categories: + - productivity + - knowledge-base + auth_mode: API_KEY + proxy: + base_url: https://public-api.granola.ai + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v1/notes?page_size=1 + docs: https://nango.dev/docs/api-integrations/granola + docs_connect: https://nango.dev/docs/api-integrations/granola/connect + credentials: + apiKey: + type: string + title: API Token + description: The API key for your Granola account + example: grn_2isA***************_7HRD*********************** + pattern: '^grn_[A-Za-z0-9]+_[A-Za-z0-9]+$' + doc_section: '#step-1-generating-your-granola-api-token' + +granola-mcp: + display_name: Granola (MCP) + categories: + - productivity + - knowledge-base + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://mcp-auth.granola.ai/oauth2/authorize + token_url: https://mcp-auth.granola.ai/oauth2/token + registration_url: https://mcp-auth.granola.ai/oauth2/register + default_scopes: + - offline_access + authorization_params: + response_type: code + resource: https://mcp.granola.ai/ + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + headers: + accept: application/json,text/event-stream + base_url: https://mcp.granola.ai + docs: https://nango.dev/docs/api-integrations/granola-mcp + +guru: + display_name: Guru + categories: + - knowledge-base + auth_mode: BASIC + proxy: + base_url: https://api.getguru.com/api/v1 + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /whoami + docs: https://nango.dev/docs/integrations/all/guru + docs_connect: https://nango.dev/docs/integrations/all/guru/connect + credentials: + username: + type: string + title: User/Collection ID + description: The user or collection ID of your Guru account + doc_section: '#step-1-finding-your-user-collection-id' + password: + type: string + title: User/Collection Token + description: The user or collection token of your Guru account + secret: true + format: uuid + example: 123e4567-e89b-12d3-a456-426614174000 + doc_section: '#step-2-generating-your-user-collection-token' + +guru-scim: + display_name: Guru (SCIM) + categories: + - knowledge-base + auth_mode: BASIC + proxy: + base_url: https://api.getguru.com/api/scim + headers: + content-type: application/scim+json + verification: + method: GET + endpoints: + - /v2/Users + headers: + content-type: application/scim+json + docs: https://nango.dev/docs/integrations/all/guru-scim + docs_connect: https://nango.dev/docs/integrations/all/guru-scim/connect + credentials: + username: + type: string + title: SCIM Username + description: The SCIM username for your Guru account + doc_section: '#step-1-finding-guru-scim-credentials' + password: + type: string + title: SCIM Token + description: The SCIM token for your Guru account + doc_section: '#step-1-finding-guru-scim-credentials' + +github: + display_name: GitHub (User OAuth) + categories: + - dev-tools + - support + - ticketing + auth_mode: OAUTH2 + authorization_url: https://github.com/login/oauth/authorize + token_url: https://github.com/login/oauth/access_token + proxy: + base_url: https://api.github.com + retry: + at: + - 'x-ratelimit-reset' + remaining: 'x-ratelimit-remaining' + error_code: + - '403' + - '5xx' + - '401' + - '429' + paginate: + type: link + limit_name_in_request: per_page + link_rel_in_response_header: next + docs: https://nango.dev/docs/api-integrations/github + setup_guide_url: https://nango.dev/docs/api-integrations/github/how-to-register-your-own-github-api-oauth-app + +github-app: + display_name: GitHub (App) + categories: + - dev-tools + - popular + - ticketing + alias: github + auth_mode: APP + authorization_url: ${connectionConfig.appPublicLink}/installations/new + token_url: https://api.github.com/app/installations/${connectionConfig.installation_id}/access_tokens + webhook_routing_script: githubAppWebhookRouting + docs: https://nango.dev/docs/api-integrations/github-app + setup_guide_url: https://nango.dev/docs/api-integrations/github-app/how-to-register-your-own-github-app-api-app + connection_config: + appPublicLink: + type: string + title: App Public Link + description: The public link of your GitHub App + format: uri + pattern: '^https?://.*$' + automated: true + installation_id: + type: string + title: Installation ID + description: The installation ID of your GitHub App + example: '38631545' + automated: true + +github-app-oauth: + display_name: GitHub (App OAuth) + categories: + - dev-tools + - ticketing + alias: github + auth_mode: CUSTOM + authorization_url: ${connectionConfig.appPublicLink}/installations/new + authorization_url_skip_encode: + - base_url + token_url: + OAUTH2: https://github.com/login/oauth/access_token + APP: https://api.github.com/app/installations/${connectionConfig.installation_id}/access_tokens + webhook_routing_script: githubAppOauthWebhookRouting + post_connection_script: githubAppOauthPostConnection + docs: https://nango.dev/docs/api-integrations/github-app-oauth + setup_guide_url: https://nango.dev/docs/api-integrations/github-app-oauth/how-to-register-your-own-github-app-api-oauth-app + connection_config: + appPublicLink: + type: string + title: App Public Link + description: The public link of your GitHub App + format: uri + pattern: '^https?://.*$' + automated: true + installation_id: + type: string + title: Installation ID + description: The installation ID of your GitHub App + example: '38631545' + automated: true + +github-pat: + display_name: Github (Personal Access Token) + categories: + - dev-tools + - ticketing + auth_mode: API_KEY + proxy: + base_url: https://api.github.com + retry: + at: + - 'x-ratelimit-reset' + remaining: 'x-ratelimit-remaining' + error_code: + - '403' + - '5xx' + - '401' + - '429' + headers: + authorization: Bearer ${apiKey} + x-github-api-version: ${connectionConfig.version} || 2022-11-28 + accept: application/vnd.github+json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /user + docs: https://nango.dev/docs/integrations/all/github-pat + docs_connect: https://nango.dev/docs/integrations/all/github-pat/connect + connection_config: + version: + type: string + title: '' + description: '' + automated: true + credentials: + apiKey: + type: string + title: Personal Access Token + description: The Personal Access Token to your Github account + pattern: '^(?:github_pat|ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{36,255}$' + example: 'github_pat_***********************xRIoxmseCYRHDDIOFfTOyKex' + doc_section: '#step-1-finding-your-personal-access-token' + +gitlab: + display_name: GitLab + categories: + - dev-tools + - ticketing + auth_mode: OAUTH2 + authorization_url: https://gitlab.com/oauth/authorize + token_url: https://gitlab.com/oauth/token + authorization_params: + response_type: code + proxy: + base_url: https://gitlab.com + docs: https://nango.dev/docs/integrations/all/gitlab + +gitlab-pat: + display_name: GitLab (Personal Access Token) + categories: + - dev-tools + - ticketing + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.hostname} + headers: + private-token: ${apiKey} + retry: + at: + - 'x-ratelimit-reset' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v4/users + docs: https://nango.dev/docs/integrations/all/gitlab-pat + docs_connect: https://nango.dev/docs/integrations/all/gitlab-pat/connect + credentials: + apiKey: + type: string + title: Personal Access Token + example: glpat-PMJoma_*******.***.***xwve + pattern: '^glpat-[A-Za-z0-9._-]+$' + description: The Personal Access Token for your GitLab account + doc_section: '#step-2-creating-your-personal-access-token' + connection_config: + hostname: + type: string + title: Hostname + description: The hostname of your Gitlab instance + format: hostname + example: gitlab.com + doc_section: '#step-1-finding-your-hostname' + order: 1 + +ghost-admin: + display_name: Ghost (Admin API) + categories: + - dev-tools + - design + - cms + auth_mode: JWT + signature: + protocol: HMAC + token: + signing_key: ${credentials.privateKey.secret} + expires_in_ms: 300000 + header: + alg: HS256 + kid: ${credentials.privateKey.id} + payload: + aud: /admin/ + proxy: + headers: + accept: application/json + accept-version: ${connectionConfig.version} + authorization: Ghost ${accessToken} + base_url: https://${connectionConfig.adminDomain}/ghost/api/admin/ + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /users + docs: https://nango.dev/docs/integrations/all/ghost-admin + connection_config: + adminDomain: + type: string + title: Ghost Admin Domain + description: The domain of your Ghost Admin which can be different from your main domain + example: 'mock.ghost.io' + pattern: '^([a-z0-9_-]+\.|)(ghost\.io|[a-z0-9_-]+\.[a-z]{2,})$' + order: 1 + version: + type: string + title: API Version + description: The version of the Ghost Admin API to use + example: 'v3.0' + pattern: '^v\d+\.\d+$' + order: 2 + credentials: + privateKey: + type: string + title: API Key + description: The private key for your Ghost account + pattern: '^[a-fA-F0-9]{24}:[a-fA-F0-9]{64}$' + example: 1234567890abcdef12345678:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890 + +ghost-content: + display_name: Ghost (Content API) + categories: + - dev-tools + - design + - cms + auth_mode: API_KEY + proxy: + headers: + accept-version: ${connectionConfig.version} + base_url: https://${connectionConfig.adminDomain}/ghost/api/content/ + query: + key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /tags + docs: https://nango.dev/docs/integrations/all/ghost-content + connection_config: + version: + type: string + title: API Version + description: The version of the Ghost Admin API to use + example: 'v3.0' + pattern: '^v\d+\.\d+$' + adminDomain: + type: string + title: Ghost Admin Domain + description: The domain of your Ghost Admin which can be different from your main domain + example: 'mock.ghost.io' + pattern: '^([a-z0-9_-]+\.|)(ghost\.io|[a-z0-9_-]+\.[a-z]{2,})$' + credentials: + apiKey: + type: string + title: API Key + description: The content API key for your Ghost account + pattern: '^[a-zA-Z0-9]{26}$' + example: a1b2c3d4e5f6g7h8i9j0k1l2m3 + +gong: + display_name: Gong (Basic Auth) + categories: + - communication + - marketing + - productivity + - video + auth_mode: BASIC + proxy: + base_url: https://api.gong.io + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/gong + docs_connect: https://nango.dev/docs/integrations/all/gong/connect + credentials: + username: + type: string + title: Access Key + description: Your Gong Access Key + pattern: '^[a-zA-Z0-9-]+$' + doc_section: '#step-1-finding-gong-api-key-and-api-key-secret' + password: + type: string + title: Access Key Secret + description: Your Gong Access Key Secret + default_value: '' + doc_section: '#step-1-finding-gong-api-key-and-api-key-secret' + +gong-oauth: + display_name: Gong (Oauth) + auth_mode: OAUTH2 + categories: + - communication + - marketing + - productivity + - video + - popular + authorization_url: https://app.gong.io/oauth2/authorize + token_url: https://app.gong.io/oauth2/generate-customer-token + token_response_metadata: + - api_base_url_for_customer + authorization_params: + response_type: code + access_type: offline + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + disable_pkce: true + token_request_auth_method: basic + proxy: + base_url: ${connectionConfig.api_base_url_for_customer} || https://api.gong.io + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/gong-oauth + connection_config: + api_base_url_for_customer: + type: string + title: API Base URL + description: The base URL of your Gong account + format: uri + automated: true + pattern: '^https?://.*$' + +glyphic: + display_name: Glyphic + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://api.glyphic.ai + headers: + x-api-key: ${apiKey} + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/test/ping + docs: https://nango.dev/docs/api-integrations/glyphic + docs_connect: https://nango.dev/docs/api-integrations/glyphic/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Glyphic API key + doc_section: '#step-1-getting-your-api-key' + +gamma: + display_name: Gamma + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://public-api.gamma.app + headers: + x-api-key: ${apiKey} + content-type: application/json + verification: + method: GET + headers: + accept: application/json + endpoints: + - /v1.0/folders + docs: https://nango.dev/docs/api-integrations/gamma + docs_connect: https://nango.dev/docs/api-integrations/gamma/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Gamma API key. + example: 'sk-gamma-xxxxxxxx' + pattern: '^sk-gamma-' + doc_section: '#step-1-getting-your-gamma-api-key' + +google: + display_name: Google + categories: + - communication + - dev-tools + - productivity + - social + auth_mode: OAUTH2 + authorization_url: https://accounts.google.com/o/oauth2/v2/auth + token_url: https://oauth2.googleapis.com/token + authorization_params: + response_type: code + access_type: offline + prompt: consent + proxy: + retry: + in_body: + path: error.message + value: /User-rate limit exceeded\. +Retry after (.+)/ + strategy: at + base_url: https://www.googleapis.com + paginate: + type: cursor + cursor_path_in_response: nextPageToken + limit_name_in_request: maxSize + cursor_name_in_request: pageToken + response_path: items + docs: https://nango.dev/docs/api-integrations/google + setup_guide_url: https://nango.dev/docs/api-integrations/google/how-to-register-your-own-google-api-oauth-app + webhook_routing_script: googleWebhookRouting + +google-analytics: + display_name: Google Analytics + alias: google + categories: + - analytics + docs: https://nango.dev/docs/api-integrations/google-analytics + setup_guide_url: https://nango.dev/docs/api-integrations/google-analytics/how-to-register-your-own-google-analytics-api-oauth-app + +google-bigquery: + display_name: Google BigQuery + categories: + - productivity + alias: google + proxy: + base_url: https://bigquery.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-bigquery + setup_guide_url: https://nango.dev/docs/api-integrations/google-bigquery/how-to-register-your-own-google-bigquery-api-oauth-app + +google-calendar: + display_name: Google Calendar + categories: + - popular + - productivity + alias: google + proxy: + base_url: https://www.googleapis.com + paginate: + type: cursor + cursor_path_in_response: nextPageToken + limit_name_in_request: maxSize + cursor_name_in_request: pageToken + response_path: items + retry: + error_code: + - '403' + - '5xx' + - '401' + - '429' + webhook_routing_script: googleCalendarWebhookRouting + post_connection_script: googleCalendarPostConnection + docs: https://nango.dev/docs/api-integrations/google-calendar + setup_guide_url: https://nango.dev/docs/api-integrations/google-calendar/how-to-register-your-own-google-calendar-api-oauth-app + +google-contacts: + display_name: Google Contacts + categories: + - productivity + alias: google + proxy: + base_url: https://people.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-contacts + setup_guide_url: https://nango.dev/docs/api-integrations/google-contacts/how-to-register-your-own-google-contacts-api-oauth-app + +google-chat: + display_name: Google Chat + alias: google + categories: + - productivity + proxy: + base_url: https://chat.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-chat + setup_guide_url: https://nango.dev/docs/api-integrations/google-chat/how-to-register-your-own-google-chat-api-oauth-app + +google-docs: + display_name: Google Docs + categories: + - productivity + alias: google + proxy: + base_url: https://docs.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-docs + setup_guide_url: https://nango.dev/docs/api-integrations/google-docs/how-to-register-your-own-google-docs-api-oauth-app + +google-mail: + display_name: Gmail + categories: + - popular + - productivity + alias: google + proxy: + base_url: https://gmail.googleapis.com + webhook_routing_script: gmailWebhookRouting + post_connection_script: googleMailPostConnection + docs: https://nango.dev/docs/api-integrations/google-mail + setup_guide_url: https://nango.dev/docs/api-integrations/google-mail/how-to-register-your-own-gmail-api-oauth-app + +google-maps: + display_name: Google Maps + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://maps.googleapis.com + query: + key: ${apiKey} + docs: https://nango.dev/docs/api-integrations/google-maps + docs_connect: https://nango.dev/docs/api-integrations/google-maps/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Google Maps API Key. + example: AIzaSyAY4P9A***************1YMSYBI + pattern: ^AIza[0-9A-Za-z\-_]+$ + doc_section: '#step-3-obtain-your-google-maps-api-key' + +google-search-console: + display_name: Google Search Console + alias: google + categories: + - productivity + proxy: + base_url: https://www.googleapis.com/webmasters + docs: https://nango.dev/docs/api-integrations/google-search-console + setup_guide_url: https://nango.dev/docs/api-integrations/google-search-console/how-to-register-your-own-google-search-console-oauth-app + +google-sheet: + display_name: Google Sheet + categories: + - productivity + alias: google + proxy: + base_url: https://sheets.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-sheet + setup_guide_url: https://nango.dev/docs/api-integrations/google-sheet/how-to-register-your-own-google-sheet-api-oauth-app + +google-slides: + display_name: Google Slides + categories: + - productivity + alias: google + proxy: + base_url: https://slides.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-slides + setup_guide_url: https://nango.dev/docs/api-integrations/google-slides/how-to-register-your-own-google-slides-api-oauth-app + +google-drive: + display_name: Google Drive + categories: + - knowledge-base + - popular + - storage + alias: google + docs: https://nango.dev/docs/api-integrations/google-drive + setup_guide_url: https://nango.dev/docs/api-integrations/google-drive/how-to-register-your-own-google-drive-api-oauth-app + +google-forms: + display_name: Google Forms + categories: + - productivity + alias: google + proxy: + base_url: https://forms.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-forms + setup_guide_url: https://nango.dev/docs/api-integrations/google-forms/how-to-register-your-own-google-forms-api-oauth-app + +google-tasks: + display_name: Google Tasks + categories: + - productivity + alias: google + proxy: + base_url: https://tasks.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-tasks + setup_guide_url: https://nango.dev/docs/api-integrations/google-tasks/how-to-register-your-own-google-tasks-api-oauth-app + +google-meet: + display_name: Google Meet + categories: + - communication + - productivity + alias: google + proxy: + base_url: https://meet.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-meet + setup_guide_url: https://nango.dev/docs/api-integrations/google-meet/how-to-register-your-own-google-meet-api-oauth-app + +google-ads: + display_name: Google Ads + categories: + - marketing + alias: google + token_url: https://www.googleapis.com/oauth2/v3/token + proxy: + base_url: https://googleads.googleapis.com + paginate: + type: cursor + cursor_path_in_response: nextPageToken + limit_name_in_request: pageSize + cursor_name_in_request: pageToken + response_path: results + docs: https://nango.dev/docs/api-integrations/google-ads + setup_guide_url: https://nango.dev/docs/api-integrations/google-ads/how-to-register-your-own-google-ads-api-oauth-app + +google-play: + display_name: Google Play + categories: + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://accounts.google.com/o/oauth2/auth + token_url: https://accounts.google.com/o/oauth2/token + authorization_params: + response_type: code + access_type: offline + prompt: consent + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://play.googleapis.com + docs: https://nango.dev/docs/integrations/all/google-play + +google-cloud-storage: + display_name: Google Cloud Storage + alias: google + categories: + - storage + docs: https://nango.dev/docs/api-integrations/google-cloud-storage + setup_guide_url: https://nango.dev/docs/api-integrations/google-cloud-storage/how-to-register-your-own-google-cloud-storage-api-oauth-app + +google-workspace-admin: + display_name: Google Workspace Admin + alias: google + categories: + - productivity + proxy: + base_url: https://admin.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-workspace-admin + setup_guide_url: https://nango.dev/docs/api-integrations/google-workspace-admin/how-to-register-your-own-google-workspace-admin-api-oauth-app + +google-service-account: + display_name: Google Service Account + categories: + - dev-tools + auth_mode: TWO_STEP + signature: + protocol: RSA + body_format: form + token: + signing_key: ${credentials.privateKey} + expires_in_ms: 3600000 + header: + alg: RS256 + typ: JWT + payload: + iss: ${credentials.serviceAccountEmailAddress} + scope: ${credentials.scopes} + aud: https://oauth2.googleapis.com/token + sub: ${credentials.delegatedAccessEmailAddress} + token_url: https://oauth2.googleapis.com/token + token_params: + grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer + assertion: ${token} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://www.googleapis.com + docs: https://nango.dev/docs/integrations/all/google-service-account + docs_connect: https://nango.dev/docs/integrations/all/google-service-account/connect + credentials: + serviceAccountEmailAddress: + type: string + title: Service Account Email Address + description: The email address of the service account + pattern: '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.iam\.gserviceaccount\.com$' + example: 'test@project.iam.gserviceaccount.com' + doc_section: '#step-1-create-a-service-account' + scopes: + type: string + title: Scopes + description: Scopes that your application should be granted access to + pattern: '^https://[^\s]+( https://[^\s]+)*$' + example: 'https://www.googleapis.com/auth/drive' + doc_section: '#step-4-finding-your-applications-scopes' + privateKey: + type: string + title: Private Key + description: The private key associated with your Google service account + example: '-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n-----END PRIVATE KEY-----' + pattern: '^-----BEGIN PRIVATE KEY-----\\n([A-Za-z0-9+/=\\n]+)\\n-----END PRIVATE KEY-----\\n?$' + doc_section: '#step-3-delegate-domain-wide-authority-optional-for-google-workspace' + delegatedAccessEmailAddress: + type: string + title: Delegated Access Email Address + description: The email address of the user for which the application is requesting delegated access + format: email + example: 'some.user@example.com' + optional: true + doc_section: '#step-2-generate-a-service-account-key' + +gorgias: + display_name: Gorgias + categories: + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.gorgias.com/oauth/authorize + token_url: https://${connectionConfig.subdomain}.gorgias.com/oauth/token + token_request_auth_method: basic + default_scopes: + - offline + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.gorgias.com + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/gorgias + connection_config: + subdomain: + type: string + title: Gorgias Domain + description: The subdomain of your Gorgias account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .gorgias.com + prefix: https:// + +gorgias-basic: + display_name: Gorgias (Basic Auth) + auth_mode: BASIC + categories: + - e-commerce + proxy: + base_url: https://${connectionConfig.subdomain}.gorgias.com + docs: https://nango.dev/docs/integrations/all/gorgias-basic + docs_connect: https://nango.dev/docs/integrations/all/gorgias-basic/connect + credentials: + username: + type: string + title: Username + description: Your Gorgias account Username + password: + type: string + title: API Key + description: Your Gorgias API Key + default_value: '' + doc_section: '#step-1-finding-gorgias-api-key-secret' + connection_config: + subdomain: + type: string + title: Gorgias Domain + description: The subdomain of your Gorgias account + pattern: '^[a-z0-9_-]+$' + prefix: https:// + order: 1 + +grafana: + display_name: Grafana + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.domain} + verification: + headers: + content-type: application/json + endpoints: + - /api/access-control/user/permissions + method: GET + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/grafana + docs_connect: https://nango.dev/docs/integrations/all/grafana/connect + connection_config: + domain: + type: string + title: Domain + description: Your Grafana domain + example: example.grafana.net + prefix: https:// + format: hostname + order: 1 + doc_section: '#step-1-finding-your-domain' + credentials: + apiKey: + type: string + title: Token + description: The Token for your Grafana service account + example: glsa_***************************************** + pattern: '^[A-Za-z0-9_-]+$' + doc_section: '#step-2-generating-your-service-account-token' + +grain: + display_name: Grain (OAuth) + categories: + - video + - communication + - productivity + auth_mode: OAUTH2 + authorization_url: https://grain.com/_/public-api/oauth2/authorize + token_url: https://api.grain.com/_/public-api/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://api.grain.com + docs: https://nango.dev/docs/integrations/all/grain + +grain-api-key: + display_name: Grain (API Key) + categories: + - video + - communication + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.grain.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /_/public-api/me + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/grain-api-key + credentials: + apiKey: + type: string + title: API Key + description: The personal access token to your Grain account + +greenhouse: + display_name: Greenhouse (OAuth) + categories: + - ats + auth_mode: OAUTH2 + authorization_url: https://api.greenhouse.io/oauth/authorize + token_url: https://api.greenhouse.io/oauth/token + proxy: + base_url: https://${connectionConfig.resource}.greenhouse.io + retry: + after: + - 'retry-after' + paginate: + type: link + limit_name_in_request: per_page + link_rel_in_response_header: next + docs: https://nango.dev/docs/integrations/all/greenhouse + docs_connect: https://nango.dev/docs/integrations/all/greenhouse/connect + connection_config: + resource: + type: string + title: Greenhouse API Domain + description: The Greenhouse API product domain you want to connect to + pattern: '^[a-z0-9_-]+$' + example: api + suffix: .greenhouse.io + prefix: https:// + doc_section: '#step-1-finding-your-greenhouse-api-domain' + +greenhouse-basic: + display_name: Greenhouse (Basic Auth) + categories: + - ats + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.resource}.greenhouse.io + retry: + after: + - 'retry-after' + paginate: + type: link + limit_name_in_request: per_page + link_rel_in_response_header: next + verification: + headers: + content-type: application/json + endpoints: + - /v1/candidates/ + docs: https://nango.dev/docs/integrations/all/greenhouse-basic + docs_connect: https://nango.dev/docs/integrations/all/greenhouse-basic/connect + connection_config: + resource: + type: string + title: Greenhouse API Domain + description: The Greenhouse API product domain you want to connect to + pattern: '^[a-z0-9_-]+$' + example: harvest + suffix: .greenhouse.io + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-greenhouse-api-domain' + credentials: + username: + type: string + title: API key + description: The API Key of your Greenhouse account + pattern: '^[a-zA-Z0-9-]+$' + secret: true + doc_section: '#step-2-generating-your-greenhouse-api-key' + password: + type: string + title: Password + description: Password + # https://developers.greenhouse.io/harvest.html#authentication + # Greenhouse is using basic auth with an api key + default_value: '' + hidden: true + +greenhouse-harvest: + display_name: Greenhouse (Harvest API) + auth_mode: BASIC + categories: + - ats + proxy: + base_url: https://harvest.greenhouse.io + retry: + after: + - 'retry-after' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/candidates + docs: https://nango.dev/docs/integrations/all/greenhouse-harvest + docs_connect: https://nango.dev/docs/integrations/all/greenhouse-harvest/connect + credentials: + username: + type: string + title: API key + description: The API Key of your Greenhouse account + pattern: '^[a-zA-Z0-9-]+$' + secret: true + doc_section: '#step-1-generating-your-greenhouse-api-key' + password: + type: string + title: Password + description: Password + # https://developers.greenhouse.io/harvest.html#authentication + # Greenhouse is using basic auth with an api key + default_value: '' + hidden: true + +greenhouse-harvest-partner: + display_name: Greenhouse Harvest Partner (V3) + categories: + - ats + auth_mode: OAUTH2 + authorization_url: https://auth.greenhouse.io/authorize + token_url: https://auth.greenhouse.io/token + token_request_auth_method: basic + disable_pkce: true + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://harvest.greenhouse.io + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/api-integrations/greenhouse-harvest-partner + setup_guide_url: https://nango.dev/docs/api-integrations/greenhouse-harvest-partner/how-to-register-your-own-greenhouse-harvest-partner-oauth-app + +greenhouse-harvest-oauth2-cc: + display_name: Greenhouse Harvest (Client Credentials V3) + categories: + - ats + auth_mode: OAUTH2_CC + token_url: https://auth.greenhouse.io/token?grant_type=client_credentials + token_request_auth_method: basic + body_format: json + token_params: + sub: ${connectionConfig.sub} + proxy: + base_url: https://harvest.greenhouse.io + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/api-integrations/greenhouse-harvest-oauth2-cc + docs_connect: https://nango.dev/docs/api-integrations/greenhouse-harvest-oauth2-cc/connect + connection_config: + sub: + type: string + title: User ID + description: The optional ID of the user to act on-behalf-of. + optional: true + example: '4212952002' + pattern: '^[0-9]+$' + doc_section: '#step-2-finding-your-user-id' + credentials: + client_id: + type: string + title: Client ID + description: Your Greenhouse client ID for authentication + doc_section: '#step-1-generating-your-client-credentials' + client_secret: + type: string + title: Client Secret + description: Your Greenhouse client secret for authentication + doc_section: '#step-1-generating-your-client-credentials' + +greenhouse-job-board: + display_name: Greenhouse (Job Board API) + auth_mode: BASIC + categories: + - ats + proxy: + base_url: https://boards-api.greenhouse.io + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/boards/${connectionConfig.boardToken} + docs: https://nango.dev/docs/integrations/all/greenhouse-job-board + docs_connect: https://nango.dev/docs/integrations/all/greenhouse-job-board/connect + credentials: + username: + type: string + title: API key + description: The API Key of your Greenhouse account + pattern: '^[a-zA-Z0-9-]+$' + secret: true + doc_section: '#step-2-generating-your-greenhouse-api-key' + password: + type: string + title: Password + description: Password + # https://developers.greenhouse.io/harvest.html#authentication + # Greenhouse is using basic auth with an api key + default_value: '' + hidden: true + connection_config: + boardToken: + type: string + title: Board Token + description: The Job Board URL token to your Greenhouse account + order: 1 + doc_section: '#step-1-finding-your-board-token' + +greenhouse-assessment: + display_name: Greenhouse (Assessment API) + auth_mode: BASIC + categories: + - ats + proxy: + base_url: https://${connectionConfig.baseUrl} + verification: + headers: + content-type: application/json + endpoints: + - /list_tests + docs: https://nango.dev/docs/integrations/all/greenhouse-assessment + docs_connect: https://nango.dev/docs/integrations/all/greenhouse-assessment/connect + connection_config: + baseUrl: + type: string + title: Assessment Base Url + description: The Assessment API Base Url you want to connect to + pattern: '^[a-z0-9_-]+$' + example: www.testing-partner.com + prefix: https:// + format: hostname + order: 1 + doc_section: '#step-1-obtaining-your-assessment-base-url' + credentials: + username: + type: string + title: API key + description: The API Key of your Greenhouse account + pattern: '^[a-zA-Z0-9-]+$' + secret: true + doc_section: '#step-2-obtaining-your-api-key' + password: + type: string + title: Password + description: Password + # https://developers.greenhouse.io/harvest.html#authentication + # Greenhouse is using basic auth with an api key + default_value: '' + hidden: true + +greenhouse-ingestion: + display_name: Greenhouse (Ingestion API) + auth_mode: OAUTH2 + authorization_url: https://api.greenhouse.io/oauth/authorize + token_url: https://api.greenhouse.io/oauth/token + categories: + - ats + proxy: + base_url: https://api.greenhouse.io + docs: https://nango.dev/docs/integrations/all/greenhouse-ingestion + +greenhouse-onboarding: + display_name: Greenhouse (Onboarding API) + auth_mode: BASIC + categories: + - ats + proxy: + base_url: https://onboarding-api.greenhouse.io + verification: + headers: + content-type: application/json + endpoints: + - /graphql?query=%7B__schema%7Btypes%7Bname,kind,fields%7Bname%7D%7D%7D%7D + credentials: + username: + type: string + title: Access Key + description: The Access Key to your Greenhouse Onboarding account + pattern: '^[a-zA-Z0-9-]+$' + doc_section: '#step-1-generating-your-access-and-secret-keys' + password: + type: string + title: Secret Key + description: The Secret Key to your Greenhouse Onboarding account + pattern: '^[a-zA-Z0-9-]+$' + doc_section: '#step-1-generating-your-access-and-secret-keys' + docs: https://nango.dev/docs/integrations/all/greenhouse-onboarding + docs_connect: https://nango.dev/docs/integrations/all/greenhouse-onboarding/connect + +grist: + display_name: Grist + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.environment}.getgrist.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /api/orgs + docs: https://nango.dev/docs/api-integrations/grist + docs_connect: https://nango.dev/docs/api-integrations/grist/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Grist API key + pattern: '^[a-f0-9]{40}$' + example: 980cb267c8fa52ae5b6a0a5b4977ec915add8c07 + connection_config: + environment: + type: string + title: Environment + description: The environment you want to connect to. + enum: + - team + - docs + order: 1 + doc_section: '#step-1-selecting-your-environment' + +gumroad: + display_name: Gumroad + categories: + - design + - e-commerce + - payment + auth_mode: OAUTH2 + authorization_url: https://gumroad.com/oauth/authorize + token_url: https://api.gumroad.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.gumroad.com + docs: https://nango.dev/docs/integrations/all/gumroad + +gusto: + display_name: Gusto + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://api.gusto.com/oauth/authorize + token_url: https://api.gusto.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.gusto.com + post_connection_script: gustoPostConnection + docs: https://nango.dev/docs/integrations/all/gusto + +gusto-demo: + display_name: Gusto (Demo) + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://api.gusto-demo.com/oauth/authorize + token_url: https://api.gusto-demo.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.gusto-demo.com + post_connection_script: gustoPostConnection + docs: https://nango.dev/docs/integrations/all/gusto-demo + +hackerrank-work: + display_name: HackerRank Work + categories: + - ats + auth_mode: BASIC + proxy: + base_url: https://www.hackerrank.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /x/api/v3/users?limit=10&offset=10 + docs: https://nango.dev/docs/integrations/all/hackerrank-work + docs_connect: https://nango.dev/docs/integrations/all/hackerrank-work/connect + credentials: + username: + type: string + title: API Key + description: Your HackerRank Work API Key + doc_section: '#step-1-finding-hackerrank-api-key' + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +halo-psa: + display_name: Halo PSA + categories: + - support + - ticketing + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.hostname}/auth/token + token_request_auth_method: basic + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.hostname}/api + docs: https://nango.dev/docs/api-integrations/halo-psa + docs_connect: https://nango.dev/docs/api-integrations/halo-psa/connect + connection_config: + hostname: + type: string + title: Hostname + description: Your Halo PSA hostname. + example: example.halopsa.com + format: hostname + prefix: https:// + doc_section: '#step-1-find-your-halo-api-details' + order: 1 + credentials: + client_id: + type: string + title: Client ID + description: Your Halo PSA API application Client ID + doc_section: '#step-3-create-an-api-application' + client_secret: + type: string + title: Client Secret + description: Your Halo PSA API application Client Secret + secret: true + doc_section: '#step-3-create-an-api-application' + +harvest: + display_name: Harvest + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://id.getharvest.com/oauth2/authorize + token_url: https://id.getharvest.com/api/v2/oauth2/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + headers: + user-agent: ${connectionConfig.appDetails} || App (support@nango.dev) + retry: + after: + - 'retry-after' + base_url: https://api.harvestapp.com + docs: https://nango.dev/docs/integrations/all/harvest + connection_config: + appDetails: + type: string + title: App Details + description: The details of your app + automated: true + +health-gorilla: + display_name: Health Gorilla + categories: + - other + auth_mode: OAUTH2 + authorization_url: https://api.healthgorilla.com/oauth/authorize + token_url: https://api.healthgorilla.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://healthgorilla.com + docs: https://nango.dev/docs/integrations/all/health-gorilla + +heap: + display_name: Heap + categories: + - other + auth_mode: TWO_STEP + proxy: + base_url: https://heapanalytics.com/api + token_url: https://heapanalytics.com/api/public/v0/auth_token + token_headers: + authorization: Basic ${base64(${credentials.appId}:${credentials.apiKey})} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/integrations/all/heap + docs_connect: https://nango.dev/docs/integrations/all/heap/connect + credentials: + appId: + type: string + title: App ID + description: Your Heap application ID + example: '3207896401' + pattern: '^\d+$' + doc_section: '#step-1-generating-your-api-key-and-app-id' + apiKey: + type: string + title: API Key + description: Your Heap API Key + secret: true + example: 1bc32cba-a5d6-438a-bbcc-af312f560a3c + format: uuid + doc_section: '#step-1-generating-your-api-key-and-app-id' + +hex: + display_name: Hex + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.hex.tech/api + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/hex + docs_connect: https://nango.dev/docs/api-integrations/hex/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Hex API Token. + example: hxtp_a1b2c3d4e5f6*** + pattern: '^hxt[pw]_[a-f0-9]+$' + doc_section: '#step-1-creating-your-api-token' + connection_config: + subdomain: + type: string + title: Subdomain + description: Your Hex subdomain. + pattern: '^[a-z0-9]([a-z0-9-]*[a-z0-9])?$' + example: app + doc_section: '#step-2-finding-your-subdomain' + +heyreach: + display_name: HeyReach + categories: + - social + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.heyreach.io/api + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /public/auth/CheckApiKey + docs: https://nango.dev/docs/integrations/all/heyreach + docs_connect: https://nango.dev/docs/integrations/all/heyreach/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your HeyReach account + pattern: '^[A-Za-z0-9+/]+={0,2}$' + example: 'FoVLZoM+nVyMELhqr7vH120O2FS1gZcAG5d2qs1bndg=' + doc_section: '#step-1-generating-an-api-key' + +hibob-service-user: + display_name: Hibob Service User + categories: + - hr + - popular + auth_mode: BASIC + proxy: + base_url: https://api.hibob.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/company/named-lists + retry: + at: + - 'x-ratelimit-reset' + credentials: + username: + type: string + title: Hibob ID + description: Your Hibob ID + doc_section: '#step-1-finding-your-hibob-service-user-id' + password: + type: string + title: Hibob Token + description: Your Hibob Token + default_value: '' + secret: true + doc_section: '#step-2-finding-your-hibob-token' + docs: https://nango.dev/docs/integrations/all/hibob-service-user + docs_connect: https://nango.dev/docs/integrations/all/hibob-service-user/connect + +heygen: + display_name: HeyGen + categories: + - video + auth_mode: OAUTH2 + authorization_url: https://app.heygen.com/oauth/authorize + token_url: https://api2.heygen.com/v1/oauth/token + refresh_url: https://api2.heygen.com/v1/oauth/refresh_token + proxy: + base_url: https://api2.heygen.com + docs: https://nango.dev/docs/api-integrations/heygen + setup_guide_url: https://nango.dev/docs/api-integrations/heygen/how-to-register-your-own-heygen-oauth-app + +heymarket: + display_name: Heymarket + categories: + - communication + - marketing + auth_mode: JWT + signature: + protocol: HMAC + hmac_secret_encoding: utf8 + token: + signing_key: ${credentials.apiSecretId}||${credentials.apiSecretKey} + expires_in_ms: 300000 + header: + alg: HS256 + typ: JWT + payload: + iss: ${credentials.apiSecretId} + proxy: + base_url: https://api.heymarket.com + headers: + accept: application/json + authorization: Bearer ${accessToken} + verification: + method: GET + headers: + accept: application/json + endpoints: + - /v1/team + docs: https://nango.dev/docs/api-integrations/heymarket + docs_connect: https://nango.dev/docs/api-integrations/heymarket/connect + credentials: + apiSecretId: + type: string + title: API Secret ID + description: Your Heymarket API Secret ID. + example: a0ee0000-0000-4000-8000-00000000abcd + format: uuid + doc_section: '#step-1-finding-your-api-secret-id-and-secret-key' + apiSecretKey: + type: string + title: API Secret Key + description: Your Heymarket API Secret Key. + secret: true + example: Aa0***Cc2***Ee4***Gg6***Ii8***Kk0 + pattern: ^[A-Za-z0-9]+$ + doc_section: '#step-1-finding-your-api-secret-id-and-secret-key' + +highlevel: + display_name: HighLevel + categories: + - marketing + auth_mode: OAUTH2 + authorization_url: https://marketplace.gohighlevel.com/oauth/chooselocation + token_url: https://services.leadconnectorhq.com/oauth/token + scope_separator: ' ' + proxy: + base_url: https://services.leadconnectorhq.com + disable_pkce: true + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + post_connection_script: highlevelPostConnection + webhook_routing_script: highlevelWebhookRouting + webhook_user_defined_secret: true + docs: https://nango.dev/docs/api-integrations/highlevel + setup_guide_url: https://nango.dev/docs/api-integrations/highlevel/how-to-register-your-own-highlevel-api-oauth-app + +highlevel-white-label: + display_name: HighLevel (LeadConnector) + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://marketplace.leadconnectorhq.com/oauth/chooselocation + token_url: https://services.leadconnectorhq.com/oauth/token + scope_separator: ' ' + proxy: + base_url: https://services.leadconnectorhq.com + disable_pkce: true + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + post_connection_script: highlevelPostConnection + webhook_routing_script: highlevelWebhookRouting + webhook_user_defined_secret: true + docs: https://nango.dev/docs/api-integrations/highlevel-white-label + setup_guide_url: https://nango.dev/docs/api-integrations/highlevel-white-label/how-to-register-your-own-highlevel-white-label-api-oauth-app + +holded: + display_name: Holded + categories: + - accounting + - crm + - invoicing + auth_mode: API_KEY + proxy: + base_url: https://api.holded.com/api + headers: + key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /invoicing/v1/contacts + docs: https://nango.dev/docs/integrations/all/holded + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Holded account + +hover: + display_name: Hover + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://hover.to/oauth/authorize + token_url: https://hover.to/oauth/token + disable_pkce: true + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.hover.to + docs: https://nango.dev/docs/integrations/all/hover + +huntress: + display_name: Huntress + categories: + - other + auth_mode: BASIC + proxy: + base_url: https://api.huntress.io + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/organizations + docs: https://nango.dev/docs/api-integrations/huntress + docs_connect: https://nango.dev/docs/api-integrations/huntress/connect + credentials: + username: + type: string + title: API Key + description: Your Huntress API key. + pattern: '^hk_[A-Za-z0-9]+$' + example: hk_XXXXXXXXXXXXXXXX + doc_section: '#step-1-generate-api-keys' + password: + type: string + title: API Secret + description: Your Huntress API secret. + secret: true + pattern: '^hs_[A-Za-z0-9]+$' + example: hs_XXXXXXXXXXXXXXXX + doc_section: '#step-1-generate-api-keys' + +hubspot: + display_name: HubSpot + categories: + - marketing + - support + - crm + - popular + auth_mode: OAUTH2 + authorization_url: https://app.hubspot.com/oauth/authorize + token_url: https://api.hubapi.com/oauth/v1/token + connection_configuration: + - portalId + post_connection_script: hubspotPostConnection + pre_connection_deletion_script: hubspotPreConnectionDeletion + webhook_routing_script: hubspotWebhookRouting + proxy: + retry: + remaining: 'x-hubspot-ratelimit-remaining' + base_url: https://api.hubapi.com + decompress: true + paginate: + type: cursor + cursor_path_in_response: paging.next.after + limit_name_in_request: limit + cursor_name_in_request: after + response_path: results + docs: https://nango.dev/docs/api-integrations/hubspot + setup_guide_url: https://nango.dev/docs/api-integrations/hubspot/how-to-register-your-own-hubspot-api-oauth-app + +hubspot-mcp: + display_name: HubSpot (MCP) + categories: + - marketing + - support + - crm + - mcp + auth_mode: MCP_OAUTH2 + client_registration: static + authorization_url: https://mcp.hubspot.com/oauth/authorize/user + token_url: https://mcp.hubspot.com/oauth/v3/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://mcp.hubspot.com + docs: https://nango.dev/docs/api-integrations/hubspot-mcp + setup_guide_url: https://nango.dev/docs/api-integrations/hubspot-mcp/how-to-register-your-own-hubspot-mcp-api-oauth-app + +incident-io: + display_name: Incident.io + categories: + - ticketing + auth_mode: API_KEY + proxy: + base_url: https://api.incident.io + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/identity + docs: https://nango.dev/docs/integrations/all/incident-io + docs_connect: https://nango.dev/docs/integrations/all/incident-io/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Incident.io account + example: 'inc_************************************f2c5e6a7b3d4**********' + pattern: 'inc_[a-f0-9]{64}$' + doc_section: '#step-1-generating-your-api-key' + +insightly: + display_name: Insightly + categories: + - crm + auth_mode: BASIC + proxy: + base_url: https://api.${connectionConfig.pod}.insightly.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v3.1/Contacts + docs: https://nango.dev/docs/integrations/all/insightly + connection_config: + pod: + type: string + title: Insightly Domain + description: The subdomain of your Insightly account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .insightly.com + prefix: https:// + credentials: + username: + type: string + title: API Key + description: Your Insightly API key + password: + type: string + title: '' + description: '' + hidden: true + default_value: '' + +instantly: + display_name: Instantly + categories: + - marketing + - communication + auth_mode: API_KEY + proxy: + base_url: https://api.instantly.ai/api + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/instantly + docs_connect: https://nango.dev/docs/integrations/all/instantly/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Instantly account + pattern: '^[A-Za-z0-9._=-]+$' + example: ZTQ****************************************QQ== + doc_section: '#step-1-generate-an-api-key' + +instagram: + display_name: Instagram + categories: + - marketing + - social + auth_mode: OAUTH2 + scope_separator: ',' + authorization_url: https://api.instagram.com/oauth/authorize + token_url: https://api.instagram.com/oauth/access_token + refresh_url: https://graph.instagram.com/refresh_access_token + proxy: + base_url: https://graph.instagram.com + docs: https://nango.dev/docs/api-integrations/instagram + setup_guide_url: https://nango.dev/docs/api-integrations/instagram/how-to-register-your-own-instagram-api-oauth-app + +icypeas: + display_name: Icypeas + categories: + - marketing + - crm + auth_mode: API_KEY + proxy: + base_url: https://app.icypeas.com/api + headers: + authorization: ${apiKey} + verification: + method: POST + endpoints: + - /email-search + docs: https://nango.dev/docs/integrations/all/icypeas + docs_connect: https://nango.dev/docs/integrations/all/icypeas/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Icypeas account + example: ab84bc2056614635866e4a98c153d7a1ab30541032fd433793d402f2a5db2404 + pattern: '^[a-f0-9]{64}$' + doc_section: '#step-1-finding-your-api-key' + +itglue: + display_name: IT Glue + categories: + - productivity + - other + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.itglue.com + headers: + x-api-key: ${apiKey} + content-type: application/vnd.api+json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /organizations + docs: https://nango.dev/docs/integrations/all/itglue + docs_connect: https://nango.dev/docs/integrations/all/itglue/connect + credentials: + apiKey: + type: string + title: API Key + description: Your IT Glue API key + doc_section: '#step-2-generating-your-api-key' + pattern: '^ITG\.[a-zA-Z0-9._-]+$' + example: ITG.12cca334567890_123456vasfagas7890 + connection_config: + subdomain: + type: string + title: Subdomain + description: Your IT Glue subdomain. + enum: + - api + - api.eu + - api.au + doc_section: '#step-1-finding-your-subdomain' + order: 1 + +immybot: + display_name: ImmyBot + categories: + - dev-tools + - support + auth_mode: OAUTH2_CC + body_format: form + token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token + token_params: + grant_type: client_credentials + scope: https://${connectionConfig.instanceSubdomain}.immy.bot/.default + proxy: + base_url: https://${connectionConfig.instanceSubdomain}.immy.bot + headers: + accept: application/json + docs: https://nango.dev/docs/api-integrations/immybot + docs_connect: https://nango.dev/docs/api-integrations/immybot/connect + connection_config: + tenantId: + type: string + title: Microsoft Entra Tenant ID + description: The Azure tenant ID that owns the ImmyBot app registration. + format: uuid + example: 00000000-0000-0000-0000-000000000000 + order: 1 + doc_section: '#step-1-create-or-find-your-microsoft-entra-app-registration' + instanceSubdomain: + type: string + title: ImmyBot Instance Subdomain + description: The first segment of your ImmyBot instance URL. + pattern: '^[a-z0-9][a-z0-9-]*[a-z0-9]$' + example: acme + prefix: https:// + suffix: .immy.bot + order: 2 + doc_section: '#step-6-find-your-immybot-instance-subdomain' + credentials: + client_id: + type: string + title: Client ID + description: The Application client ID from the Microsoft Entra app registration. + format: uuid + example: 00000000-0000-0000-0000-000000000000 + doc_section: '#step-1-create-or-find-your-microsoft-entra-app-registration' + client_secret: + type: string + title: Client Secret + description: The client secret value from the Microsoft Entra app registration. + secret: true + doc_section: '#step-2-create-a-client-secret' + +intercom: + display_name: Intercom + categories: + - marketing + - popular + - support + - surveys + - ticketing + auth_mode: OAUTH2 + authorization_url: https://app.${connectionConfig.region}.intercom.com/oauth || https://app.intercom.com/oauth + token_url: https://api.${connectionConfig.region}.intercom.io/auth/eagle/token || https://api.intercom.io/auth/eagle/token + proxy: + base_url: https://api.${connectionConfig.region}.intercom.io || https://api.intercom.io + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/api-integrations/intercom + setup_guide_url: https://nango.dev/docs/api-integrations/intercom/how-to-register-your-own-intercom-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/intercom/connect + pre_connection_deletion_script: intercomPreConnectionDeletion + connection_config: + region: + type: string + title: Region + description: The API region for your Intercom workspace. + enum: + - eu + - au + optional: true + doc_section: '#step-1-finding-your-region' + +intuit: + display_name: Intuit + categories: + - accounting + auth_mode: OAUTH2 + authorization_url: https://appcenter.intuit.com/connect/oauth2 + token_url: https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer + proxy: + base_url: https://quickbooks.api.intuit.com + docs: https://nango.dev/docs/integrations/all/intuit + +ironclad: + display_name: Ironclad + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://ironcladapp.com/oauth/authorize + token_url: https://${connectionConfig.subdomain}.ironcladapp.com/oauth/token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.ironcladapp.com + docs: https://nango.dev/docs/integrations/all/ironclad + docs_connect: https://nango.dev/docs/integrations/all/ironclad/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: Your Ironclad Environment Subdomain. + enum: + - na1 + - demo + - eu1 + doc_section: '#step-1-finding-your-subdomain' + +ironclad-cc: + display_name: Ironclad (Client Credentials) + categories: + - legal + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.subdomain}.ironcladapp.com/oauth/token + token_params: + grant_type: client_credentials + scope_separator: ' ' + proxy: + base_url: https://${connectionConfig.subdomain}.ironcladapp.com + headers: + x-as-user-email: ${connectionConfig.userEmail} + docs: https://nango.dev/docs/api-integrations/ironclad-cc + docs_connect: https://nango.dev/docs/api-integrations/ironclad-cc/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: Your Ironclad environment subdomain. + enum: + - na1 + - demo + - eu1 + order: 1 + userEmail: + type: string + title: User Email + description: The email of the Ironclad user on whose behalf API requests are made. + example: user@yourcompany.com + format: email + order: 2 + +jamf: + display_name: Jamf Pro (Client Credentials) + categories: + - other + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.instance}.jamfcloud.com/api/v1/oauth/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.instance}.jamfcloud.com + scope_separator: ' ' + docs: https://nango.dev/docs/integrations/all/jamf + connection_config: + instance: + type: string + title: Jamf Pro Instance + description: Your Jamf Pro instance + example: example + prefix: https:// + suffix: .jamfcloud.com + order: 1 + +jamf-basic: + display_name: Jamf Pro (Basic Auth) + categories: + - other + auth_mode: TWO_STEP + proxy: + base_url: https://${connectionConfig.instance}.jamfcloud.com + headers: + authorization: Bearer ${accessToken} + token_url: https://${connectionConfig.instance}.jamfcloud.com/api/v1/auth/token + token_headers: + authorization: Basic ${base64(${credentials.username}:${credentials.password})} + token_response: + token: token + token_expiration: expires + token_expiration_strategy: expireAt + docs: https://nango.dev/docs/integrations/all/jamf-basic + connection_config: + instance: + type: string + title: Jamf Pro Instance + description: Your Jamf Pro instance + example: example + prefix: https:// + suffix: .jamfcloud.com + order: 1 + credentials: + username: + type: string + title: Username + description: Your Jamf Pro username + password: + type: string + title: Password + description: Your Jamf Pro password + secret: true + +jamie: + display_name: Jamie + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://beta-api.meetjamie.ai + headers: + x-api-key: ${apiKey} + docs: https://nango.dev/docs/api-integrations/jamie + docs_connect: https://nango.dev/docs/api-integrations/jamie/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Jamie workspace or personal API key. + example: jk_your_api_key + pattern: '^jk_[a-zA-Z0-9_-]+$' + doc_section: '#step-1-create-an-api-key' + +jazzhr: + display_name: JazzHR + categories: + - hr + - ats + auth_mode: API_KEY + proxy: + base_url: https://api.resumatorapi.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/users?apikey=${credentials.apiKey} + query: + apikey: ${apiKey} + docs: https://nango.dev/docs/integrations/all/jazzhr + docs_connect: https://nango.dev/docs/integrations/all/jazzhr/connect + credentials: + apiKey: + type: string + title: API Key + description: Your JazzHR API Key + doc_section: '#step-1-finding-your-api-key' + +jiminny: + display_name: Jiminny + categories: + - productivity + - communication + auth_mode: API_KEY + proxy: + base_url: https://app.jiminny.${connectionConfig.region}/customer/api + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v1/me + docs: https://nango.dev/docs/api-integrations/jiminny + docs_connect: https://nango.dev/docs/api-integrations/jiminny/connect + connection_config: + region: + type: string + title: Region + description: The region your Jiminny account is hosted in. + enum: + - eu + - com + doc_section: '#step-1-find-your-region' + credentials: + apiKey: + type: string + title: API Key + description: Your Jiminny API key. + example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c + pattern: '^eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' + doc_section: '#step-2-generate-an-api-key' + +jira: + display_name: Jira (OAuth) + categories: + - popular + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://auth.atlassian.com/authorize + token_url: https://auth.atlassian.com/oauth/token + default_scopes: + - offline_access + authorization_params: + audience: api.atlassian.com + prompt: consent + connection_configuration: + - cloudId + - accountId + proxy: + base_url: https://api.atlassian.com + connection_config: + subdomain: ${connectionConfig.subdomain} + paginate: + type: link + link_rel_in_response_header: next + limit_name_in_request: limit + response_path: results + link_path_in_response_body: _links.next + post_connection_script: jiraPostConnection + webhook_routing_script: jiraWebhookRouting + docs: https://nango.dev/docs/api-integrations/jira + setup_guide_url: https://nango.dev/docs/api-integrations/jira/how-to-register-your-own-jira-api-oauth-app + connection_config: + subdomain: + type: string + title: Subdomain + optional: true + description: The subdomain of your Attlassian account + pattern: '^[a-zA-Z0-9.-]+$' + example: subdomain + suffix: .atlassian.net + prefix: https:// + +justworks: + display_name: Justworks + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://payroll.justworks.com/oauth/authorize + token_url: https://public-api.justworks.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + scope_separator: ' ' + proxy: + base_url: https://public-api.justworks.com + docs: https://nango.dev/docs/api-integrations/justworks + setup_guide_url: https://nango.dev/docs/api-integrations/justworks/how-to-register-your-own-justworks-oauth-app + +jira-basic: + display_name: Jira (Basic Auth) + categories: + - productivity + - ticketing + auth_mode: BASIC + proxy: + retry: + after: + - 'retry-after' + base_url: https://${connectionConfig.subdomain}.atlassian.net + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /rest/api/3/myself + docs: https://nango.dev/docs/integrations/all/jira-basic + connection_config: + subdomain: + type: string + title: Jira Domain + description: The subdomain of your Jira account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .atlassian.net + prefix: https:// + order: 1 + doc_section: '#step-2-finding-your-atlassian-domain' + credentials: + username: + type: string + title: Email Address + description: The Email Address of your Jira account + format: email + doc_section: '#step-3-finding-your-user-name' + password: + type: string + title: API Key + description: The API Key of your Jira account + doc_section: '#step-1-finding-atlassian-api-key' + docs_connect: https://nango.dev/docs/integrations/all/jira-basic/connect + +jira-data-center: + display_name: Jira Data Center + categories: + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.endpointURL}/rest/oauth2/latest/authorize + authorization_params: + grant_type: authorization_code + token_url: https://${connectionConfig.endpointURL}/rest/oauth2/latest/token + docs: https://nango.dev/docs/integrations/all/jira-data-center + proxy: + base_url: https://${connectionConfig.endpointURL}/rest/api/latest + connection_config: + endpointURL: + type: string + title: Domain + description: The domain of your Jira Data Center account + pattern: '^[a-zA-Z0-9.-]+(:\d+)?(/[a-zA-Z0-9._~-]+)*/?$' + prefix: https:// + example: foobar.atlassian.net + +jira-data-center-api-key: + display_name: Jira Data Center (API Key) + categories: + - productivity + - ticketing + auth_mode: API_KEY + proxy: + base_url: ${connectionConfig.baseUrl} + retry: + after: + - 'retry-after' + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/jira-data-center-api-key + docs_connect: https://nango.dev/docs/integrations/all/jira-data-center-api-key/connect + connection_config: + baseUrl: + type: string + title: Instance Base Url + description: The base Url for your Jira Data Center instance + pattern: '^(https?:\/\/)?[A-Za-z0-9.-]+(:\d+)?(\/[A-Za-z0-9._-]*)?$' + example: https://foobar.atlassian.net + doc_section: '#step-1-finding-your-instance-base-url' + order: 1 + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Jira Data Center + doc_section: '#step-2-generating-your-api-key' + +jira-data-center-basic: + display_name: Jira Data Center (Basic Auth) + categories: + - productivity + - ticketing + auth_mode: BASIC + proxy: + base_url: ${connectionConfig.baseUrl} + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/jira-data-center-basic + docs_connect: https://nango.dev/docs/integrations/all/jira-data-center-basic/connect + connection_config: + baseUrl: + type: string + title: Instance Base Url + description: The base Url for your Jira Data Center instance + pattern: '^(https?:\/\/)?[A-Za-z0-9.-]+(:\d+)?(\/[A-Za-z0-9._-]*)?$' + example: https://foobar.atlassian.net + doc_section: '#step-1-finding-your-instance-base-url' + order: 1 + credentials: + username: + type: string + title: Username + description: The username for your Jira Data Center + doc_section: '#step-2-finding-your-credentials' + password: + type: string + title: Password + description: The password for your Jira Data Center + doc_section: '#step-2-finding-your-credentials' + +jobadder: + display_name: Jobadder + categories: + - hr + - ats + auth_mode: OAUTH2 + disable_pkce: true + authorization_url: https://id.jobadder.com/connect/authorize + token_url: https://id.jobadder.com/connect/token + default_scopes: + - offline_access + authorization_params: + response_type: code + proxy: + base_url: https://api.jobadder.com + docs: https://nango.dev/docs/integrations/all/jobadder + +jobdiva: + display_name: JobDiva + categories: + - hr + - ats + auth_mode: TWO_STEP + token_url: https://api.jobdiva.com/apiv2/authenticate?clientid=${credentials.clientId}&username=${credentials.username}&password=${credentials.password} + token_request_method: GET + proxy: + base_url: https://api.jobdiva.com + token_response: + token: '' + webhook_routing_script: jobdivaWebhookRouting + webhook_user_defined_secret: true + docs: https://nango.dev/docs/integrations/all/jobdiva + docs_connect: https://nango.dev/docs/integrations/all/jobdiva/connect + credentials: + clientId: + type: string + title: Client ID + description: Your JobDiva Client ID + example: '3050' + doc_section: '#step-1-obtaining-your-client-id' + pattern: '^[0-9]{4}$' + username: + type: string + title: Username + description: Your JobDiva API username + example: username + doc_section: '#step-2-creating-an-api-user' + password: + type: string + title: Password + description: Your JobDiva API password + secret: true + example: password + doc_section: '#step-2-creating-an-api-user' + +jobber: + display_name: Jobber + categories: + - crm + - invoicing + auth_mode: OAUTH2 + authorization_url: https://api.getjobber.com/api/oauth/authorize + token_url: https://api.getjobber.com/api/oauth/token + authorization_params: + response_type: code + proxy: + headers: + x-jobber-graphql-version: ${connectionConfig.version} || 2025-01-20 + base_url: https://api.getjobber.com/api + docs: https://nango.dev/docs/integrations/all/jobber + connection_config: + version: + type: string + title: '' + description: '' + automated: true + +jobvite: + display_name: Jobvite + categories: + - ats + auth_mode: API_KEY + proxy: + base_url: https://api.jobvite.com/api + headers: + x-jvi-api: ${apiKey} + x-jvi-sc: ${connectionConfig.secretKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/candidate + docs: https://nango.dev/docs/integrations/all/jobvite + docs_connect: https://nango.dev/docs/integrations/all/jobvite/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Jobvite account + doc_section: '#step-1-getting-your-api-key-and-secret-key' + connection_config: + secretKey: + type: string + title: Secret Key + description: The secret key for your Jobvite account + secret: true + doc_section: '#step-1-getting-your-api-key-and-secret-key' + +jotform: + display_name: Jotform + categories: + - surveys + auth_mode: API_KEY + proxy: + base_url: https://api.jotform.com + headers: + apikey: ${apiKey} + docs: https://nango.dev/docs/integrations/all/jotform + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Jotform account + +jumpcloud: + display_name: JumpCloud + categories: + - iam + auth_mode: API_KEY + proxy: + base_url: https://console.jumpcloud.com/api + headers: + x-api-key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /organizations + docs: https://nango.dev/docs/integrations/all/jumpcloud + docs_connect: https://nango.dev/docs/integrations/all/jumpcloud/connect + credentials: + apiKey: + type: string + title: API Key + description: Your JumpCloud API Key. + example: jca_9mK4pL2xR8vN6qW1sT7uY3eA5bC9dF0hG2jM + pattern: '^[A-Za-z0-9_-]+$' + doc_section: '#step-1-generate-your-jumpcloud-api-key' + +helpscout-docs: + display_name: Help Scout Docs + categories: + - knowledge-base + - support + auth_mode: BASIC + proxy: + retry: + after: + - 'x-ratelimit-reset' + base_url: https://docsapi.helpscout.net + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/sites + docs: https://nango.dev/docs/integrations/all/helpscout-docs + docs_connect: https://nango.dev/docs/integrations/all/helpscout-docs/connect + credentials: + username: + type: string + title: API Key + description: Your Help Scout Docs API Key + secret: true + doc_section: '#step-1-finding-help-scout-api-key' + password: + type: string + title: '' + description: '' + default_value: 'X' + hidden: true + +helpscout-mailbox: + display_name: Help Scout Mailbox + categories: + - support + auth_mode: OAUTH2 + authorization_url: https://secure.helpscout.net/authentication/authorizeClientApplication + token_url: https://api.helpscout.net/v2/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + retry: + after: + - 'x-ratelimit-retry-after' + base_url: https://api.helpscout.net + docs: https://nango.dev/docs/integrations/all/helpscout-mailbox + +kandji: + display_name: Kandji + categories: + - support + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.kandji.io + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/kandji + docs_connect: https://nango.dev/docs/integrations/all/kandji/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain to your kandji account + doc_section: '#step-1-finding-your-subdomain' + order: 1 + credentials: + apiKey: + type: string + title: API Token + description: The API Token for your Kandji account + example: 1bc32cba-a5d6-438a-bbcc-af312f560a3c + format: uuid + doc_section: '#step-2-generating-your-api-token' + +keap: + display_name: Keap + categories: + - marketing + auth_mode: OAUTH2 + authorization_url: https://accounts.infusionsoft.com/app/oauth/authorize + token_url: https://api.infusionsoft.com/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.infusionsoft.com + docs: https://nango.dev/docs/integrations/all/keap + +keeper-scim: + display_name: Keeper (SCIM) + categories: + - productivity + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://keepersecurity.com/api/rest/scim/v2/${connectionConfig.node} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /Users + docs: https://nango.dev/docs/integrations/all/keeper-scim + docs_connect: https://nango.dev/docs/integrations/all/keeper-scim/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your node keeper account + pattern: '^[A-Za-z0-9+/=]+$' + example: 'J9b7kgdL2gf14d5F9p67zYXVrTZPTMEnl3/EmwwI9K2=' + doc_section: '#step-2-finding-your-api-key-api-token' + connection_config: + node: + type: string + title: Node + description: The node id to your Keeper account + pattern: '^\d{15}$' + example: '123435384338765' + doc_section: '#step-1-finding-your-node-id' + +kintone: + display_name: Kintone + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.kintone.com/oauth2/authorization + token_url: https://${connectionConfig.subdomain}.kintone.com/oauth2/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.kintone.com + docs: https://nango.dev/docs/integrations/all/kintone + docs_connect: https://nango.dev/docs/integrations/all/kintone/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain for your Kintone account + doc_section: '#step-1-finding-your-subdomain' + example: urdzw8p24agp + pattern: '^[a-z0-9_-]+$' + +kintone-user-api: + display_name: Kintone User API + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.kintone.com + verification: + method: GET + endpoints: + - /v1/users.json + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/kintone-user-api + docs_connect: https://nango.dev/docs/integrations/all/kintone-user-api/connect + credentials: + apiKey: + type: string + title: API Token + description: The API Token for your Kintone account + example: cy.s.api1.eyJraWQiOiJ2MSIsInR5cCI6IkpXVCIsImFsZyI6IkhTMjU2In0.eyJyYW5kIjoiNWQ4ZmNiOGYtMDk3ZC00MWNhLWJkZjAtYTAxN2ZiMDZkYjNlIiwiaXNzIjoieTkwNzgyIiwiZXhwIjoxNzU4MTg1Mzg5fQ.GUoYL6hBFGOywcfjxQB3Y3vSwEq67evDGcmVQvzPY94 + pattern: '^cy\.s\.api1\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' + doc_section: '#step-2-generating-your-api-token' + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain for your Kintone account + doc_section: '#step-1-finding-your-subdomain' + example: urdzw8p24agp + order: 1 + pattern: '^[a-z0-9_-]+$' + +konnektive: + display_name: Konnektive + categories: + - crm + - e-commerce + auth_mode: BASIC + proxy: + base_url: https://api.konnektive.com + query: + loginId: ${credentials.username} + password: ${credentials.password} + docs: https://nango.dev/docs/api-integrations/konnektive + docs_connect: https://nango.dev/docs/api-integrations/konnektive/connect + credentials: + username: + type: string + title: API Login ID + description: Your Konnektive API Login ID. + doc_section: '#step-1-find-your-api-credentials' + password: + type: string + title: API Password + description: Your Konnektive API password. + secret: true + doc_section: '#step-1-find-your-api-credentials' + +knowbe4: + display_name: KnowBe4 + categories: + - support + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.knowbe4.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/api-integrations/knowbe4 + docs_connect: https://nango.dev/docs/api-integrations/knowbe4/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your KnowBe4 account + doc_section: '#step-2-generating-your-knowbe4-api-key' + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain to your API base URL. + doc_section: '#step-1-finding-your-subdomain' + enum: + - us.api + - eu.api + - ca.api + - uk.api + - de.api + order: 1 + +klipfolio: + display_name: Klipfolio + categories: + - productivity + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://app.klipfolio.com + headers: + kf-api-key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/1.0/profile + docs: https://nango.dev/docs/integrations/all/klipfolio + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Klipfolio account + +klaviyo: + display_name: Klaviyo (API Key) + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://a.klaviyo.com + headers: + authorization: Klaviyo-API-Key ${apiKey} + revision: '2024-07-15' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/accounts + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/klaviyo + docs_connect: https://nango.dev/docs/integrations/all/klaviyo/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Klaviyo account + doc_section: '#step-1-finding-klaviyo-api-key' + +klaviyo-oauth: + display_name: Klaviyo (OAuth) + categories: + - marketing + auth_mode: OAUTH2 + authorization_url: https://www.klaviyo.com/oauth/authorize + token_url: https://a.klaviyo.com/oauth/token + token_request_auth_method: basic + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://a.klaviyo.com + headers: + revision: '2024-07-15' + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/klaviyo-oauth + +klicktipp: + display_name: KlickTipp + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.klicktipp.com + credentials: + apiKey: + type: string + title: API Key + description: Your KlickTipp API key. + example: a1b2c3d4e5f6g7h8 + pattern: '^[a-z0-9]{16}$' + secret: true + doc_section: '#step-1-getting-your-api-key' + docs: https://nango.dev/docs/api-integrations/klicktipp + docs_connect: https://nango.dev/docs/api-integrations/klicktipp/connect + +kno-commerce: + display_name: Kno Commerce + categories: + - e-commerce + auth_mode: OAUTH2_CC + token_url: https://app-api.knocommerce.com/api/oauth2/token + token_request_auth_method: basic + body_format: query + token_params: + grant_type: client_credentials + proxy: + base_url: https://app-api.knocommerce.com + docs: https://nango.dev/docs/api-integrations/kno-commerce + docs_connect: https://nango.dev/docs/api-integrations/kno-commerce/connect + credentials: + client_id: + type: string + title: Client ID + description: Your Kno Commerce API client ID + doc_section: '#step-1-creating-an-api-client' + client_secret: + type: string + title: Client Secret + description: Your Kno Commerce API client secret + secret: true + doc_section: '#step-1-creating-an-api-client' + +kustomer: + display_name: Kustomer + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.extension}.kustomerapp.com + retry: + after: + - 'x-ratelimit-reset' + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/kustomer + connection_config: + extension: + type: string + title: Kustomer Domain + description: The subdomain of your Kustomer account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .kustomerapp.com + prefix: https:// + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Kustomer account + +lagrowthmachine: + display_name: La Growth Machine + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://apiv2.lagrowthmachine.com + query: + KEY: ${apiKey} + docs: https://nango.dev/docs/integrations/all/lagrowthmachine + docs_connect: https://nango.dev/docs/integrations/all/lagrowthmachine/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your La Growth Machine account + example: 1bc32cba-a5d6-438a-bbcc-af312f560a3c + format: uuid + doc_section: '#step-1-finding-your-api-key' + +lastpass: + display_name: LastPass + categories: + - productivity + auth_mode: BASIC + proxy: + base_url: https://lastpass.com + docs: https://nango.dev/docs/integrations/all/lastpass + docs_connect: https://nango.dev/docs/integrations/all/lastpass/connect + credentials_verification_script: lastpassCredentialsVerification + credentials: + username: + type: string + title: CID + description: Your LastPass Account number + doc_section: '#step-1-finding-your-cid' + password: + type: string + title: Provhash + description: 'Your LastPass API key' + secret: true + doc_section: '#step-2-generating-your-provhash' + +lattice: + display_name: Lattice + categories: + - hr + auth_mode: API_KEY + proxy: + base_url: https://api.latticehq.com/ + headers: + authorization: Bearer ${apiKey} + accept: application/json + content-type: application/json + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/lattice + docs_connect: https://nango.dev/docs/integrations/all/lattice/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Lattice account + doc_section: '#step-1-finding-lattice-api-key' + +leadmagic: + display_name: LeadMagic + categories: + - marketing + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.leadmagic.io + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v1/credits + docs: https://nango.dev/docs/integrations/all/leadmagic + docs_connect: https://nango.dev/docs/integrations/all/leadmagic/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your LeadMagic account + example: 1e30029c105a89d36b76b879f01208d8 + pattern: '^[a-f0-9]{32}$' + doc_section: '#step-1-finding-your-api-key' + +leadfeeder: + display_name: Leadfeeder + categories: + - marketing + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.leadfeeder.com + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v1/accounts + docs: https://nango.dev/docs/api-integrations/leadfeeder + docs_connect: https://nango.dev/docs/api-integrations/leadfeeder/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key from your Leadfeeder account. + example: a3f8c2b1****************************8805 + pattern: '^[a-f0-9]{40}$' + doc_section: '#step-1-obtain-your-api-key' + +lessonly: + display_name: Lessonly + categories: + - productivity + auth_mode: BASIC + proxy: + base_url: https://api.lessonly.com/api + docs: https://nango.dev/docs/integrations/all/lessonly + credentials: + username: + type: string + title: Subdomain + description: Your Lessonly Subdomain + password: + type: string + title: API Key + description: Your Lessonly API key + secret: true + +lemlist: + display_name: lemlist + categories: + - marketing + - communication + auth_mode: BASIC + proxy: + base_url: https://api.lemlist.com + verification: + headers: + content-type: application/json + endpoints: + - /api/team + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/lemlist + docs_connect: https://nango.dev/docs/integrations/all/lemlist/connect + credentials: + username: + type: string + title: '' + description: '' + default_value: '' + hidden: true + password: + type: string + title: API Key + description: The API key for your Lemlist account + secret: true + example: a1b2c3d4e5f67890abcdefabcdefabcd + pattern: '[a-f0-9]$' + doc_section: '#step-1-generating-your-api-key' + +lever: + display_name: Lever (OAuth) + categories: + - ats + auth_mode: OAUTH2 + authorization_url: https://auth.lever.co/authorize + token_url: https://auth.lever.co/oauth/token + authorization_params: + response_type: code + audience: https://api.lever.co/v1/ + proxy: + base_url: https://api.lever.co + docs: https://nango.dev/docs/integrations/all/lever + +lever-basic: + display_name: Lever (Basic Auth) + auth_mode: BASIC + categories: + - ats + proxy: + base_url: https://api.lever.co + docs: https://nango.dev/docs/integrations/all/lever-basic + docs_connect: https://nango.dev/docs/integrations/all/lever-basic/connect + credentials: + username: + type: string + title: User name + description: The API Key of your lever account + doc_section: '#step-1-finding-lever-api-key' + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +lever-sandbox: + display_name: Lever (OAuth Sandbox) + categories: + - ats + auth_mode: OAUTH2 + authorization_url: https://sandbox-lever.auth0.com/authorize + token_url: https://sandbox-lever.auth0.com/oauth/token + authorization_params: + response_type: code + prompt: consent + audience: https://api.sandbox.lever.co/v1/ + proxy: + base_url: https://api.sandbox.lever.co + docs: https://nango.dev/docs/integrations/all/lever-sandbox + +lever-basic-sandbox: + display_name: Lever (Basic Auth Sandbox)) + categories: + - ats + auth_mode: BASIC + proxy: + base_url: https://api.sandbox.lever.co + docs: https://nango.dev/docs/integrations/all/lever-basic-sandbox + credentials: + username: + type: string + title: User name + description: The API Key of your Lever sandbox account + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +lightfield: + display_name: Lightfield + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.lightfield.app + headers: + authorization: Bearer ${apiKey} + lightfield-version: '2026-03-01' + verification: + method: GET + endpoints: + - /v1/auth/validate + docs: https://nango.dev/docs/api-integrations/lightfield + docs_connect: https://nango.dev/docs/api-integrations/lightfield/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Lightfield API key + example: sk_lf_0_... + pattern: '^sk_lf_0_[A-Za-z0-9_-]+$' + doc_section: '#step-1-create-an-api-key' + +lightspeed-retail: + display_name: Lightspeed Retail (X-Series) + categories: + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://secure.retail.lightspeed.app/connect + token_url: https://${connectionConfig.domain_prefix}.retail.lightspeed.app/api/1.0/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + redirect_uri_metadata: + - domain_prefix + disable_pkce: true + proxy: + base_url: https://${connectionConfig.domain_prefix}.retail.lightspeed.app + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/api-integrations/lightspeed-retail + setup_guide_url: https://nango.dev/docs/api-integrations/lightspeed-retail/how-to-register-your-own-lightspeed-retail-api-oauth-app + connection_config: + domain_prefix: + type: string + title: '' + description: '' + automated: true + +linear: + display_name: Linear + categories: + - popular + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://linear.app/oauth/authorize + token_url: https://api.linear.app/oauth/token + scope_separator: ',' + authorization_params: + prompt: consent + proxy: + base_url: https://api.linear.app + retry: + at: + - 'x-ratelimit-requests-reset' + remaining: 'x-ratelimit-requests-remaining' + error_code: + - '400' + - '5xx' + - '401' + - '429' + disable_pkce: true + webhook_routing_script: linearWebhookRouting + post_connection_script: linearPostConnection + pre_connection_deletion_script: linearPreConnectionDeletion + webhook_user_defined_secret: true + docs: https://nango.dev/docs/api-integrations/linear + setup_guide_url: https://nango.dev/docs/api-integrations/linear/how-to-register-your-own-linear-api-oauth-app + +linear-mcp: + display_name: Linear (MCP) + categories: + - popular + - productivity + - ticketing + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://mcp.linear.app/authorize + token_url: https://mcp.linear.app/token + registration_url: https://mcp.linear.app/register + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + docs: https://nango.dev/docs/api-integrations/linear-mcp + +linkedin: + display_name: LinkedIn + categories: + - ats + - social + auth_mode: OAUTH2 + authorization_url: https://www.linkedin.com/oauth/v2/authorization + token_url: https://www.linkedin.com/oauth/v2/accessToken + disable_pkce: true + proxy: + base_url: https://api.linkedin.com + docs: https://nango.dev/docs/api-integrations/linkedin + setup_guide_url: https://nango.dev/docs/api-integrations/linkedin/how-to-register-your-own-linkedin-api-oauth-app + +linkhut: + display_name: LinkHut + categories: + - social + auth_mode: OAUTH2 + authorization_url: https://ln.ht/_/oauth/authorize + token_url: https://api.ln.ht/v1/oauth/token + proxy: + base_url: https://api.ln.ht + docs: https://nango.dev/docs/integrations/all/linkhut + +lokalise: + display_name: Lokalise + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://app.lokalise.com/oauth2/auth + token_url: https://app.lokalise.com/oauth2/token + body_format: json + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + disable_pkce: true + proxy: + base_url: https://api.lokalise.com/api2 + docs: https://nango.dev/docs/api-integrations/lokalise + setup_guide_url: https://nango.dev/docs/api-integrations/lokalise/how-to-register-your-own-lokalise-oauth-app + +loom-scim: + display_name: Loom (SCIM) + categories: + - other + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.domain}/scim + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /Users + docs: https://nango.dev/docs/integrations/all/loom-scim + docs_connect: https://nango.dev/docs/integrations/all/loom-scim/connect + connection_config: + domain: + type: string + title: Loom SCIM Bridge URL + description: The domain for your Loom SCIM Bridge + example: scim.example.com + pattern: '^[a-zA-Z0-9.-]+$' + prefix: https:// + doc_section: '#step-4-get-your-scim-bridge-url' + credentials: + apiKey: + type: string + title: SCIM API Key + description: Your Loom SCIM API Key + secret: true + doc_section: '#step-3-retrieve-your-loom-scim-api-key' + +loops-so: + display_name: Loops.so + categories: + - marketing + - communication + auth_mode: API_KEY + proxy: + base_url: https://app.loops.so/api + headers: + accept: application/json + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/api-key + docs: https://nango.dev/docs/integrations/all/loops-so + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Loops.so account + pattern: '^[a-f0-9]{32}$' + example: d2d561f5ff80136f69b4b5a31b9fb3c9 + +loop-returns: + display_name: Loop Returns + categories: + - e-commerce + auth_mode: API_KEY + proxy: + headers: + x-authorization: ${apiKey} + base_url: https://api.loopreturns.com/api + docs: https://nango.dev/docs/integrations/all/loop-returns + docs_connect: https://nango.dev/docs/integrations/all/loop-returns/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Loop Returns account + doc_section: '#step-1-generating-your-api-key' + +looker: + display_name: Looker + categories: + - analytics + auth_mode: TWO_STEP + token_url: https://${connectionConfig.hostname}/api/4.0/login + body_format: form + token_params: + client_id: ${credentials.clientId} + client_secret: ${credentials.clientSecret} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://${connectionConfig.hostname}/api + docs: https://nango.dev/docs/api-integrations/looker + docs_connect: https://nango.dev/docs/api-integrations/looker/connect + connection_config: + hostname: + type: string + title: Looker Instance Hostname + description: Your Looker instance hostname + prefix: https:// + example: mycompany.looker.com + order: 1 + pattern: '^[a-zA-Z0-9.-]+(:[0-9]+)?$' + doc_section: '#step-1-finding-your-looker-hostname' + credentials: + clientId: + type: string + title: Client ID + description: Your Looker Client ID + doc_section: '#step-2-obtaining-your-client-credentials' + clientSecret: + type: string + title: Client Secret + description: Your Looker Client Secret + secret: true + doc_section: '#step-2-obtaining-your-client-credentials' + +looker-oauth: + display_name: Looker (OAuth) + categories: + - analytics + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.hostname}/auth + token_url: https://${connectionConfig.apiHostname}/api/token + authorization_params: + response_type: code + default_scopes: + - cors_api + body_format: json + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.apiHostname}/api + docs: https://nango.dev/docs/api-integrations/looker-oauth + setup_guide_url: https://nango.dev/docs/api-integrations/looker-oauth/how-to-register-your-own-looker-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/looker-oauth/connect + connection_config: + hostname: + type: string + title: Looker UI Hostname + description: Your Looker instance UI hostname. + format: hostname + prefix: https:// + example: mycompany.looker.com + order: 1 + doc_section: '#step-1-finding-your-looker-ui-hostname' + apiHostname: + type: string + title: Looker API Hostname + description: Your Looker API hostname including port. + pattern: '^[a-zA-Z0-9.-]+(:[0-9]+)?$' + prefix: https:// + example: mycompany.looker.com:19999 + order: 2 + doc_section: '#step-2-finding-your-looker-api-hostname' + +lucid-scim: + display_name: Lucid (SCIM) + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://users.lucid.app/scim + headers: + authorization: Bearer ${apiKey} + accept: application/json + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/Users + docs: https://nango.dev/docs/integrations/all/lucid-scim + docs_connect: https://nango.dev/docs/integrations/all/lucid-scim/connect + credentials: + apiKey: + type: string + title: API Key + description: The SCIM API key generated from the Lucid admin panel + doc_section: '#step-1-generate-the-bearer-token' + +luma: + display_name: Luma + categories: + - productivity + - ticketing + auth_mode: API_KEY + proxy: + headers: + x-luma-api-key: ${apiKey} + base_url: https://api.lu.ma + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /public/v1/user/get-self + docs: https://nango.dev/docs/integrations/all/luma + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Luma account + +lumos: + display_name: Lumos + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.lumos.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/api-integrations/lumos + docs_connect: https://nango.dev/docs/api-integrations/lumos/connect + credentials: + apiKey: + type: string + title: API Token + description: The API token to your Lumos account + example: 'lsk_example_1234' + doc_section: '#step-1-creating-your-api-token' + +listmonk: + display_name: Listmonk + categories: + - marketing + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.domain}/api + headers: + content-type: application/json + retry: + after: + - 'retry-after' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /lists + docs: https://nango.dev/docs/integrations/all/listmonk + connection_config: + domain: + type: string + title: Domain + description: The domain of your Listmonk account + format: hostname + prefix: https:// + credentials: + username: + type: string + title: API User + description: The API user to your Listmonk account + password: + type: string + title: Token + description: The token to your Listmonk account + secret: true + +listrak: + display_name: Listrak + categories: + - marketing + auth_mode: OAUTH2_CC + token_url: https://auth.listrak.com/oauth2/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.listrak.com/email + docs: https://nango.dev/docs/api-integrations/listrak + docs_connect: https://nango.dev/docs/api-integrations/listrak/connect + credentials: + client_id: + type: string + title: Client ID + description: Your Listrak API Client ID + doc_section: '#step-1-create-api-credentials' + client_secret: + type: string + title: Client Secret + description: Your Listrak API Client Secret + secret: true + doc_section: '#step-1-create-api-credentials' + +lob: + display_name: Lob + categories: + - marketing + auth_mode: BASIC + proxy: + base_url: https://api.lob.com + verification: + method: GET + endpoints: + - /v1/addresses + docs: https://nango.dev/docs/api-integrations/lob + docs_connect: https://nango.dev/docs/api-integrations/lob/connect + credentials: + username: + type: string + title: Secret API Key + description: Your Lob Secret API Key. + secret: true + example: 'live_0dc8d***************************5b0cc' + pattern: '^(test|live)_[a-f0-9]{35}$' + doc_section: '#step-1-getting-your-secret-api-key' + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +make: + display_name: Make + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.environmentUrl}/api/v2 + headers: + authorization: Token ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /users/me + docs: https://nango.dev/docs/integrations/all/make + docs_connect: https://nango.dev/docs/integrations/all/make/connect + connection_config: + environmentUrl: + type: string + title: Domain + description: The domain of your Make account + format: hostname + prefix: https:// + doc_section: '#step-2-finding-your-domain' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Make account + doc_section: '#step-1-generating-an-api-key' + +mailgun: + display_name: Mailgun + categories: + - marketing + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.region}.mailgun.net + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v4/domains + docs: https://nango.dev/docs/integrations/all/mailgun + docs_connect: https://nango.dev/docs/integrations/all/mailgun/connect + connection_config: + region: + type: string + title: Region + description: The region of your Mailgun account. + enum: + - api + - api.eu + doc_section: '#step-1-finding-your-mailgun-region' + +mailchimp: + display_name: Mailchimp + categories: + - marketing + - surveys + auth_mode: OAUTH2 + authorization_url: https://login.mailchimp.com/oauth2/authorize + token_url: https://login.mailchimp.com/oauth2/token + authorization_params: + response_type: code + proxy: + base_url: https://${connectionConfig.dc}.api.mailchimp.com + docs: https://nango.dev/docs/integrations/all/mailchimp + post_connection_script: mailchimpPostConnection + connection_config: + dc: + type: string + title: Data Center + description: The data center for your account + pattern: '^[a-z]+\d*$' + example: us6 + automated: true + +mailjet: + display_name: Mailjet + categories: + - marketing + auth_mode: BASIC + proxy: + base_url: https://api.mailjet.com + verification: + method: GET + endpoints: + - /v3/REST/myprofile + docs: https://nango.dev/docs/api-integrations/mailjet + docs_connect: https://nango.dev/docs/api-integrations/mailjet/connect + credentials: + username: + type: string + title: API Key + description: Your Mailjet API Key. + secret: true + pattern: '^[a-f0-9]{32}$' + example: 'a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6' + doc_section: '#step-1-getting-your-credentials' + password: + type: string + title: Secret Key + description: Your Mailjet Secret Key. + secret: true + pattern: '^[a-f0-9]{32}$' + example: 'f6e5d4c3b2a1f0e9d8c7b6a5f4e3d2c1' + doc_section: '#step-1-getting-your-credentials' + +mcp-generic: + display_name: MCP Server OAuth2 (Generic) + categories: + - mcp + auth_mode: MCP_OAUTH2_GENERIC + connection_config: + mcp_server_url: + type: string + title: MCP Server URL + description: The base URL of your MCP server + example: https://mcp.notion.com/mcp + pattern: '^https://[a-zA-Z0-9.-]+(?:\:[0-9]+)?(?:/.*)?$' + docs: https://nango.dev/docs/integrations/all/mcp-generic + +# Untested configuration. Please reach out if you have a test account that we can use to test it. +manatal: + display_name: Manatal + auth_mode: API_KEY + categories: + - crm + - hr + - ats + proxy: + base_url: https://api.manatal.com/open/v3 + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /users + headers: + authorization: Token ${apiKey} + paginate: + type: link + limit_name_in_request: page_size + link_path_in_response_body: next + response_path: results + docs: https://nango.dev/docs/integrations/all/manatal + docs_connect: https://nango.dev/docs/integrations/all/manatal/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Manatal account + doc_section: '#step-2-generate-an-api-key' + +marketo: + display_name: Marketo + categories: + - marketing + auth_mode: OAUTH2_CC + proxy: + base_url: https://${connectionConfig.endpointURL} + token_url: https://${connectionConfig.identityURL}/identity/oauth/token + token_params: + grant_type: client_credentials + docs: https://nango.dev/docs/integrations/all/marketo + docs_connect: https://nango.dev/docs/integrations/all/marketo/connect + connection_config: + endpointURL: + type: string + title: Domain + description: The domain of your Marketo account + format: hostname + example: xxx.mktorest.com + prefix: https:// + suffix: / + order: 1 + doc_section: '#step-3-find-your-domain-and-identity-url' + identityURL: + type: string + title: Identity URL + description: The identity URL of your Marketo account + format: hostname + prefix: https:// + example: xxx.mktorest.com + suffix: /identity/oauth/token + order: 2 + doc_section: '#step-3-find-your-domain-and-identity-url' + +mattermost: + display_name: Mattermost + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.hostname}/api + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'x-ratelimit-reset' + verification: + method: GET + endpoints: + - /v4/users/me + docs: https://nango.dev/docs/api-integrations/mattermost + docs_connect: https://nango.dev/docs/api-integrations/mattermost/connect + connection_config: + hostname: + type: string + title: Server URL + description: The hostname of your Mattermost server. + example: mattermost.example.com + pattern: '^[a-zA-Z0-9.-]+(?::[0-9]+)?$' + prefix: https:// + order: 1 + doc_section: '#step-1-find-your-mattermost-server-url' + credentials: + apiKey: + type: string + title: Personal Access Token + description: Your Mattermost personal access token. + example: 'hx3mq8n0vy6***************' + pattern: '^[a-z0-9]+$' + doc_section: '#step-2-generate-a-personal-access-token' + +malwarebytes: + display_name: Malwarebytes + categories: + - other + auth_mode: OAUTH2_CC + token_url: https://api.malwarebytes.com/oauth2/token + token_request_auth_method: basic + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.malwarebytes.com + headers: + accountid: ${connectionConfig.accountId} + connection_config: + accountId: + type: string + title: Account Id + description: Your Nebula account id + pattern: '[\da-fA-F]{8}-?[\da-fA-F]{4}-?[\da-fA-F]{4}-?[\da-fA-F]{4}-?[\da-fA-F]{12}$' + example: 9256034b-7967-4253-a5d9-260663e4fa4f + order: 1 + doc_section: '#step-1-finding-your-account-id' + + docs: https://nango.dev/docs/integrations/all/malwarebytes + docs_connect: https://nango.dev/docs/integrations/all/malwarebytes/connect + +medallia: + display_name: Medallia + categories: + - crm + - support + - surveys + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.reportingInstance}/oauth/${connectionConfig.tenantName}/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + retry: + after: + - 'x-ratelimit-reset' + base_url: https://${connectionConfig.apiHostUrl} || https://${connectionConfig.gatewayUrl}.apis.medallia.com + docs: https://nango.dev/docs/integrations/all/medallia + docs_connect: https://nango.dev/docs/integrations/all/medallia/connect + connection_config: + reportingInstance: + type: string + title: Domain + description: The base domain for your Medallia instance + format: hostname + prefix: https:// + suffix: /oauth + example: instance.medallia.com + order: 1 + doc_section: '#step-2-identifying-your-domain' + tenantName: + type: string + title: Tenant Name + description: The tenant name of your Medallia account + order: 2 + example: acme + doc_section: '#step-3-identifying-your-tenant-name' + apiHostUrl: + type: string + title: API Host URL + description: The base API endpoint (gateway URL) for your Medallia account + format: hostname + prefix: https:// + order: 3 + example: fo-acme.apis.medallia.eu + doc_section: '#step-4-identifying-your-api-host-url' + gatewayUrl: + type: string + title: '' + description: '' + default_value: '' + hidden: true # deprecating this in favor of apiHostUrl + +metabase: + display_name: Metabase + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.hostname} || https://${connectionConfig.domain}.com + headers: + x-api-key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/database + docs: https://nango.dev/docs/api-integrations/metabase + docs_connect: https://nango.dev/docs/api-integrations/metabase/connect + connection_config: + hostname: + type: string + title: Hostname + description: The Metabase hostname + example: acme.metabaseapp.com + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-metabase-hostname' + domain: + type: string + title: '' + description: '' + default_value: '' + hidden: true # deprecating this in favor of hostname + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Metabase account + example: mb_**************************kR9mZw= + pattern: '^mb_[A-Za-z0-9+/]+=*$' + doc_section: '#step-2-generating-an-api-key' + +mercury: + display_name: Mercury + categories: + - accounting + auth_mode: OAUTH2 + scope_separator: ' ' + authorization_method: header + authorization_url: https://${connectionConfig.oauth_hostname}/oauth2/auth || https://oauth2.mercury.com/oauth2/auth + token_url: https://${connectionConfig.oauth_hostname}/oauth2/token || https://oauth2.mercury.com/oauth2/token + default_scopes: + - offline_access + proxy: + base_url: https://${connectionConfig.hostname} || https://api.mercury.com + docs: https://nango.dev/docs/api-integrations/mercury + docs_connect: https://nango.dev/docs/api-integrations/mercury/connect + setup_guide_url: https://nango.dev/docs/api-integrations/mercury/how-to-register-your-own-mercury-oauth-app + connection_config: + oauth_hostname: + type: string + title: OAuth Hostname + description: Your Mercury OAuth hostname. + optional: true + enum: + - oauth2.mercury.com + - oauth2-sandbox.mercury.com + hostname: + type: string + title: API Hostname + description: Your Mercury API hostname. + optional: true + enum: + - api.mercury.com + - api-sandbox.mercury.com + +meta-marketing-api: + display_name: Meta Marketing API + categories: + - marketing + alias: facebook + docs: https://nango.dev/docs/api-integrations/meta-marketing-api + setup_guide_url: https://nango.dev/docs/api-integrations/meta-marketing-api/how-to-register-your-own-meta-marketing-api-oauth-app + +microsoft: + display_name: Microsoft + auth_mode: OAUTH2 + categories: + - communication + - dev-tools + - productivity + authorization_url: https://login.microsoftonline.com/common/oauth2/v2.0/authorize + token_url: https://login.microsoftonline.com/common/oauth2/v2.0/token + disable_pkce: true + default_scopes: + - offline_access + - .default + authorization_params: + response_type: code + response_mode: query + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://graph.microsoft.com + retry: + after: + - 'retry-after' + decompress: true + docs: https://nango.dev/docs/api-integrations/microsoft + setup_guide_url: https://nango.dev/docs/api-integrations/microsoft/how-to-register-your-own-microsoft-api-oauth-app + +microsoft-admin: + display_name: Microsoft (Admin) + auth_mode: OAUTH2 + categories: + - communication + - dev-tools + - productivity + - iam + authorization_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/adminconsent + token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token + authorization_code_param_in_callback: tenant + proxy: + base_url: https://graph.microsoft.com + retry: + after: + - 'retry-after' + decompress: true + docs: https://nango.dev/docs/integrations/all/microsoft-admin + docs_connect: https://nango.dev/docs/integrations/all/microsoft-admin/connect + connection_config: + tenantId: + type: string + title: Tenant ID + description: The unique identifier for your organization that uses Microsoft services + format: uuid + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-1-finding-your-tenant-id' + order: 1 + +microsoft-teams-bot: + display_name: Microsoft Teams Bot + auth_mode: OAUTH2 + categories: + - communication + authorization_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/authorize + token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token + disable_pkce: true + default_scopes: + - offline_access + - .default + authorization_params: + response_type: code + response_mode: query + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://smba.trafficmanager.net/teams + connection_config: + botHostTenantId: ${connectionConfig.botHostTenantId} + webhook_routing_script: microsoftTeamsWebhookRouting + post_connection_script: microsoftTeamsBotPostConnection + docs: https://nango.dev/docs/api-integrations/microsoft-teams-bot + docs_connect: https://nango.dev/docs/api-integrations/microsoft-teams-bot/connect + connection_config: + tenantId: + type: string + title: Tenant ID + description: The unique identifier for your Microsoft Entra ID tenant. + format: uuid + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-1-finding-your-tenant-id' + order: 1 + botHostTenantId: + type: string + title: '' + description: '' + automated: true + +microsoft-excel: + display_name: Microsoft Excel + categories: + - productivity + - analytics + alias: microsoft + docs: https://nango.dev/docs/integrations/all/microsoft-excel + +microsoft-oauth2-cc: + display_name: Microsoft (Client Credentials) + auth_mode: OAUTH2_CC + categories: + - communication + - dev-tools + - productivity + token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://graph.microsoft.com + webhook_routing_script: microsoftClientCredentialsWebhookRouting + webhook_user_defined_secret: true + webhook_allowed_query_params: + - validationToken + docs: https://nango.dev/docs/api-integrations/microsoft-oauth2-cc + docs_connect: https://nango.dev/docs/api-integrations/microsoft-oauth2-cc/connect + connection_config: + tenantId: + type: string + title: Tenant ID + description: The unique identifier for your organization that uses Microsoft services + format: uuid + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-1-finding-your-tenant-id' + order: 1 + +microsoft-oauth2-cc-cert: + display_name: Microsoft (Client Credentials - Certificate) + auth_mode: TWO_STEP + categories: + - communication + - dev-tools + - productivity + body_format: form + token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token + token_params: + grant_type: client_credentials + client_id: ${credentials.clientId} + scope: ${connectionConfig.oauth_scopes} + client_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer + client_assertion: ${credentials.assertion} + token_headers: + content-type: application/x-www-form-urlencoded + assertion: + type: jwt + key: ${credentials.privateKey} + lifetimeInSeconds: 3600 + header: + alg: PS256 + x5t#S256: ${credentials.certificateThumbprint} + payload: + iss: ${credentials.clientId} + sub: ${credentials.clientId} + aud: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token + jti: ${random} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://graph.microsoft.com + docs: https://nango.dev/docs/api-integrations/microsoft-oauth2-cc-cert + docs_connect: https://nango.dev/docs/api-integrations/microsoft-oauth2-cc-cert/connect + connection_config: + tenantId: + type: string + title: Tenant ID + description: The unique identifier for your organization that uses Microsoft services. + format: uuid + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-1-finding-your-tenant-id' + order: 1 + oauth_scopes: + type: string + title: Scope + description: The resource scope to request access for. + example: https://graph.microsoft.com/.default + doc_section: '#step-5-granting-api-permissions' + order: 2 + credentials: + clientId: + type: string + title: Client ID + description: The application (client) ID assigned to your app in Azure. + format: uuid + example: 11112222-bbbb-3333-cccc-4444dddd5555 + doc_section: '#step-2-registering-your-application-and-finding-your-client-id' + privateKey: + type: string + title: Private Key + description: The RSA private key (PEM format) matching the certificate uploaded to your Azure app registration. + example: "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n-----END PRIVATE KEY-----" + secret: true + doc_section: '#step-3-generating-a-certificate-and-uploading-it-to-azure' + certificateThumbprint: + type: string + title: Certificate Thumbprint (x5t#S256) + description: The base64url-encoded SHA-256 thumbprint of your certificate. + example: rCnkMH5GKJI03tRpdjBh8OG2U8I + doc_section: '#step-4-computing-the-certificate-thumbprint-x5t' + assertion: + type: string + title: '' + description: '' + automated: true + +microsoft-intune: + display_name: Microsoft Intune + categories: + - dev-tools + alias: microsoft-oauth2-cc + docs: https://nango.dev/docs/api-integrations/microsoft-intune + docs_connect: https://nango.dev/docs/api-integrations/microsoft-intune/connect + +microsoft-planner: + display_name: Microsoft Planner + categories: + - productivity + - analytics + alias: microsoft + docs: https://nango.dev/docs/api-integrations/microsoft-planner + setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-planner/how-to-register-your-own-microsoft-planner-api-oauth-app + +microsoft-powerpoint: + display_name: Microsoft PowerPoint + categories: + - productivity + alias: microsoft + docs: https://nango.dev/docs/api-integrations/microsoft-powerpoint + setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-powerpoint/how-to-register-your-own-microsoft-powerpoint-api-oauth-app + +microsoft-teams: + display_name: Microsoft Teams + categories: + - productivity + - video + - popular + alias: microsoft + webhook_routing_script: microsoftTeamsWebhookRouting + post_connection_script: microsoftTeamsPostConnection + docs: https://nango.dev/docs/api-integrations/microsoft-teams + setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-teams/how-to-register-your-own-microsoft-teams-api-oauth-app + +microsoft-people: + display_name: Microsoft People + categories: + - productivity + alias: microsoft + docs: https://nango.dev/docs/api-integrations/microsoft-people + setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-people/how-to-register-your-own-microsoft-people-api-oauth-app + +microsoft-word: + display_name: Microsoft Word + categories: + - productivity + alias: microsoft + docs: https://nango.dev/docs/api-integrations/microsoft-word + setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-word/how-to-register-your-own-microsoft-word-api-oauth-app + +microsoft-tenant-specific: + display_name: Microsoft (Tenant) + categories: + - erp + auth_mode: OAUTH2 + authorization_url: https://login.microsoftonline.com/${connectionConfig.tenant}/oauth2/v2.0/authorize + token_url: https://login.microsoftonline.com/${connectionConfig.tenant}/oauth2/v2.0/token + disable_pkce: true + default_scopes: + - offline_access + authorization_params: + response_type: code + response_mode: query + prompt: consent + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://graph.microsoft.com + docs: https://nango.dev/docs/integrations/all/microsoft-tenant-specific + connection_config: + tenant: + type: string + title: Tenant + description: The tenant of your Microsoft account + +microsoft-business-central: + display_name: Microsoft Business Central + categories: + - erp + auth_mode: OAUTH2_CC + token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.businesscentral.dynamics.com/v2.0/${connectionConfig.tenantId}/${connectionConfig.environmentName} + docs: https://nango.dev/docs/integrations/all/microsoft-business-central + docs_connect: https://nango.dev/docs/integrations/all/microsoft-business-central/connect + connection_config: + tenantId: + type: string + title: Tenant ID + description: The unique identifier for your organization that uses Microsoft services + format: uuid + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-1-finding-your-tenant-id' + order: 1 + environmentName: + type: string + title: Enrivonment Name + description: The environment name to your organization + example: production + pattern: '^[a-zA-Z0-9-_]+$' + doc_section: '#step-2-finding-your-enrivonment-name' + order: 2 + +microsoft-ads: + display_name: Microsoft Ads + alias: microsoft + categories: + - marketing + default_scopes: + - https://ads.microsoft.com/msads.manage + - offline_access + proxy: + base_url: https://clientcenter.api.bingads.microsoft.com/Api + refresh_params: + grant_type: refresh_token + scope: https://ads.microsoft.com/msads.manage + docs: https://nango.dev/docs/integrations/all/microsoft-ads + +microsoft-entra-id: + display_name: Microsoft Entra ID + categories: + - iam + alias: microsoft + docs: https://nango.dev/docs/integrations/all/microsoft-entra-id + +microsoft-power-bi: + display_name: Microsoft Power BI + categories: + - productivity + alias: microsoft + proxy: + base_url: https://api.powerbi.com + docs: https://nango.dev/docs/integrations/all/microsoft-power-bi + +maximizer: + display_name: Maximizer (Cloud) + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.region}.maximizercrmlive.com/oauth2/${connectionConfig.company_alias}/authorize + token_url: https://${connectionConfig.region}.maximizercrmlive.com/oauth2/${connectionConfig.company_alias}/token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.region}.maximizercrmlive.com + docs: https://nango.dev/docs/api-integrations/maximizer + setup_guide_url: https://nango.dev/docs/api-integrations/maximizer/how-to-register-your-own-maximizer-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/maximizer/connect + connection_config: + region: + type: string + title: Region + description: Region-specific subdomain. + enum: + - caw + - ukw + company_alias: + type: string + title: Company Alias + description: The company alias of your Maximizer cloud account. + example: acme + +maximizer-on-premise: + display_name: Maximizer (On-Premise) + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.hostname}/MaximizerWebAuthentication/OAuth2/Authorize + token_url: https://${connectionConfig.hostname}/MaximizerWebAuthentication/OAuth2/Token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.hostname} + docs: https://nango.dev/docs/api-integrations/maximizer-on-premise + setup_guide_url: https://nango.dev/docs/api-integrations/maximizer-on-premise/how-to-register-your-own-maximizer-on-premise-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/maximizer-on-premise/connect + connection_config: + hostname: + type: string + title: Hostname + description: The hostname of your Maximizer on premise instance. + example: maximizer.mycompany.com + format: hostname + +maxio: + display_name: Maxio + categories: + - payment + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.hostname} + verification: + method: GET + endpoints: + - /subscriptions.json + docs: https://nango.dev/docs/api-integrations/maxio + docs_connect: https://nango.dev/docs/api-integrations/maxio/connect + credentials: + username: + type: string + title: API Key + description: Your Maxio API Key. + doc_section: '#step-2-retrieving-your-api-key' + password: + type: string + title: '' + description: '' + default_value: 'X' + hidden: true + connection_config: + hostname: + type: string + title: Hostname + description: Your Maxio site hostname. + pattern: '^[a-zA-Z0-9-]+\.(chargify\.com|ebilling\.maxio\.com)$' + example: acme.chargify.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-hostname' + +mindbody: + display_name: Mindbody + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.mindbodyonline.com + headers: + api-key: ${apiKey} + siteid: ${connectionConfig.siteId} + authorization: ${connectionConfig.staffUserToken} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /public/v6/site/locations + docs: https://nango.dev/docs/integrations/all/mindbody + docs_connect: https://nango.dev/docs/integrations/all/mindbody/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Mindbody account + pattern: '^[a-f0-9]{32}$' + example: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4 + doc_section: '#step-2-generate-api-key' + connection_config: + siteId: + type: string + title: Site ID + description: The site ID for your Mindbody account + pattern: '^\d+$' + example: '-99' + doc_section: '#step-3-obtain-site-id-and-staff-user-token' + staffUserToken: + type: string + title: Staff User Token + description: The staff user token for your Mindbody account + pattern: '^[a-f0-9]{32}$' + example: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4 + doc_section: '#step-3-obtain-site-id-and-staff-user-token' + +minimax: + display_name: MiniMax + categories: + - productivity + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.minimaxi.chat + headers: + authorization: Bearer ${apiKey} + group-id: ${connectionConfig.groupId} + query: + GroupId: ${connectionConfig.groupId} + docs: https://nango.dev/docs/integrations/all/minimax + docs_connect: https://nango.dev/docs/integrations/all/minimax/connect + connection_config: + groupId: + type: string + title: Group ID + description: The unique identifier for your MiniMax account, linked to your account's privileges. + example: '1234567890123456789' + pattern: '^\d{19}$' + doc_section: '#step-1-retrieve-your-group-id' + credentials: + apiKey: + type: string + title: API Key + description: The API key for securely accessing the MiniMax API. + doc_section: '#step-2-generate-an-api-key' + +mip-cloud: + display_name: MIP Cloud + categories: + - accounting + auth_mode: TWO_STEP + proxy: + base_url: https://api.mip.com + headers: + authorization-token: ${accessToken} + token_url: https://${connectionConfig.domain}/api/v1/sso/mipadv/login + token_params: + username: ${credentials.username} + password: ${credentials.password} + org: ${credentials.org} + token_headers: + content-type: application/json + token_response: + token: AccessToken + docs: https://nango.dev/docs/integrations/all/mip-cloud + docs_connect: https://nango.dev/docs/integrations/all/mip-cloud/connect + credentials: + username: + type: string + title: ID + description: Your Login ID for MIP Fund Accounting + password: + type: string + title: Password + description: Your Password for MIP Fund Accounting. + secret: true + org: + type: string + title: ORG + description: The MIP Fund Accounting database you will be using. + optional: true + example: ZQXP_98421_NTO + connection_config: + domain: + type: string + title: HOST REST Service URL + description: The rest service URL for the cloud-based API service + prefix: https:// + suffix: /api/v1/sso/mipadv/login + format: hostname + +mip-on-premise: + display_name: MIP On Premise + categories: + - accounting + auth_mode: TWO_STEP + proxy: + base_url: https://api.mip.com + headers: + authorization-token: ${accessToken} + token_url: https://${connectionConfig.domain}/api/security/login + token_params: + login: ${credentials.login} + password: ${credentials.password} + org: ${credentials.org} + token_headers: + content-type: application/json + token_response: + token: AccessToken + docs: https://nango.dev/docs/integrations/all/mip-on-premise + docs_connect: https://nango.dev/docs/integrations/all/mip-on-premise/connect + credentials: + login: + type: string + title: ID + description: Your Login ID for MIP Fund Accounting + password: + type: string + title: Password + description: Your Password for MIP Fund Accounting. + secret: true + org: + type: string + title: ORG + description: The MIP Fund Accounting database you will be using. + connection_config: + domain: + type: string + title: HOST REST Service URL + description: The URL of your locally installed REST API server. + prefix: https:// + suffix: /api/security/login + format: hostname + +mixpanel: + display_name: Mixpanel + categories: + - analytics + auth_mode: BASIC + proxy: + base_url: https://mixpanel.com + credentials: + # https://developer.mixpanel.com/reference/service-accounts + username: + type: string + title: Service Account Username + description: Mixpanel Service Account Username + doc_section: '#step-1-finding-mixpanel-api-key' + password: + type: string + title: Service Account Secret + description: Mixpanel Service Account Secret + doc_section: '#step-1-finding-mixpanel-api-key' + docs: https://nango.dev/docs/integrations/all/mixpanel + docs_connect: https://nango.dev/docs/integrations/all/mixpanel/connect + +mimecast: + display_name: Mimecast + categories: + - communication + auth_mode: OAUTH2_CC + token_url: https://api.services.mimecast.com/oauth/token + body_format: form + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.services.mimecast.com + docs: https://nango.dev/docs/integrations/all/mimecast + docs_connect: https://nango.dev/docs/integrations/all/mimecast/connect + +miro: + display_name: Miro + categories: + - design + - productivity + auth_mode: OAUTH2 + authorization_url: https://miro.com/oauth/authorize + token_url: https://api.miro.com/v1/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.miro.com + docs: https://nango.dev/docs/integrations/all/miro + +miro-scim: + display_name: Miro (SCIM API) + categories: + - design + - productivity + auth_mode: API_KEY + proxy: + base_url: https://miro.com/api + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/scim/Users + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/miro-scim + docs_connect: https://nango.dev/docs/integrations/all/miro-scim/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Miro scim account + doc_section: '#step-1-finding-miro-api-key' +missive: + display_name: Missive + categories: + - productivity + auth_mode: API_KEY + proxy: + headers: + api_token: ${apiKey} + base_url: https://missiveapp.com + docs: https://nango.dev/docs/integrations/all/missive + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Missive account + +juniper-mist: + display_name: Juniper Mist + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.mist.com + headers: + authorization: Token ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v1/self + docs: https://nango.dev/docs/api-integrations/juniper-mist + docs_connect: https://nango.dev/docs/api-integrations/juniper-mist/connect + connection_config: + subdomain: + type: string + title: API Subdomain + description: The API subdomain for your Juniper Mist region + example: api + pattern: '^api(\.[a-z0-9]+)*$' + doc_section: '#step-1-finding-your-api-subdomain' + credentials: + apiKey: + type: string + title: API Token + description: Your Juniper Mist API token + doc_section: '#step-2-generating-your-api-token' + example: 3n69xDYMlT36fulLwIq7PDaDopc5W0b***************************************************************** + pattern: '^[A-Za-z0-9]{96}$' + +monday: + display_name: Monday + categories: + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://auth.monday.com/oauth2/authorize + token_url: https://auth.monday.com/oauth2/token + disable_pkce: true + authorization_params: + force_install_if_needed: true + authorization_url_replacements: + response_type: '' + proxy: + base_url: https://api.monday.com + docs: https://nango.dev/docs/api-integrations/monday + setup_guide_url: https://nango.dev/docs/api-integrations/monday/how-to-register-your-own-monday-oauth-app + +momentum-io: + display_name: Momentum.io + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.momentum.io + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v1/meetings?from=1970-01-01T00:00:00.000Z&pageSize=1 + docs: https://nango.dev/docs/integrations/all/momentum-io + docs_connect: https://nango.dev/docs/integrations/all/momentum-io/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Make account + doc_section: '#step-1-generating-an-api-key' + +modjo-ai: + display_name: Modjo AI + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.modjo.ai + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v1/users?page=1&perPage=1 + docs: https://nango.dev/docs/api-integrations/modjo-ai + docs_connect: https://nango.dev/docs/api-integrations/modjo-ai/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Modjo AI API key. + doc_section: '#step-1-generate-your-api-key' + +mollie: + display_name: Mollie + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://my.mollie.com/oauth2/authorize + token_url: https://api.mollie.com/oauth2/tokens + scope_separator: ' ' + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.mollie.com + docs: https://nango.dev/docs/api-integrations/mollie + setup_guide_url: https://nango.dev/docs/api-integrations/mollie/how-to-register-your-own-mollie-oauth-app +modmed: + display_name: ModMed + categories: + - other + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.environment}/firm/${connectionConfig.firmUrlPrefix}/ema/ws/oauth2/grant + token_params: + grant_type: password + username: ${credentials.username} + password: ${credentials.password} + token_headers: + x-api-key: ${credentials.apiKey} + accept: application/json + content-type: application/x-www-form-urlencoded + proxy: + base_url: https://${connectionConfig.environment}/firm/${connectionConfig.firmUrlPrefix} + headers: + accept: application/fhir+json + x-api-key: ${credentials.apiKey} + token_response: + token: access_token + docs: https://nango.dev/docs/api-integrations/modmed + docs_connect: https://nango.dev/docs/api-integrations/modmed/connect + connection_config: + environment: + type: string + title: Environment + description: The ModMed API environment. + enum: + - stage.ema-api.com/ema-dev + - stage.ema-api.com/ema-training + - stage.ema-api.com/ema-prod + - mmapi.ema-api.com/ema-dev + - mmapi.ema-api.com/ema-training + - mmapi.ema-api.com/ema-prod + doc_section: '#step-3-selecting-your-environment' + order: 1 + firmUrlPrefix: + type: string + title: Firm URL Prefix + description: The firm URL prefix for your practice + example: emapmsandbox01 + doc_section: '#step-2-finding-your-firm-url-prefix' + order: 2 + credentials: + username: + type: string + title: Username + description: Your API username + example: fhir_QfLlo + doc_section: '#step-1-request-access-to-modmed-sandbox' + password: + type: string + title: Password + description: Your API password + secret: true + doc_section: '#step-1-request-access-to-modmed-sandbox' + apiKey: + type: string + title: API Key + description: Your API key (x-api-key) + secret: true + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-1-request-access-to-modmed-sandbox' + +mural: + display_name: Mural + categories: + - design + auth_mode: OAUTH2 + authorization_url: https://app.mural.co/api/public/v1/authorization/oauth2 + token_url: https://app.mural.co/api/public/v1/authorization/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://app.mural.co + docs: https://nango.dev/docs/integrations/all/mural + +nable-ncentral: + display_name: N-able N-central + categories: + - support + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.serverUrl}/api/auth/authenticate + token_headers: + authorization: Bearer ${credentials.userApiToken} + accept: application/json + token_response: + token: tokens.access.token + token_expiration: tokens.access.expirySeconds + token_expiration_strategy: expireIn + proxy: + base_url: https://${connectionConfig.serverUrl}/api + verification: + method: GET + endpoints: + - /auth/validate + docs: https://nango.dev/docs/api-integrations/nable-ncentral + docs_connect: https://nango.dev/docs/api-integrations/nable-ncentral/connect + connection_config: + serverUrl: + type: string + title: N-central server URL + description: Your N-central server hostname. + example: ncentral.example.com + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-1-find-your-n-central-server-url' + credentials: + userApiToken: + type: string + title: User-API token + description: Your N-central User-API token (JWT) + pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' + example: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJOX2NlbnRyYWwifQ.c2lnbmF0dXJl + secret: true + doc_section: '#step-2-generate-a-user-api-token' + +nationbuilder: + display_name: NationBuilder + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.accountId}.nationbuilder.com/oauth/authorize + token_url: https://${connectionConfig.accountId}.nationbuilder.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + default_scopes: + - default + docs: https://nango.dev/docs/integrations/all/nationbuilder + proxy: + base_url: https://${connectionConfig.accountId}.nationbuilder.com/api + connection_config: + accountId: + type: string + title: Account ID + description: The account ID of your NationBuilder account + +namely: + display_name: Namely + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.company}.namely.com/api/v1/oauth2/authorize + token_url: https://${connectionConfig.company}.namely.com/api/v1/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.company}.namely.com/api + docs: https://nango.dev/docs/integrations/all/namely + docs_connect: https://nango.dev/docs/integrations/all/namely/connect + connection_config: + company: + type: string + title: Company + description: The name of your Namely company + example: example + doc_section: '#step-1-finding-your-company-name' + +namely-pat: + display_name: Namely (PAT) + categories: + - hr + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://${connectionConfig.company}.namely.com/api + docs: https://nango.dev/docs/integrations/all/namely-pat + docs_connect: https://nango.dev/docs/integrations/all/namely-pat/connect + connection_config: + company: + type: string + title: Company Name + description: The name of your Namely company + example: example + order: 1 + doc_section: '#step-1-finding-your-company-name' + credentials: + apiKey: + type: string + title: Personal Access Token + description: The Personal Access Token for your Namely account + doc_section: '#step-2-generating-your-personal-access-token' + +nerdio: + display_name: Nerdio + categories: + - other + auth_mode: OAUTH2_CC + token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token + token_params: + grant_type: client_credentials + scope: ${connectionConfig.scope} + proxy: + base_url: https://${connectionConfig.hostname}/rest-api + docs: https://nango.dev/docs/api-integrations/nerdio + docs_connect: https://nango.dev/docs/api-integrations/nerdio/connect + connection_config: + hostname: + type: string + title: Nerdio Instance URL + description: The hostname of your Nerdio Manager instance + format: hostname + example: web-admin-portal-3e3a4zfp4peo4.azurewebsites.net + doc_section: '#step-1-finding-your-nerdio-instance-url' + order: 1 + tenantId: + type: string + title: Azure Tenant ID + description: Your Azure Active Directory Tenant ID + format: uuid + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-2-getting-your-azure-credentials' + order: 2 + scope: + type: string + title: API Scope + description: The Application ID URI scope + example: api://g0cb288e-ff16-1861-9393-50219a19453c/.default + doc_section: '#step-3-configuring-the-api-scope' + order: 3 + credentials: + client_id: + type: string + title: Client ID + description: The Application (client) ID from your Azure App Registration + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + format: uuid + doc_section: '#step-2-getting-your-azure-credentials' + client_secret: + type: string + title: Client Secret + description: The client secret from your Azure App Registration + secret: true + doc_section: '#step-2-getting-your-azure-credentials' + +netsuite: + display_name: NetSuite (OAuth) + categories: + - accounting + - erp + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.accountId}.app.netsuite.com/app/login/oauth2/authorize.nl + authorization_params: + prompt: consent + token_url: https://${connectionConfig.accountId}.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token + default_scopes: + - rest_webservices + proxy: + base_url: https://${connectionConfig.accountId}.suitetalk.api.netsuite.com/services/rest/record/v1 + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/netsuite + connection_config: + accountId: + type: string + title: Account ID + description: The account ID of your NetSuite account + pattern: '^[a-zA-Z0-9-_]+$' + example: tstdrv231585 + +netsuite-tba: + alias: netsuite + display_name: NetSuite (TBA) + auth_mode: TBA + categories: + - accounting + - erp + - popular + docs: https://nango.dev/docs/api-integrations/netsuite-tba + setup_guide_url: https://nango.dev/docs/api-integrations/netsuite-tba/how-to-set-up-netsuite-tba-with-nango + +netsuite-client-credentials: + alias: netsuite + display_name: NetSuite (Client Credentials) + categories: + - accounting + - erp + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.accountId}.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token + token_params: + grant_type: client_credentials + client_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer + client_assertion: ${credentials.assertion} + token_headers: + content-type: application/x-www-form-urlencoded + assertion: + type: jwt + key: ${assertionOption.privateKey} + lifetimeInSeconds: 3600 + header: + alg: RS256 + kid: ${credentials.certificateId} + payload: + iss: ${credentials.clientId} + aud: https://${connectionConfig.accountId}.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token + jti: ${random} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/api-integrations/netsuite-client-credentials + docs_connect: https://nango.dev/docs/api-integrations/netsuite-client-credentials/connect + credentials: + clientId: + type: string + title: Client ID + description: The Client ID from your NetSuite integration record. + example: 1c343a716c1d****************************976dde7d8e3e2 + certificateId: + type: string + title: Certificate ID + description: The ID of the certificate registered in your NetSuite integration. + example: HRril7Vwkk********************eWT2Fgks + assertion: + type: string + title: '' + description: '' + automated: true + connection_config: + accountId: + type: string + title: Account ID + description: Your NetSuite Account ID (e.g. 1234567 or 1234567_SB1 for sandbox). + example: '1234567' + assertion_option: + privateKey: + type: string + title: Private Key + description: The RSA private key (PEM format) used to sign the JWT assertion. + example: "-----BEGIN RSA PRIVATE KEY-----\nMIIEow...\n-----END RSA PRIVATE KEY-----" + +next-cloud-ocs: + display_name: Next Cloud OCS + categories: + - storage + - productivity + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.domain}/ocs/v1.php + headers: + 'ocs-apirequest': 'true' + docs: http://nango.dev/docs/integrations/all/next-cloud-ocs + docs_connect: https://nango.dev/docs/integrations/all/next-cloud-ocs/connect + connection_config: + domain: + type: string + title: Domain + description: The domain of your Next Cloud account + format: hostname + prefix: https:// + doc_section: '#step-1-locate-your-next-cloud-domain' + +nexthink: + display_name: Nexthink + categories: + - analytics + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.instance}-login.${connectionConfig.region}.nexthink.cloud/oauth2/default/v1/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + default_scopes: + - service:integration + proxy: + base_url: https://${connectionConfig.instance}.api.${connectionConfig.region}.nexthink.cloud + docs: https://nango.dev/docs/api-integrations/nexthink + docs_connect: https://nango.dev/docs/api-integrations/nexthink/connect + credentials: + client_id: + type: string + title: Client ID + description: Your Nexthink API Client ID. + doc_section: '#step-2-create-api-credentials' + client_secret: + type: string + title: Client Secret + description: Your Nexthink API Client Secret. + secret: true + doc_section: '#step-2-create-api-credentials' + connection_config: + instance: + type: string + title: Instance Name + description: The name of your Nexthink instance. + example: acme + order: 1 + doc_section: '#step-1-locate-your-instance-name-and-region' + region: + type: string + title: Region + description: 'Your Nexthink region' + example: eu + pattern: '^(us|eu|pac|meta)$' + order: 2 + doc_section: '#step-1-locate-your-instance-name-and-region' + +ninjaone-rmm: + display_name: NinjaOne RMM + categories: + - support + auth_mode: OAUTH2_CC + token_url: https://app.ninjarmm.com/ws/oauth/token + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://app.ninjarmm.com + credentials: + client_id: + type: string + title: Client ID + description: Your NinjaOne RMM OAuth Client ID + example: KTmhkNf1_dZZVPmIQTK_lH2DCNJ + pattern: '^[A-Za-z0-9_/+-]{10,}$' + doc_section: '#step-1-create-an-oauth-client-application' + client_secret: + type: string + title: Client Secret + description: Your NinjaOne RMM OAuth Client Secret + example: 'Ilfs4crKIU1t-5bde-2OMBsB9v3LGmfg82XJO7_q9TtgTnfNRmK' + pattern: '^[A-Za-z0-9_/+-]{10,}$' + secret: true + doc_section: '#step-2-copy-your-credentials' + docs: https://nango.dev/docs/integrations/all/ninjaone-rmm + docs_connect: https://nango.dev/docs/integrations/all/ninjaone-rmm/connect + +ninjaone-rmm-oauth2: + display_name: NinjaOne RMM (OAuth2) + categories: + - support + auth_mode: OAUTH2 + authorization_url: https://app.ninjarmm.com/ws/oauth/authorize + token_url: https://app.ninjarmm.com/ws/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + scope_separator: ' ' + default_scopes: + - offline_access + proxy: + base_url: https://app.ninjarmm.com + docs: https://nango.dev/docs/api-integrations/ninjaone-rmm-oauth2 + setup_guide_url: https://nango.dev/docs/api-integrations/ninjaone-rmm-oauth2/how-to-register-your-own-ninjaone-rmm-api-oauth-app + +ninjaone-saas-backup: + display_name: NinjaOne SaaS Backup + categories: + - storage + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.apiHost}/api + headers: + x-reseller-token: ${connectionConfig.resellerToken} + x-access-token: ${apiKey} + verification: + method: GET + endpoints: + - /accounts + docs: https://nango.dev/docs/api-integrations/ninjaone-saas-backup + docs_connect: https://nango.dev/docs/api-integrations/ninjaone-saas-backup/connect + connection_config: + apiHost: + type: string + title: API Host + description: The host from your NinjaOne SaaS Backup API URL. + example: dropsuite.us + pattern: '^(dropsuite\.com|dropsuite\.(us|uk|ca)|dropsuite-au\.com|[a-z0-9.-]+\.dropsuite\.com)$' + prefix: https:// + suffix: /api + order: 1 + doc_section: '#step-1-find-your-api-credentials' + resellerToken: + type: string + title: Reseller Token + description: The Reseller Token from NinjaOne SaaS Backup API Settings. + format: uuid + order: 2 + doc_section: '#step-1-find-your-api-credentials' + credentials: + apiKey: + type: string + title: Authentication Token + description: The Authentication Token from NinjaOne SaaS Backup API Settings. + format: uuid + secret: true + doc_section: '#step-1-find-your-api-credentials' + +nocrm: + display_name: nocrm.io + categories: + - crm + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.nocrm.io + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /api/v2/ping + docs: https://nango.dev/docs/api-integrations/nocrm + docs_connect: https://nango.dev/docs/api-integrations/nocrm/connect + credentials: + apiKey: + type: string + title: API Key + description: Your nocrm.io API key + pattern: ^[a-f0-9]{48}$ + example: 4b945b************************************4991 + doc_section: '#step-2-obtaining-your-api-key' + connection_config: + subdomain: + type: string + title: Account subdomain + description: Your nocrm.io account subdomain + example: acme + prefix: https:// + pattern: '^[a-z0-9-]+$' + suffix: .nocrm.io + order: 1 + doc_section: '#step-1-finding-your-subdomain' + +northbeam: + display_name: Northbeam + categories: + - analytics + - marketing + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.northbeam.io + headers: + authorization: ${apiKey} + data-client-id: ${connectionConfig.dataClientId} + verification: + method: GET + endpoints: + - /v1/exports/attribution-models + docs: https://nango.dev/docs/api-integrations/northbeam + docs_connect: https://nango.dev/docs/api-integrations/northbeam/connect + connection_config: + subdomain: + type: string + title: API Subdomain + description: Use api for production or api-uat for testing/development. + enum: + - api + - api-uat + order: 1 + doc_section: '#step-1-getting-authentication-credentials' + dataClientId: + type: string + title: Data Client ID + description: Your Northbeam Data Client ID (UUID). + format: uuid + example: '123e4567-e89b-12d3-a456-426614174000' + doc_section: '#step-1-getting-authentication-credentials' + credentials: + apiKey: + type: string + title: API Key + description: Your Northbeam API Key. + format: uuid + example: f1c2d3a4-5b67-4c89-ae01-123456789abc + doc_section: '#step-1-getting-authentication-credentials' + +notion: + display_name: Notion + categories: + - knowledge-base + - popular + - productivity + auth_mode: OAUTH2 + authorization_url: https://api.notion.com/v1/oauth/authorize + token_url: https://api.notion.com/v1/oauth/token + authorization_params: + response_type: code + owner: user + authorization_method: header + body_format: json + webhook_routing_script: notionWebhookRouting + webhook_user_defined_secret: true + token_response_metadata: + - workspace_id + proxy: + retry: + after: + - 'retry-after' + base_url: https://api.notion.com + headers: + 'notion-version': '2022-06-28' + paginate: + type: cursor + cursor_path_in_response: next_cursor + cursor_name_in_request: start_cursor + limit_name_in_request: page_size + response_path: results + docs: https://nango.dev/docs/api-integrations/notion + setup_guide_url: https://nango.dev/docs/api-integrations/notion/how-to-register-your-own-notion-api-oauth-app + +notion-mcp: + display_name: Notion (MCP) + categories: + - knowledge-base + - productivity + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://mcp.notion.com/authorize + token_url: https://mcp.notion.com/token + registration_url: https://mcp.notion.com/register + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + docs: https://nango.dev/docs/api-integrations/notion-mcp + +notion-scim: + display_name: Notion (SCIM API) + categories: + - knowledge-base + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.notion.com/scim + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/Users + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/notion-scim + docs_connect: https://nango.dev/docs/integrations/all/notion-scim/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Notion scim account + doc_section: '#step-1-finding-your-scim-api-key-token' + +nyne-ai: + display_name: Nyne AI + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://api.nyne.ai + headers: + x-api-key: ${connectionConfig.apiKey} + x-api-secret: ${apiKey} + content-type: application/json + verification: + method: POST + headers: + content-type: application/json + endpoints: + - /person/events + data: + event: 'test' + docs: https://nango.dev/docs/api-integrations/nyne-ai + docs_connect: https://nango.dev/docs/api-integrations/nyne-ai/connect + connection_config: + apiKey: + type: string + title: API Key + description: Your Nyne AI API key. + pattern: '^[a-fA-F0-9]{32}$' + example: '48f0****************************892' + order: 1 + doc_section: '#step-1-getting-your-api-credentials' + credentials: + apiKey: + type: string + title: API Secret + description: Your Nyne AI API secret. + pattern: '^[a-fA-F0-9]{16}$' + example: '97e7********0463' + doc_section: '#step-1-getting-your-api-credentials' + +ocean-io: + display_name: Ocean.io + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.ocean.io + headers: + x-api-token: ${apiKey} + retry: + after: + - 'retry-after' + verification: + method: GET + endpoints: + - /v2/credits/balance + docs: https://nango.dev/docs/api-integrations/ocean-io + docs_connect: https://nango.dev/docs/api-integrations/ocean-io/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Ocean.io API token. + example: api_7Zs******_************************mhS + pattern: '^api_[A-Za-z0-9]+_[A-Za-z0-9]+' + doc_section: '#step-1-generate-your-api-token' + +odoo: + display_name: Odoo (OAuth) + categories: + - erp + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.serverUrl}/restapi/1.0/common/oauth2/authorize + token_url: https://${connectionConfig.serverUrl}/restapi/1.0/common/oauth2/access_token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.serverUrl} + docs: https://nango.dev/docs/integrations/all/odoo + connection_config: + serverUrl: + type: string + title: Domain + description: The domain of your Odoo account + format: hostname + prefix: https:// + +odoo-cc: + display_name: Odoo (Client Credentials) + categories: + - erp + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.serverUrl}/restapi/1.0/common/oauth2/access_token + token_params: + client_id: ${credentials.consumerId} + client_secret: ${credentials.consumerSecret} + grant_type: client_credentials + token_headers: + content-type: application/x-www-form-urlencoded + token_response: + token: access_token + token_expiration: access_token_validity + token_expiration_strategy: expireIn + proxy: + base_url: https://${connectionConfig.serverUrl}/restapi + docs: https://nango.dev/docs/integrations/all/odoo-cc + docs_connect: https://nango.dev/docs/integrations/all/odoo-cc/connect + credentials: + consumerId: + type: string + title: Consumer ID + description: Your App Consumer ID + secret: true + doc_section: '#step-2-generating-your-odoo-client-credentials' + consumerSecret: + type: string + title: Consumer Secret + description: Your App Consumer Secret + secret: true + doc_section: '#step-2-generating-your-odoo-client-credentials' + connection_config: + serverUrl: + type: string + title: Domain + description: The domain to your Odoo account + format: hostname + example: example.odoo.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-odoo-domain' + +okta: + display_name: Okta + auth_mode: OAUTH2 + categories: + - dev-tools + - iam + authorization_url: https://${connectionConfig.subdomain}.okta.com/oauth2/v1/authorize + token_url: https://${connectionConfig.subdomain}.okta.com/oauth2/v1/token + authorization_params: + response_type: code + response_mode: query + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.okta.com + retry: + at: + - 'x-rate-limit-reset' + paginate: + type: 'link' + limit_name_in_request: 'limit' + link_rel_in_response_header: 'next' + docs: https://nango.dev/docs/integrations/all/okta + connection_config: + subdomain: + type: string + title: Okta Domain + description: The subdomain of your Okta account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .okta.com + prefix: https:// + +okta-cc: + display_name: Okta (Client Credentials) + categories: + - dev-tools + - iam + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.hostname}/oauth2/v1/token || https://${connectionConfig.subdomain}.okta.com/oauth2/v1/token + token_request_auth_method: private_key_jwt + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.hostname} || https://${connectionConfig.subdomain}.okta.com + retry: + at: + - 'x-rate-limit-reset' + paginate: + type: 'link' + limit_name_in_request: 'limit' + link_rel_in_response_header: 'next' + docs: https://nango.dev/docs/api-integrations/okta-cc + docs_connect: https://nango.dev/docs/api-integrations/okta-cc/connect + credentials: + client_id: + type: string + title: Client ID + description: The Client ID of your Okta API Services application + doc_section: '#step-1-creating-your-okta-api-services-application' + client_private_key: + type: string + title: Private Key (JWK) + description: The private JWK JSON (including kid, kty, n, e, d, p, q, dp, dq, qi) whose public key is registered in your Okta API Services application + secret: true + doc_section: '#step-2-generating-and-registering-your-rsa-key-pair' + connection_config: + hostname: + type: string + title: Okta Domain + description: The full hostname of your Okta account + format: hostname + prefix: https:// + example: dev-12345678.okta.com + doc_section: '#step-3-finding-your-okta-domain' + subdomain: + type: string + title: '' + description: '' + hidden: true # deprecating this in favor of hostname + oauth_scopes: + type: string + title: Scopes + description: Space-separated list of Okta Management API scopes (e.g. okta.users.read okta.users.manage). Must be granted under Okta API Scopes on your application. + example: okta.users.read okta.users.manage okta.groups.read + doc_section: '#step-4-grant-api-scopes-to-your-application' + +okta-preview: + alias: okta + display_name: Okta (Preview) + categories: + - dev-tools + - iam + authorization_url: https://${connectionConfig.subdomain}.oktapreview.com/oauth2/v1/authorize + token_url: https://${connectionConfig.subdomain}.oktapreview.com/oauth2/v1/token + proxy: + base_url: https://${connectionConfig.subdomain}.oktapreview.com + docs: https://nango.dev/docs/integrations/all/okta-preview + connection_config: + subdomain: + type: string + title: Okta Preview Domain + description: The subdomain of your Okta Preview account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .oktapreview.com + prefix: https:// + +onlogist: + display_name: Onlogist + categories: + - other + auth_mode: API_KEY + proxy: + base_url: https://dev.portal.onlogist.com/api + headers: + authorization: ${apiKey} + docs: https://nango.dev/docs/api-integrations/onlogist + docs_connect: https://nango.dev/docs/api-integrations/onlogist/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your OnLogist account + doc_section: '#step-1-finding-your-api-key' + +one-drive: + display_name: OneDrive for Business + categories: + - knowledge-base + - storage + alias: microsoft + post_connection_script: onedrivePostConnection + docs: https://nango.dev/docs/api-integrations/one-drive + setup_guide_url: https://nango.dev/docs/api-integrations/one-drive/how-to-register-your-own-onedrive-for-business-api-oauth-app + +one-drive-personal: + display_name: OneDrive Personal + categories: + - knowledge-base + - storage + auth_mode: OAUTH2 + authorization_url: https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize + token_url: https://login.microsoftonline.com/consumers/oauth2/v2.0/token + disable_pkce: true + default_scopes: + - offline_access + authorization_params: + response_type: code + response_mode: query + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.onedrive.com + retry: + after: + - 'retry-after' + decompress: true + docs: https://nango.dev/docs/integrations/all/one-drive-personal + +one-note: + display_name: One Note + categories: + - productivity + alias: microsoft + docs: https://nango.dev/docs/integrations/all/one-note + +onelogin: + display_name: OneLogin + categories: + - dev-tools + - iam + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.subdomain}.onelogin.com/auth/oauth2/v2/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.subdomain}.onelogin.com + pre_connection_deletion_script: oneloginPreConnectionDeletion + docs: https://nango.dev/docs/integrations/all/onelogin + docs_connect: https://nango.dev/docs/integrations/all/onelogin/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: Your OneLogin subdomain + example: acme + order: 1 + prefix: https:// + suffix: .onelogin.com + doc_section: '#step-1-finding-your-subdomain' + +oomnitza: + display_name: Oomnitza + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.oomnitza.com + headers: + authorization2: ${apiKey} + content-type: application/json + verification: + method: GET + endpoints: + - /api/v3/assets/meta + docs: https://nango.dev/docs/api-integrations/oomnitza + docs_connect: https://nango.dev/docs/api-integrations/oomnitza/connect + connection_config: + subdomain: + type: string + title: Oomnitza Subdomain + description: The subdomain of your Oomnitza instance + example: mycompany + prefix: https:// + suffix: .oomnitza.com + order: 1 + doc_section: '#step-1-finding-your-subdomain' + credentials: + apiKey: + type: string + title: API Token + description: Your Oomnitza API token + doc_section: '#step-2-generating-your-api-token' + +orange-logic: + display_name: Orange Logic + categories: + - storage + auth_mode: TWO_STEP + body_format: json + token_url: https://${connectionConfig.serverUrl}/webapi/security/clientcredentialsauthentication/authenticate_46H_v1 + token_params: + client_id: ${credentials.clientId} + client_secret: ${credentials.clientSecret} + token_headers: + content-type: application/json + accept: application/json + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://${connectionConfig.serverUrl} + docs: https://nango.dev/docs/api-integrations/orange-logic + docs_connect: https://nango.dev/docs/api-integrations/orange-logic/connect + credentials: + clientId: + type: string + title: Client ID + description: The Client ID from your Orange Logic OAuth 2.0 Client Credentials. + doc_section: '#step-2-obtain-client-credentials' + clientSecret: + type: string + title: Client Secret + description: The Client Secret from your Orange Logic OAuth 2.0 Client Credentials. + secret: true + doc_section: '#step-2-obtain-client-credentials' + connection_config: + serverUrl: + type: string + title: Orange Logic Server URL + description: The base URL of your Orange Logic instance + example: mycompany.orangelogic.com + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-1-find-your-orange-logic-url' + +openai: + display_name: OpenAI + categories: + - productivity + - dev-tools + - popular + auth_mode: API_KEY + proxy: + base_url: https://api.openai.com + headers: + authorization: Bearer ${apiKey} + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/models + retry: + after: + - 'x-ratelimit-reset-requests' + docs: https://nango.dev/docs/integrations/all/openai + docs_connect: https://nango.dev/docs/integrations/all/openai/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your OpenAI account + doc_section: '#step-1-retrieve-your-openai-api-key' +openai-admin: + display_name: OpenAI (Admin) + categories: + - productivity + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.openai.com + headers: + authorization: Bearer ${apiKey} + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/organization/users + retry: + after: + - 'x-ratelimit-reset-requests' + docs: https://nango.dev/docs/integrations/all/openai-admin + docs_connect: https://nango.dev/docs/integrations/all/openai-admin/connect + credentials: + apiKey: + type: string + title: Admin Key + description: The Admin API key for your OpenAI account + doc_section: '#step-1-retrieve-your-openai-admin-key' +open-hands: + display_name: Open Hands + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://app.all-hands.dev + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/conversations + docs: https://nango.dev/docs/integrations/all/open-hands + docs_connect: https://nango.dev/docs/integrations/all/open-hands/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Open Hands account + pattern: '^[A-Za-z0-9]{32}$' + example: 'aNVlyRBLGWJgnVp1vwXN7TkO1MCYxeIDz' + doc_section: '#step-1-finding-your-api-key' + +oracle-hcm: + display_name: Oracle Fusion Cloud (HCM) + categories: + - hr + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.restServerUrl} + headers: + content-type: application/vnd.oracle.adf.resourceitem+json + docs: https://nango.dev/docs/integrations/all/oracle-hcm + docs_connect: https://nango.dev/docs/integrations/all/oracle-hcm/connect + credentials: + username: + type: string + title: Username + description: Your Oracle Cloud service username. + doc_section: '#step-2-finding-your-credentials' + password: + type: string + title: Password + description: Your Oracle Cloud service password. + doc_section: '#step-2-finding-your-credentials' + connection_config: + restServerUrl: + type: string + title: REST Server URL + description: The REST server URL for your Oracle Fusion Cloud + format: hostname + prefix: https:// + example: servername.fa.us2.oraclecloud.com + order: 1 + doc_section: '#step-1-finding-your-rest-server-url' + +oracle-cloud-identity: + display_name: Oracle Cloud Identity + categories: + - dev-tools + - iam + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.serviceInstance}.identity.oraclecloud.com/oauth2/v1/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + scope_separator: ' ' + proxy: + base_url: https://${connectionConfig.serviceInstance}.identity.oraclecloud.com + docs: https://nango.dev/docs/api-integrations/oracle-cloud-identity + docs_connect: https://nango.dev/docs/api-integrations/oracle-cloud-identity/connect + connection_config: + serviceInstance: + type: string + title: IDCS Service Instance + description: Your Oracle Identity Cloud Service instance identifier + pattern: '^idcs-[a-f0-9]{32}$' + example: idcs-1234567890abcdef1234567890abcdef + prefix: https:// + suffix: .identity.oraclecloud.com + order: 1 + doc_section: '#step-1-finding-your-service-instance' + +ordinal: + display_name: Ordinal + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://app.tryordinal.com/api + headers: + authorization: Bearer ${apiKey} + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/workspace + docs: https://nango.dev/docs/api-integrations/ordinal + docs_connect: https://nango.dev/docs/api-integrations/ordinal/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Ordinal API key. + example: ord_************* + pattern: '^ord_[A-Za-z0-9-_]+$' + doc_section: '#step-1-generating-your-api-key' + +ory: + display_name: Ory + categories: + - iam + auth_mode: OAUTH2_CC + proxy: + base_url: https://${connectionConfig.projectSlug}.projects.oryapis.com + token_url: https://${connectionConfig.projectSlug}.projects.oryapis.com/oauth2/token + scope_separator: ' ' + token_params: + grant_type: client_credentials + docs: https://nango.dev/docs/integrations/all/ory + connection_config: + projectSlug: + type: string + title: Project Slug + description: The project slug of your Ory project + +osu: + display_name: Osu + categories: + - gaming + auth_mode: OAUTH2 + authorization_url: https://osu.ppy.sh/oauth/authorize + token_url: https://osu.ppy.sh/oauth/token + default_scopes: + - identify + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://osu.ppy.sh + docs: https://nango.dev/docs/integrations/all/osu + +oura: + display_name: Oura + categories: + - sports + auth_mode: OAUTH2 + authorization_url: https://cloud.ouraring.com/oauth/authorize + token_url: https://api.ouraring.com/oauth/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.ouraring.com + docs: https://nango.dev/docs/integrations/all/oura + +outlook: + display_name: Outlook + categories: + - communication + - popular + alias: microsoft + docs: https://nango.dev/docs/api-integrations/outlook + setup_guide_url: https://nango.dev/docs/api-integrations/outlook/how-to-register-your-own-outlook-api-oauth-app + +outreach: + display_name: Outreach + categories: + - marketing + auth_mode: OAUTH2 + authorization_url: https://api.outreach.io/oauth/authorize + token_url: https://api.outreach.io/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.outreach.io + docs: https://nango.dev/docs/integrations/all/outreach + +pagerduty: + display_name: PagerDuty + categories: + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://app.pagerduty.com/oauth/authorize + token_url: https://app.pagerduty.com/oauth/token + webhook_routing_script: pagerdutyWebhookRouting + proxy: + base_url: https://api.pagerduty.com + retry: + after: + - 'ratelimit-reset' + docs: https://nango.dev/docs/integrations/all/pagerduty + +paligo: + display_name: Paligo + categories: + - cms + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.paligoapp.com + verification: + method: GET + endpoints: + - /api/v2/groups?page=1&per_page=1 + docs: https://nango.dev/docs/api-integrations/paligo + docs_connect: https://nango.dev/docs/api-integrations/paligo/connect + connection_config: + subdomain: + type: string + title: Paligo Instance Name + description: The name of your Paligo instance + example: mycompany + suffix: .paligoapp.com + prefix: https:// + order: 1 + doc_section: '#step-1-find-your-paligo-instance-name' + credentials: + username: + type: string + title: Username + description: Your Paligo account username (email address). + example: name@example.com + format: email + doc_section: '#step-3-enter-credentials-in-the-connect-ui' + password: + type: string + title: API Key + description: The API key token generated. + secret: true + pattern: '^[A-F0-9]+$' + example: 74E12F****************************9C5D6F + doc_section: '#step-2-create-an-api-key' + +pandadoc: + display_name: Pandadoc + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://app.pandadoc.com/oauth2/authorize + token_url: https://api.pandadoc.com/oauth2/access_token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.pandadoc.com + docs: https://nango.dev/docs/integrations/all/pandadoc + +pandadoc-api-key: + display_name: Pandadoc (API Key) + categories: + - legal + auth_mode: API_KEY + proxy: + base_url: https://api.pandadoc.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /public/v1/members/current + headers: + authorization: API-Key ${apiKey} + docs: https://nango.dev/docs/integrations/all/pandadoc-api-key + docs_connect: https://nango.dev/docs/integrations/all/pandadoc-api-key/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Pandadoc account + doc_section: '#step-1-generating-your-api-key' + example: 3039ba033eb1410caa0a2227158d63c9d6502cd8 + pattern: '^[a-fA-F0-9]+$' + +paddle: + display_name: Paddle + categories: + - payment + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.paddle.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/api-integrations/paddle + docs_connect: https://nango.dev/docs/api-integrations/paddle/connect + setup_guide_url: https://nango.dev/docs/api-integrations/paddle/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Paddle API key. + example: pdl_live_apikey_01kpb*********************_xRs9*********************_A40 + doc_section: '#step-1-generating-your-api-key' + connection_config: + subdomain: + type: string + title: Environment + description: Use 'api' for live or 'sandbox-api' for sandbox. + enum: + - api + - sandbox-api + doc_section: '#step-2-choose-your-environment' + order: 1 + +passportal: + display_name: Passportal + categories: + - support + auth_mode: TWO_STEP + token_url: https://${connectionConfig.base_url}/api/v2/auth/client_token + token_headers: + x-key: ${credentials.apiKey} + x-hash: ${credentials.hmacToken} + content-type: application/json + token_params: + scope: docs_api + content: ${credentials.content} + token_response: + token: access_token + token_expiration: expiry_time + token_expiration_strategy: expireAt + proxy: + base_url: https://${connectionConfig.base_url} + headers: + x-access-token: ${accessToken} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v2/documents?resultsPerPage=1 + connection_config: + base_url: + type: string + title: Passportal Base URL + description: Your Passportal base URL + example: mycompany.mypasswordapp.com + format: hostname + prefix: https:// + doc_section: '#step-1-find-your-passportal-base-url' + credentials: + apiKey: + type: string + title: API Access Key ID + description: Your Passportal API Access Key ID + example: a14e6b4923ba5027189baded6ba7b68e6fcda742008c5d57b867f43a09768ece + pattern: '^[a-fA-F0-9]{64}$' + doc_section: '#step-2-generate-api-access-key-id-and-secret-access-key' + hmacToken: + type: string + title: HMAC Token + description: Your pre-generated HMAC token, hex encoded + example: 23ec313efecb560a7f44239f6dd439ea56d18911c18b59e1150a3c7299da8202 + pattern: '^[a-fA-F0-9]{64}$' + secret: true + doc_section: '#step-3-generate-hmac-token' + content: + type: string + title: Content String + description: Plain text message used to compute the HMAC token + example: api-content-hash + doc_section: '#step-3-generate-hmac-token' + docs: https://nango.dev/docs/integrations/all/passportal + docs_connect: https://nango.dev/docs/integrations/all/passportal/connect + +paychex: + display_name: Paychex + categories: + - hr + auth_mode: OAUTH2_CC + token_url: https://api.paychex.com/auth/oauth/v2/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.paychex.com + docs: https://nango.dev/docs/integrations/all/paychex + docs_connect: https://nango.dev/docs/integrations/all/paychex/connect + credentials: + client_id: + type: string + title: API Key + description: A unique identifier for your application on Paychex + doc_section: '#step-1-generating-your-client-credentials' + client_secret: + type: string + title: Client Secret + description: A confidential key used to authenticate the identity of application (client) + doc_section: '#step-1-generating-your-client-credentials' + +paycor: + display_name: Paycor + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://hcm.paycor.com/AppActivation/Authorize + token_url: https://apis.paycor.com/sts/v1/common/token?subscription-key=${connectionConfig.subscriptionKey} + authorization_params: + response_type: code + subscription-key: ${connectionConfig.subscriptionKey} + scope_separator: ' ' + default_scopes: + - offline_access + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://apis.paycor.com + headers: + ocp-apim-subscription-key: ${connectionConfig.subscriptionKey} + docs: https://nango.dev/docs/integrations/all/paycor + docs_connect: https://nango.dev/docs/integrations/all/paycor/connect + connection_config: + subscriptionKey: + type: string + title: Subscription Key + description: The subscription key for your Paycor account + automated: true + tenantId: + type: string + title: Company ID + example: '290180' + pattern: '^\d+$' + description: The company ID for your Paycor account + doc_section: '#step-1-finding-your-company-id' + +paycor-sandbox: + display_name: Paycor (Sandbox) + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://hcm-demo.paycor.com/AppActivation/Authorize + token_url: https://apis-sandbox.paycor.com/sts/v1/common/token?subscription-key=${connectionConfig.subscriptionKey} + authorization_params: + response_type: code + subscription-key: ${connectionConfig.subscriptionKey} + scope_separator: ' ' + default_scopes: + - offline_access + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://apis-sandbox.paycor.com + headers: + ocp-apim-subscription-key: ${connectionConfig.subscriptionKey} + docs: https://nango.dev/docs/integrations/all/paycor-sandbox + docs_connect: https://nango.dev/docs/integrations/all/paycor-sandbox/connect + connection_config: + subscriptionKey: + type: string + title: Subscription Key + description: The subscription key for your Paycor sandbox account + automated: true + tenantId: + type: string + title: Company ID + example: '290180' + pattern: '^\d+$' + description: The company ID for your Paycor sandbox account + doc_section: '#step-1-finding-your-company-id' + +paycom: + display_name: Paycom + categories: + - hr + auth_mode: BASIC + proxy: + base_url: https://api.paycomonline.net + docs: https://nango.dev/docs/integrations/all/paycom + docs_connect: https://nango.dev/docs/integrations/all/paycom/connect + credentials: + username: + type: string + title: SID + description: The SID of your Paycom account + doc_section: '#step-1-finding-your-credentials' + password: + type: string + title: API Token + description: The API token of your Paycom account + doc_section: '#step-1-finding-your-credentials' + +payfit: + display_name: Payfit + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://oauth.payfit.com/authorize + token_url: https://app.pagerduty.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://partner-api.payfit.com + docs: https://nango.dev/docs/integrations/all/payfit + +paylocity-nextgen: + display_name: Paylocity (NextGen) + categories: + - hr + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.environment}.paylocity.com/public/security/v1/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.environment}.paylocity.com + connection_config: + companyId: ${connectionConfig.companyId} + docs: https://nango.dev/docs/api-integrations/paylocity-nextgen + docs_connect: https://nango.dev/docs/api-integrations/paylocity-nextgen/connect + connection_config: + environment: + type: string + title: Environment + description: Your Paylocity NextGen environment. + enum: + - dc1prodgwext + - dc1demogwext + order: 1 + doc_section: '#step-1-select-the-correct-paylocity-environment' + companyId: + type: string + title: Company ID + description: The company ID of your Paylocity account + doc_section: '#step-2-find-your-company-id' + pattern: '^[a-zA-Z0-9]+$' + example: S2222 + order: 2 + +paylocity: + display_name: Paylocity (Weblink) + categories: + - hr + auth_mode: OAUTH2_CC + proxy: + base_url: https://${connectionConfig.environment}.paylocity.com + connection_config: + companyId: ${connectionConfig.companyId} + token_url: https://${connectionConfig.environment}.paylocity.com/IdentityServer/connect/token + token_params: + grant_type: client_credentials + docs: https://nango.dev/docs/api-integrations/paylocity + docs_connect: https://nango.dev/docs/api-integrations/paylocity/connect + connection_config: + environment: + type: string + title: Paylocity Environment + enum: + - dc1demogw + - api + description: Your Paylocity Weblink environment. + order: 1 + doc_section: '#step-1-select-the-correct-paylocity-environment' + companyId: + type: string + title: Company ID + description: The company ID of your Paylocity account + doc_section: '#step-2-find-your-company-id' + pattern: '^[a-zA-Z0-9]+$' + example: S2222 + order: 2 + +paypal: + display_name: Paypal + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://www.paypal.com/signin/authorize + token_url: https://api.paypal.com/v1/oauth2/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api-m.paypal.com + docs: https://nango.dev/docs/integrations/all/paypal + +paypal-sandbox: + display_name: Paypal (Sandbox) + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://www.sandbox.paypal.com/signin/authorize + token_url: https://api-m.sandbox.paypal.com/v1/oauth2/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api-m.sandbox.paypal.com + docs: https://nango.dev/docs/integrations/all/paypal-sandbox + +pax8: + display_name: Pax8 + categories: + - other + auth_mode: OAUTH2_CC + body_format: json + token_url: https://api.pax8.com/v1/token + token_params: + grant_type: client_credentials + audience: ${connectionConfig.audience} || https://api.pax8.com + proxy: + base_url: https://api.pax8.com + docs: https://nango.dev/docs/integrations/all/pax8 + docs_connect: https://nango.dev/docs/integrations/all/pax8/connect + connection_config: + audience: + type: string + title: '' + description: '' + automated: true + +pendo: + display_name: Pendo + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://app.pendo.io + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v1/page + headers: + x-pendo-integration-key: ${apiKey} + docs: https://nango.dev/docs/integrations/all/pendo + docs_connect: https://nango.dev/docs/integrations/all/pendo/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Pendo account + doc_section: '#step-1-finding-pendo-api-key' + +pendo-oauth: + display_name: Pendo (OAuth) + categories: + - analytics + auth_mode: OAUTH2_CC + token_url: https://app.pendo.io/oauth/v1/token + token_params: + grant_type: client_credentials + default_scopes: + - read:me + body_format: form + proxy: + base_url: https://app.pendo.io + docs: https://nango.dev/docs/api-integrations/pendo-oauth + docs_connect: https://nango.dev/docs/api-integrations/pendo-oauth/connect + credentials: + client_id: + type: string + title: Client ID + description: Your Pendo OAuth client ID + doc_section: '#step-1-finding-your-pendo-oauth-credentials' + client_secret: + type: string + title: Client Secret + description: Your Pendo OAuth client secret + secret: true + doc_section: '#step-1-finding-your-pendo-oauth-credentials' + +pennylane: + display_name: Pennylane + categories: + - accounting + - banking + - invoicing + - payment + auth_mode: OAUTH2 + authorization_url: https://app.pennylane.com/oauth/authorize + token_url: https://app.pennylane.com/oauth/token + proxy: + base_url: https://app.pennylane.com + retry: + at: + - 'ratelimit-reset' + scope_separator: '+' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + authorization_url_skip_encode: + - scopes + docs: https://nango.dev/docs/integrations/all/pennylane + +pennylane-company-api: + display_name: Pennylane (Company API) + categories: + - accounting + - banking + - invoicing + - payment + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://app.pennylane.com + verification: + method: GET + headers: + accept: application/json + endpoints: + - /api/external/v2/me + retry: + at: + - 'ratelimit-reset' + docs: https://nango.dev/docs/integrations/all/pennylane-company-api + docs_connect: https://nango.dev/docs/integrations/all/pennylane-company-api/connect + credentials: + apiKey: + type: string + title: API Token + description: The company API token for your Pennylane account + pattern: '^[A-Za-z0-9_-]{43}$' + example: aZ9b4Lp3QhN7vXyK1sTcO0WfR8jMdEuD5GrIi2-H6PnU + doc_section: '#step-1-generating-your-company-api-token' + +peopledatalabs: + display_name: People Data Labs + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://api.peopledatalabs.com + query: + api_key: ${apiKey} + docs: https://nango.dev/docs/integrations/all/peopledatalabs + credentials: + apiKey: + type: string + title: API Key + description: The API key for your People Data Labs account + +perdoo: + display_name: Perdoo + categories: + - productivity + - analytics + auth_mode: API_KEY + proxy: + base_url: https://eu.perdoo.com + headers: + authorization: Bearer ${apiKey} + content-type: application/json + verification: + method: GET + endpoints: + - /user + docs: https://nango.dev/docs/api-integrations/perdoo + docs_connect: https://nango.dev/docs/api-integrations/perdoo/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Perdoo API token + example: '5037c64a83d34725a13131b9b28856c0e499887b16c84b6d9bba2756d1e61634' + pattern: '^[a-f0-9]{64}$' + doc_section: '#step-1-generating-your-api-token' + +perplexity: + display_name: Perplexity + categories: + - productivity + - dev-tools + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.perplexity.ai + docs: https://nango.dev/docs/integrations/all/perplexity + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Perplexity account + pattern: '^pplx-[a-zA-Z0-9]+$' + example: pplx-**************************** + +perimeter81: + display_name: Perimeter81 + categories: + - productivity + auth_mode: TWO_STEP + proxy: + base_url: https://api.perimeter81.com/api/rest + token_url: https://api.${connectionConfig.domain}.com/api/v1/auth/authorize + token_params: + apiKey: ${credentials.apiKey} + grantType: api_key + token_headers: + content-type: application/json + token_response: + token: data.accessToken + token_expiration: data.accessTokenExpire + token_expiration_strategy: expireAt + docs: https://nango.dev/docs/integrations/all/perimeter81 + docs_connect: https://nango.dev/docs/integrations/all/perimeter81/connect + connection_config: + domain: + type: string + title: Domain + description: The domain for Perimeter81. + enum: + - perimeter81 + - eu.sase.checkpoint + doc_section: '#step-1-finding-your-perimeter81-domain-and-perimeter81-api-key' + order: 1 + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Perimeter81 account + secret: true + +personio: + display_name: Personio (v1) + categories: + - hr + auth_mode: OAUTH2_CC + proxy: + base_url: https://api.personio.de/v1 + headers: + x-personio-partner-id: ${connectionConfig.partnerId} + x-personio-app-id: ${connectionConfig.appId} + token_url: https://api.personio.de/v1/auth + body_format: json + docs: https://nango.dev/docs/integrations/all/personio + docs_connect: https://nango.dev/docs/integrations/all/personio/connect + connection_config: + partnerId: + type: string + title: Partner ID + description: The partner ID of your Personio account + doc_section: '#step-1-finding-personio-client-id' + appId: + type: string + title: App ID + description: The app ID of your Personio account + doc_section: '#step-2-finding-personio-client-secret' + +personio-v2: + display_name: Personio (v2) + categories: + - hr + auth_mode: OAUTH2_CC + proxy: + base_url: https://api.personio.de/v2 + headers: + content-type: application/x-www-form-urlencoded + token_url: https://api.personio.de/v2/auth/token + scope_separator: ' ' + docs: https://nango.dev/docs/integrations/all/personio-v2 + token_params: + grant_type: client_credentials + +personio-recruiting: + display_name: Personio Recruiting + categories: + - hr + - ats + auth_mode: API_KEY + proxy: + base_url: https://api.personio.de/v1 + headers: + authorization: Bearer ${apiKey} + x-company-id: ${connectionConfig.companyId} + x-personio-partner-id: ${connectionConfig.partnerId} + x-personio-app-id: ${connectionConfig.appId} + verification: + method: GET + endpoints: + - /xml?language=en + base_url_override: https://${connectionConfig.company}.jobs.personio.de + headers: + accept: application/xml + content-type: xml + docs: https://nango.dev/docs/integrations/all/personio-recruiting + connection_config: + companyId: + type: string + title: Company ID + description: The company ID of your Personio account + company: + type: string + title: Company Name + description: The company name of your Personio account + partnerId: + type: string + title: Partner ID + description: The partner ID of your Personio account + appId: + type: string + title: App ID + description: The app ID of your Personio account + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Pingboard account + +pingboard: + display_name: Pingboard + categories: + - productivity + auth_mode: OAUTH2_CC + proxy: + base_url: https://app.pingboard.com/api/v2 + token_url: https://app.pingboard.com/oauth/token + scope_separator: ' ' + token_params: + grant_type: client_credentials + docs: https://nango.dev/docs/integrations/all/pingboard + +pingone: + display_name: PingOne + categories: + - dev-tools + - iam + auth_mode: OAUTH2 + authorization_url: https://auth.pingone.${connectionConfig.tld}/${connectionConfig.environmentId}/as/authorize + token_url: https://auth.pingone.${connectionConfig.tld}/${connectionConfig.environmentId}/as/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.pingone.${connectionConfig.tld} + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/pingone + docs_connect: https://nango.dev/docs/integrations/all/pingone/connect + connection_config: + tld: + type: string + title: Top Level Domain + description: The top level domain for your PingOne account. + enum: + - com + - ca + - eu + - com.au + - sg + - asia + doc_section: '#step-2-finding-your-top-level-domain' + environmentId: + type: string + title: Environment ID + order: 1 + description: The environment ID for your PingOne account + example: f2aba07d-270c-42ba-8811-01af5f63d458 + format: uuid + doc_section: '#step-1-finding-your-environment-id' + +pingone-cc: + display_name: PingOne (Client Credentials) + categories: + - dev-tools + - iam + auth_mode: OAUTH2_CC + token_url: https://auth.pingone.${connectionConfig.tld}/${connectionConfig.environmentId}/as/token + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.pingone.${connectionConfig.tld} + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/pingone-cc + docs_connect: https://nango.dev/docs/integrations/all/pingone-cc/connect + connection_config: + tld: + type: string + title: Top Level Domain + description: The top level domain for your PingOne account. + order: 2 + enum: + - com + - ca + - eu + - com.au + - sg + - asia + doc_section: '#step-3-finding-your-top-level-domain' + environmentId: + type: string + title: Environment ID + order: 1 + description: The environment ID for your PingOne account + example: f2aba07d-270c-42ba-8811-01af5f63d458 + format: uuid + doc_section: '#step-2-finding-your-environment-id' + +pinterest: + display_name: Pinterest + categories: + - design + - marketing + - social + - video + auth_mode: OAUTH2 + authorization_url: https://www.pinterest.com/oauth + token_url: https://api.pinterest.com/v5/oauth/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.pinterest.com + docs: https://nango.dev/docs/integrations/all/pinterest + +rocketlane: + display_name: Rocketlane + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.rocketlane.com/api + headers: + api-key: ${apiKey} + verification: + method: GET + endpoints: + - /1.0/users/?pageSize=1 + docs: https://nango.dev/docs/integrations/all/rocketlane + docs_connect: https://nango.dev/docs/integrations/all/rocketlane/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Rocketlane API key + pattern: ^rl-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$ + example: rl-3d2d4d87-1801-48ca-8948-8d5ed6f05df7 + doc_section: '#step-1-generating-your-api-key' + +pipedrive: + display_name: Pipedrive + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://oauth.pipedrive.com/oauth/authorize + token_url: https://oauth.pipedrive.com/oauth/token + authorization_url_skip_empty: true + token_request_auth_method: basic + disable_pkce: true + token_response_metadata: + - api_domain + proxy: + base_url: ${connectionConfig.api_domain}/api + decompress: true + paginate: + type: offset + offset_name_in_request: start + response_path: data + limit_name_in_request: limit + docs: https://nango.dev/docs/api-integrations/pipedrive + setup_guide_url: https://nango.dev/docs/api-integrations/pipedrive/how-to-register-your-own-pipedrive-oauth-app + connection_config: + api_domain: + type: string + title: '' + description: '' + automated: true + +pylon: + display_name: Pylon + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.usepylon.com + headers: + authorization: Bearer ${apiKey} + accept: '*/*' + verification: + method: GET + endpoints: + - /me + docs: https://nango.dev/docs/api-integrations/pylon + docs_connect: https://nango.dev/docs/api-integrations/pylon/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Pylon API token + doc_section: '#step-1-generating-your-api-token' + +pipedream: + display_name: Pipedream (API Key) + categories: + - dev-tools + - productivity + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.pipedream.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/users/me + docs: https://nango.dev/docs/integrations/all/pipedream + docs_connect: https://nango.dev/docs/integrations/all/pipedream/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Pipedream account + pattern: '^[a-f0-9]{32}$' + example: 9a1b2c3d4e5f67890abcdeffedcba123 + doc_section: '#step-1-finding-your-api-key' + +pipedream-oauth2-cc: + display_name: Pipedream (Client Credentials) + categories: + - dev-tools + - productivity + auth_mode: OAUTH2_CC + token_url: https://api.pipedream.com/v1/oauth/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.pipedream.com + docs: https://nango.dev/docs/integrations/all/pipedream-oauth2-cc + docs_connect: https://nango.dev/docs/integrations/all/pipedream-oauth2-cc/connect + +pivotaltracker: + display_name: Pivotal Tracker + categories: + - productivity + auth_mode: API_KEY + proxy: + headers: + x-trackertoken: ${apiKey} + base_url: https://www.pivotaltracker.com/services/v5 + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /accounts + docs: https://nango.dev/docs/integrations/all/pivotaltracker + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Pivotal Tracker account + +planning-center-online: + display_name: Planning Center Online (OAuth) + categories: + - crm + - productivity + auth_mode: OAUTH2 + authorization_url: https://api.planningcenteronline.com/oauth/authorize + token_url: https://api.planningcenteronline.com/oauth/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.planningcenteronline.com + headers: + accept: application/json + user-agent: Nango (https://nango.dev) + retry: + after: + - 'retry-after' + paginate: + type: offset + offset_name_in_request: offset + limit_name_in_request: per_page + response_path: data + docs: https://nango.dev/docs/api-integrations/planning-center-online + setup_guide_url: https://nango.dev/docs/api-integrations/planning-center-online/how-to-register-your-own-planning-center-oauth-app + +planning-center-online-pat: + display_name: Planning Center Online (Personal Access Token) + categories: + - crm + - productivity + auth_mode: BASIC + proxy: + base_url: https://api.planningcenteronline.com + headers: + accept: application/json + retry: + after: + - 'retry-after' + paginate: + type: offset + offset_name_in_request: offset + limit_name_in_request: per_page + response_path: data + verification: + method: GET + headers: + accept: application/json + user-agent: Nango (https://nango.dev) + endpoints: + - /current/v2/me + docs: https://nango.dev/docs/api-integrations/planning-center-online-pat + docs_connect: https://nango.dev/docs/api-integrations/planning-center-online-pat/connect + credentials: + username: + type: string + title: Client ID + description: The Client ID for your Planning Center Personal Access Token. + pattern: '^[a-zA-Z0-9_-]{4,128}$' + example: 01h2jk3lm4np5qrst6uvw + doc_section: '#step-2-create-a-personal-access-token' + password: + type: string + title: Secret + description: The Secret for your Planning Center Personal Access Token. + pattern: '^[a-zA-Z0-9+/=_-]{8,512}$' + example: 7f8e9d0c1b2a3847564930210fedcba9876543210fedcba9876543210 + doc_section: '#step-2-create-a-personal-access-token' + +pushpay-chms-v1: + display_name: Pushpay ChMS (v1) + categories: + - crm + - productivity + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.ccbchurch.com + retry: + after: + - 'retry-after' + credentials_verification_script: pushpayChmsV1CredentialsVerification + docs: https://nango.dev/docs/api-integrations/pushpay-chms-v1 + docs_connect: https://nango.dev/docs/api-integrations/pushpay-chms-v1/connect + connection_config: + subdomain: + type: string + title: Church subdomain + description: The subdomain for your Pushpay ChMS site. + example: yourchurch + pattern: '^[a-zA-Z0-9-]+$' + order: 1 + prefix: https:// + suffix: .ccbchurch.com + doc_section: '#step-1-finding-your-church-subdomain' + credentials: + username: + type: string + title: API username + description: The API login created in Pushpay ChMS API Admin. + doc_section: '#step-2-create-an-api-user' + password: + type: string + title: API password + description: The password for your Pushpay ChMS API user. + secret: true + doc_section: '#step-2-create-an-api-user' + +plain: + display_name: Plain + categories: + - support + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://core-api.uk.plain.com/graphql + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1?query=%7B__schema%7Btypes%7Bname,kind,fields%7Bname%7D%7D%7D%7D + docs: https://nango.dev/docs/integrations/all/plain + docs_connect: https://nango.dev/docs/integrations/all/plain/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Plain account + doc_section: '#step-1-generating-your-api-key' + +pleo: + display_name: Pleo + categories: + - payment + - invoicing + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.pleo.io/oauth/authorize + token_url: https://${connectionConfig.subdomain}.pleo.io/oauth/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.apiSubdomain}.pleo.io + docs: https://nango.dev/docs/api-integrations/pleo + docs_connect: https://nango.dev/docs/api-integrations/pleo/connect + setup_guide_url: https://nango.dev/docs/api-integrations/pleo/how-to-register-your-own-pleo-api-oauth-app + connection_config: + subdomain: + type: string + title: OAuth Subdomain + description: The OAuth subdomain for your Pleo environment. + enum: + - auth + - auth.staging + apiSubdomain: + type: string + title: API Subdomain + description: The API subdomain for your Pleo environment. + enum: + - external + - external.staging + +podium: + display_name: Podium + categories: + - communication + - marketing + auth_mode: OAUTH2 + authorization_url: https://api.podium.com/oauth/authorize + token_url: https://api.podium.com/oauth/token + scope_separator: ' ' + body_format: json + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + headers: + podium-version: ${connectionConfig.apiVersion} + content-type: application/json + base_url: https://api.podium.com + retry: + after: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/integrations/all/podium + connection_config: + apiVersion: + type: string + title: API Version + description: The API version of your Podium account + +podscribe: + display_name: Podscribe + categories: + - marketing + - analytics + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://backend.podscribe.ai + docs: https://nango.dev/docs/api-integrations/podscribe + docs_connect: https://nango.dev/docs/api-integrations/podscribe/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Podscribe account + pattern: '^[a-zA-Z0-9]+\.[a-zA-Z0-9]+\.[a-zA-Z0-9_-]+$' + example: xkPqbW**********.*********.*******T8mz + doc_section: '#step-1-generating-your-api-key' + +posthog: + display_name: PostHog + categories: + - dev-tools + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://${connectionConfig.subdomain}.posthog.com + docs: https://nango.dev/docs/api-integrations/posthog + docs_connect: https://nango.dev/docs/api-integrations/posthog/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of your PostHog cloud account. + enum: + - us + - us.i + - eu + - eu.i + order: 1 + doc_section: '#step-1-finding-your-subdomain' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your PostHog account + pattern: '^phx_[A-Za-z0-9]+$' + example: phx_1PPf***************************k3D + doc_section: '#step-2-finding-your-api-key' + +posthog-oauth: + display_name: PostHog (OAuth) + categories: + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://oauth.posthog.com/oauth/authorize/ + token_url: https://oauth.posthog.com/oauth/token/ + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.posthog.com + docs: https://nango.dev/docs/api-integrations/posthog-oauth + setup_guide_url: https://nango.dev/docs/api-integrations/posthog-oauth/how-to-register-your-own-posthog-oauth-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/posthog-oauth/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of your PostHog cloud account. + enum: + - us + - us.i + - eu + - eu.i + order: 1 + doc_section: '#step-1-finding-your-subdomain' + +prive: + display_name: Prive + categories: + - e-commerce + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + content-type: application/json + base_url: https://subs.api.tryprive.com + docs: https://nango.dev/docs/integrations/all/prive + docs_connect: https://nango.dev/docs/integrations/all/prive/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Prive account + doc_section: '#step-1-requesting-your-prive-api-key' + +prospeo: + display_name: Prospeo + categories: + - crm + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.prospeo.io + headers: + x-key: ${apiKey} + verification: + method: POST + headers: + content-type: application/json + endpoints: + - /account-information + docs: https://nango.dev/docs/api-integrations/prospeo + docs_connect: https://nango.dev/docs/api-integrations/prospeo/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Prospeo API Key + example: pk_640edfcc************************304fca5e + pattern: '^(pk_[a-f0-9]{64}|[a-f0-9]{32})$' + doc_section: '#step-1-finding-your-api-key' + +prtg-classic: + display_name: PRTG Classic + categories: + - support + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.host} + query: + apitoken: ${apiKey} + verification: + method: GET + endpoints: + - /api/table.json?content=sensors&count=1 + docs: https://nango.dev/docs/api-integrations/prtg-classic + docs_connect: https://nango.dev/docs/api-integrations/prtg-classic/connect + connection_config: + host: + type: string + title: Instance Host + description: The host of your PRTG instance + pattern: '^[A-Za-z0-9.-]+(:\d+)?$' + example: monitor.example.com + prefix: https:// + doc_section: '#step-1-finding-your-instance-host' + order: 1 + credentials: + apiKey: + type: string + title: API Key + description: The API key for your PRTG account + pattern: '^[A-Z2-7]+=*$' + example: RUTOWB5KVJCMEOWHL5MLUWMA324UGNDLPS6JKLTEDT====== + doc_section: '#step-2-finding-your-api-key' + +private-api-bearer: + display_name: Private API (Bearer Auth) + categories: + - other + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://my-private-api + docs: https://nango.dev/docs/integrations/all/private-api-bearer + docs_connect: https://nango.dev/docs/integrations/all/private-api-bearer/connect + credentials: + apiKey: + type: string + title: API Key + description: Your API Key + +private-api-basic: + display_name: Private API (Basic Auth) + categories: + - other + auth_mode: BASIC + proxy: + base_url: https://my-private-api + docs: https://nango.dev/docs/integrations/all/private-api-basic + docs_connect: https://nango.dev/docs/integrations/all/private-api-basic/connect + credentials: + username: + type: string + title: Username + description: Your username + password: + type: string + title: Password + description: Your password +private-api-generic: + display_name: Private API (Generic) + categories: + - other + auth_mode: API_KEY + proxy: + base_url: https://api.nango.dev/ + integration_config: + keyPlacement: + type: string + title: Key placement + description: Where the API key is sent on proxied requests. + enum: + - header + - query + default_value: header + warnings: + query: Sending the key as a query param can expose it in upstream, proxy, and CDN logs. Prefer a header when the API supports it. + order: 1 + keyName: + type: string + title: Key name + description: Header name or query-param name (e.g. Authorization, x-api-key, api_key). + example: Authorization + order: 2 + valueTemplate: + type: string + title: Value template + description: How the key is presented to the upstream API. Use ${apiKey} as the placeholder for the stored key. + example: Api-Key ${apiKey} + default_value: ${apiKey} + pattern: '\$\{apiKey\}' + order: 3 + baseUrl: + type: string + title: Base URL + description: Base URL of the upstream API the proxy will call. + format: uri + pattern: '^https?://' + example: https://api.example.com + order: 4 + keyLabel: + type: string + title: API key label (shown in Connect UI) + description: The label end users see for the API key field in the Connect UI. + default_value: API Key + optional: true + order: 5 + docs: https://nango.dev/docs/integrations/all/private-api-generic + docs_connect: https://nango.dev/docs/integrations/all/private-api-generic/connect + credentials: + apiKey: + type: string + title: API Key + description: Your API Key +precisefp: + display_name: PreciseFP + categories: + - crm + - productivity + auth_mode: OAUTH2 + authorization_url: https://app.precisefp.com/oauth/authorize + token_url: https://app.precisefp.com/oauth/token + authorization_params: + response_type: code + scope: '*' + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + authorization_method: header + proxy: + base_url: https://app.precisefp.com + docs: https://nango.dev/docs/integrations/all/precisefp + +practicefusion: + display_name: PracticeFusion + categories: + - other + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.baseUrl}/authorize + token_url: https://${connectionConfig.baseUrl}/token + authorization_url_skip_empty: true + authorization_params: + response_type: code + aud: https://${connectionConfig.baseUrl} + launch: ${connectionConfig.launch} + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + token_response_metadata: + - patient + - need_patient_banner + - smart_style_url + proxy: + base_url: https://${connectionConfig.baseUrl} + docs: https://nango.dev/docs/api-integrations/practicefusion + setup_guide_url: https://nango.dev/docs/api-integrations/practicefusion/how-to-register-your-own-practicefusion-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/practicefusion/connect + connection_config: + baseUrl: + type: string + title: Base URL + description: The base URL for your Practice authorization server + pattern: '^[a-zA-Z0-9.-]+\.(practice|patient)fusion\.com/.*$' + prefix: https:// + example: api.patientfusion.com/fhir/r4/v1/118b460b-8390-4754-8e4a-1dd5ee20f599/ + doc_section: '#step-1-find-your-base-url' + order: 1 + launch: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +productboard: + display_name: Productboard + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://app.productboard.com/oauth2/authorize + token_url: https://app.productboard.com/oauth2/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + headers: + x-version: '1' + base_url: https://api.productboard.com + docs: https://nango.dev/docs/integrations/all/productboard + +printful: + display_name: Printful + categories: + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://www.printful.com/oauth/authorize + token_url: https://www.printful.com/oauth/token + disable_pkce: true + authorization_url_replacements: + redirect_uri: redirect_url + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.printful.com + docs: https://nango.dev/docs/api-integrations/printful + setup_guide_url: https://nango.dev/docs/api-integrations/printful/how-to-register-your-own-printful-oauth-app + +procore: + display_name: Procore + categories: + - erp + auth_mode: OAUTH2 + authorization_url: https://login.procore.com/oauth/authorize + token_url: https://login.procore.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + post_connection_script: procorePostConnection + proxy: + headers: + procore-company-id: ${connectionConfig.companyId} + base_url: https://api.procore.com + retry: + at: + - 'x-rate-limit-reset' + docs: https://nango.dev/docs/api-integrations/procore + setup_guide_url: https://nango.dev/docs/api-integrations/procore/how-to-register-your-own-procore-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/procore/connect + connection_config: + companyId: + type: string + title: Company ID + description: Your Procore company ID + optional: true + example: '598134325779301' + pattern: '^[0-9]+$' + +provenexpert: + display_name: ProvenExpert + categories: + - marketing + auth_mode: BASIC + proxy: + base_url: https://www.provenexpert.com/api/ + verification: + method: POST + endpoints: + - v1/rating/summary/get + docs: https://nango.dev/docs/api-integrations/provenexpert + docs_connect: https://nango.dev/docs/api-integrations/provenexpert/connect + credentials: + username: + type: string + title: API ID + description: Your ProvenExpert API ID. + pattern: '^[A-Za-z0-9]{32}$' + example: '3yxp1qwZl5UAmyHZ5qRC2Sbpk5KAlEDZ' + doc_section: '#step-1-getting-your-credentials' + password: + type: string + title: API Key + description: Your ProvenExpert API Key. + secret: true + pattern: '^[A-Za-z0-9]{43}$' + example: 'M3A5NwykMKW1BRy6NRrxAwW2MzI3MxOmNRXzNzByMxW' + doc_section: '#step-1-getting-your-credentials' + +pverify: + display_name: pVerify + categories: + - other + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.apiHost}/Token + token_params: + Client_Id: ${credentials.clientId} + Client_Secret: ${credentials.clientSecret} + grant_type: client_credentials + token_headers: + content-type: application/x-www-form-urlencoded + Client-API-Id: ${credentials.clientId} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://${connectionConfig.apiHost} + headers: + client-api-id: ${credentials.clientId} + docs: https://nango.dev/docs/api-integrations/pverify + docs_connect: https://nango.dev/docs/api-integrations/pverify/connect + credentials: + clientId: + type: string + title: Client ID + description: Your pVerify Client ID. + example: f1c2d3a4-5b67-4c89-ae01-123456789abc + format: uuid + doc_section: '#step-1-getting-your-credentials' + clientSecret: + type: string + title: Client Secret + description: Your pVerify Client Secret. + secret: true + example: aB3mNpQr7sXwYz2t*************** + pattern: '^[A-Za-z0-9]+$' + doc_section: '#step-1-getting-your-credentials' + connection_config: + apiHost: + type: string + title: API Host + description: Your pVerify API hostname. + example: api.pverify.com + pattern: '^(api|testapi)\.pverify\.com$' + doc_section: '#step-1-getting-your-credentials' + +qualtrics: + display_name: Qualtrics + categories: + - surveys + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.qualtrics.com/oauth2/auth + token_url: https://${connectionConfig.subdomain}.qualtrics.com/oauth2/token + proxy: + base_url: https://${connectionConfig.subdomain}.qualtrics.com + docs: https://nango.dev/docs/integrations/all/qualtrics + connection_config: + subdomain: + type: string + title: Qualtrics Domain + description: The subdomain of your Qualtrics account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .qualtrics.com + prefix: https:// + +quentn: + display_name: Quentn + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.quentn.com/public/api + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v1/terms + docs: https://nango.dev/docs/api-integrations/quentn + docs_connect: https://nango.dev/docs/api-integrations/quentn/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Quentn API key. + secret: true + example: a1bcDeFgHi-jkLmNoPqRsTuVwXyZ0123456789AbCdE + pattern: '^[A-Za-z0-9_-]{43}$' + doc_section: '#step-1-getting-your-api-key' + connection_config: + subdomain: + type: string + title: Subdomain + description: Your Quentn account subdomain. + format: hostname + example: xk7mdf.eu-5 + suffix: .quentn.com/public/api + prefix: https:// + order: 1 + doc_section: '#step-2-finding-your-subdomain' + +quickbase: + display_name: Quickbase + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.quickbase.com/v1/ + headers: + qb-realm-hostname: ${connectionConfig.domain} + user-agent: ${connectionConfig.appDetails} || App (support@nango.dev) + authorization: QB-USER-TOKEN ${apiKey} + query: + apiKey: ${apiKey} + docs: https://nango.dev/docs/integrations/all/quickbase + docs_connect: https://nango.dev/docs/integrations/all/quickbase/connect + connection_config: + domain: + type: string + title: Realm Hostname + description: Your Quickbase Realm Hostname + example: demo.quickbase.com + format: hostname + doc_section: '#step-1-finding-your-realm-hostname' + appDetails: + type: string + title: App Details + description: The details of your app + automated: true + credentials: + apiKey: + type: string + title: User Token + description: Your User Token + pattern: '^[a-z0-9_-]+$' + example: bb_aa_xxxxxx_xxxxxxxxxxxxxxxxx + doc_section: '#step-2-finding-your-user-token' + +qualia: + display_name: Qualia + categories: + - legal + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.qualia.io/api + docs: https://nango.dev/docs/api-integrations/qualia + docs_connect: https://nango.dev/docs/api-integrations/qualia/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of the Qualia platform you want to connect to. + pattern: '^[a-z0-9-]+$' + example: connect + order: 1 + doc_section: '#step-1-finding-your-subdomain' + credentials: + username: + type: string + title: Username + description: Your Qualia organization username. + doc_section: '#step-2-finding-your-api-key' + password: + type: string + title: Password + description: Your Qualia API password. + secret: true + doc_section: '#step-2-finding-your-api-key' + +quickbooks: + display_name: Quickbooks + categories: + - accounting + - popular + auth_mode: OAUTH2 + authorization_url: https://appcenter.intuit.com/connect/oauth2 + token_url: https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer + redirect_uri_metadata: + - realmId + proxy: + connection_config: + realmId: ${connectionConfig.realmId} + base_url: https://quickbooks.api.intuit.com + docs: https://nango.dev/docs/api-integrations/quickbooks + setup_guide_url: https://nango.dev/docs/api-integrations/quickbooks/how-to-register-your-own-quickbooks-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/quickbooks/connect + connection_config: + realmId: + type: string + title: Quickbooks Realm ID + optional: true + description: The realmId of your quickbooks company + pattern: '^\d{10,19}$' + example: '9341453474484455' + doc_section: '#step-1-finding-your-realm-id' + +quickbooks-sandbox: + alias: quickbooks + display_name: Quickbooks (Sandbox) + categories: + - accounting + proxy: + connection_config: + realmId: ${connectionConfig.realmId} + base_url: https://sandbox-quickbooks.api.intuit.com + docs: https://nango.dev/docs/api-integrations/quickbooks-sandbox + setup_guide_url: https://nango.dev/docs/api-integrations/quickbooks/how-to-register-your-own-quickbooks-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/quickbooks-sandbox/connect + connection_config: + realmId: + type: string + title: Quickbooks Realm ID + optional: true + description: The realmId of your quickbooks sandbox company + pattern: '^\d{10,19}$' + example: '9341453474484455' + doc_section: '#step-1-finding-your-realm-id' + +quipteams: + display_name: Quipteams + categories: + - other + auth_mode: API_KEY + proxy: + base_url: https://api.quipteams.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /api/v1/quotes + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/api-integrations/quipteams + docs_connect: https://nango.dev/docs/api-integrations/quipteams/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Quipteams API key. + doc_section: '#step-1-finding-your-api-key' + +ragieai: + display_name: Ragie AI + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.ragie.ai + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /documents + docs: https://nango.dev/docs/integrations/all/ragieai + credentials: + apiKey: + type: string + title: API Key + description: The API key for your ragie.ai account + example: tnt_IZ56tqGVgX9_k8CKnxQ9MvQgzDXcDGgtcjXABkwusxSOR8QzwxxeA1B + pattern: '^tnt_[a-zA-Z0-9_]+$' + +ramp: + display_name: Ramp + categories: + - banking + auth_mode: OAUTH2 + authorization_url: https://app.ramp.com/v1/authorize + token_url: https://api.ramp.com/developer/v1/token + authorization_method: header + proxy: + base_url: https://api.ramp.com + docs: https://nango.dev/docs/integrations/all/ramp + +ramp-sandbox: + display_name: Ramp (Sandbox) + categories: + - banking + auth_mode: OAUTH2 + authorization_url: https://demo.ramp.com/v1/authorize + token_url: https://demo-api.ramp.com/developer/v1/token + authorization_method: header + proxy: + base_url: https://demo-api.ramp.com + docs: https://nango.dev/docs/integrations/all/ramp-sandbox + +rapidapi: + display_name: RapidAPI + categories: + - dev-tools + auth_mode: API_KEY + proxy: + headers: + x-rapidapi-key: ${apiKey} + x-rapidapi-host: ${connectionConfig.subdomain}.p.rapidapi.com + base_url: https://${connectionConfig.subdomain}.p.rapidapi.com + docs: https://nango.dev/docs/integrations/all/rapidapi + credentials: + apiKey: + type: string + title: API Key + description: The API key for your RapidAPI account + example: b7c156af2dmgh5c635305f3744bap168553jsp75193c8367ef + pattern: '^[a-zA-Z0-9]+$' + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of the Rapid API. + pattern: '^[a-z0-9_-]+$' + example: api-football-v1 + suffix: .p.rapidapi.com + prefix: https:// + +razorpay: + display_name: Razorpay + categories: + - payment + auth_mode: BASIC + proxy: + base_url: https://api.razorpay.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/orders + docs: https://nango.dev/docs/integrations/all/razorpay + docs_connect: https://nango.dev/docs/integrations/all/razorpay/connect + credentials: + username: + type: string + title: Key ID + description: Your Key ID + pattern: '^rzp_(test|live)_[A-Za-z0-9]+$' + example: 'rzp_test_*************' + doc_section: '#step-1-finding-your-key-id-and-secret' + password: + type: string + title: Key Secret + description: Your Key Secret + secret: true + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-1-finding-your-key-id-and-secret' + +read-ai: + display_name: Read.ai + categories: + - productivity + - video + auth_mode: OAUTH2 + authorization_url: https://authn.read.ai/oauth2/auth + token_url: https://authn.read.ai/oauth2/token + token_request_auth_method: basic + authorization_method: header + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.read.ai + docs: https://nango.dev/docs/api-integrations/read-ai + setup_guide_url: https://nango.dev/docs/api-integrations/read-ai/how-to-register-your-own-read-ai-oauth-app + +readwise: + display_name: Readwise + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://readwise.io/api/v2 + headers: + authorization: Token ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /auth + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/readwise + docs_connect: https://nango.dev/docs/integrations/all/readwise/connect + credentials: + apiKey: + type: string + title: Access Token + description: The Access Token for your Readwise account + example: zCDL1fUOpu4Cg3WMlMl1S7ecKsaBQlfCzw7sbVfc0wBqUJMI56 + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-1-generating-your-access-token' + +readwise-reader: + display_name: Readwise Reader + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://readwise.io/api/v3 + headers: + authorization: Token ${apiKey} + verification: + method: GET + headers: + content-type: application/json + base_url_override: https://readwise.io + endpoints: + - /api/v2/auth + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/readwise-reader + docs_connect: https://nango.dev/docs/integrations/all/readwise-reader/connect + credentials: + apiKey: + type: string + title: Access Token + description: The Access Token for your Readwise account + example: zCDL1fUOpu4Cg3WMlMl1S7ecKsaBQlfCzw7sbVfc0wBqUJMI56 + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-1-generating-your-access-token' + +recharge: + display_name: Recharge + categories: + - e-commerce + auth_mode: API_KEY + proxy: + headers: + x-recharge-access-token: ${apiKey} + base_url: https://api.rechargeapps.com + docs: https://nango.dev/docs/integrations/all/recharge + docs_connect: https://nango.dev/docs/integrations/all/recharge/connect + credentials: + apiKey: + type: string + title: API Token + description: The API Token for your Recharge account + example: sk_test_1p1_************************************************** + pattern: '^[a-zA-Z0-9_]+$' + doc_section: '#step-1-generating-your-api-token' + +recall-ai: + display_name: Recall.ai + categories: + - dev-tools + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.region}.recall.ai + headers: + authorization: ${apiKey} + verification: + method: GET + endpoints: + - /api/v2/calendar-events + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/recall-ai + docs_connect: https://nango.dev/docs/api-integrations/recall-ai/connect + connection_config: + region: + type: string + title: Region + description: The region where your Recall.ai account is hosted. + enum: + - us-east-1 + - us-west-2 + - eu-central-1 + - ap-northeast-1 + order: 1 + doc_section: '#step-1-determine-your-region' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Recall.ai account + example: 2d7843e2351dd4afa67eecfb5c723142fcb401b1 + pattern: '^[a-f0-9]{40}$' + doc_section: '#step-2-generating-your-api-key' + +recruitcrm: + display_name: Recruitcrm + categories: + - hr + - ats + auth_mode: API_KEY + proxy: + base_url: https://api.recruitcrm.io + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/candidates/search + docs: https://nango.dev/docs/integrations/all/recruitcrm + docs_connect: https://nango.dev/docs/integrations/all/recruitcrm/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Recruitcrm account + example: 9SKXL************************************** + doc_section: '#step-1-generating-your-api-key' + +recruitee: + display_name: Recruitee + categories: + - ats + auth_mode: API_KEY + proxy: + base_url: https://api.recruitee.com/c/${connectionConfig.companyId} + headers: + authorization: Bearer ${apiKey} + connection_config: + companyName: ${connectionConfig.companyName} + verification: + method: GET + endpoints: + - /departments + docs: https://nango.dev/docs/integrations/all/recruitee + docs_connect: https://nango.dev/docs/integrations/all/recruitee/connect + connection_config: + companyId: + type: string + title: Company ID + description: The Company ID for your Recruitee account + example: '126786' + pattern: '^[0-9]+$' + order: 1 + doc_section: '#step-1-finding-your-company-id-and-company-name' + companyName: + type: string + title: Company Name + description: The Company name for your Recruitee account + example: acme + optional: true + doc_section: '#step-1-finding-your-company-id-and-company-name' + credentials: + apiKey: + type: string + title: Personal API Token + description: The Personal API Token for your Recruitee account + example: 'OTlHOGlWNUFJRkErekoxd1lXMGd6dz09' + pattern: '^[A-Za-z0-9+/]+={0,2}$' + doc_section: '#step-2-generating-your-personal-api-token' + +recruiterflow: + display_name: Recruiterflow + categories: + - hr + - ats + auth_mode: API_KEY + proxy: + base_url: https://api.recruiterflow.com + headers: + rf-api-key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/external/user/list + docs: https://nango.dev/docs/integrations/all/recruiterflow + docs_connect: https://nango.dev/docs/integrations/all/recruiterflow/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Recruiterflow account + doc_section: '#step-1-generating-your-api-key' + example: 7b0c0d**************************** + pattern: '^[a-zA-Z0-9_]+$' + +render-mcp: + display_name: Render (MCP) + categories: + - dev-tools + - mcp + auth_mode: API_KEY + proxy: + base_url: https://mcp.render.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/api-integrations/render-mcp + docs_connect: https://nango.dev/docs/api-integrations/render-mcp/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Render API key from Account Settings. + doc_section: '#step-1-create-a-render-api-key' + example: rnd_**************************** + pattern: '^rnd_[A-Za-z0-9]+$' + +raindrop-mcp: + display_name: Raindrop (MCP) + categories: + - dev-tools + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://auth.raindrop.ai/oauth/2.1/authorize + token_url: https://auth.raindrop.ai/oauth/2.1/token + registration_url: https://auth.raindrop.ai/oauth/2.1/register + authorization_params: + response_type: code + resource: https://mcp.raindrop.ai/mcp + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://mcp.raindrop.ai + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/raindrop-mcp + +reddit: + display_name: Reddit + categories: + - social + auth_mode: OAUTH2 + authorization_url: https://www.reddit.com/api/v1/authorize + token_url: https://www.reddit.com/api/v1/access_token + authorization_method: header + authorization_params: + duration: permanent + proxy: + base_url: https://oauth.reddit.com + docs: https://nango.dev/docs/integrations/all/reddit + +redtail-crm-sandbox: + display_name: Redtail CRM (Sandbox) + categories: + - crm + auth_mode: TWO_STEP + token_url: https://review.crm.redtailtechnology.com/api/public/v1/authentication + token_request_method: GET + token_headers: + authorization: Basic ${base64(${credentials.apiKey}:${credentials.username}:${credentials.password})} + token_response: + token: authenticated_user.user_key + proxy: + headers: + authorization: Userkeyauth ${base64(${credentials.apiKey}:${accessToken})} + base_url: https://review.crm.redtailtechnology.com/api/public + docs: https://nango.dev/docs/integrations/all/redtail-crm-sandbox + docs_connect: https://nango.dev/docs/integrations/all/redtail-crm-sandbox/connect + credentials: + username: + type: string + title: Username + description: The username for your Redtail CRM account + doc_section: '#step-2-finding-your-credentials' + password: + type: string + title: Password + description: The password for your Redtail CRM account + secret: true + doc_section: '#step-2-finding-your-credentials' + apiKey: + type: string + title: API Key + description: The API Key for your Redtail CRM account + example: f1c2d3a4-5b67-4c89-ae01-123456789abc + format: uuid + secret: true + doc_section: '#step-1-finding-your-api-token' +refiner: + display_name: Refiner + categories: + - surveys + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.refiner.io/v1 + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /account + docs: https://nango.dev/docs/integrations/all/refiner + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Refiner account + +replicate: + display_name: Replicate + categories: + - dev-tools + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.replicate.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/account + docs: https://nango.dev/docs/integrations/all/replicate + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Replicate account + +reply-io: + display_name: Reply.io + categories: + - marketing + - communication + auth_mode: API_KEY + proxy: + base_url: https://api.reply.io + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v3/whoami + docs: https://nango.dev/docs/api-integrations/reply-io + docs_connect: https://nango.dev/docs/api-integrations/reply-io/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Reply.io account. + example: AKp2Bbuy**************** + pattern: '^[A-Za-z0-9_-]+$' + doc_section: '#step-1-finding-your-api-key' + +researchdesk: + display_name: ResearchDesk + categories: + - other + auth_mode: TWO_STEP + body_format: json + token_url: https://${connectionConfig.subdomain}.researchdesk.com/tokens + token_params: + email: ${credentials.email} + password: ${credentials.password} + token_headers: + content-type: application/json + token_response: + token: token + token_expiration: expires + token_expiration_strategy: expireAt + proxy: + base_url: https://${connectionConfig.subdomain}.researchdesk.com + headers: + authorization: Bearer ${accessToken} + docs: https://nango.dev/docs/api-integrations/researchdesk + docs_connect: https://nango.dev/docs/api-integrations/researchdesk/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of the environment to which you want to connect to. + enum: + - demand + - stage-demand + order: 1 + doc_section: '#step-1-choosing-your-subdomain' + credentials: + email: + type: string + title: Email + description: Your ResearchDesk account email + format: email + doc_section: '#step-2-finding-your-credentials' + password: + type: string + title: Password + description: Your ResearchDesk account password + secret: true + doc_section: '#step-2-finding-your-credentials' + +resend: + display_name: Resend + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://api.resend.com + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'retry-after' + verification: + method: GET + endpoints: + - /domains?limit=1 + docs: https://nango.dev/docs/api-integrations/resend + docs_connect: https://nango.dev/docs/api-integrations/resend/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Resend API key. + pattern: '^re_[A-Za-z0-9_]+$' + example: 're_HW***************************65L' + doc_section: '#step-1-getting-your-api-key' + +retell-ai: + display_name: Retell AI + categories: + - dev-tools + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.retellai.com + headers: + authorization: Bearer ${apiKey} + content-type: application/json + docs: https://nango.dev/docs/integrations/all/retell-ai + docs_connect: https://nango.dev/docs/integrations/all/retell-ai/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for Retell AI + example: key-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + doc_section: '#step-1-finding-your-retell-ai-api-key' + +revivn: + display_name: Revivn + categories: + - other + auth_mode: OAUTH2_CC + token_url: https://api.revivn.dev/oauth/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.revivn.dev + docs: https://nango.dev/docs/api-integrations/revivn + docs_connect: https://nango.dev/docs/api-integrations/revivn/connect + credentials: + client_id: + type: string + title: Client ID + description: Your Revivn OAuth2 client ID. + doc_section: '#step-1-get-your-oauth2-credentials' + client_secret: + type: string + title: Client Secret + description: Your Revivn OAuth2 client secret. + secret: true + doc_section: '#step-1-get-your-oauth2-credentials' + +ring-central: + display_name: RingCentral + categories: + - support + auth_mode: OAUTH2 + authorization_url: https://platform.ringcentral.com/restapi/oauth/authorize + token_url: https://platform.ringcentral.com/restapi/oauth/token + authorization_method: header + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://platform.ringcentral.com + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/ring-central + +ring-central-sandbox: + display_name: RingCentral (Sandbox) + categories: + - communication + auth_mode: OAUTH2 + authorization_url: https://platform.devtest.ringcentral.com/restapi/oauth/authorize + token_url: https://platform.devtest.ringcentral.com/restapi/oauth/token + authorization_method: header + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://platform.devtest.ringcentral.com + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/ring-central-sandbox + +ringover: + display_name: Ringover + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://public-api.ringover.com + headers: + authorization: ${apiKey} + docs: https://nango.dev/docs/api-integrations/ringover + docs_connect: https://nango.dev/docs/api-integrations/ringover/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Ringover API key. + example: 'a3f9e2***************************d8e9f0' + pattern: '^[a-f0-9]{40}$' + doc_section: '#step-1-generating-your-api-key' + +rippling: + display_name: Rippling + categories: + - hr + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + user-agent: Node.js/20.12.2 (linux; x64) + base_url: https://rest.ripplingapis.com + docs: https://nango.dev/docs/integrations/all/rippling + docs_connect: https://nango.dev/docs/integrations/all/rippling/connect + credentials: + apiKey: + type: string + title: API Token + description: The API Token for your Rippling account + doc_section: '#step-1-generating-your-api-token' + +rippling-shop-app: + display_name: Rippling Shop App + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://app.rippling.com/apps/PLATFORM/${connectionConfig.appName}/authorize + token_url: https://api.rippling.com/api/o/token/ + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.rippling.com + post_connection_script: ripplingShopAppPostConnection + docs: https://nango.dev/docs/integrations/all/rippling-shop-app + connection_config: + appName: + type: string + title: '' + description: '' + automated: true + +roam-scim: + display_name: Roam (SCIM API) + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.ro.am/scim + headers: + authorization: Bearer ${apiKey} + accept: application/json + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/Users + docs: https://nango.dev/docs/integrations/all/roam-scim + docs_connect: https://nango.dev/docs/integrations/all/roam-scim/connect + credentials: + apiKey: + type: string + title: SCIM API Token + description: The SCIM API token generated from your Roam organization settings. + example: rmk-uu9zt58h-EYHyLJ3ay4Mc-wuWQTOk-Y2yY-gZlW7Ys8AdVXBRZks_SGrCyZ09_IDvX9ikahdxushGYKcT77Fjw + pattern: '^rmk-[A-Za-z0-9_-]{86}$' + doc_section: '#step-1-generating-your-scim-api-token' + +robinhood-mcp: + display_name: Robinhood (MCP) + categories: + - payment + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://robinhood.com/oauth + token_url: https://api.robinhood.com/oauth2/token/ + registration_url: https://agent.robinhood.com/oauth/trading/register + authorization_params: + response_type: code + resource: https://agent.robinhood.com/mcp/trading + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://agent.robinhood.com + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/robinhood-mcp + +rock-gym-pro: + display_name: Rock Gym Pro + categories: + - crm + auth_mode: BASIC + proxy: + base_url: https://api.rockgympro.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/ping + paginate: + type: offset + offset_name_in_request: page + limit_name_in_request: limit + docs: https://nango.dev/docs/integrations/all/rock-gym-pro + credentials: + username: + type: string + title: API Username + description: Your Rock Gym Pro API username + password: + type: string + title: API Password + description: Your Rock Gym Pro API password + +roller: + display_name: Roller + categories: + - ticketing + auth_mode: OAUTH2_CC + token_url: https://api.roller.app/token + body_format: json + credentials: + client_id: + type: string + title: Client ID + description: Roller client ID + client_secret: + type: string + title: Client Secret + description: Roller client secret + proxy: + base_url: https://api.roller.app + + docs: https://nango.dev/docs/integrations/all/roller + +rocketreach: + display_name: RocketReach + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.rocketreach.co + headers: + api-key: ${apiKey} + retry: + at: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/rocketreach + docs_connect: https://nango.dev/docs/api-integrations/rocketreach/connect + credentials: + apiKey: + type: string + title: API Key + description: Your RocketReach API key. + example: 1e4dfd5***************************e3ca3a + pattern: '^[a-z0-9]+$' + doc_section: '#step-1-get-your-api-key' + +rootly: + display_name: Rootly + categories: + - dev-tools + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.rootly.com + verification: + method: GET + headers: + content-type: application/vnd.api+json + endpoints: + - /v1/users/me + docs: https://nango.dev/docs/api-integrations/rootly + docs_connect: https://nango.dev/docs/api-integrations/rootly/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Rootly account + example: rootly_db86a6β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’ + pattern: '^rootly_[a-f0-9]{64}$' + doc_section: '#step-1-generating-your-api-key' + +reapit: + display_name: Reapit Connect + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://connect.reapit.cloud/authorize + token_url: https://connect.reapit.cloud/token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://platform.reapit.cloud + headers: + api-version: ${connectionConfig.version} || 2020-01-31 + docs: https://nango.dev/docs/api-integrations/reapit + setup_guide_url: https://nango.dev/docs/api-integrations/reapit/how-to-register-your-own-reapit-oauth-app + connection_config: + version: + type: string + title: '' + description: '' + automated: true +rydoo: + display_name: Rydoo + categories: + - accounting + auth_mode: OAUTH2_CC + token_url: https://accounts.rydoo.com/connect/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.rydoo.com + docs: https://nango.dev/docs/api-integrations/rydoo + docs_connect: https://nango.dev/docs/api-integrations/rydoo/connect + credentials: + client_id: + type: string + title: Client ID + description: Your Rydoo Client ID. + client_secret: + type: string + title: Client Secret + description: Your Rydoo Client Secret. + secret: true + +segment: + display_name: Segment + categories: + - analytics + - marketing + auth_mode: OAUTH2 + authorization_url: https://id.segmentapis.com/oauth2/auth + token_url: https://id.segmentapis.com/oauth2/token + token_request_auth_method: basic + proxy: + base_url: https://api.segment.io + docs: https://nango.dev/docs/integrations/all/segment + +sage: + display_name: Sage + categories: + - accounting + - erp + auth_mode: OAUTH2 + authorization_url: https://www.sageone.com/oauth2/auth/central + token_url: https://oauth.accounting.sage.com/token + authorization_params: + filter: apiv3.1 + proxy: + base_url: https://api.accounting.sage.com + docs: https://nango.dev/docs/integrations/all/sage + +sage-200: + display_name: Sage 200 + categories: + - accounting + - erp + auth_mode: OAUTH2 + authorization_url: https://id.sage.com/authorize + token_url: https://id.sage.com/oauth/token + authorization_params: + audience: s200ukipd/sage200 + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + default_scopes: + - offline_access + scope_separator: ' ' + post_connection_script: sage200PostConnection + proxy: + base_url: https://api.columbus.sage.com/uk/${connectionConfig.edition} + headers: + x-company: ${connectionConfig.company_id} + x-site: ${connectionConfig.site_id} + docs: https://nango.dev/docs/api-integrations/sage-200 + setup_guide_url: https://nango.dev/docs/api-integrations/sage-200/how-to-register-your-own-sage-200-oauth-app + connection_config: + edition: + type: string + title: '' + description: '' + automated: true + company_id: + type: string + title: '' + description: '' + automated: true + site_id: + type: string + title: '' + description: '' + automated: true + +sage-hr: + display_name: Sage HR + categories: + - hr + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.sage.hr + headers: + x-auth-token: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/employees + docs: https://nango.dev/docs/integrations/all/sage-hr + docs_connect: https://nango.dev/docs/integrations/all/sage-hr/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Sage HR account + doc_section: '#step-1-enabling-api-access' + example: apikey**************************** + pattern: '^[a-zA-Z0-9.]+$' + connection_config: + subdomain: + type: string + title: Sage HR Subdomain + description: The subdomain of your Sage HR account + pattern: '^[a-zA-Z0-9-]+$' + example: subdomain + suffix: .sage.hr + prefix: https:// + +sage-intacct-oauth: + display_name: Sage Intacct (OAuth) + categories: + - accounting + - erp + - popular + auth_mode: OAUTH2 + authorization_url: https://api.intacct.com/ia/api/v1/oauth2/authorize + token_url: https://api.intacct.com/ia/api/v1/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.intacct.com/ia/api + docs: https://nango.dev/docs/integrations/all/sage-intacct-oauth + +sage-intacct-cc: + display_name: Sage Intacct (Client Credentials) + categories: + - accounting + - erp + auth_mode: TWO_STEP + body_format: form + token_url: https://api.intacct.com/ia/api/v1/oauth2/token + token_params: + grant_type: client_credentials + client_id: ${credentials.clientId} + client_secret: ${credentials.clientSecret} + username: ${credentials.username} + session_id: ${credentials.sessionId} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://api.intacct.com/ia/api + docs: https://nango.dev/docs/api-integrations/sage-intacct-cc + docs_connect: https://nango.dev/docs/api-integrations/sage-intacct-cc/connect + setup_guide_url: https://nango.dev/docs/api-integrations/sage-intacct-cc/connect + credentials: + clientId: + type: string + title: Client ID + description: Your Sage Intacct application Client ID. + clientSecret: + type: string + title: Client Secret + description: Your Sage Intacct application Client Secret. + secret: true + username: + type: string + title: Username + description: The Web Services user ID in userId@companyId|entityId format. Required if not using Session ID. + example: Admin@MyCompany|Central Region + optional: true + sessionId: + type: string + title: Session ID + description: A valid UI or API session ID. Required if not using Username. + secret: true + optional: true + +sage-intacct: + display_name: Sage Intacct + categories: + - accounting + - erp + auth_mode: TWO_STEP + proxy: + base_url: https://api.intacct.com/ia/xml/xmlgw.phtml + token_url: https://api.intacct.com/ia/xml/xmlgw.phtml + body_format: xml + token_params: + request: + control: + senderid: ${credentials.senderId} + password: ${credentials.senderPassword} + controlid: ${now} + uniqueid: false + dtdversion: '3.0' + includewhitespace: false + operation: + authentication: + login: + userid: ${credentials.userId} + companyid: ${credentials.companyId} + password: ${credentials.userPassword} + content: + function: + $controlid: '{{$guid}}' + getAPISession: '' + token_headers: + content-type: application/xml + token_response: + token: response.operation.result.data.api.sessionid + token_expiration: response.operation.authentication.sessiontimeout + token_expiration_strategy: expireAt + docs: https://nango.dev/docs/integrations/all/sage-intacct + docs_connect: https://nango.dev/docs/integrations/all/sage-intacct/connect + credentials: + senderId: + type: string + title: Sender ID + description: Your Sage Intacct Sender ID + doc_section: '#step-1-how-to-retrieve-the-sender-id' + senderPassword: + type: string + title: Sender Password + description: Your Sage Intacct Sender Password + secret: true + userId: + type: string + title: User ID + description: Your Sage Intacct User ID + doc_section: '#step-2-how-to-retrieve-the-user-id' + companyId: + type: string + title: Company ID + description: Your Sage Intacct Company ID + doc_section: '#step-3-how-to-retrieve-the-company-id' + userPassword: + type: string + title: User Password + description: Your Sage Intacct User Password + secret: true + +sage-people: + display_name: Sage People + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://login.salesforce.com/services/oauth2/authorize + token_url: https://login.salesforce.com/services/oauth2/token + authorization_params: + prompt: consent + default_scopes: + - offline_access + - api + proxy: + base_url: https://${connectionConfig.instance_url}/services/apexrest/spapi + headers: + accept: application/json + token_response_metadata: + - instance_url + docs: https://nango.dev/docs/integrations/all/sage-people + docs_connect: https://nango.dev/docs/integrations/all/sage-people/connect + connection_config: + instance_url: + type: string + title: Instance URL + description: The instance URL of your Salesforce account + format: uri + pattern: '^https?://.*$' + automated: true + +sap-ariba: + display_name: SAP Ariba + categories: + - erp + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.subdomain}.ariba.com/v2/oauth/token + token_params: + grant_type: openapi_2lo + token_request_auth_method: basic + body_format: form + proxy: + base_url: https://open${connectionConfig.subdomain}.ariba.com + headers: + apikey: ${connectionConfig.apiKey} + x-ariba-network-id: ${connectionConfig.anid} + retry: + after: + - retry-after + docs: https://nango.dev/docs/api-integrations/sap-ariba + docs_connect: https://nango.dev/docs/api-integrations/sap-ariba/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: Your SAP Ariba API subdomain. + example: api-eu + default_value: api + enum: + - api + - api-eu + - api.au.cloud + doc_section: '#step-1-select-your-subdomain' + order: 1 + apiKey: + type: string + title: Application Key (API Key) + description: Your SAP Ariba application's API Key. + secret: true + doc_section: '#step-2-get-your-api-key' + order: 2 + anid: + type: string + title: Ariba Network ID (ANID) + description: Your SAP Ariba Network ID. + example: AN01234567890 + pattern: '^AN[0-9]+$' + doc_section: '#step-3-find-your-anid' + order: 3 + +salesforce: + display_name: Salesforce + categories: + - crm + - popular + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.hostname}/services/oauth2/authorize || https://login.salesforce.com/services/oauth2/authorize + token_url: https://${connectionConfig.hostname}/services/oauth2/token || https://login.salesforce.com/services/oauth2/token + authorization_params: + prompt: consent + default_scopes: + - offline_access + token_response_metadata: + - instance_url + proxy: + base_url: ${connectionConfig.instance_url} + webhook_routing_script: salesforceWebhookRouting + post_connection_script: salesforcePostConnection + docs: https://nango.dev/docs/api-integrations/salesforce + setup_guide_url: https://nango.dev/docs/api-integrations/salesforce/salesforce-api-oauth-app-setup + docs_connect: https://nango.dev/docs/api-integrations/salesforce/connect + connection_config: + instance_url: + type: string + title: Instance URL + description: The instance URL of your Salesforce account + format: uri + pattern: '^https?://.*$' + automated: true + hostname: + type: string + title: Hostname + description: The hostname to your Salesforce instance + pattern: '^(?!(?:.*\.)?[Ll][Ii][Gg][Hh][Tt][Nn][Ii][Nn][Gg]\.([Ff][Oo][Rr][Cc][Ee]|[Ss][Aa][Ll][Ee][Ss][Ff][Oo][Rr][Cc][Ee])\.[Cc][Oo][Mm]$)[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$' + example: acme.my.salesforce.com + prefix: https:// + optional: true + doc_section: '#step-1-finding-your-hostname' + +salesforce-cc: + display_name: Salesforce (Client Credentials) + categories: + - crm + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.hostname}/services/oauth2/token + token_params: + grant_type: client_credentials + token_response_metadata: + - instance_url + proxy: + base_url: ${connectionConfig.instance_url} + docs: https://nango.dev/docs/api-integrations/salesforce-cc + docs_connect: https://nango.dev/docs/api-integrations/salesforce-cc/connect + token_expires_in_ms: 0 + connection_config: + instance_url: + type: string + title: '' + description: '' + automated: true + hostname: + type: string + title: Hostname + description: The hostname to your Salesforce instance + pattern: '^(?!(?:.*\.)?[Ll][Ii][Gg][Hh][Tt][Nn][Ii][Nn][Gg]\.([Ff][Oo][Rr][Cc][Ee]|[Ss][Aa][Ll][Ee][Ss][Ff][Oo][Rr][Cc][Ee])\.[Cc][Oo][Mm]$)[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$' + example: acme.my.salesforce.com + prefix: https:// + +salesforce-jwt: + display_name: Salesforce (JWT) + categories: + - crm + auth_mode: TWO_STEP + signature: + protocol: RSA + body_format: form + token: + signing_key: ${credentials.privateKey} + expires_in_ms: 3600000 + header: + alg: RS256 + typ: JWT + payload: + iss: ${credentials.clientId} + aud: https://${connectionConfig.authorizationUrl} + sub: ${credentials.username} + token_url: https://${connectionConfig.authorizationUrl}/services/oauth2/token + token_params: + grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer + assertion: ${token} + token_response: + token: access_token + token_response_metadata: + - instance_url + proxy: + base_url: ${connectionConfig.instance_url} + token_expires_in_ms: 0 + docs: https://nango.dev/docs/api-integrations/salesforce-jwt + docs_connect: https://nango.dev/docs/api-integrations/salesforce-jwt/connect + connection_config: + authorizationUrl: + type: string + title: Authorization Server URL + description: Your Salesforce authorization server URL. + format: hostname + example: 'login.salesforce.com' + doc_section: '#step-5-finding-the-authorization-server-url' + credentials: + clientId: + type: string + title: Consumer Key + example: 3MVG9dAEux2v1sLsg0e52***************CJpGsXgqg8E + description: The Consumer Key from your Salesforce Connected App. + doc_section: '#step-3-get-consumer-key-and-consumer-secret' + clientSecret: + type: string + title: Consumer Secret + example: 954F73F4C234***************9D069B8FCF83B5 + pattern: '^[A-F0-9]{64}$' + description: The Consumer Secret from your Salesforce Connected App. + doc_section: '#step-3-get-consumer-key-and-consumer-secret' + username: + type: string + title: Username + description: The Salesforce username of the user the JWT will act on behalf of. + format: email + example: john@acme.com + doc_section: '#step-6-finding-the-username' + privateKey: + type: string + title: Private Key + description: The private key that matches the certificate you uploaded to the Connected App. + example: '-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n-----END PRIVATE KEY-----' + doc_section: '#step-1-create-a-private-key-and-self-signed-digital-certificate' + +salesforce-sandbox: + display_name: Salesforce (Sandbox) + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://test.salesforce.com/services/oauth2/authorize + token_url: https://test.salesforce.com/services/oauth2/token + default_scopes: + - offline_access + token_response_metadata: + - instance_url + proxy: + base_url: ${connectionConfig.instance_url} + docs: https://nango.dev/docs/api-integrations/salesforce-sandbox + setup_guide_url: https://nango.dev/docs/api-integrations/salesforce-sandbox/how-to-register-your-own-salesforce-sandbox-api-oauth-app + connection_config: + instance_url: + type: string + title: Instance URL + description: The instance URL of your Salesforce account + format: uri + pattern: '^https?://.*$' + automated: true + +salesforce-experience-cloud: + display_name: Salesforce Experience Cloud + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.my.site.com/services/oauth2/authorize + token_url: https://${connectionConfig.subdomain}.my.site.com/services/oauth2/token + default_scopes: + - offline_access + token_response_metadata: + - instance_url + proxy: + base_url: ${connectionConfig.instance_url} + docs: https://nango.dev/docs/integrations/all/salesforce-experience-cloud + connection_config: + subdomain: + type: string + title: Salesforce Domain + description: The subdomain of your Salesforce Experience Cloud account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .my.site.com + prefix: https:// + instance_url: + type: string + title: Instance URL + description: The instance URL of your Salesforce Experience Cloud account + format: uri + pattern: '^https?://.*$' + automated: true +salesforce-cdp: + display_name: Salesforce (Data Cloud) + categories: + - storage + auth_mode: TWO_STEP + token_url: https://login.salesforce.com/services/oauth2/token + body_format: form + token_params: + grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer + assertion: ${credentials.jwt} + token_headers: + content-type: application/x-www-form-urlencoded + additional_steps: + - body_format: form + token_params: + grant_type: urn:salesforce:grant-type:external:cdp + subject_token: ${step1.access_token} + subject_token_type: urn:ietf:params:oauth:token-type:access_token + token_headers: + content-type: application/x-www-form-urlencoded + token_url: ${step1.instance_url}/services/a360/token + token_response_metadata: + - instance_url + proxy: + base_url: ${connectionConfig.instance_url} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/integrations/all/salesforce-cdp + docs_connect: https://nango.dev/docs/integrations/all/salesforce-cdp/connect + credentials: + jwt: + type: string + title: Encoded JWT + description: This is your pre-generated, encoded JSON Web Token (JWT) + secret: true + doc_section: '#step-1-generating-your-encoded-jwt' + +salesmsg: + display_name: Salesmsg (PAT) + categories: + - communication + - marketing + auth_mode: TWO_STEP + body_format: json + token_url: https://api.salesmessage.com/pub/v2.2/oauth/personal-token/refresh + token_headers: + authorization: Bearer ${credentials.apiKey} + content-type: application/json + refresh_token_headers: + authorization: Bearer ${refresh_token} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + refresh_token: access_token + proxy: + base_url: https://api.salesmessage.com/pub/ + headers: + authorization: Bearer ${accessToken} + docs: https://nango.dev/docs/api-integrations/salesmsg + docs_connect: https://nango.dev/docs/api-integrations/salesmsg/connect + credentials: + apiKey: + type: string + title: Personal Access Token + description: Your Salesmsg Personal Access Token (PAT). + example: eyJhbGciOi***.eyJzdWIiOi***.xxxxxxxxxxxx + pattern: '^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$' + doc_section: '#step-1-generating-your-personal-access-token' + +salesmsg-oauth2: + display_name: Salesmsg (OAuth2) + categories: + - communication + - marketing + auth_mode: OAUTH2 + authorization_url: https://app.salesmessage.com/auth/oauth + token_url: https://api.salesmessage.com/pub/v2.2/oauth/token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.salesmessage.com/pub/ + docs: https://nango.dev/docs/api-integrations/salesmsg-oauth2 + setup_guide_url: https://nango.dev/docs/api-integrations/salesmsg-oauth2/how-to-register-your-own-salesmsg-oauth-app + +sap-fieldglass: + display_name: SAP Fieldglass + categories: + - erp + body_format: form + auth_mode: TWO_STEP + token_url: https://${connectionConfig.domain}/api/oauth2/v2.0/token?grant_type=client_credentials&response_type=token + token_headers: + authorization: Basic ${base64(${credentials.clientId}:${credentials.clientSecret})} + X-ApplicationKey: ${credentials.appKey} + proxy: + base_url: https://${connectionConfig.domain}/api + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/integrations/all/sap-fieldglass + docs_connect: https://nango.dev/docs/integrations/all/sap-fieldglass/connect + credentials: + clientId: + type: string + title: Client ID + description: Your SAP Fieldglass application Client ID + doc_section: '#step-1-generating-an-application' + clientSecret: + type: string + title: Client secret + description: Your SAP Fieldglass application Client secret + secret: true + doc_section: '#step-1-generating-an-application' + appKey: + type: string + title: Application Key + description: Your SAP Fieldglass application key + secret: true + optional: true + doc_section: '#step-1-generating-an-application' + connection_config: + domain: + type: string + title: Domain + description: Your SAP Fieldglass environment URL + example: auth.fieldglass.net + prefix: https:// + pattern: '^(?:[a-zA-Z0-9_-]+-(?:auth\.)?fgvms\.com|auth\.fieldglass\.net|sso\.fieldglass\.eu)$' + doc_section: '#step-2-determining-your-domain' + +sap-concur: + display_name: SAP Concur + categories: + - erp + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.region}.api.concursolutions.com/oauth2/v0/token + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.region}.api.concursolutions.com + docs: https://nango.dev/docs/integrations/all/sap-concur + docs_connect: https://nango.dev/docs/integrations/all/sap-concur/connect + connection_config: + companyUUID: + type: string + title: Company UUID + description: The unique identifier for your SAP Concur company + doc_section: '#step-2-generate-company-request-token' + companyRequestToken: + type: string + title: Company Request Token + description: The request token generated for the company + doc_section: '#step-2-generate-company-request-token' + region: + type: string + title: Region + description: The SAP Concur Data Center region (e.g., `us`, `eu`, `cn`) + example: us + doc_section: '#step-3-determine-your-region' + +sap-concur-password: + display_name: SAP Concur (Password Grant) + categories: + - erp + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.region}.api.concursolutions.com/oauth2/v0/token + token_params: + grant_type: password + client_id: ${credentials.clientId} + client_secret: ${credentials.clientSecret} + username: ${credentials.username} + password: ${credentials.password} + token_headers: + content-type: application/x-www-form-urlencoded + token_response: + token: access_token + refresh_token: refresh_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://${connectionConfig.region}.api.concursolutions.com + docs: https://nango.dev/docs/api-integrations/sap-concur-password + docs_connect: https://nango.dev/docs/api-integrations/sap-concur-password/connect + credentials: + username: + type: string + title: Username + description: Your SAP Concur username or userId. + doc_section: '#step-2-get-your-user-credentials' + password: + type: string + title: Password + secret: true + description: Your SAP Concur account password. + doc_section: '#step-2-get-your-user-credentials' + clientId: + type: string + title: Client ID + description: Your OAuth application client_id supplied by App Management. + doc_section: '#step-1-get-your-client-credentials' + clientSecret: + type: string + title: Client Secret + secret: true + description: Your OAuth application client_secret supplied by App Management. + doc_section: '#step-1-get-your-client-credentials' + connection_config: + region: + type: string + title: Region + description: The SAP Concur Data Center region. + example: us + pattern: '^[a-z0-9-]+$' + order: 1 + doc_section: '#step-3-determine-your-region' + +sap-business-one: + display_name: SAP Business One + categories: + - erp + body_format: json + auth_mode: TWO_STEP + token_url: https://${connectionConfig.domain}/Login + token_params: + CompanyDB: ${connectionConfig.companyDb} + UserName: ${credentials.userName} + DBInstance: ${connectionConfig.dbInstance} + Password: ${credentials.password} + token_headers: + content-type: application/json + token_expires_in_ms: 1700000 + proxy: + base_url: https://${connectionConfig.domain} + headers: + cookie: ${credentials._cookies} + token_response: + token: SessionId + token_response_headers: + - set-cookie + docs: https://nango.dev/docs/integrations/all/sap-business-one + docs_connect: https://nango.dev/docs/integrations/all/sap-business-one/connect + connection_config: + domain: + type: string + title: Service Layer URL + prefix: https:// + suffix: /Login + pattern: '^[A-Za-z0-9.-]+(?::\d+(?:/[-A-Za-z0-9.]*)*)?$' + order: 1 + description: The base URL for your SAP Business One Service Layer + doc_section: '#step-3-finding-your-service-layer-url' + companyDb: + type: string + title: Company Database Name + description: The name of your SAP Business One company database + example: 10COR0809H + order: 2 + doc_section: '#step-2-identifying-your-company-database' + dbInstance: + type: string + title: Database Instance + description: The database server instance name + optional: true + order: 3 + example: C200@10.58.114.200:30013 + doc_section: '#step-4-finding-your-database-instance' + credentials: + userName: + type: string + title: Username + description: Your SAP Business One username + doc_section: '#step-1-obtaining-your-credentials' + password: + type: string + title: Password + description: Your SAP Business One password + secret: true + doc_section: '#step-1-obtaining-your-credentials' + +sap-success-factors: + display_name: SAP SuccessFactors + categories: + - hr + body_format: form + auth_mode: TWO_STEP + token_url: https://${connectionConfig.apiServer}/oauth/token + token_params: + company_id: ${connectionConfig.companyId} + client_id: ${credentials.apiKey} + grant_type: urn:ietf:params:oauth:grant-type:saml2-bearer + assertion: ${credentials.assertion} + new_token: true + assertion: + type: saml + key: ${assertionOption.privateKey} + issuer: www.successfactors.com + lifetimeInSeconds: '315360000' + audiences: www.successfactors.com + attributes: + api_key: ${credentials.apiKey} + use_username: true + use_email: false + external_user: false + sessionIndex: ${random} + nameIdentifier: ${assertionOption.userName} + recipient: https://${connectionConfig.apiServer}/oauth/token + token_headers: + content-type: application/x-www-form-urlencoded + proxy: + base_url: https://${connectionConfig.apiServer} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/api-integrations/sap-success-factors + docs_connect: https://nango.dev/docs/api-integrations/sap-success-factors/connect + connection_config: + apiServer: + type: string + title: API Server + description: The API Server to connect to your SAP SuccessFactors account + format: hostname + example: api41preview.sapsf.com + prefix: https:// + doc_section: '#step-1-finding-your-api-server' + order: 1 + companyId: + type: string + title: Company ID + description: The company ID of your SAP SuccessFactors account + example: SFSALES012345 + pattern: '^[A-Za-z0-9]+$' + doc_section: '#step-2-finding-your-company-id' + order: 2 + credentials: + apiKey: + type: string + title: API Key + description: The API key for your SAP SuccessFactors account + secret: true + example: YzA4MTVhMTQzZTUzMjc3NTk0ZDY2Nzc1ZmVkOA + pattern: ^[A-Za-z0-9+/]{32,44}={0,2}$ + doc_section: '#step-3-finding-your-api-key-and-private-key' + assertion: + type: string + title: '' + description: '' + automated: true + assertion_option: + userName: + type: string + title: Username + description: The username of your SAP SuccessFactors account + example: johnDoe + doc_section: '#step-4-finding-your-username' + privateKey: + type: string + title: Private Key + description: The Private Key for your SAP SuccessFactors Oauth Client + doc_section: '#step-3-finding-your-api-key-and-private-key' + +sap-odata-oauth2-cc: + display_name: SAP S/4HANA Cloud (Client Credentials) + categories: + - erp + - popular + token_request_auth_method: basic + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.subdomain}.authentication.${connectionConfig.region}.hana.ondemand.com/oauth/token + token_params: + grant_type: client_credentials + scope_separator: ',' + proxy: + base_url: https://${connectionConfig.apiServer} + docs: https://nango.dev/docs/api-integrations/sap-odata-oauth2-cc + docs_connect: https://nango.dev/docs/api-integrations/sap-odata-oauth2-cc/connect + connection_config: + subdomain: + type: string + title: Subdomain + prefix: https:// + pattern: '^[a-z0-9_-]+$' + example: acme + suffix: /hana.ondemand.com + order: 1 + description: The subdomain where your SAP S/4HANA cloud instance is hosted + doc_section: '#step-2-finding-your-subdomain' + region: + type: string + title: Region + description: The region where your SAP S/4HANA cloud instance is hosted + example: eu10 + order: 2 + doc_section: '#step-3-finding-your-region' + apiServer: + type: string + title: API Server + description: The API base URL of the SAP S/4HANA cloud API service you want to connect to + pattern: '^[A-Za-z0-9.-]+(?::\d+(?:/[-A-Za-z0-9.]*)*)?$' + prefix: https:// + format: hostname + example: eu10.cfapps.eu10.hana.ondemand.com + doc_section: '#step-4-finding-your-api-server' + order: 3 + +sap-odata-basic: + display_name: SAP S/4HANA Cloud (Basic Auth) + categories: + - erp + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.apiServer} + docs: https://nango.dev/docs/api-integrations/sap-odata-basic + docs_connect: https://nango.dev/docs/api-integrations/sap-odata-basic/connect + connection_config: + apiServer: + type: string + title: API Server + description: The API base URL of the SAP S/4HANA cloud API service you want to connect to + pattern: '^[A-Za-z0-9.-]+(?::\d+(?:/[-A-Za-z0-9.]*)*)?$' + prefix: https:// + example: eu10.cfapps.eu10.hana.ondemand.com + doc_section: '#step-2-finding-your-api-server' + order: 1 + +schwab: + display_name: Schwab + categories: + - banking + - accounting + auth_mode: OAUTH2 + authorization_url: https://api.schwabapi.com/v1/oauth/authorize + token_url: https://api.schwabapi.com/v1/oauth/token + token_request_auth_method: basic + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.schwabapi.com + docs: https://nango.dev/docs/api-integrations/schwab + setup_guide_url: https://nango.dev/docs/api-integrations/schwab/how-to-register-your-own-schwab-oauth-app + +scrapedo: + display_name: Scrape.do + categories: + - other + auth_mode: API_KEY + proxy: + base_url: https://api.scrape.do + query: + token: ${apiKey} + docs: https://nango.dev/docs/integrations/all/scrapedo + docs_connect: https://nango.dev/docs/integrations/all/scrapedo/connect + credentials: + apiKey: + type: string + title: API Token + description: The API Token for your Scrape.do account + example: 3c12d71308a346c41d10b19a2b2ac1ea5cacb53588d + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-1-finding-your-api-key' + +salesloft: + display_name: Salesloft + categories: + - marketing + auth_mode: OAUTH2 + authorization_url: https://accounts.salesloft.com/oauth/authorize + token_url: https://accounts.salesloft.com/oauth/token + proxy: + base_url: https://api.salesloft.com + docs: https://nango.dev/docs/integrations/all/salesloft + +sendgrid: + display_name: SendGrid + categories: + - marketing + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.sendgrid.com + docs: https://nango.dev/docs/integrations/all/sendgrid + docs_connect: https://nango.dev/docs/integrations/all/sendgrid/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Sendgrid account + doc_section: '#step-1-generating-your-sendgrid-api-key' + +semrush: + display_name: Semrush (v3) + categories: + - marketing + - analytics + auth_mode: API_KEY + proxy: + base_url: https://api.semrush.com + query: + key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /management/v1/projects + docs: https://nango.dev/docs/integrations/all/semrush + docs_connect: https://nango.dev/docs/integrations/all/semrush/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Semrush API key + doc_section: '#step-1-finding-your-api-key' + +sentinelone: + display_name: SentinelOne + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.hostname} + headers: + authorization: ApiToken ${apiKey} + accept: application/json + content-type: application/json + verification: + method: GET + endpoints: + - /web/api/v2.1/sites?limit=1 + docs: https://nango.dev/docs/api-integrations/sentinelone + docs_connect: https://nango.dev/docs/api-integrations/sentinelone/connect + connection_config: + hostname: + type: string + title: Hostname + description: The hostname of your SentinelOne management console + format: hostname + prefix: https:// + example: your-tenant.sentinelone.net + doc_section: '#step-2-find-your-hostname' + order: 1 + credentials: + apiKey: + type: string + title: API Token + description: The API token for your SentinelOne service user + doc_section: '#step-1-generate-your-api-token' + +sentry: + display_name: Sentry + categories: + - dev-tools + - analytics + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.hostname}/api + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/sentry + docs_connect: https://nango.dev/docs/integrations/all/sentry/connect + connection_config: + hostname: + type: string + title: Hostname + description: The Hostname of your Sentry account. + format: hostname + enum: + - sentry.io + - us.sentry.io + - eu.sentry.io + - de.sentry.io + order: 1 + doc_section: '#step-1-finding-your-hostname' + credentials: + apiKey: + type: string + title: Auth Token + description: The Authentication token for your Sentry account + example: sntryu_795225***************b9864a********************* + pattern: '^sntryu_[a-f0-9]{64}$' + doc_section: '#step-2-generating-your-sentry-auth-token' + +sentry-oauth: + display_name: Sentry (Public Integrations) + installation: outbound + categories: + - dev-tools + - analytics + auth_mode: OAUTH2 + token_url: https://sentry.io/api/0/sentry-app-installations/${connectionConfig.installation.uuid}/authorizations/ + webhook_routing_script: sentryOauthWebhookRouting + post_connection_script: sentryOauthPostConnection + authorization_code_param_in_webhook: data.installation.code + webhook_response_metadata: + - installation.uuid + proxy: + base_url: https://${connectionConfig.hostname}/api + connection_config: + actor: ${connectionConfig.actor} + docs: https://nango.dev/docs/integrations/all/sentry-oauth + docs_connect: https://nango.dev/docs/integrations/all/sentry-oauth/connect + connection_config: + hostname: + type: string + title: Hostname + description: The Hostname of your Sentry account. + format: hostname + enum: + - sentry.io + - us.sentry.io + - eu.sentry.io + - de.sentry.io + order: 1 + doc_section: '#step-1-finding-your-hostname' + actor: + type: string + title: User ID + description: The unique identifier of the user who will accept and install the public integration + doc_section: '#step-2-finding-your-user-id' + installation.uuid: + type: string + title: '' + description: '' + automated: true + +sedna: + display_name: Sedna (OAuth) + auth_mode: OAUTH2_CC + categories: + - communication + proxy: + base_url: https://${connectionConfig.tenant}.sednanetwork.com/platform + token_url: https://${connectionConfig.tenant}.sednanetwork.com/platform/oauth/token + token_params: + grant_type: client_credentials + scope_separator: ',' + docs: https://nango.dev/docs/integrations/all/sedna + connection_config: + tenant: + type: string + title: Tenant + description: The tenant name to your sedna account + +sedna-basic: + display_name: Sedna (Basic Auth) + auth_mode: BASIC + categories: + - communication + proxy: + base_url: https://${connectionConfig.tenant}.sednanetwork.com/platform + docs: https://nango.dev/docs/integrations/all/sedna-basic + connection_config: + tenant: + type: string + title: Tenant + description: The tenant name to your sedna account + +setmore: + display_name: Setmore + categories: + - productivity + auth_mode: TWO_STEP + token_request_method: GET + token_url: https://developer.setmore.com/api/v1/o/oauth2/token?refreshToken=${credentials.refreshToken} + proxy: + base_url: https://developer.setmore.com/api + token_response: + token: data.token.access_token + token_expiration: data.token.expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/integrations/all/setmore + docs_connect: https://nango.dev/docs/integrations/all/setmore/connect + credentials: + refreshToken: + type: string + title: Access Token + pattern: '^r1\/[A-Za-z0-9\-]+$' + example: r1/Ab12Cd34Ef56Gh78Ij90KlMnOpQr-StUvWxYz123456 + description: The access token provided to you by Setmore team + doc_section: '#step-1-requesting-access-to-the-api' + +sellercloud: + display_name: Sellercloud + categories: + - e-commerce + auth_mode: TWO_STEP + proxy: + base_url: ${connectionConfig.restApiEndpoint} + token_request_method: GET + token_url: https://api.sellercloud.com/api/server-by-team/?team=${credentials.teamName} + additional_steps: + - body_format: json + token_params: + Username: ${credentials.username} + Password: ${credentials.password} + token_url: ${step1.restApiEndpoint}/api/token + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + token_response_metadata: + - restApiEndpoint + docs: https://nango.dev/docs/api-integrations/sellercloud + docs_connect: https://nango.dev/docs/api-integrations/sellercloud/connect + connection_config: + restApiEndpoint: + type: string + title: '' + description: '' + automated: true + credentials: + teamName: + type: string + title: Team Name + description: Your Sellercloud team name + example: myteam + doc_section: '#step-1-finding-your-team-name' + username: + type: string + title: Username + description: Your Sellercloud username + doc_section: '#step-2-identifying-your-credentials' + password: + type: string + title: Password + description: Your Sellercloud password + secret: true + doc_section: '#step-2-identifying-your-credentials' + +sellsy: + display_name: Sellsy + auth_mode: OAUTH2 + categories: + - invoicing + - accounting + - crm + authorization_url: https://login.sellsy.com/oauth2/authorization + token_url: https://login.sellsy.com/oauth2/access-tokens + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.sellsy.com + webhook_routing_script: sellsyWebhookRouting + webhook_user_defined_secret: true + post_connection_script: sellsyPostConnection + docs: https://nango.dev/docs/integrations/all/sellsy + +sellsy-oauth2-cc: + display_name: Sellsy (Client Credentials) + auth_mode: OAUTH2_CC + categories: + - invoicing + - accounting + - crm + token_url: https://login.sellsy.com/oauth2/access-tokens + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.sellsy.com + webhook_routing_script: sellsyWebhookRouting + webhook_user_defined_secret: true + post_connection_script: sellsyPostConnection + docs: https://nango.dev/docs/integrations/all/sellsy-oauth2-cc + docs_connect: https://nango.dev/docs/integrations/all/sellsy-oauth2-cc/connect + credentials: + client_id: + type: string + title: Client ID + description: Your Client ID + client_secret: + type: string + title: Secret shopper + description: Your Secret shopper + +servicem8: + display_name: ServiceM8 + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://go.servicem8.com/oauth/authorize + token_url: https://go.servicem8.com/oauth/access_token + proxy: + base_url: https://api.servicem8.com + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + docs: https://nango.dev/docs/integrations/all/servicem8 + +signnow: + display_name: SignNow + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://app.signnow.com/authorize + token_url: https://api.signnow.com/oauth2/token + disable_pkce: true + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.signnow.com + docs: https://nango.dev/docs/integrations/all/signnow + +signnow-sandbox: + display_name: SignNow (Sandbox) + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://app-eval.signnow.com/authorize + token_url: https://api-eval.signnow.com/oauth2/token + disable_pkce: true + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api-eval.signnow.com + docs: https://nango.dev/docs/integrations/all/signnow-sandbox + +servicenow: + display_name: ServiceNow + categories: + - productivity + - popular + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.service-now.com/oauth_auth.do + token_url: https://${connectionConfig.subdomain}.service-now.com/oauth_token.do + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.service-now.com + docs: https://nango.dev/docs/integrations/all/servicenow + connection_config: + subdomain: + type: string + title: ServiceNow Domain + description: The subdomain of your ServiceNow account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .service-now.com + prefix: https:// + +servicenow-oauth2-cc: + display_name: ServiceNow (Client Credentials) + categories: + - productivity + - ticketing + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.subdomain}.service-now.com/oauth_token.do + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.subdomain}.service-now.com + docs: https://nango.dev/docs/api-integrations/servicenow-oauth2-cc + docs_connect: https://nango.dev/docs/api-integrations/servicenow-oauth2-cc/connect + connection_config: + subdomain: + type: string + title: ServiceNow Domain + description: The subdomain of your ServiceNow account + doc_section: '#step-5-enter-credentials-in-the-connect-ui' + pattern: '^[a-z0-9_-]+$' + example: dev12345 + suffix: .service-now.com + prefix: https:// + credentials: + client_id: + type: string + title: Client ID + description: The Client ID from your ServiceNow OAuth Application + doc_section: '#step-4-create-an-oauth-application' + client_secret: + type: string + title: Client Secret + description: The Client Secret from your ServiceNow OAuth Application + secret: true + doc_section: '#step-4-create-an-oauth-application' + +skio: + display_name: Skio + categories: + - e-commerce + auth_mode: API_KEY + proxy: + headers: + authorization: API ${apiKey} + base_url: https://graphql.skio.com + credentials_verification_script: skioCredentialsVerification + docs: https://nango.dev/docs/integrations/all/skio + docs_connect: https://nango.dev/docs/integrations/all/skio/connect + credentials: + apiKey: + type: string + title: API Token + description: The API Token for your Skio account + format: uuid + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-1-generating-your-api-key' + +sharepoint-online: + display_name: SharePoint Online (v2) + categories: + - storage + - communication + - popular + alias: microsoft + post_connection_script: onedrivePostConnection + docs: https://nango.dev/docs/api-integrations/sharepoint-online + setup_guide_url: https://nango.dev/docs/api-integrations/sharepoint-online/how-to-register-your-own-sharepoint-online-api-oauth-app + +sharepoint-online-oauth2-cc: + display_name: SharePoint Online (Client Credentials V2) + categories: + - storage + - communication + auth_mode: OAUTH2_CC + token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://graph.microsoft.com + docs: https://nango.dev/docs/integrations/all/sharepoint-online-oauth2-cc + docs_connect: https://nango.dev/docs/integrations/all/sharepoint-online-oauth2-cc/connect + connection_config: + tenantId: + type: string + title: Tenant ID + description: The unique identifier for your organization that uses Microsoft services + format: uuid + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-1-finding-your-tenant-id' + order: 1 + +sharepoint-online-v1: + display_name: SharePoint Online (v1) + categories: + - storage + - communication + auth_mode: TWO_STEP + token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/token + body_format: form + token_params: + client_id: ${credentials.clientId} + grant_type: client_credentials + resource: https://${connectionConfig.tenantId}.sharepoint.com + client_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer + client_assertion: ${credentials.assertion} + token_headers: + content-type: application/x-www-form-urlencoded + proxy: + base_url: https://${connectionConfig.tenantName}.sharepoint.com + headers: + accept: application/json;odata=verbose + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/integrations/all/sharepoint-online-v1 + docs_connect: https://nango.dev/docs/integrations/all/sharepoint-online-v1/connect + connection_config: + tenantId: + type: string + title: Tenant ID + description: The unique identifier for your organization that uses Microsoft services + format: uuid + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-1-finding-your-tenant-id' + order: 1 + tenantName: + type: string + title: Tenant Name + description: The initial domain name for your Microsoft services tenant + example: mycompany + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-2-finding-your-tenant-name' + order: 2 + credentials: + clientId: + type: string + title: Client ID + description: Your application Client ID + secret: true + doc_section: '#step-3-finding-your-client-id' + assertion: + type: string + title: Client Assertion + description: Your generated client assertion + secret: true + doc_section: '#step-4-generating-your-client-assertion' + +shipbob-pat: + display_name: ShipBob (Personal Access Token) + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.apiSubdomain}.shipbob.com + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'x-retry-after' + verification: + method: GET + endpoints: + - /2026-01/channel + docs: https://nango.dev/docs/api-integrations/shipbob-pat + docs_connect: https://nango.dev/docs/api-integrations/shipbob-pat/connect + connection_config: + apiSubdomain: + type: string + title: API Subdomain + description: The ShipBob API subdomain of the environment you want to connect to. + enum: + - api + - sandbox-api + doc_section: '#step-2-identify-your-api-subdomain' + credentials: + apiKey: + type: string + title: Personal Access Token + description: Your ShipBob Personal Access Token + example: 6E4647BB**************************806E464161FBB996DD8E87EEA86DB926-1 + pattern: '^[A-F0-9]{64}-\d+$' + doc_section: '#step-1-generate-your-token' + +shippo: + display_name: Shippo + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://api.goshippo.com + headers: + authorization: ShippoToken ${apiKey} + retry: + at: + - 'x-ratelimit-reset' + verification: + method: GET + endpoints: + - /parcel-templates?page=1&results=1 + docs: https://nango.dev/docs/api-integrations/shippo + docs_connect: https://nango.dev/docs/api-integrations/shippo/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Shippo API token (live or test). + pattern: '^shippo_(live|test)_[a-f0-9]+$' + example: shippo_live_e2848d36**************************** + doc_section: '#step-1-get-your-api-token' + +shipstation: + display_name: Shipstation (v1) + categories: + - e-commerce + auth_mode: BASIC + proxy: + base_url: https://ssapi.shipstation.com + retry: + after: + - 'x-rate-limit-reset' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /users + webhook_routing_script: shipstationWebhookRouting + docs: https://nango.dev/docs/integrations/all/shipstation + docs_connect: https://nango.dev/docs/integrations/all/shipstation/connect + credentials: + username: + type: string + title: API Key + description: Your ShipStation API key + example: '0ff30856c5634da1b5ce1953fdaf3dcd' + pattern: '^[a-f0-9]{32}$' + doc_section: '#step-1-finding-shipstation-api-key-and-api-secret' + password: + type: string + title: API Secret + description: Your Shipstation API secret + example: '17f1c62148b044c687f80e1060224a4e' + pattern: '^[a-f0-9]{32}$' + # https://www.shipstation.com/docs/api/requirements/#authentication + # Shipstation is using basic auth with API key and secret + doc_section: '#step-1-finding-shipstation-api-key-and-api-secret' + +shipstation-v2: + display_name: Shipstation (v2) + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://api.shipstation.com + retry: + after: + - 'retry-after' + headers: + api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v2/users?page_size=1 + webhook_routing_script: shipstationWebhookRouting + docs: https://nango.dev/docs/integrations/all/shipstation-v2 + docs_connect: https://nango.dev/docs/integrations/all/shipstation-v2/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Shipstation account + example: zEfcI+rouT0q1fjQWHBOYnsGYiax3rGDjtt3O5UhFIw + pattern: '^[A-Za-z0-9+/]+={0,2}$' + doc_section: '#step-1-generating-your-api-key' + +shopify: + display_name: Shopify (OAuth) + categories: + - e-commerce + - popular + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.myshopify.com/admin/oauth/authorize + token_url: https://${connectionConfig.subdomain}.myshopify.com/admin/oauth/access_token + proxy: + base_url: https://${connectionConfig.subdomain}.myshopify.com + headers: + x-shopify-access-token: ${accessToken} + webhook_routing_script: shopifyWebhookRouting + token_params: + expiring: 1 + docs: https://nango.dev/docs/api-integrations/shopify + setup_guide_url: https://nango.dev/docs/api-integrations/shopify/how-to-register-your-own-shopify-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/shopify/connect + connection_config: + subdomain: + type: string + title: Shopify Domain + description: The subdomain of your Shopify account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .myshopify.com + prefix: https:// + doc_section: '#step-1-finding-your-shopify-domain' + +shopify-cc: + display_name: Shopify (Client Credentials) + categories: + - e-commerce + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.subdomain}.myshopify.com/admin/oauth/access_token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.subdomain}.myshopify.com + headers: + x-shopify-access-token: ${accessToken} + docs: https://nango.dev/docs/api-integrations/shopify-cc + docs_connect: https://nango.dev/docs/api-integrations/shopify-cc/connect + connection_config: + subdomain: + type: string + title: Shopify Store Domain + description: The subdomain of the Shopify store the app is installed in. + pattern: '^[a-z0-9_-]+$' + example: my-store + suffix: .myshopify.com + prefix: https:// + order: 1 + doc_section: '#step-2-find-your-shopify-store-domain' + credentials: + client_id: + type: string + title: Client ID + description: The Client ID for your Shopify app. + doc_section: '#step-1-generating-your-client-credentials' + client_secret: + type: string + title: Client Secret + description: The Client Secret for your Shopify app. + secret: true + doc_section: '#step-1-generating-your-client-credentials' + +shopify-api-key: + display_name: Shopify (API Key) + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.myshopify.com + headers: + x-shopify-access-token: ${apiKey} + content-type: application/json + verification: + method: POST + headers: + content-type: application/json + endpoints: + - /admin/api/2024-10/graphql.json?query=%7B__schema%7Btypes%7Bname%2Ckind%2Cfields%7Bname%7D%7D%7D%7D + webhook_routing_script: shopifyWebhookRouting + webhook_user_defined_secret: true + docs: https://nango.dev/docs/integrations/all/shopify-api-key + docs_connect: https://nango.dev/docs/integrations/all/shopify-api-key/connect + connection_config: + subdomain: + type: string + title: Shopify Domain + description: The subdomain of your Shopify account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .myshopify.com + prefix: https:// + doc_section: '#step-1-finding-your-shopify-domain' + order: 1 + credentials: + apiKey: + type: string + title: API Access Token + description: The API access token generated + example: shpat_***************c03266f + pattern: '^(shpat|shpca|shppa)_[a-f0-9]{32}$' + doc_section: '#step-2-generating-your-api-access-token' + +shopify-partner: + display_name: Shopify Partner + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://partners.shopify.com/${connectionConfig.partnerId}/api/ + headers: + x-shopify-access-token: ${apiKey} + content-type: application/json + verification: + method: POST + headers: + content-type: application/json + endpoints: + - 2026-04/graphql.json + docs: https://nango.dev/docs/integrations/all/shopify-partner + docs_connect: https://nango.dev/docs/integrations/all/shopify-partner/connect + credentials: + apiKey: + type: string + title: Partner Access Token + description: The access token for your Shopify Partner account + connection_config: + partnerId: + type: string + title: Partner ID + description: Your Shopify Partner ID + +shopify-scim: + display_name: Shopify (SCIM API) + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://shopifyscim.com/scim + headers: + authorization: Bearer ${apiKey} + accept: application/json + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/Users + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/shopify-scim + docs_connect: https://nango.dev/docs/integrations/all/shopify-scim/connect + credentials: + apiKey: + type: string + title: SCIM API Token + description: The SCIM API token generated from your Shopify organization settings. + doc_section: '#step-1-generating-your-scim-api-token' + +shopvox: + display_name: ShopVox + categories: + - other + auth_mode: TWO_STEP + body_format: json + token_url: https://api.shopvox.com/v1/login + token_params: + user: ${credentials.email} + password: ${credentials.password} + token_headers: + content-type: application/json + token_response: + token: authToken + proxy: + base_url: https://api.shopvox.com/ + query: + authToken: ${accessToken} + account_id: ${credentials.raw.accountID} + docs: https://nango.dev/docs/api-integrations/shopvox + docs_connect: https://nango.dev/docs/api-integrations/shopvox/connect + credentials: + email: + type: string + title: Email + format: email + description: Your ShopVox login email. + doc_section: '#step-1-finding-your-credentials' + password: + type: string + title: Password + description: Your ShopVox login password. + secret: true + doc_section: '#step-1-finding-your-credentials' + +shopware: + display_name: Shopware (Admin API) + categories: + - e-commerce + auth_mode: OAUTH2_CC + body_format: json + token_url: https://${connectionConfig.shopwareUrl}/api/oauth/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.shopwareUrl}/api + docs: https://nango.dev/docs/api-integrations/shopware + docs_connect: https://nango.dev/docs/api-integrations/shopware/connect + credentials: + client_id: + type: string + title: Access key ID + description: The Access key ID of yout integration. + doc_section: '#step-2-create-a-shopware-integration' + client_secret: + type: string + title: Secret access key + description: The Secret access key of your integration. + secret: true + doc_section: '#step-2-create-a-shopware-integration' + connection_config: + shopwareUrl: + type: string + title: Shopware URL + description: The hostname of your Shopware instance. + example: myshop.example.com + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-1-find-your-shopware-url' + +shopworks: + display_name: ShopWorks + categories: + - other + auth_mode: TWO_STEP + body_format: json + token_url: https://${connectionConfig.hostname}/signin + token_params: + username: ${credentials.username} + password: ${credentials.password} + token_headers: + content-type: application/json + token_response: + token: id_token + token_expires_in_ms: 3600000 + proxy: + base_url: https://${connectionConfig.hostname} + headers: + authorization: ${accessToken} + docs: https://nango.dev/docs/api-integrations/shopworks + docs_connect: https://nango.dev/docs/api-integrations/shopworks/connect + connection_config: + hostname: + type: string + title: Hostname + prefix: https:// + suffix: /signin + description: The hostname of the API you want to connect to. + example: manageordersapi.com/onsite + doc_section: '#step-1-find-your-hostname' + credentials: + username: + type: string + title: Username + description: The username for your ShopWorks account. + doc_section: '#step-2-find-your-credentials' + password: + type: string + title: Password + secret: true + description: The password for your ShopWorks account. + doc_section: '#step-2-find-your-credentials' + +slab: + display_name: Slab + categories: + - productivity + - knowledge-base + auth_mode: API_KEY + proxy: + base_url: https://api.slab.com + headers: + authorization: ${apiKey} + content-type: application/json + docs: https://nango.dev/docs/api-integrations/slab + docs_connect: https://nango.dev/docs/api-integrations/slab/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Slab API token + doc_section: '#step-1-generating-your-slab-api-token' + +shortcut: + display_name: Shortcut + categories: + - dev-tools + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.app.shortcut.com + headers: + shortcut-token: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v3/member + docs: https://nango.dev/docs/integrations/all/shortcut + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Shortcut account + +simpro: + display_name: Simpro + categories: + - productivity + - invoicing + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.build}.simprosuite.com/oauth2/login + token_url: https://${connectionConfig.build}.simprosuite.com/oauth2/token + proxy: + base_url: https://${connectionConfig.build}.simprosuite.com + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + docs: https://nango.dev/docs/api-integrations/simpro + docs_connect: https://nango.dev/docs/api-integrations/simpro/connect + connection_config: + build: + type: string + title: Simpro Build Name + description: The subdomain part of your Simpro URL. + pattern: '^[a-z0-9_-]+$' + example: yourcompany + suffix: .simprosuite.com + prefix: https:// + doc_section: '#step-1-find-your-simpro-build-name' + +slack: + display_name: Slack + categories: + - popular + - productivity + auth_mode: OAUTH2 + authorization_url: https://slack.com/oauth/v2/authorize + scope_separator: ',' + alternate_access_token_response_path: authed_user + token_url: https://slack.com/api/oauth.v2.access + disable_pkce: true + token_response_metadata: + - incoming_webhook.url + - incoming_webhook.channel + - incoming_webhook.channel_id + - bot_user_id + - team.id + proxy: + base_url: https://slack.com/api + retry: + after: + - 'retry-after' + paginate: + type: cursor + cursor_path_in_response: response_metadata.next_cursor + cursor_name_in_request: cursor + limit_name_in_request: limit + webhook_routing_script: slackWebhookRouting + docs: https://nango.dev/docs/api-integrations/slack + setup_guide_url: https://nango.dev/docs/api-integrations/slack/how-to-register-your-own-slack-api-oauth-app + +slack-mcp: + display_name: Slack (MCP) + categories: + - popular + - productivity + - communication + - mcp + auth_mode: MCP_OAUTH2 + client_registration: static + authorization_url: https://slack.com/oauth/v2_user/authorize + token_url: https://slack.com/api/oauth.v2.user.access + scope_separator: ',' + alternate_access_token_response_path: authed_user + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://mcp.slack.com + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/slack-mcp + setup_guide_url: https://nango.dev/docs/api-integrations/slack-mcp/how-to-register-your-own-slack-mcp-oauth-app + +smartlead-ai: + display_name: Smartlead.ai + categories: + - communication + - marketing + auth_mode: API_KEY + proxy: + base_url: https://server.smartlead.ai/api + retry: + after: + - x-ratelimit-reset + query: + api_key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/client + docs: https://nango.dev/docs/integrations/all/smartlead-ai + docs_connect: https://nango.dev/docs/integrations/all/smartlead-ai/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Smartlead.ai account + pattern: '^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}_[a-zA-Z0-9]+$' + example: 12345678-1234-1234-1234-123456789012_abcdefg + doc_section: '#step-1-generating-your-api-key' + +sophos-central: + display_name: Sophos Central + categories: + - dev-tools + auth_mode: OAUTH2_CC + token_url: https://id.sophos.com/api/v2/oauth2/token + token_params: + grant_type: client_credentials + scope: token + body_format: form + proxy: + base_url: ${connectionConfig.dataRegion} + headers: + x-tenant-id: ${connectionConfig.tenantId} + post_connection_script: sophosCentralPostConnection + docs: https://nango.dev/docs/api-integrations/sophos-central + docs_connect: https://nango.dev/docs/api-integrations/sophos-central/connect + connection_config: + dataRegion: + type: string + title: '' + description: '' + automated: true + tenantId: + type: string + title: '' + description: '' + automated: true + +smartrecruiters-api-key: + display_name: Smartrecruiters + categories: + - ats + auth_mode: API_KEY + proxy: + base_url: https://api.smartrecruiters.com + headers: + x-smarttoken: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /feed/publications + docs: https://nango.dev/docs/integrations/all/smartrecruiters-api-key + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Smartrecruiters account + +smartsheet: + display_name: Smartsheet + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.app_host}/b/authorize || https://app.smartsheet.com/b/authorize + token_url: https://api.${connectionConfig.domain}/2.0/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.${connectionConfig.domain} + docs: https://nango.dev/docs/api-integrations/smartsheet + docs_connect: https://nango.dev/docs/api-integrations/smartsheet/connect + setup_guide_url: https://nango.dev/docs/api-integrations/smartsheet/how-to-register-your-own-smartsheet-api-oauth-app + connection_config: + app_host: + type: string + title: App Host + description: The app host used for authorization. + example: app.smartsheet.com + optional: true + pattern: '^(app\.smartsheet\.com|app\.test\.smartsheet\.com)$' + domain: + type: string + title: Domain + description: The domain where your account is hosted. + prefix: https://api. + order: 1 + enum: + - smartsheet.com + - smartsheet.eu + - smartsheet.au + - smartsheetgov.com + - test.smartsheet.com + +smugmug: + display_name: Smugmug + categories: + - storage + auth_mode: OAUTH1 + request_url: https://api.smugmug.com/services/oauth/1.0a/getRequestToken + authorization_url: https://api.smugmug.com/services/oauth/1.0a/authorize + token_url: https://api.smugmug.com/services/oauth/1.0a/getAccessToken + scope_separator: ',' + signature_method: 'PLAINTEXT' + proxy: + base_url: https://www.smugmug.com + docs: https://nango.dev/docs/integrations/all/smugmug + +snapchat: + display_name: Snapchat (Ads API) + auth_mode: OAUTH2 + categories: + - video + - social + authorization_url: https://accounts.snapchat.com/login/oauth2/authorize + disable_pkce: true + token_url: https://accounts.snapchat.com/login/oauth2/access_token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://adsapi.snapchat.com + docs: https://nango.dev/docs/integrations/all/snapchat + +snowflake: + display_name: Snowflake + categories: + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.snowflake_account_url}/oauth/authorize + token_url: https://${connectionConfig.snowflake_account_url}/oauth/token-request + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.snowflake_account_url} + post_connection_script: snowflakePostConnection + docs: https://nango.dev/docs/api-integrations/snowflake + docs_connect: https://nango.dev/docs/api-integrations/snowflake/connect + connection_config: + snowflake_account_url: + type: string + title: Domain + description: The domain of your Snowflake account. + format: hostname + example: myorg-myaccount.snowflakecomputing.com + prefix: https:// + +snowflake-jwt: + display_name: Snowflake (JWT) + categories: + - dev-tools + auth_mode: JWT + signature: + protocol: RSA + token: + signing_key: ${credentials.privateKey} + expires_in_ms: 3600000 + header: + alg: RS256 + typ: JWT + payload: + iss: ${credentials.accountIdentifier}.${credentials.userName}.${fingerprint(${credentials.privateKey})} + sub: ${credentials.accountIdentifier}.${credentials.userName} + proxy: + headers: + accept: application/json + authorization: Bearer ${accessToken} + x-snowflake-authorization-token-type: KEYPAIR_JWT + base_url: https://${connectionConfig.subdomain}.snowflakecomputing.com + verification: + method: POST + endpoints: + - /api/v2/statements + data: { 'statement': 'SELECT CURRENT_TIMESTAMP' } + headers: + x-snowflake-authorization-token-type: KEYPAIR_JWT + content-type: application/json + docs: https://nango.dev/docs/integrations/all/snowflake-jwt + docs_connect: https://nango.dev/docs/integrations/all/snowflake-jwt/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain for your Snowflake instance + example: KXOPMLU-RE00572 + order: 1 + doc_section: '#step-1-finding-your-subdomain' + credentials: + accountIdentifier: + type: string + title: Account Identifier + description: The unique identifier for your Snowflake account. + example: KXOPMLU-RE00572 + doc_section: '#step-2-finding-your-account-identifier' + userName: + type: string + title: User Name + description: The username for your Snowflake account used for authentication + example: MYUSER + doc_section: '#step-3-finding-your-user-name' + privateKey: + type: string + title: Private Key + description: The private key associated with your Snowflake account for JWT authentication + example: -----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n-----END PRIVATE KEY----- + pattern: '^-----BEGIN PRIVATE KEY-----\s*([A-Za-z0-9+/=\s]+)\s*-----END PRIVATE KEY-----$' + secret: true + doc_section: '#step-4-generating-your-private-key' + +splitwise: + display_name: Splitwise + categories: + - payment + - social + auth_mode: OAUTH2 + authorization_url: https://secure.splitwise.com/oauth/authorize + token_url: https://secure.splitwise.com/oauth/token + proxy: + base_url: https://secure.splitwise.com + docs: https://nango.dev/docs/integrations/all/splitwise + +spotify: + display_name: Spotify (OAuth) + categories: + - other + auth_mode: OAUTH2 + authorization_url: https://accounts.spotify.com/authorize + token_url: https://accounts.spotify.com/api/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.spotify.com + docs: https://nango.dev/docs/integrations/all/spotify + +spotify-oauth2-cc: + display_name: Spotify (Client Credentials) + categories: + - other + auth_mode: OAUTH2_CC + token_url: https://accounts.spotify.com/api/token + token_request_auth_method: basic + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.spotify.com + docs: https://nango.dev/docs/integrations/all/spotify-oauth2-cc + +squarespace: + display_name: Squarespace + categories: + - dev-tools + - design + auth_mode: OAUTH2 + authorization_url: https://login.squarespace.com/api/1/login/oauth/provider/authorize + token_url: https://login.squarespace.com/api/1/login/oauth/provider/tokens + token_request_auth_method: basic + scope_separator: ',' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.squarespace.com + headers: + user-agent: ${connectionConfig.customappDescription} + docs: https://nango.dev/docs/integrations/all/squarespace + connection_config: + customappDescription: + type: string + title: User Agent + description: The user agent of your custom app + +squareup: + display_name: Squareup + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://connect.squareup.com/oauth2/authorize + token_url: https://connect.squareup.com/oauth2/token + disable_pkce: true + decode_url: true + authorization_params: + response_type: code + session: false + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://connect.squareup.com + docs: https://nango.dev/docs/api-integrations/squareup + setup_guide_url: https://nango.dev/docs/api-integrations/squareup/how-to-register-your-own-squareup-oauth-app + +squareup-sandbox: + display_name: Squareup (Sandbox) + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://connect.squareupsandbox.com/oauth2/authorize + token_url: https://connect.squareupsandbox.com/oauth2/token + disable_pkce: true + authorization_params: + response_type: code + session: false + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://connect.squareupsandbox.com + docs: https://nango.dev/docs/api-integrations/squareup-sandbox + setup_guide_url: https://nango.dev/docs/api-integrations/squareup-sandbox/how-to-register-your-own-squareup-sandbox-oauth-app + +stackexchange: + display_name: Stack Exchange + categories: + - knowledge-base + - support + auth_mode: OAUTH2 + authorization_url: https://stackoverflow.com/oauth + token_url: https://stackoverflow.com/oauth/access_token/json + default_scopes: + - no_expiry + proxy: + base_url: https://api.stackexchange.com + docs: https://nango.dev/docs/integrations/all/stackexchange + +statamic: + display_name: Statamic + categories: + - cms + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.baseUrl} + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/api-integrations/statamic + docs_connect: https://nango.dev/docs/api-integrations/statamic/connect + credentials: + apiKey: + type: string + title: API token + description: The value of STATAMIC_API_AUTH_TOKEN in your Statamic .env file. + doc_section: '#step-1-enable-the-rest-api' + connection_config: + baseUrl: + type: string + title: Base URL + description: The hostname of your Statamic site. + example: mysite.example.com + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-2-find-your-base-url' + +statista: + display_name: Statista + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://api.statista.ai + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v1/statistics?q=* + docs: https://nango.dev/docs/integrations/all/statista + docs_connect: https://nango.dev/docs/integrations/all/statista/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Statista account + example: c5c28261f9ade4e34891ccf761491b94 + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-1-finding-your-api-key' + +stay-ai: + display_name: Stay AI + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://api.retextion.com/api + headers: + x-retextion-access-token: ${apiKey} + docs: https://nango.dev/docs/api-integrations/stay-ai + docs_connect: https://nango.dev/docs/api-integrations/stay-ai/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Stay AI API key. + example: 7k9***f-***da3e-***hjtb-***22cy + pattern: '^[a-z0-9]{7}-[a-z0-9]{7}-[a-z0-9]{7}-[a-z0-9]{7}$' + doc_section: '#step-1-create-a-new-api-key' + +stitch-mcp: + display_name: Stitch (MCP) + categories: + - design + - mcp + alias: google + default_scopes: + - https://www.googleapis.com/auth/cloud-platform + proxy: + base_url: https://stitch.googleapis.com + headers: + x-goog-user-project: ${connectionConfig.project_id} + connection_config: + project_id: + type: string + title: '' + description: '' + hidden: true + docs: https://nango.dev/docs/api-integrations/stitch-mcp + setup_guide_url: https://nango.dev/docs/api-integrations/stitch-mcp/how-to-register-your-own-stitch-mcp-api-oauth-app + +store-census: + display_name: StoreCensus + categories: + - e-commerce + - crm + auth_mode: API_KEY + proxy: + base_url: https://www.storecensus.com + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'retry-after' + verification: + method: GET + endpoints: + - /api/v1/apps?page=1&pageSize=1 + docs: https://nango.dev/docs/api-integrations/store-census + docs_connect: https://nango.dev/docs/api-integrations/store-census/connect + credentials: + apiKey: + type: string + title: API Key + description: Your StoreCensus API key. + doc_section: '#step-1-get-your-api-key' + +store-leads: + display_name: Store Leads + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://storeleads.app/json/api + headers: + authorization: Bearer ${apiKey} + retry: + at: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/store-leads + docs_connect: https://nango.dev/docs/api-integrations/store-leads/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Store Leads API key. + doc_section: '#step-1-generate-your-api-key' + pattern: '^[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{8}$' + example: a174****-****-****-****-****c6ee + +strava: + display_name: Strava (Mobile) + categories: + - social + - sports + auth_mode: OAUTH2 + authorization_url: https://www.strava.com/oauth/mobile/authorize + token_url: https://www.strava.com/api/v3/oauth/token + scope_separator: ',' + authorization_params: + response_type: code + approval_prompt: auto + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://www.strava.com + docs: https://nango.dev/docs/integrations/all/strava + +strava-web: + display_name: Strava (Web) + categories: + - social + - sports + auth_mode: OAUTH2 + authorization_url: https://www.strava.com/oauth/authorize + token_url: https://www.strava.com/api/v3/oauth/token + scope_separator: ',' + authorization_params: + response_type: code + approval_prompt: force + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://www.strava.com + docs: https://nango.dev/docs/integrations/all/strava-web + +streak: + display_name: Streak + categories: + - crm + auth_mode: BASIC + proxy: + base_url: https://api.streak.com/api + verification: + method: GET + endpoints: + - /v1/users/me + headers: + content-type: application/json + accept: application/json + webhook_routing_script: streakWebhookRouting + docs: https://nango.dev/docs/api-integrations/streak + docs_connect: https://nango.dev/docs/api-integrations/streak/connect + credentials: + username: + type: string + title: API Key + description: The API Key for your Streak account + example: 'strk_7SGgswz9ZJrNZp7iJmoAFjwdaym1' + pattern: '^strk_[A-Za-z0-9]+$' + doc_section: '#step-1-generating-your-api-key' + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +stripe: + display_name: Stripe Connect + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://connect.stripe.com/oauth/authorize + token_url: https://connect.stripe.com/oauth/token + proxy: + base_url: https://api.stripe.com + docs: https://nango.dev/docs/api-integrations/stripe + setup_guide_url: https://nango.dev/docs/api-integrations/stripe/how-to-register-your-own-stripe-api-oauth-app + +stripe-express: + display_name: Stripe Express + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://connect.stripe.com/express/oauth/authorize + token_url: https://connect.stripe.com/oauth/token + token_response_metadata: + - stripe_user_id + proxy: + base_url: https://api.stripe.com + docs: https://nango.dev/docs/integrations/all/stripe-express + +stripe-app: + display_name: Stripe App + categories: + - payment + - popular + auth_mode: OAUTH2 + authorization_url: https://marketplace.stripe.com/oauth/v2/authorize + token_url: https://api.stripe.com/v1/oauth/token + disable_pkce: true + proxy: + base_url: https://api.stripe.com + refresh_params: + grant_type: refresh_token + docs: https://nango.dev/docs/integrations/all/stripe-app + +stripe-app-sandbox: + display_name: Stripe App (Sandbox) + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://marketplace.stripe.com/oauth/v2/${connectionConfig.appDomain}/authorize + token_url: https://api.stripe.com/v1/oauth/token + disable_pkce: true + proxy: + base_url: https://api.stripe.com + refresh_params: + grant_type: refresh_token + docs: https://nango.dev/docs/integrations/all/stripe-app-sandbox + docs_connect: https://nango.dev/docs/integrations/all/stripe-app-sandbox/connect + connection_config: + appDomain: + type: string + title: App Domain + description: The unique identifier Stripe assigns to your app instance + doc_section: '#step-1-finding-your-app-domain' + +stripe-api-key: + display_name: Stripe (API Key) + categories: + - payment + auth_mode: BASIC + proxy: + base_url: https://api.stripe.com + headers: + stripe-context: ${connectionConfig.context} + docs: https://nango.dev/docs/api-integrations/stripe-api-key + docs_connect: https://nango.dev/docs/api-integrations/stripe-api-key/connect + credentials: + username: + type: string + title: Restricted API Key + description: Your Stripe restricted API Key + secret: true + example: rk_live_51On1GfAemfaBCd0eHq***************BV5007KeuAVcO + pattern: '^rk_[a-z]+_[A-Za-z0-9]{8}[A-Za-z0-9]+([A-Za-z0-9]{8})$' + doc_section: '#step-1-generating-your-stripe-restricted-api-key' + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + connection_config: + context: + type: string + title: Stripe Context + description: The Stripe account context + optional: true + example: acct_1aTnTtAAB0hHJ26p + pattern: '^acct_[A-Za-z0-9]{16}(\/acct_[A-Za-z0-9]{16})?$' + doc_section: '#step-2-finding-your-stripe-context' + +supabase: + display_name: Supabase + categories: + - dev-tools + - storage + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.projectUrl} + headers: + authorization: Bearer ${apiKey} + apikey: ${apiKey} + docs: https://nango.dev/docs/api-integrations/supabase + docs_connect: https://nango.dev/docs/api-integrations/supabase/connect + connection_config: + projectUrl: + type: string + title: Project URL + description: The Supabase project url you want to connect to. + example: project.supabase.co + format: hostname + prefix: https:// + doc_section: '#step-1-find-your-project-url' + credentials: + apiKey: + type: string + title: Secret Key + description: The secret key from your Supabase project. + example: sb_secret_*******************************hm + pattern: '^sb_secret_[A-Za-z0-9_]+$' + doc_section: '#step-2-finding-your-secret-key' + +supabase-mcp: + display_name: Supabase (MCP) + categories: + - dev-tools + - mcp + auth_mode: API_KEY + proxy: + base_url: https://mcp.supabase.com + headers: + authorization: Bearer ${apiKey} + content-type: application/json + verification: + method: POST + headers: + content-type: application/json + accept: application/json,text/event-stream + endpoints: + - /mcp?project_ref=${connectionConfig.projectRef} + data: + { + 'jsonrpc': '2.0', + 'id': 1, + 'method': 'initialize', + 'params': { 'protocolVersion': '2024-11-05', 'capabilities': {}, 'clientInfo': { 'name': 'nango-client', 'version': '1.0.0' } } + } + docs: https://nango.dev/docs/api-integrations/supabase-mcp + docs_connect: https://nango.dev/docs/api-integrations/supabase-mcp/connect + connection_config: + projectRef: + type: string + title: Project reference + description: Your Supabase project reference ID. + example: bvzzcafzoysezumrdvif + pattern: '^[a-z0-9]{20}$' + doc_section: '#step-1-finding-your-project-reference' + credentials: + apiKey: + type: string + title: Personal Access Token + description: Your Supabase account personal access token. + example: sbp_*******************************23d + pattern: '^sbp_[A-Za-z0-9]{40}$' + doc_section: '#step-2-obtaining-your-personal-access-token' + +supabase-mcp-oauth: + display_name: Supabase (MCP OAuth) + categories: + - dev-tools + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + registration_url: https://api.supabase.com/platform/oauth/apps/register + authorization_url: https://api.supabase.com/v1/oauth/authorize + token_url: https://api.supabase.com/v1/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://mcp.supabase.com + headers: + accept: application/json,text/event-stream + connection_config: + projectRef: ${connectionConfig.projectRef} + docs: https://nango.dev/docs/api-integrations/supabase-mcp-oauth + docs_connect: https://nango.dev/docs/api-integrations/supabase-mcp-oauth/connect + connection_config: + projectRef: + type: string + title: Project Reference + description: Your Supabase project reference ID. + example: bvzzcafzoysezumrdvif + pattern: '^[a-z0-9]{20}$' + doc_section: '#step-1-finding-your-project-reference' + +superhuman-mcp: + display_name: Superhuman (MCP) + categories: + - communication + - productivity + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://mcp.auth.mail.superhuman.com/oauth2/authorize + token_url: https://mcp.auth.mail.superhuman.com/oauth2/token + registration_url: https://mcp.auth.mail.superhuman.com/oauth2/register + default_scopes: + - offline_access + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://mcp.mail.superhuman.com + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/superhuman-mcp + +surecontact: + display_name: SureContact + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.surecontact.com + headers: + x-api-key: ${apiKey} + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/api-integrations/surecontact + docs_connect: https://nango.dev/docs/api-integrations/surecontact/connect + credentials: + apiKey: + type: string + title: API Key + description: Your SureContact API key. + example: jWkZ3QYFe7**********************************************qlp + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-1-create-an-api-key' + +survey-monkey: + display_name: SurveyMonkey + categories: + - surveys + auth_mode: OAUTH2 + authorization_url: https://api.surveymonkey.com/oauth/authorize + token_url: https://api.surveymonkey.com/oauth/token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://api.surveymonkey.com + docs: https://nango.dev/docs/integrations/all/survey-monkey + +swoogo: + display_name: Swoogo + categories: + - marketing + auth_mode: OAUTH2_CC + token_url: https://api.swoogo.com/api/v1/oauth2/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.swoogo.com + docs: https://nango.dev/docs/api-integrations/swoogo + docs_connect: https://nango.dev/docs/api-integrations/swoogo/connect + credentials: + client_id: + type: string + title: API Key + description: Your Swoogo API key. + doc_section: '#step-1-generate-your-api-credentials' + client_secret: + type: string + title: API Secret + description: Your Swoogo API secret. + secret: true + doc_section: '#step-1-generate-your-api-credentials' + +tailscale: + display_name: Tailscale (OAuth) + auth_mode: TWO_STEP + categories: + - dev-tools + - productivity + token_url: https://api.tailscale.com/api/v2/oauth/token + token_params: + client_id: ${credentials.clientId} + client_secret: ${credentials.clientSecret} + body_format: form + proxy: + base_url: https://api.tailscale.com/api + connection_config: + organizationName: ${connectionConfig.organizationName} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/integrations/all/tailscale + docs_connect: https://nango.dev/docs/integrations/all/tailscale/connect + connection_config: + organizationName: + type: string + title: Organization Name + description: Your Tailscale organization name + example: example.com + order: 1 + doc_section: '#step-1-finding-your-organization-name' + credentials: + clientId: + type: string + title: Client ID + description: Your OAuth Client ID + example: kcLBRFmtYZ11CNTRL + pattern: '^[A-Za-z0-9]+CNTRL$' + doc_section: '#step-2-generating-your-oauth-client-credentials' + clientSecret: + type: string + title: Client secret + description: Your OAuth Client secret + secret: true + example: 'tskey-client-kdC27MPR3X11CNTRL-tjtxjop8mdawckVitWkNdaBaNRtZ48GN' + pattern: '^tskey-client-[A-Za-z0-9]+CNTRL-[A-Za-z0-9]+$' + doc_section: '#step-2-generating-your-oauth-client-credentials' + +tailscale-api-key: + display_name: Tailscale (API Key) + categories: + - dev-tools + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.tailscale.com/api + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v2/tailnet/${connectionConfig.organizationName}/users + docs: https://nango.dev/docs/integrations/all/tailscale-api-key + docs_connect: https://nango.dev/docs/integrations/all/tailscale-api-key/connect + connection_config: + organizationName: + type: string + title: Organization Name + description: Your Tailscale organization name + example: example.com + order: 1 + doc_section: '#step-1-finding-your-organization-name' + credentials: + apiKey: + type: string + title: API Access Token + description: The API Access Token for your Tailscale account + example: tskey-api-k7Hpb9Lcv611CNTRL-WJ9YG52LqXJXY9oJ7RtmXJdzWkdRMgBG + pattern: '^tskey-api-[A-Za-z0-9]+CNTRL-[A-Za-z0-9]+$' + doc_section: '#step-2-generating-an-api-access-token' + +talentlms: + display_name: TalentLMS + categories: + - other + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.talentlms.com + headers: + x-api-key: ${apiKey} + x-api-version: ${connectionConfig.apiVersion} + verification: + method: GET + endpoints: + - /api/v2/users?page[size]=1 + docs: https://nango.dev/docs/api-integrations/talentlms + docs_connect: https://nango.dev/docs/api-integrations/talentlms/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of your TalentLMS account. + example: mycompany + pattern: '^[a-z0-9-]+$' + suffix: .talentlms.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-subdomain' + apiVersion: + type: string + title: '' + description: '' + default_value: '2025-01-01' + hidden: true + credentials: + apiKey: + type: string + title: API Key + description: Your TalentLMS API key. + doc_section: '#step-2-finding-your-api-key' + +tally: + display_name: Tally + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.tally.so + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /forms?limit=1 + docs: https://nango.dev/docs/api-integrations/tally + docs_connect: https://nango.dev/docs/api-integrations/tally/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Tally API key. + pattern: '^tly-[A-Za-z0-9]{32}$' + example: tly-84m**************************56Y + doc_section: '#step-1-create-an-api-key' + +tapclicks: + display_name: TapClicks + auth_mode: OAUTH2_CC + categories: + - marketing + - analytics + token_url: https://api.tapclicks.com/oauth/accesstoken + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.tapclicks.com/v2 + docs: https://nango.dev/docs/integrations/all/tapclicks + docs_connect: https://nango.dev/docs/integrations/all/tapclicks/connect + +tableau: + display_name: Tableau (PAT) + categories: + - analytics + auth_mode: TWO_STEP + token_url: https://${connectionConfig.hostname}/api/${connectionConfig.version}/auth/signin + proxy: + headers: + accept: application/json + content-type: application/json + x-tableau-auth: ${accessToken} + base_url: https://${connectionConfig.hostname}/api/${connectionConfig.version} + token_params: + credentials: + personalAccessTokenName: ${credentials.pat} + personalAccessTokenSecret: ${credentials.secret} + site: + contentUrl: ${credentials.contentUrl} + token_headers: + content-type: application/json + accept: application/json + token_response: + token: credentials.token + token_expiration: credentials.estimatedTimeToExpiration + token_expiration_strategy: expireAt + docs: https://nango.dev/docs/integrations/all/tableau + docs_connect: https://nango.dev/docs/integrations/all/tableau/connect + credentials: + pat: + type: string + title: Personal Access Token + description: Your Personal Access Token + doc_section: '#step-2-generating-your-personal-access-token' + secret: + type: string + title: Personal Access Token Secret + description: Your Personal Access Token Secret + secret: true + doc_section: '#step-2-generating-your-personal-access-token' + contentUrl: + type: string + title: Content Url + optional: true + example: test-eaec4a3fe2 + doc_section: '#step-5-finding-your-content-url' + description: Your content URL + connection_config: + hostname: + type: string + title: HostName + description: The domain of your Tableau instance + format: hostname + order: 1 + example: dub01.online.tableau.com + doc_section: '#step-3-finding-your-hostname' + prefix: https:// + version: + type: string + title: API Version + order: 2 + example: '3.26' + doc_section: '#step-4-finding-your-api-version' + description: The version of the Tableau API to use + +tanium: + display_name: Tanium + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.hostname}/api + headers: + session: ${apiKey} + content-type: application/json + verification: + method: GET + endpoints: + - /v2/session/current + docs: https://nango.dev/docs/api-integrations/tanium + docs_connect: https://nango.dev/docs/api-integrations/tanium/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Tanium API token. + doc_section: '#step-1-generate-an-api-token' + connection_config: + hostname: + type: string + title: Hostname + description: Your Tanium Cloud API hostname. + example: acme-api.cloud.tanium.com + format: hostname + prefix: https:// + doc_section: '#step-2-find-your-hostname' + order: 1 + +teamtailor: + display_name: Teamtailor + categories: + - ats + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.extension}.teamtailor.com + retry: + after: + - 'x-rate-limit-reset' + headers: + authorization: Token token=${apiKey} + x-api-version: '20210218' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/users + docs: https://nango.dev/docs/integrations/all/teamtailor + connection_config: + extension: + type: string + title: Teamtailor Domain + description: The subdomain of your Teamtailor instance + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .teamtailor.com + prefix: https:// + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Teamtailor account + +teamleader: + display_name: Teamleader Focus + categories: + - invoicing + - crm + auth_mode: OAUTH2 + authorization_url: https://focus.teamleader.eu/oauth2/authorize + token_url: https://focus.teamleader.eu/oauth2/access_token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + retry: + at: + - 'x-ratelimit-reset' + base_url: https://api.focus.teamleader.eu + docs: https://nango.dev/docs/integrations/all/teamleader + +teamwork: + display_name: Teamwork + categories: + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://www.teamwork.com/launchpad/login + token_url: https://www.teamwork.com/launchpad/v1/token.json + token_response_metadata: + - installation.apiEndPoint + proxy: + base_url: ${connectionConfig.installation.apiEndPoint} + docs: https://nango.dev/docs/integrations/all/teamwork + +telegram: + display_name: Telegram + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://api.telegram.org/bot${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /getMe + docs: https://nango.dev/docs/api-integrations/telegram + docs_connect: https://nango.dev/docs/api-integrations/telegram/connect + credentials: + apiKey: + type: string + title: Bot Token + description: Your Telegram Bot token from @BotFather. + example: 1234567890:ABCdefGHIjklMNOpqrSTUvwxYZ1234567 + pattern: '^[0-9]+:[a-zA-Z0-9_-]+$' + doc_section: '#step-1-creating-your-telegram-bot' + +tempo: + display_name: Tempo + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://api.tempo.io/oauth/authorize/redirect + token_url: https://api.tempo.io/oauth/token/ + disable_pkce: true + authorization_params: + jira_url: https://${connectionConfig.jiraSubdomain}.atlassian.net + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.tempo.io + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/tempo + setup_guide_url: https://nango.dev/docs/api-integrations/tempo/how-to-register-your-own-tempo-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/tempo/connect + connection_config: + jiraSubdomain: + type: string + title: Jira Cloud Subdomain + description: The subdomain of your Jira Cloud instance. + example: acme + pattern: '^[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?$' + doc_section: '#step-1-find-your-jira-cloud-subdomain' + order: 2 + subdomain: + type: string + title: API Subdomain + description: The subdomain of the Tempo API. + enum: + - api + - api.eu + - api.us + doc_section: '#step-2-find-your-api-subdomain' + order: 1 + +the-swarm: + display_name: The Swarm + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://bee.theswarm.com + headers: + x-api-key: ${apiKey} + verification: + method: POST + endpoints: + - /v2/profiles/search + headers: + content-type: application/json + data: + query: + match_all: {} + limit: 1 + docs: https://nango.dev/docs/api-integrations/the-swarm + docs_connect: https://nango.dev/docs/api-integrations/the-swarm/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Swarm API key from Team Settings. + example: aB3cD9eF************************wX6yZ2 + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-1-get-your-api-key' + +theirstack: + display_name: TheirStack + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.theirstack.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v0/billing/credit-balance + docs: https://nango.dev/docs/api-integrations/theirstack + docs_connect: https://nango.dev/docs/api-integrations/theirstack/connect + credentials: + apiKey: + type: string + title: API Key + description: Your TheirStack API key. + example: eyJhbGci*******.eyJ2ZX********.kWB5******** + pattern: '^eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' + doc_section: '#step-1-generate-your-api-key' + +thomson-reuters-legal-tracker: + display_name: Thomson Reuters Legal Tracker + categories: + - legal + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.hostname}/onepass/oauth2/token + token_headers: + content-type: application/x-www-form-urlencoded + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.hostname}/legal-tracker + docs: https://nango.dev/docs/api-integrations/thomson-reuters-legal-tracker + docs_connect: https://nango.dev/docs/api-integrations/thomson-reuters-legal-tracker/connect + connection_config: + hostname: + type: string + title: Hostname + description: The regional API hostname for your Thomson Reuters account. + enum: + - api.thomsonreuters.com + - api.thomsonreuters.co.uk + - api.thomsonreuters.ca + - api.thomsonreuters.au + order: 1 + credentials: + client_id: + type: string + title: Client ID + description: The client ID from the App Management. + doc_section: '#step-1-obtain-your-client-credentials' + client_secret: + type: string + title: Client Secret + description: The client secret from the App Management. + secret: true + doc_section: '#step-1-obtain-your-client-credentials' + +thomson-reuters-legal-tracker-tr-account: + display_name: Thomson Reuters Legal Tracker (TR Account) + alias: thomson-reuters-legal-tracker + categories: + - legal + auth_mode: OAUTH2_CC + token_url: https://auth.thomsonreuters.com/oauth/token + token_request_auth_method: basic + token_headers: + content-type: application/x-www-form-urlencoded + token_params: + grant_type: client_credentials + audience: 506f6a92-4fd1-43c1-bf18-4e3735ea55aa + docs: https://nango.dev/docs/api-integrations/thomson-reuters-legal-tracker-tr-account + docs_connect: https://nango.dev/docs/api-integrations/thomson-reuters-legal-tracker-tr-account/connect + credentials: + client_id: + type: string + title: Client ID + description: Your TR Account client ID. + doc_section: '#step-1-obtain-your-client-credentials' + client_secret: + type: string + title: Client Secret + description: Your TR Account client secret. + secret: true + doc_section: '#step-1-obtain-your-client-credentials' + +terraform: + display_name: Terraform + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://app.terraform.io + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'x-ratelimit-reset' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v2/organizations + docs: https://nango.dev/docs/integrations/all/terraform + docs_connect: https://nango.dev/docs/integrations/all/terraform/connect + credentials: + apiKey: + type: string + title: API Token + description: The API Token for your Terraform account + doc_section: '#step-1-generating-your-api-token' + example: VbQo**************************** + pattern: '^[a-zA-Z0-9.]{50,}$' + +ticktick: + display_name: TickTick + categories: + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://ticktick.com/oauth/authorize + token_url: https://ticktick.com/oauth/token + scope_separator: ' ' + proxy: + base_url: https://api.ticktick.com + docs: https://nango.dev/docs/integrations/all/ticktick + +tiktok-accounts: + display_name: TikTok Accounts + categories: + - social + auth_mode: OAUTH2 + authorization_url: https://www.tiktok.com/v2/auth/authorize/ + token_url: https://business-api.tiktok.com/open_api/v1.3/tt_user/oauth2/token/ + refresh_url: https://business-api.tiktok.com/open_api/v1.3/tt_user/oauth2/refresh_token/ + proxy: + base_url: https://business-api.tiktok.com/open_api/v1.3/ + authorization_params: + response_type: code + authorization_url_replacements: + client_id: client_key + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + scope_separator: ',' + docs: https://nango.dev/docs/integrations/all/tiktok-accounts + +tiktok-ads: + display_name: TikTok Ads + categories: + - social + auth_mode: OAUTH2 + authorization_url: https://business-api.tiktok.com/portal/auth + token_url: https://business-api.tiktok.com/open_api/v1.3/oauth2/access_token/ + proxy: + base_url: https://business-api.tiktok.com/open_api/v1.3/ + headers: + access-token: ${accessToken} + token_params: + grant_type: authorization_code + authorization_url_replacements: + client_id: app_id + docs: https://nango.dev/docs/integrations/all/tiktok-ads + +tiktok-personal: + display_name: TikTok Personal + categories: + - social + auth_mode: OAUTH2 + authorization_url: https://www.tiktok.com/v2/auth/authorize/ + token_url: https://open.tiktokapis.com/v2/oauth/token/ + proxy: + base_url: https://open.tiktokapis.com + retry: + at: + - 'x-ratelimit-reset' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + body_format: form + scope_separator: ',' + authorization_url_replacements: + client_id: client_key + docs: https://nango.dev/docs/integrations/all/tiktok-personal + +timely: + display_name: Timely + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://api.timelyapp.com/1.1/oauth/authorize + token_url: https://api.timelyapp.com/1.1/oauth/token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://api.timelyapp.com + docs: https://nango.dev/docs/integrations/all/timely + +thrivecart-oauth: + display_name: ThriveCart (OAuth) + categories: + - e-commerce + - payment + auth_mode: OAUTH2 + authorization_url: https://thrivecart.com/authorization/new + token_url: https://thrivecart.com/authorization/token + scope_separator: ' ' + proxy: + base_url: https://thrivecart.com/api/external + docs: https://nango.dev/docs/integrations/all/thrivecart-oauth + +thrivecart-api-key: + display_name: ThriveCart (API Key) + categories: + - e-commerce + - payment + auth_mode: API_KEY + proxy: + base_url: https://thrivecart.com/api/external + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /ping + docs: https://nango.dev/docs/integrations/all/thrivecart-api-key + credentials: + apiKey: + type: string + title: API Key + description: The API key for your ThriveCart account + example: 'ASYDV5S8-0BSO1SH2-4BH5PO7U-YF8SV3CZ' + pattern: '^[A-Z0-9]{8}-[A-Z0-9]{10}-[A-Z0-9]{8}-[A-Z0-9]{8}$' + +trakstar-hire: + display_name: Trakstar Hire + categories: + - ats + auth_mode: BASIC + proxy: + base_url: https://api.recruiterbox.com + verification: + method: GET + endpoints: + - /v2/openings + headers: + content-type: application/json + docs: https://nango.dev/docs/integrations/all/trakstar-hire + docs_connect: https://nango.dev/docs/integrations/all/trakstar-hire/connect + credentials: + username: + type: string + title: API Key + description: Your Trakstar API Key + pattern: '^[a-f0-9]+$' + example: a3f8b92c4d6e715f0a1b3c4d5e6f7890 + doc_section: '#step-1-generating-your-api-key' + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +trafft: + display_name: Trafft + categories: + - productivity + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.subdomain}.admin.trafft.com/api/v2/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.subdomain}.admin.trafft.com/api + docs: https://nango.dev/docs/integrations/all/trafft + docs_connect: https://nango.dev/docs/integrations/all/trafft/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of your Trafft instance + example: subdomain + format: hostname + prefix: https:// + suffix: .admin.trafft.com + doc_section: '#step-1-access-api-settings' + credentials: + client_id: + type: string + title: Client ID + description: Your Trafft OAuth2 Client ID. + doc_section: '#step-2-get-your-credentials' + client_secret: + type: string + title: Client Secret + description: Your Trafft OAuth2 Client Secret. + secret: true + doc_section: '#step-2-get-your-credentials' + +tremendous: + display_name: Tremendous + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://api.tremendous.com/oauth/authorize + token_url: https://api.tremendous.com/oauth/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.tremendous.com/api/v2 + docs: https://nango.dev/docs/integrations/all/tremendous + +tremendous-sandbox: + display_name: Tremendous (Sandbox) + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://testflight.tremendous.com/oauth/authorize + token_url: https://testflight.tremendous.com/oauth/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://testflight.tremendous.com/api/v2 + docs: https://nango.dev/docs/integrations/all/tremendous-sandbox + +perk: + display_name: Perk + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://app.travelperk.com/oauth2/authorize/ + token_url: https://app.travelperk.com/accounts/oauth2/token/ + disable_pkce: true + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.travelperk.com + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/perk + setup_guide_url: https://nango.dev/docs/api-integrations/perk/how-to-register-your-own-perk-api-oauth-app + +trello: + display_name: Trello + categories: + - productivity + - ticketing + auth_mode: OAUTH1 + request_url: https://trello.com/1/OAuthGetRequestToken + authorization_url: https://trello.com/1/OAuthAuthorizeToken + token_url: https://trello.com/1/OAuthGetAccessToken + signature_method: 'HMAC-SHA1' + scope_separator: ',' + authorization_params: + expiration: never + proxy: + base_url: https://api.trello.com + docs: https://nango.dev/docs/integrations/all/trello + +trello-scim: + display_name: Trello (SCIM API) + categories: + - productivity + - ticketing + auth_mode: API_KEY + proxy: + base_url: https://trello.com/scim + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/users?sortBy=displayName&count=10 + docs: https://nango.dev/docs/integrations/all/trello-scim + docs_connect: https://nango.dev/docs/integrations/all/trello-scim/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Trello scim account + doc_section: '#step-1-finding-your-trello-api-key' + +tldv: + display_name: tl;dv + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://pasta.tldv.io + headers: + x-api-key: ${apiKey} + docs: https://nango.dev/docs/integrations/all/tldv + docs_connect: https://nango.dev/docs/integrations/all/tldv/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your tl;dv account + doc_section: '#step-1-finding-your-api-key' + +trigify-io-mcp: + display_name: Trigify IO (MCP) + categories: + - dev-tools + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://clerk.trigify.io/oauth/authorize + token_url: https://clerk.trigify.io/oauth/token + registration_url: https://clerk.trigify.io/oauth/register + default_scopes: + - offline_access + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.trigify.io + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/trigify-io-mcp + +trigger-dev: + display_name: Trigger.dev + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.baseUrl} + headers: + authorization: Bearer ${apiKey} + connection_config: + environment: ${connectionConfig.environment} + projectRef: ${connectionConfig.projectRef} + triggerBranch: ${connectionConfig.triggerBranch} + docs: https://nango.dev/docs/api-integrations/trigger-dev + docs_connect: https://nango.dev/docs/api-integrations/trigger-dev/connect + connection_config: + baseUrl: + type: string + title: Hostname + description: The API hostname. + example: api.trigger.dev + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-4-set-your-base-url' + projectRef: + type: string + title: Project Ref + description: Your Trigger.dev project identifier. + example: proj_1234567890 + optional: true + doc_section: '#step-2-find-your-project-ref' + environment: + type: string + title: Environment + description: The target environment. + example: prod + optional: true + doc_section: '#step-3-find-your-environment' + triggerBranch: + type: string + title: Preview Branch + description: Target a specific preview branch for environment variable operations. + example: feature-xyz + optional: true + doc_section: '#step-5-set-your-preview-branch' + credentials: + apiKey: + type: string + title: Secret Key + description: Your Trigger.dev secret key or personal access token. + pattern: '^tr_(dev|prod|stg|preview|pat)_[a-zA-Z0-9]+$' + example: tr_dev_******************** + doc_section: '#step-1-get-your-secret-key-or-personal-access-token' + +triple-whale: + display_name: Triple Whale + categories: + - analytics + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.triplewhale.com + headers: + x-api-key: ${apiKey} + accept: application/json + verification: + method: GET + headers: + accept: application/json + content-type: application/json + endpoints: + - /api/v2/users/api-keys/me + docs: https://nango.dev/docs/api-integrations/triple-whale + docs_connect: https://nango.dev/docs/api-integrations/triple-whale/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Triple Whale API key. + example: 5ab87915-2deb-429c-a1e2-8b0495900f45 + format: uuid + doc_section: '#step-1-generating-your-api-key' + +tsheetsteam: + display_name: TSheets + categories: + - hr + - productivity + auth_mode: OAUTH2 + authorization_url: https://rest.tsheets.com/api/v1/authorize + token_url: https://rest.tsheets.com/api/v1/grant + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://rest.tsheets.com/api/v1 + docs: https://nango.dev/docs/integrations/all/tsheetsteam + +timify: + display_name: Timify + categories: + - productivity + auth_mode: TWO_STEP + body_format: json + token_url: https://${connectionConfig.subdomain}.timify.com/v1/auth/token + refresh_url: https://${connectionConfig.subdomain}.timify.com/v1/auth/refreshtoken + token_params: + appid: ${credentials.appId} + appsecret: ${credentials.appSecret} + refresh_token_params: + refreshtoken: ${refresh_token} + token_headers: + content-type: application/json + accept: application/json + token_response: + token: accessToken + token_expiration: expires + token_expiration_strategy: expireIn + refresh_token: refreshToken + proxy: + base_url: https://${connectionConfig.subdomain}.timify.com + headers: + authorization: ${accessToken} + docs: https://nango.dev/docs/api-integrations/timify + docs_connect: https://nango.dev/docs/api-integrations/timify/connect + connection_config: + subdomain: + type: string + title: Timify Subdomain + description: The subdomain of your Timify API. + pattern: '^[a-z0-9_-]+$' + example: api + order: 1 + suffix: .timify.com + prefix: https:// + doc_section: '#step-1-finding-your-subdomain' + credentials: + appId: + type: string + title: App ID + description: Your Timify app ID + doc_section: '#step-3-getting-your-credentials' + appSecret: + type: string + title: App Secret + description: Your Timify app secret + secret: true + doc_section: '#step-3-getting-your-credentials' + +toast: + display_name: Toast + categories: + - erp + auth_mode: TWO_STEP + body_format: json + token_url: https://${connectionConfig.subdomain}.toasttab.com/authentication/v1/authentication/login + token_params: + clientId: ${credentials.clientId} + clientSecret: ${credentials.clientSecret} + userAccessType: TOAST_MACHINE_CLIENT + token_headers: + content-type: application/json + token_response: + token: token.accessToken + token_expiration: token.expiresIn + token_expiration_strategy: expireIn + token_expiration_buffer: 60 + proxy: + base_url: https://${connectionConfig.subdomain}.toasttab.com + headers: + toast-restaurant-external-id: ${connectionConfig.restaurantId} + docs: https://nango.dev/docs/api-integrations/toast + docs_connect: https://nango.dev/docs/api-integrations/toast/connect + connection_config: + subdomain: + type: string + title: API Subdomain + description: The Toast API subdomain for your environment. + example: ws-api + pattern: '^[a-z0-9-]+$' + order: 1 + restaurantId: + type: string + title: Restaurant External ID + description: The Toast GUID for the restaurant to connect to. + example: 4721e7a9-b4ae-4fef-9230-b3dae186e0a4 + format: uuid + optional: true + credentials: + clientId: + type: string + title: Client ID + description: Your Toast API client identifier. + clientSecret: + type: string + title: Client Secret + description: Your Toast API client secret. + secret: true + +todoist: + display_name: Todoist + categories: + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://todoist.com/oauth/authorize + token_url: https://todoist.com/oauth/access_token + scope_separator: ',' + proxy: + base_url: https://api.todoist.com + docs: https://nango.dev/docs/integrations/all/todoist + +toggl: + display_name: Toggl Track + categories: + - productivity + auth_mode: BASIC + proxy: + base_url: https://api.track.toggl.com + verification: + method: GET + endpoints: + - /api/v9/me + retry: + after: + - 'x-toggl-quota-resets-in' + docs: https://nango.dev/docs/api-integrations/toggl + docs_connect: https://nango.dev/docs/api-integrations/toggl/connect + credentials: + username: + type: string + title: Email or API token + description: Your Toggl Track account email, or your API token when using token-based Basic Auth. + doc_section: '#step-1-choose-emailpassword-or-api-token' + password: + type: string + title: Password or api_token + description: Your Toggl Track account password, or the literal text api_token when authenticating with an API token. + secret: true + doc_section: '#step-1-choose-emailpassword-or-api-token' + +torii: + display_name: Torii + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.toriihq.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1.0/orgs/my + retry: + at: + - 'x-rate-limit-reset' + docs: https://nango.dev/docs/api-integrations/torii + docs_connect: https://nango.dev/docs/api-integrations/torii/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Torii account + doc_section: '#step-1-generating-your-api-key' + +tumblr: + display_name: Tumblr + categories: + - social + - communication + auth_mode: OAUTH2 + authorization_url: https://www.tumblr.com/oauth2/authorize + token_url: https://api.tumblr.com/v2/oauth2/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.tumblr.com/v2 + docs: https://nango.dev/docs/integrations/all/tumblr + +twitch: + display_name: Twitch + categories: + - gaming + - social + - sports + - video + auth_mode: OAUTH2 + authorization_url: https://id.twitch.tv/oauth2/authorize + token_url: https://id.twitch.tv/oauth2/token + authorization_params: + force_verify: false + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.twitch.tv + docs: https://nango.dev/docs/integrations/all/twitch + +twitter: + display_name: Twitter (v1) + categories: + - marketing + - social + auth_mode: OAUTH1 + request_url: https://api.twitter.com/oauth/request_token + authorization_url: https://api.twitter.com/oauth/authorize + token_url: https://api.twitter.com/oauth/access_token + signature_method: 'HMAC-SHA1' + request_params: + x_auth_access_type: write + proxy: + base_url: https://api.twitter.com + docs: https://nango.dev/docs/integrations/all/twitter +twitter-v2: + display_name: Twitter (v2) + categories: + - marketing + - social + auth_mode: OAUTH2 + authorization_url: https://x.com/i/oauth2/authorize + token_url: https://api.twitter.com/2/oauth2/token + token_request_auth_method: basic + authorization_params: + response_type: code + response_mode: query + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + default_scopes: + - offline.access + proxy: + base_url: https://api.twitter.com + docs: https://nango.dev/docs/api-integrations/twitter-v2 + setup_guide_url: https://nango.dev/docs/api-integrations/twitter-v2/how-to-register-your-own-twitter-v2-api-oauth-app +twitter-oauth2-cc: + display_name: Twitter (Client Credentials) + categories: + - marketing + - social + auth_mode: OAUTH2_CC + token_url: https://api.twitter.com/oauth2/token + token_request_auth_method: basic + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.twitter.com + docs: https://nango.dev/docs/integrations/all/twitter-oauth2-cc + +twinfield: + display_name: Twinfield + categories: + - accounting + auth_mode: OAUTH2 + authorization_url: https://login.twinfield.com/auth/authentication/connect/authorize + token_url: https://login.twinfield.com/auth/authentication/connect/token + authorization_params: + response_type: code + nonce: AnotherRandomStringTwinfield + refresh_params: + grant_type: refresh_token + scope_separator: ' ' + default_scopes: + - openid + - twf.user + - twf.organisation + - twf.organisationUser + - offline_access + disable_pkce: true + proxy: + base_url: https://${connectionConfig.cluster}.twinfield.com + docs: https://nango.dev/docs/integrations/all/twinfield + connection_config: + cluster: + type: string + title: Twinfield Cluster + description: The cluster to your Twinfield instance + pattern: '^[a-z0-9_-]+$' + example: accounting + suffix: .twinfield.com + prefix: https:// + +twenty-crm: + display_name: Twenty CRM + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.twenty.com/rest + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'retry-after' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /companies + docs: https://nango.dev/docs/integrations/all/twenty-crm + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Twenty CRM account + example: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyMTIxMjEyMS0yNmExLTRkODktYjQ2YS0wNDI0NTViODM3N2YiLCJ0eXBlIjoiQVBJX0tFWSIsIndvcmtzcGFjZUlkIjoiMjEyMTIxMjEtMjZhMS00ZDg5LWI0NmEtMDQyNDU1YjgzNzdmIiwiaWF0IjoxNzMxMzA5MzQwLCJleHAiOjQ4ODQ5MDU3MzksImp0aSI6ImVmZTg4MjcxLTM4OWItNDk5Mi04MjYwLWZjNGIxZmYxYjRiMSJ9.n3tohFIEBBRMsyas_agbh3-KvKXYUnjyhrYzTHYC3vc' + pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' + +twenty-crm-self-hosted: + display_name: Twenty CRM (Self Hosted) + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.domain}/rest + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'retry-after' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /companies + docs: https://nango.dev/docs/integrations/all/twenty-crm-self-hosted + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Twenty CRM account + example: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyMTIxMjEyMS0yNmExLTRkODktYjQ2YS0wNDI0NTViODM3N2YiLCJ0eXBlIjoiQVBJX0tFWSIsIndvcmtzcGFjZUlkIjoiMjEyMTIxMjEtMjZhMS00ZDg5LWI0NmEtMDQyNDU1YjgzNzdmIiwiaWF0IjoxNzMxMzA5MzQwLCJleHAiOjQ4ODQ5MDU3MzksImp0aSI6ImVmZTg4MjcxLTM4OWItNDk5Mi04MjYwLWZjNGIxZmYxYjRiMSJ9.n3tohFIEBBRMsyas_agbh3-KvKXYUnjyhrYzTHYC3vc' + pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' + connection_config: + domain: + type: string + title: Twenty CRM domain + description: The domain of your Twnety CRM instance + pattern: '^[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' + example: domain + +twilio: + display_name: Twilio + categories: + - dev-tools + - communication + auth_mode: BASIC + proxy: + base_url: https://api.twilio.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /2010-04-01/Accounts/${credentials.username}/Messages.json + docs: https://nango.dev/docs/integrations/all/twilio + docs_connect: https://nango.dev/docs/integrations/all/twilio/connect + credentials: + username: + type: string + title: Account SID + description: Your Twilio Account SID + pattern: '^AC[a-zA-Z0-9]{32}$' + doc_section: '#step-1-finding-your-account-sid' + password: + type: string + title: Auth Token + description: Your Twilio Auth Token + secret: true + doc_section: '#step-2-finding-your-auth-token' + +typeform: + display_name: Typeform + categories: + - surveys + auth_mode: OAUTH2 + authorization_url: https://api.typeform.com/oauth/authorize + token_url: https://api.typeform.com/oauth/token + disable_pkce: true + default_scopes: + - offline + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.typeform.com + docs: https://nango.dev/docs/integrations/all/typeform + +typefully: + display_name: Typefully + categories: + - analytics + - communication + - social + auth_mode: API_KEY + proxy: + base_url: https://api.typefully.com + headers: + x-api-key: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/notifications/ + docs: https://nango.dev/docs/integrations/all/typefully + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Typefully account + +typefully-v2: + display_name: Typefully (API v2) + categories: + - analytics + - communication + - social + auth_mode: API_KEY + proxy: + base_url: https://api.typefully.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v2/me + retry: + at: + - 'x-ratelimit-user-reset' + - 'x-ratelimit-socialset-reset' + docs: https://nango.dev/docs/api-integrations/typefully-v2 + docs_connect: https://nango.dev/docs/api-integrations/typefully-v2/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Typefully v2 API key. + example: 'aNVlyR********************YxeIDz' + pattern: '^[A-Za-z0-9]{32}$' + doc_section: '#step-1-generating-your-api-key' + +uber: + display_name: Uber + categories: + - other + auth_mode: OAUTH2 + authorization_url: https://login.uber.com/oauth/v2/authorize + token_url: https://login.uber.com/oauth/v2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.uber.com + docs: https://nango.dev/docs/integrations/all/uber + +ukg-pro-wfm: + display_name: UKG Pro (Workforce Management) + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://welcome-us.ukg.net/authorize + token_url: https://welcome-us.ukg.net/oauth/token + scope_separator: ' ' + authorization_params: + response_type: code + audience: https://wfm.ukg.net/api + realm: ${connectionConfig.tenantName} + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.hostname}/api + docs: https://nango.dev/docs/integrations/all/ukg-pro-wfm + docs_connect: https://nango.dev/docs/integrations/all/ukg-pro-wfm/connect + connection_config: + hostname: + type: string + title: Tenant URL + description: The tenant URL of your UKG Pro instance + format: hostname + example: wfm.us1.ukg.com + suffix: /api + prefix: https:// + doc_section: '#step-1-finding-your-tenant-url-and-tenant-name' + tenantName: + type: string + title: Tenant Name + description: The tenant name of your UKG Pro instance + example: wfm + doc_section: '#step-1-finding-your-tenant-url-and-tenant-name' + +ukg-pro: + display_name: UKG Pro + categories: + - hr + - popular + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.hostname} + headers: + content-type: application/json + us-customer-api-key: ${connectionConfig.customerApiKey} + docs: https://nango.dev/docs/integrations/all/ukg-pro + docs_connect: https://nango.dev/docs/integrations/all/ukg-pro/connect + credentials: + username: + type: string + title: Service Account Username + description: The username for your UKG Pro service account + doc_section: '#step-2-creating-a-web-service-account' + password: + type: string + title: Service Account Password + description: The password generated for your UKG Pro service account + doc_section: '#step-2-creating-a-web-service-account' + secret: true + connection_config: + customerApiKey: + type: string + order: 2 + title: Customer API Key + description: Your UKG Pro Customer API Key found in Service Account Administration + doc_section: '#step-1-finding-your-customer-api-key' + secret: true + hostname: + type: string + order: 1 + title: Hostname + description: The tenant URL of your UKG Pro instance + format: hostname + example: servicet.ultipro.com + prefix: https:// + doc_section: '#step-3-finding-your-hostname' + +ukg-pro-cc: + display_name: UKG Pro HCM (Client Credentials) + categories: + - hr + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.identityServer}/signin/oauth2/t/${connectionConfig.tenantId}/access_token + body_format: form + token_headers: + content-type: application/x-www-form-urlencoded + accept: application/json + token_params: + grant_type: client_credentials + proxy: + retry: + after: + - 'retry-after' + base_url: https://${connectionConfig.hostname} + docs: https://nango.dev/docs/api-integrations/ukg-pro-cc + docs_connect: https://nango.dev/docs/api-integrations/ukg-pro-cc/connect + credentials: + client_id: + type: string + title: Client ID + description: Unique identifier of the identity client provided by UKG customer support. + doc_section: '#step-1-getting-the-credentials-from-ukg-support' + client_secret: + type: string + title: Client Secret + description: Client secret associated with the client ID provided by UKG customer support. + secret: true + doc_section: '#step-1-getting-the-credentials-from-ukg-support' + connection_config: + identityServer: + type: string + title: Identity Server + description: Identity server for your tenant. + format: hostname + example: signin.ukg.net + order: 1 + doc_section: '#step-1-getting-the-credentials-from-ukg-support' + tenantId: + type: string + title: Tenant + description: Tenant value from your UKG Pro Recruiting URL. + example: UO32145HGOGOG + pattern: '^[a-zA-Z0-9]+$' + order: 3 + doc_section: '#step-2-identify-tenant-and-recruiting-application-domain' + hostname: + type: string + title: Recruiting Application Domain + description: Recruiting application domain from your UKG Pro Recruiting URL. + format: hostname + example: recruiting.example.ultipro.com + prefix: https:// + order: 2 + doc_section: '#step-2-identify-tenant-and-recruiting-application-domain' + +ukg-ready: + display_name: UKG Ready + categories: + - hr + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.hostname}/ta/rest/v2/companies/${connectionConfig.realmId}/oauth2/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.hostname} + docs: https://nango.dev/docs/integrations/all/ukg-ready + docs_connect: https://nango.dev/docs/integrations/all/ukg-ready/connect + connection_config: + realmId: + type: string + title: Company ID + description: A unique identifier for your company. + example: '23444234' + doc_section: '#step-3-finding-your-company-id' + hostname: + type: string + title: Hostname + description: The hostname to your UKG Ready instance + format: hostname + example: secure.us.rdy.ukg + suffix: /ta + prefix: https:// + doc_section: '#step-4-finding-your-hostname' +unanet: + display_name: Unanet + categories: + - crm + - erp + - accounting + auth_mode: BASIC + proxy: + headers: + x-compass-firm-id: ${connectionConfig.firmId} + x-compass-api-key: ${connectionConfig.apiKey} + base_url: https://compass.cosential.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/projects + docs: https://nango.dev/docs/integrations/all/unanet + docs_connect: https://nango.dev/docs/integrations/all/unanet/connect + connection_config: + firmId: + type: string + title: Firm ID + description: The firm ID of your Unanet instance + doc_section: '#step-2-finding-the-firm-id' + apiKey: + type: string + title: API Key + description: The API key of your Unanet instance + secret: true + doc_section: '#step-3-finding-the-api-key' + credentials: + username: + type: string + title: User name + description: Your Unanet username + doc_section: '#step-1-finding-username-and-password' + password: + type: string + title: Password + description: Your Unanet password + default_value: '' + doc_section: '#step-1-finding-username-and-password' + +unauthenticated: + display_name: Unauthenticated + categories: + - other + auth_mode: NONE + webhook_routing_script: unauthenticatedWebhookRouting + docs: https://nango.dev/docs/integrations/all/unauthenticated + +unipile: + display_name: Unipile + categories: + - crm + - marketing + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.unipile.com:${connectionConfig.port} + headers: + x-api-key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v1/accounts + docs: https://nango.dev/docs/integrations/all/unipile + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Unipile instance + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of your Unipile instance + pattern: '^[a-z0-9_-]+$' + example: api1 + suffix: .unipile.com + prefix: https:// + port: + type: string + title: Port + description: The port of your Unipile instance + pattern: '^[0-9]+$' + example: '13113' + +upsales: + display_name: Upsales + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://integration.upsales.com + query: + token: ${apiKey} + retry: + at: + - 'x-ratelimit-reset' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v2/users + docs: https://nango.dev/docs/api-integrations/upsales + docs_connect: https://nango.dev/docs/api-integrations/upsales/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Upsales API Token + doc_section: '#step-1-finding-your-api-token' + +vercel: + display_name: Vercel + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.vercel.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/user + docs: https://nango.dev/docs/api-integrations/vercel + docs_connect: https://nango.dev/docs/api-integrations/vercel/connect + credentials: + apiKey: + type: string + title: Token + description: The Token for your Vercel account. + pattern: '^vcp_[A-Za-z0-9]+$' + example: 'vcp_6ppUxFRd****r1sc53a' + doc_section: '#step-1-finding-your-token' + +vercel-mcp: + display_name: Vercel (MCP) + categories: + - dev-tools + - mcp + auth_mode: MCP_OAUTH2 + client_registration: static + authorization_url: https://vercel.com/oauth/authorize + token_url: https://vercel.com/api/login/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + default_scopes: + - offline_access + proxy: + headers: + accept: application/json,text/event-stream + base_url: https://mcp.vercel.com + docs: https://nango.dev/docs/api-integrations/vercel-mcp + setup_guide_url: https://nango.dev/docs/api-integrations/vercel-mcp/how-to-register-your-own-vercel-mcp-oauth-app + +vimeo: + display_name: Vimeo (OAuth) + categories: + - video + auth_mode: OAUTH2 + authorization_url: https://api.vimeo.com/oauth/authorize + token_url: https://api.vimeo.com/oauth/access_token + token_request_auth_method: basic + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://api.vimeo.com + docs: https://nango.dev/docs/integrations/all/vimeo + +vimeo-basic: + display_name: Vimeo (Basic Auth) + categories: + - video + auth_mode: BASIC + proxy: + base_url: https://api.vimeo.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - / + docs: https://nango.dev/docs/integrations/all/vimeo-basic + +valley-api-key: + display_name: Valley (API Key) + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.joinvalley.co/api + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v1/auth/verify-api-key + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/integrations/all/valley-api-key + docs_connect: https://nango.dev/docs/integrations/all/valley-api-key/connect + credentials: + apiKey: + type: string + title: API Key + example: valley_a3f4c8d2e1b9a7**********************************************c5d8e2f1 + pattern: '^valley_[a-f0-9]{64}$' + description: The API key for your Valley account + doc_section: '#step-1-verifying-your-api-key' + +valley: + display_name: Valley (OAuth) + categories: + - marketing + auth_mode: TWO_STEP + body_format: json + token_url: https://api.joinvalley.co/api/v1/auth/get-token + refresh_url: https://api.joinvalley.co/api/v1/auth/refresh-token + token_params: + email: ${credentials.email} + password: ${credentials.password} + refresh_token_params: + refresh_token: ${refresh_token} + token_headers: + content-type: application/json + proxy: + base_url: https://api.joinvalley.co/api/ + headers: + authorization: Bearer ${accessToken} + retry: + at: + - 'x-ratelimit-reset' + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + refresh_token: refresh_token + docs: https://nango.dev/docs/integrations/all/valley + docs_connect: https://nango.dev/docs/integrations/all/valley/connect + credentials: + email: + type: string + title: Email + description: Your Valley email address + format: email + doc_section: '#step-1-getting-your-credentials' + password: + type: string + title: Password + description: Your Valley password + doc_section: '#step-1-getting-your-credentials' + +vanta: + display_name: Vanta + categories: + - dev-tools + auth_mode: OAUTH2_CC + token_url: https://api.vanta.com/oauth/token + token_params: + grant_type: client_credentials + body_format: json + proxy: + base_url: https://api.vanta.com + docs: https://nango.dev/docs/api-integrations/vanta + docs_connect: https://nango.dev/docs/api-integrations/vanta/connect + +veeva-vault: + display_name: Veeva Vault + categories: + - crm + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.subdomain}.veevavault.com/api/${connectionConfig.version}/auth + token_params: + username: ${credentials.username} + password: ${credentials.password} + token_headers: + content-type: application/x-www-form-urlencoded + accept: application/json + token_response: + token: sessionId + proxy: + base_url: https://${connectionConfig.subdomain}.veevavault.com/api/${connectionConfig.version} + headers: + authorization: ${accessToken} + accept: application/json + docs: https://nango.dev/docs/api-integrations/veeva-vault + docs_connect: https://nango.dev/docs/api-integrations/veeva-vault/connect + credentials: + username: + type: string + title: Username + description: Your Vault user name assigned by your administrator + doc_section: '#step-2-obtaining-your-credentials' + password: + type: string + title: Password + description: Your Vault password associated with your assigned Vault user name + secret: true + doc_section: '#step-2-obtaining-your-credentials' + connection_config: + subdomain: + type: string + title: Vault DNS (subdomain) + description: The Vault DNS subdomain of the Veeva Vault you want to connect to + example: myvault + prefix: https:// + suffix: veevavault.com + order: 1 + doc_section: '#step-1-finding-your-vault-dns-subdomain' + version: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +vtex: + display_name: VTEX + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.accountName}.vtexcommercestable.com.br + headers: + x-vtex-api-appkey: ${connectionConfig.appKey} + x-vtex-api-apptoken: ${apiKey} + docs: https://nango.dev/docs/api-integrations/vtex + docs_connect: https://nango.dev/docs/api-integrations/vtex/connect + connection_config: + accountName: + type: string + title: Account Name + description: Your VTEX store account name. + example: mystore + pattern: '^[a-zA-Z0-9_-]+$' + suffix: .vtexcommercestable.com.br + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-account-name' + appKey: + type: string + title: App Key + description: Your VTEX application key. + example: vtexappkey-mystore-ABCDEF + secret: true + pattern: '^vtexappkey-[a-zA-Z0-9_-]+-[A-Z0-9]+$' + order: 2 + doc_section: '#step-2-generating-an-api-key' + credentials: + apiKey: + type: string + title: App Token + description: The application token associated with your VTEX App Key. + example: ZNWDC************************************LXPNX + pattern: '^[A-Z]+$' + doc_section: '#step-2-generating-an-api-key' + +videoask: + display_name: VideoAsk + categories: + - video + auth_mode: OAUTH2 + authorization_url: https://auth.videoask.com/authorize + token_url: https://auth.videoask.com/oauth/token + disable_pkce: true + default_scopes: + - openid + - profile + - email + - offline_access + authorization_params: + response_type: code + audience: https://api.videoask.com/ + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.videoask.com + webhook_routing_script: videoaskWebhookRouting + webhook_user_defined_secret: true + docs: https://nango.dev/docs/api-integrations/videoask + setup_guide_url: https://nango.dev/docs/api-integrations/videoask/how-to-register-your-own-videoask-api-oauth-app + +wappalyzer: + display_name: Wappalyzer + categories: + - marketing + - analytics + auth_mode: API_KEY + proxy: + base_url: https://api.wappalyzer.com + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v2/credits/balance/ + docs: https://nango.dev/docs/api-integrations/wappalyzer + docs_connect: https://nango.dev/docs/api-integrations/wappalyzer/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Wappalyzer API key. + doc_section: '#step-1-get-your-api-key' + +wakatime: + display_name: Wakatime + categories: + - analytics + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://wakatime.com/oauth/authorize + token_url: https://wakatime.com/oauth/token + proxy: + base_url: https://wakatime.com + docs: https://nango.dev/docs/integrations/all/wakatime + +walmart: + display_name: Walmart Marketplace + categories: + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://login.account.wal-mart.com/authorize + authorization_params: + clientType: ${connectionConfig.clientType} + nonce: ${random} + disable_pkce: true + authorization_url_replacements: + response_type=: responseType= + client_id=: clientId= + redirect_uri=: redirectUri= + token_url: https://marketplace.walmartapis.com/v3/token + redirect_uri_metadata: + - sellerId + proxy: + base_url: https://marketplace.walmartapis.com + headers: + wm_qos.correlation_id: ${random} + wm_sec.access_token: ${accessToken} + docs: https://nango.dev/docs/api-integrations/walmart + setup_guide_url: https://nango.dev/docs/api-integrations/walmart/how-to-register-your-own-walmart-marketplace-oauth-app + connection_config: + clientType: + type: string + title: '' + description: '' + default_value: seller + hidden: true + +wave-accounting: + display_name: Wave Accounting + categories: + - accounting + auth_mode: OAUTH2 + authorization_url: https://api.waveapps.com/oauth2/authorize + token_url: https://api.waveapps.com/oauth2/token/ + proxy: + base_url: https://gql.waveapps.com + docs: https://nango.dev/docs/integrations/all/wave-accounting + +wealthbox: + display_name: Wealthbox + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://app.crmworkspace.com/oauth/authorize + token_url: https://app.crmworkspace.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.crmworkspace.com + docs: https://nango.dev/docs/integrations/all/wealthbox + +webflow: + display_name: Webflow + categories: + - dev-tools + - design + - cms + auth_mode: OAUTH2 + authorization_url: https://webflow.com/oauth/authorize + token_url: https://api.webflow.com/oauth/access_token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://api.webflow.com + docs: https://nango.dev/docs/integrations/all/webflow + +webex: + display_name: Webex + categories: + - communication + auth_mode: OAUTH2 + scope_separator: ' ' + authorization_url: https://webexapis.com/v1/authorize + token_url: https://webexapis.com/v1/access_token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://webexapis.com + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/webex + +webinarjam: + display_name: WebinarJam + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.webinarjam.com/webinarjam + query: + api_key: ${apiKey} + verification: + method: POST + headers: + content-type: application/x-www-form-urlencoded + endpoints: + - /webinars + docs: https://nango.dev/docs/api-integrations/webinarjam + docs_connect: https://nango.dev/docs/api-integrations/webinarjam/connect + credentials: + apiKey: + type: string + title: API Key + description: Your WebinarJam API key. + example: b7e2d4f1-8a3c-4e6b-9d5f-1a2b3c4d5e6f + format: uuid + doc_section: '#step-1-getting-your-api-key' + +wejam: + display_name: WeJam AI + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.wejam.ai + headers: + x-api-key: ${apiKey} + docs: https://nango.dev/docs/api-integrations/wejam + docs_connect: https://nango.dev/docs/api-integrations/wejam/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your WeJam account. + doc_section: '#step-1-getting-your-api-key' + pattern: '^[a-f0-9]+$' + example: c0c1fc3f**************************************************************************************** + +whatsapp-business: + display_name: WhatsApp Business + categories: + - communication + - marketing + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + content-type: application/json + base_url: https://graph.facebook.com + verification: + headers: + content-type: application/json + endpoints: + - /v21.0/me + method: GET + docs: https://nango.dev/docs/api-integrations/whatsapp-business + setup_guide_url: https://nango.dev/docs/api-integrations/whatsapp-business/how-to-register-your-own-whatsapp-business-api-oauth-app + credentials: + apiKey: + type: string + title: API Key + description: The access token to your whatsapp account + pattern: '^[a-zA-Z0-9]+$' + +whoop: + display_name: Whoop + categories: + - sports + auth_mode: OAUTH2 + authorization_url: https://api.prod.whoop.com/oauth/oauth2/auth + token_url: https://api.prod.whoop.com/oauth/oauth2/token + authorization_params: + response_type: code + proxy: + base_url: https://api.prod.whoop.com/ + retry: + after: + - 'x-ratelimit-reset' + paginate: + type: cursor + offset_name_in_request: nextToken + limit_name_in_request: limit + docs: https://nango.dev/docs/integrations/all/whoop + +wildix-pbx: + display_name: Wildix PBX + categories: + - communication + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.wildixin.com/authorization/oauth2 + token_url: https://${connectionConfig.subdomain}.wildixin.com/authorization/oauth2Token + authorization_params: + response_type: code + redirect_uri_metadata: + - subdomain + docs: https://nango.dev/docs/integrations/all/wildix-pbx + proxy: + base_url: https://${connectionConfig.subdomain}.wildixin.com + connection_config: + subdomain: + type: string + title: Wildix Domain + description: The subdomain of your Wildix instance + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .wildixin.com + prefix: https:// + +wiza: + display_name: Wiza + categories: + - crm + - marketing + auth_mode: API_KEY + proxy: + base_url: https://wiza.co/api + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /meta/credits + docs: https://nango.dev/docs/integrations/all/wiza + docs_connect: https://nango.dev/docs/integrations/all/wiza/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Wiza API key + pattern: '^[a-f0-9]{64}$' + example: 6e0f838beb0a09d35f3f56b52b1344b262ecc713aab41456485d12c5f6edaef7 + doc_section: '#step-1-getting-your-api-key' + +wordpress: + display_name: WordPress + categories: + - dev-tools + - design + - cms + auth_mode: OAUTH2 + authorization_url: https://public-api.wordpress.com/oauth2/authorize + token_url: https://public-api.wordpress.com/oauth2/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://public-api.wordpress.com/rest/v1 + docs: https://nango.dev/docs/integrations/all/wordpress + +wordpress-mcp: + display_name: WordPress.com (MCP) + categories: + - cms + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://public-api.wordpress.com/oauth2-1/authorize + token_url: https://public-api.wordpress.com/oauth2-1/token + registration_url: https://public-api.wordpress.com/oauth2-1/register + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://public-api.wordpress.com/wpcom + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/wordpress-mcp + +wiseagent: + display_name: Wiseagent + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://sync.thewiseagent.com/WiseAuth/auth + token_url: https://sync.thewiseagent.com/WiseAuth/token + body_format: json + disable_pkce: true + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://sync.thewiseagent.com + docs: https://nango.dev/docs/api-integrations/wiseagent + setup_guide_url: https://nango.dev/docs/api-integrations/wiseagent/how-to-register-your-own-wiseagent-oauth-app + +woocommerce: + display_name: WooCommerce + categories: + - e-commerce + - dev-tools + - design + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.storeURL} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /wp-json/wc/v3/customers + docs: https://nango.dev/docs/integrations/all/woocommerce + docs_connect: https://nango.dev/docs/integrations/all/woocommerce/connect + connection_config: + storeURL: + type: string + title: Domain + description: The domain of your WooCommerce store + credentials: + username: + type: string + title: User name + description: Your woocommerce Consumer Key + doc_section: '#step-1-finding-your-woocommerce-consumer-key' + password: + type: string + title: Password + description: Your woocommerce Consumer Secret + default_value: '' + doc_section: '#step-2-finding-your-woocommerce-consumer-secret' + +workable: + display_name: Workable (API Key) + categories: + - ats + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://${connectionConfig.subdomain}.workable.com + retry: + at: + - 'x-rate-limit-reset' + post_connection_script: workablePostConnection + docs: https://nango.dev/docs/integrations/all/workable + docs_connect: https://nango.dev/docs/integrations/all/workable/connect + connection_config: + subdomain: + type: string + title: Workable Domain + description: The subdomain of your Workable account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .workable.com + prefix: https:// + optional: true + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Workable account + doc_section: '#step-1-finding-workable-api-key' + +workable-oauth: + display_name: Workable (OAuth) + categories: + - ats + auth_mode: OAUTH2 + authorization_url: https://www.workable.com/oauth/authorize + token_url: https://www.workable.com/oauth/token + scope_separator: '+' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.workable.com + retry: + at: + - 'x-rate-limit-reset' + docs: https://nango.dev/docs/integrations/all/workable-oauth + connection_config: + subdomain: + type: string + title: Workable Domain + description: The subdomain of your Workable account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .workable.com + prefix: https:// + +workday: + display_name: Workday + categories: + - hr + - popular + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.hostname}/ccx/service/${connectionConfig.tenant} + docs: https://nango.dev/docs/integrations/all/workday + docs_connect: https://nango.dev/docs/integrations/all/workday/connect + connection_config: + hostname: + type: string + title: Hostname + description: The hostname of your Workday account + format: hostname + example: wd3-impl-services1.workday.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-hostname' + tenant: + type: string + title: Tenant + description: The tenant of your Workday account + example: acme + order: 2 + doc_section: '#step-2-finding-your-tenant' + credentials: + username: + type: string + example: ISU Nango@acme + title: Username + description: Workday API Username + pattern: '^[^@]+@[^@]+$' + doc_section: '#step-4-generating-your-username' + password: + type: string + title: Password + description: Workday API Password + doc_section: '#step-5-finding-your-password' + +workday-adaptive-planning-basic: + display_name: Workday Adaptive Planning (Basic Auth) + categories: + - accounting + auth_mode: BASIC + proxy: + base_url: https://api.adaptiveplanning.com/api/rest + docs: https://nango.dev/docs/api-integrations/workday-adaptive-planning-basic + docs_connect: https://nango.dev/docs/api-integrations/workday-adaptive-planning-basic/connect + credentials: + username: + type: string + title: Username + description: Your Workday Adaptive Planning username. + doc_section: '#step-1-find-your-username-and-password' + password: + type: string + title: Password + description: Your Workday Adaptive Planning password. + secret: true + doc_section: '#step-1-find-your-username-and-password' + +workday-oauth: + display_name: Workday (OAuth) + categories: + - hr + auth_mode: OAUTH2 + token_request_auth_method: basic + authorization_url: https://${connectionConfig.authorizationDomain}/${connectionConfig.tenant}/authorize + token_url: https://${connectionConfig.tokenDomain}/ccx/oauth2/${connectionConfig.tenant}/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.tokenDomain}/ccx/api + docs: https://nango.dev/docs/api-integrations/workday-oauth + docs_connect: https://nango.dev/docs/api-integrations/workday-oauth/connect + connection_config: + authorizationDomain: + type: string + title: Authorization Domain + description: The domain used to authorize your Workday account + format: hostname + example: impl.workday.com + prefix: https:// + order: 1 + suffix: /mytenant + doc_section: '#step-1-finding-your-authorization-domain' + tokenDomain: + type: string + title: Token Domain + description: The domain used to obtain the token for your Workday account + format: hostname + example: wd3-impl-services1.workday.com + prefix: https:// + order: 2 + suffix: /ccx + doc_section: '#step-2-finding-your-token-domain' + tenant: + type: string + title: Tenant + description: The tenant of your Workday account + example: yourtenant + order: 2 + doc_section: '#step-3-finding-your-tenant' + +workos: + display_name: WorkOS + categories: + - productivity + - iam + auth_mode: API_KEY + proxy: + base_url: https://api.workos.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /organizations?limit=1 + docs: https://nango.dev/docs/api-integrations/workos + docs_connect: https://nango.dev/docs/api-integrations/workos/connect + credentials: + apiKey: + type: string + title: API Key + description: Your WorkOS API key + pattern: '^sk_[A-Za-z0-9_]+$' + example: sk_test_a2V5XzAxS0cyS********************************************NUSlZ + doc_section: '#step-1-obtaining-your-workos-api-key' +workday-refresh-token: + display_name: Workday (Refresh Token Auth) + categories: + - hr + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.tokenDomain}/ccx/oauth2/${connectionConfig.tenant}/token + token_params: + grant_type: refresh_token + refresh_token: ${credentials.refreshToken} + token_headers: + content-type: application/x-www-form-urlencoded + authorization: Basic ${base64(${credentials.clientId}:${credentials.clientSecret})} + token_response: + token: access_token + token_expires_in_ms: 3600000 + proxy: + base_url: https://${connectionConfig.tokenDomain}/ccx/api + docs: https://nango.dev/docs/api-integrations/workday-refresh-token + docs_connect: https://nango.dev/docs/api-integrations/workday-refresh-token/connect + connection_config: + tokenDomain: + type: string + title: Token Domain + description: The domain used to obtain the token for your Workday account + format: hostname + example: wd3-impl-services1.workday.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-token-domain' + tenant: + type: string + title: Tenant + description: The tenant of your Workday account + example: mytenant + order: 2 + doc_section: '#step-2-finding-your-tenant' + credentials: + clientId: + type: string + title: Client ID + description: Your Workday API Client ID + doc_section: '#step-3-registering-an-api-client' + clientSecret: + type: string + title: Client Secret + description: Your Workday API Client Secret + secret: true + doc_section: '#step-3-registering-an-api-client' + refreshToken: + type: string + title: Refresh Token + description: Your Workday refresh token for the Integration System User + secret: true + doc_section: '#step-4-generating-a-refresh-token' + +workday-cc: + display_name: Workday (Client Credentials) + categories: + - hr + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.tokenDomain}/ccx/oauth2/${connectionConfig.tenant}/token + token_params: + grant_type: client_credentials + tenant_alias: ${connectionConfig.tenant} + token_headers: + content-type: application/x-www-form-urlencoded + authorization: ID ${base64(${credentials.clientId}:${credentials.clientSecret})} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://${connectionConfig.tokenDomain}/ccx/api + docs: https://nango.dev/docs/api-integrations/workday-cc + docs_connect: https://nango.dev/docs/api-integrations/workday-cc/connect + connection_config: + tokenDomain: + type: string + title: Token Domain + description: The hostname of your Workday tenant. + format: hostname + example: wd3-impl-services1.workday.com + prefix: https:// + order: 1 + doc_section: '#step-2-finding-your-token-domain' + tenant: + type: string + title: Tenant + description: The tenant name of your Workday account. + example: mytenant + order: 2 + doc_section: '#step-3-finding-your-tenant' + credentials: + clientId: + type: string + title: Client ID + description: Your Workday API Client ID. + doc_section: '#step-5-register-an-api-client' + clientSecret: + type: string + title: Client Secret + description: Your Workday API Client Secret. + secret: true + doc_section: '#step-5-register-an-api-client' + +workday-adaptive-planning: + display_name: Workday Adaptive Planning + categories: + - accounting + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.host}/ccx/oauth2/${connectionConfig.tenant}/token + token_params: + grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer + assertion: ${credentials.assertion} + token_headers: + content-type: application/x-www-form-urlencoded + assertion: + type: jwt + key: ${credentials.privateKey} + lifetimeInSeconds: 300 + header: + alg: RS256 + typ: JWT + payload: + iss: ${credentials.clientId} + sub: ${credentials.isu} + aud: wd + additional_steps: + - token_request_method: GET + token_url: https://${connectionConfig.host}/ccx/api/planning/v1/${connectionConfig.tenant}/adaptiveAPIAccessToken + token_headers: + authorization: Bearer ${step1.access_token} + token_response: + token: adaptiveAPIAccessToken + proxy: + base_url: https://api.adaptiveplanning.com + docs: https://nango.dev/docs/api-integrations/workday-adaptive-planning + docs_connect: https://nango.dev/docs/api-integrations/workday-adaptive-planning/connect + connection_config: + host: + type: string + title: Host + description: The hostname of your Workday account. + format: hostname + example: wd3-impl-services1.workday.com + prefix: https:// + order: 1 + tenant: + type: string + title: Tenant + description: The tenant of your Workday account. + example: mytenant + order: 2 + credentials: + clientId: + type: string + title: Client ID + description: The Client ID from the Workday API Client registration. + isu: + type: string + title: ISU Username + description: The Integration System User (ISU) username. + assertion: + type: string + title: '' + description: '' + automated: true + privateKey: + type: string + title: Private Key + description: The RSA private key (PEM format) used to sign the JWT. + secret: true + +workpath: + display_name: Workpath + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://connect.workpath.com/api + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v3/kpis + docs: https://nango.dev/docs/api-integrations/workpath + docs_connect: https://nango.dev/docs/api-integrations/workpath/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Workpath API Token. + doc_section: '#step-1-getting-your-api-token' + +wrike: + display_name: Wrike + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://login.wrike.com/oauth2/authorize/v4 + token_url: https://login.wrike.com/oauth2/token + scope_separator: ',' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + token_response_metadata: + - host + proxy: + base_url: https://${connectionConfig.host}/api/v4 + docs: https://nango.dev/docs/integrations/all/wrike + connection_config: + host: + type: string + title: Domain + description: The domain of your Wrike account + format: hostname + prefix: https:// + +wise-api-key: + display_name: Wise (API Key) + categories: + - banking + - payment + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.wise.com + verification: + method: GET + endpoints: + - /v1/profiles + docs: https://nango.dev/docs/api-integrations/wise-api-key + docs_connect: https://nango.dev/docs/api-integrations/wise-api-key/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Wise Personal API Token + example: 12345678-1234-1234-1234-123456789abc + pattern: '^[a-f0-9-]{36}$' + doc_section: '#step-1-generating-your-api-token' +xai: + display_name: xAI + categories: + - productivity + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.x.ai + headers: + authorization: Bearer ${apiKey} + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/api-key + docs: https://nango.dev/docs/integrations/all/xai + docs_connect: https://nango.dev/docs/integrations/all/xai/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your xAI account + example: xai-****************************************************** + pattern: 'xai-[A-Za-z0-9]+$' + doc_section: '#step-1-generating-your-api-key' + +xero: + display_name: Xero + categories: + - accounting + - popular + auth_mode: OAUTH2 + authorization_url: https://login.xero.com/identity/connect/authorize + token_url: https://identity.xero.com/connect/token + authorization_params: + response_type: code + default_scopes: + - offline_access + - openid + proxy: + base_url: https://api.xero.com + retry: + after: + - 'retry-after' + post_connection_script: xeroPostConnection + webhook_routing_script: xeroWebhookRouting + webhook_user_defined_secret: true + docs: https://nango.dev/docs/api-integrations/xero + setup_guide_url: https://nango.dev/docs/api-integrations/xero/how-to-register-your-own-xero-api-oauth-app + +xero-oauth2-cc: + display_name: Xero (Client Credentials) + categories: + - accounting + auth_mode: OAUTH2_CC + token_url: https://identity.xero.com/connect/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.xero.com + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/xero-oauth2-cc + docs_connect: https://nango.dev/docs/integrations/all/xero-oauth2-cc/connect + +yahoo: + display_name: Yahoo + categories: + - social + auth_mode: OAUTH2 + authorization_url: https://api.login.yahoo.com/oauth2/request_auth + token_url: https://api.login.yahoo.com/oauth2/get_token + proxy: + base_url: https://${connectionConfig.apiDomain} + docs: https://nango.dev/docs/integrations/all/yahoo + connection_config: + apiDomain: + type: string + title: API Domain + description: The domain to the API you want to connect to + format: hostname + example: fantasysports.yahooapis.com + prefix: https:// + +yotpo: + display_name: Yotpo + categories: + - e-commerce + auth_mode: TWO_STEP + proxy: + base_url: https://api.yotpo.com + headers: + x-yotpo-token: ${accessToken} + token_url: https://api.yotpo.com/core/v3/stores/${connectionConfig.storeId}/access_tokens + token_params: + secret: ${credentials.apiSecret} + token_headers: + content-type: application/json + token_response: + token: access_token + docs: https://nango.dev/docs/integrations/all/yotpo + docs_connect: https://nango.dev/docs/integrations/all/yotpo/connect + connection_config: + storeId: + type: string + title: App Key + description: Your Yotpo Store Key. + pattern: '^[A-Za-z0-9]{40}$' + doc_section: '#step-1-retrieving-your-app-key' + example: rvR3359XuCuuuEgCgcHNrQ9TE8zwC5dMzWMULHZm + order: 1 + credentials: + apiSecret: + type: string + title: Secret Key + description: Your Yotpo app's secret key. + secret: true + example: tHrwXaIBaWETHLRwxWaNktfYeEteyTcSjiNJY4IH + doc_section: '#step-2-generating-your-secret-key' + pattern: '^[A-Za-z0-9]{40}$' + +youcanbook-me: + display_name: YouCanBookMe + categories: + - productivity + auth_mode: BASIC + proxy: + base_url: https://api.youcanbook.me + connection_config: + subdomain: ${connectionConfig.subdomain} + verification: + method: GET + endpoints: + - /v1/profiles + docs: https://nango.dev/docs/api-integrations/youcanbook-me + docs_connect: https://nango.dev/docs/api-integrations/youcanbook-me/connect + credentials: + username: + type: string + title: Account ID + description: Your YouCanBookMe Account ID. + format: uuid + example: 78c3430e-21f5-483b-8e26-84cd6dabf7a6 + doc_section: '#step-1-finding-your-account-id-and-api-key' + password: + type: string + title: API Key + description: Your YouCanBookMe API key. + pattern: '^ak_[A-Za-z0-9_-]+$' + example: ak_xxxxxxxxxxxxxxxxxxxxx + secret: true + doc_section: '#step-1-finding-your-account-id-and-api-key' + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of your YouCanBookMe booking page. + example: mycompany + doc_section: '#step-2-finding-your-subdomain' + +yandex: + display_name: Yandex + categories: + - social + auth_mode: OAUTH2 + authorization_url: https://oauth.yandex.com/authorize + token_url: https://oauth.yandex.com/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://translate.yandex.net + docs: https://nango.dev/docs/integrations/all/yandex + +youtube: + display_name: YouTube + alias: google + categories: + - video + docs: https://nango.dev/docs/api-integrations/youtube + setup_guide_url: https://nango.dev/docs/api-integrations/youtube/how-to-register-your-own-youtube-api-oauth-app + +zapier: + display_name: Zapier + categories: + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://api.zapier.com/v2/authorize + token_url: https://zapier.com/oauth/token + disable_pkce: true + scope_separator: ' ' + proxy: + base_url: https://api.zapier.com + authorization_params: + response_type: code + response_mode: query + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + docs: https://nango.dev/docs/api-integrations/zapier + setup_guide_url: https://nango.dev/docs/api-integrations/zapier/how-to-register-your-own-zapier-oauth-app + +zapier-nla: + display_name: Zapier NLA + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://nla.zapier.com/oauth/authorize/ + token_url: https://nla.zapier.com/oauth/token/ + proxy: + base_url: https://nla.zapier.com + docs: https://nango.dev/docs/integrations/all/zapier-nla + +zapier-scim: + display_name: Zapier (SCIM API) + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://zapier.com/scim/v2 + headers: + authorization: Bearer ${apiKey} + accept: application/json, application/scim+json + content-type: application/json + retry: + after: + - 'retry-after' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /Users + docs: https://nango.dev/docs/integrations/all/zapier-scim + docs_connect: https://nango.dev/docs/integrations/all/zapier-scim/connect + credentials: + apiKey: + type: string + title: SCIM API Token + description: The SCIM API token generated from the Provision tab in your Zapier account. + doc_section: '#getting-your-scim-api-token' + +zendesk: + display_name: Zendesk + categories: + - popular + - support + - ticketing + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.zendesk.com/oauth/authorizations/new + token_url: https://${connectionConfig.subdomain}.zendesk.com/oauth/tokens + proxy: + base_url: https://${connectionConfig.subdomain}.zendesk.com + retry: + after: + - 'retry-after' + paginate: + type: link + limit_name_in_request: per_page + link_path_in_response_body: next_page + docs: https://nango.dev/docs/api-integrations/zendesk + setup_guide_url: https://nango.dev/docs/api-integrations/zendesk/how-to-register-your-own-zendesk-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/zendesk/connect + connection_config: + subdomain: + type: string + title: Zendesk Domain + description: The subdomain of your Zendesk account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .zendesk.com + prefix: https:// + doc_section: '#step-1-finding-your-subdomain' + +zendesk-api-key: + display_name: Zendesk (API Token) + categories: + - support + - ticketing + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.zendesk.com + headers: + authorization: 'Basic ${base64(${credentials.username}/token:${credentials.password})}' + retry: + after: + - 'retry-after' + verification: + method: GET + endpoints: + - /api/v2/users.json?per_page=1&page=1 + docs: https://nango.dev/docs/api-integrations/zendesk-api-key + docs_connect: https://nango.dev/docs/api-integrations/zendesk-api-key/connect + connection_config: + subdomain: + type: string + title: Zendesk Domain + description: The subdomain of your Zendesk account. + pattern: '^[a-z0-9_-]+$' + example: acme + suffix: .zendesk.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-subdomain' + credentials: + username: + type: string + title: Email Address + description: Your Zendesk account email address. + format: email + doc_section: '#step-3-generate-an-api-token' + password: + type: string + title: API Token + description: Your Zendesk API token. + example: 'SDMWuOoZ******************************9CMz' + pattern: '^[A-Za-z0-9]+$' + doc_section: '#step-3-generate-an-api-token' + +zendesk-sell: + display_name: Zendesk Sell + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://api.getbase.com/oauth2/authorize + token_url: https://api.getbase.com/oauth2/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.getbase.com + docs: https://nango.dev/docs/integrations/all/zendesk-sell + +zenefits: + display_name: Zenefits + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://secure.zenefits.com/oauth2/platform-authorize + token_url: https://secure.zenefits.com/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.zenefits.com + docs: https://nango.dev/docs/integrations/all/zenefits + +zigpoll: + display_name: Zigpoll + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://v1.zigpoll.com + headers: + authorization: ${apiKey} + verification: + method: GET + endpoints: + - /me + docs: https://nango.dev/docs/api-integrations/zigpoll + docs_connect: https://nango.dev/docs/api-integrations/zigpoll/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Zigpoll private API key. + format: uuid + example: 3f7b2d4e-****-****-****-************ + doc_section: '#step-1-get-your-api-token' + +zoho: + display_name: Zoho + categories: + - accounting + auth_mode: OAUTH2 + authorization_url: https://accounts.zoho.${connectionConfig.extension}/oauth/v2/auth || https://accounts.zoho.com/oauth/v2/auth + token_url: https://accounts.zoho.${connectionConfig.extension}/oauth/v2/token || ${connectionConfig.accounts-server}/oauth/v2/token + authorization_params: + prompt: consent + access_type: offline + redirect_uri_metadata: + - accounts-server + token_response_metadata: + - api_domain + proxy: + base_url: https://www.zohoapis.${connectionConfig.extension} || ${connectionConfig.api_domain} + paginate: + type: offset + response_path: data + offset_name_in_request: page + limit_name_in_request: per_page + post_connection_script: zohoPostConnection + docs: https://nango.dev/docs/integrations/all/zoho + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + accounts-server: + type: string + title: '' + description: '' + automated: true + +zoho-books: + display_name: Zoho Books + categories: + - accounting + alias: zoho + docs: https://nango.dev/docs/integrations/all/zoho-books + docs_connect: https://nango.dev/docs/integrations/all/zoho-books/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho Books account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + +zoho-crm: + display_name: Zoho CRM + categories: + - crm + alias: zoho + docs: https://nango.dev/docs/api-integrations/zoho-crm + setup_guide_url: https://nango.dev/docs/api-integrations/zoho-crm/how-to-register-your-own-zoho-crm-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/zoho-crm/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho CRM account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + +zoho-calendar: + display_name: Zoho Calendar + categories: + - productivity + alias: zoho + proxy: + base_url: https://calendar.zoho.com/api + docs: https://nango.dev/docs/integrations/all/zoho-calendar + docs_connect: https://nango.dev/docs/integrations/all/zoho-calendar/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho Calendar account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + +zoho-desk: + display_name: Zoho Desk + categories: + - support + - ticketing + alias: zoho + proxy: + base_url: https://desk.zoho.com/api + docs: https://nango.dev/docs/integrations/all/zoho-desk + docs_connect: https://nango.dev/docs/integrations/all/zoho-desk/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho Desk account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + +zoho-inventory: + display_name: Zoho Inventory + categories: + - e-commerce + alias: zoho + docs: https://nango.dev/docs/integrations/all/zoho-inventory + docs_connect: https://nango.dev/docs/integrations/all/zoho-inventory/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho Inventory account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + +zoho-invoice: + display_name: Zoho Invoice + categories: + - invoicing + alias: zoho + docs: https://nango.dev/docs/integrations/all/zoho-invoice + docs_connect: https://nango.dev/docs/integrations/all/zoho-invoice/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho Invoice account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + +zoho-mail: + display_name: Zoho Mail + categories: + - productivity + - communication + alias: zoho + proxy: + base_url: https://mail.zoho.${connectionConfig.extension} + docs: https://nango.dev/docs/integrations/all/zoho-mail + docs_connect: https://nango.dev/docs/integrations/all/zoho-mail/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho Mail account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + +zoho-bigin: + display_name: Zoho Bigin + categories: + - crm + alias: zoho + docs: https://nango.dev/docs/integrations/all/zoho-bigin + docs_connect: https://nango.dev/docs/integrations/all/zoho-bigin/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho Bigin account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + +zoho-people: + display_name: Zoho People + categories: + - hr + alias: zoho + proxy: + base_url: https://people.zoho.com + docs: https://nango.dev/docs/integrations/all/zoho-people + docs_connect: https://nango.dev/docs/integrations/all/zoho-people/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho People account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + +zoho-recruit: + display_name: Zoho Recruit + alias: zoho + categories: + - ats + proxy: + base_url: https://recruit.zoho.${connectionConfig.extension}/recruit + docs: https://nango.dev/docs/integrations/all/zoho-recruit + docs_connect: https://nango.dev/docs/integrations/all/zoho-recruit/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho Recruit account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + +zoom: + display_name: Zoom + categories: + - video + auth_mode: OAUTH2 + authorization_url: https://zoom.us/oauth/authorize + token_url: https://zoom.us/oauth/token + scope_separator: ',' + authorization_params: + response_type: code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.zoom.us/v2 + paginate: + type: cursor + cursor_path_in_response: next_page_token + cursor_name_in_request: next_page_token + limit_name_in_request: page_size + docs: https://nango.dev/docs/api-integrations/zoom + setup_guide_url: https://nango.dev/docs/api-integrations/zoom/how-to-register-your-own-zoom-api-oauth-app + +zoominfo: + display_name: ZoomInfo + categories: + - crm + - marketing + auth_mode: OAUTH2_CC + proxy: + retry: + after: + - 'x-ratelimit-reset' + base_url: https://api.zoominfo.com + token_url: https://api.zoominfo.com/authenticate + token_request_auth_method: custom + body_format: json + docs: https://nango.dev/docs/integrations/all/zoominfo + docs_connect: https://nango.dev/docs/integrations/all/zoominfo/connect + +snipe-it: + display_name: Snipe-IT + categories: + - productivity + - other + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.hostname}/api/ + headers: + authorization: Bearer ${apiKey} + accept: application/json + content-type: application/json + credentials_verification_script: snipeItCredentialsVerification + docs: https://nango.dev/docs/integrations/all/snipe-it + docs_connect: https://nango.dev/docs/integrations/all/snipe-it/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Snipe-IT API token + doc_section: '#step-1-create-an-api-token' + pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' + connection_config: + hostname: + type: string + title: Domain + format: hostname + description: Your Snipe-IT hostname (e.g., yourcompany) + example: yourcompany + suffix: .snipe-it.io + prefix: https:// + doc_section: '#step-2-finding-your-domain' + order: 1 + +zorus: + display_name: Zorus + categories: + - other + auth_mode: API_KEY + proxy: + base_url: https://developer.zorustech.com + headers: + authorization: Impersonation ${apiKey} + zorus-api-version: '1.0' + verification: + method: POST + headers: + content-type: application/json + endpoints: + - /api/customers/search + data: { 'page': 1, 'pageSize': 1 } + docs: https://nango.dev/docs/api-integrations/zorus + docs_connect: https://nango.dev/docs/api-integrations/zorus/connect + credentials: + apiKey: + type: string + title: API Token + description: The API token generated from the Zorus Portal. + doc_section: '#step-1-generating-your-api-token' + example: 1_a1b2c3d4-e5f6-7890-abcd-1234567890ab + pattern: '^[0-9]+_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$' + +zuora: + display_name: Zuora + categories: + - erp + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.subdomain}.zuora.com/oauth/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.subdomain}.zuora.com + retry: + after: + - 'ratelimit-reset' + docs: https://nango.dev/docs/integrations/all/zuora + docs_connect: https://nango.dev/docs/integrations/all/zuora/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The Subdomain to your Zuora Base URL + suffix: .zuora.com + prefix: https:// + example: rest.test + doc_section: '#step-1-finding-your-zuora-subdomain' + order: 1 From 01baa8b7980f2011deafb61a8218d1887835f526 Mon Sep 17 00:00:00 2001 From: Sameersribot Date: Tue, 7 Jul 2026 18:25:33 +0530 Subject: [PATCH 4/8] fix(integrations): restore LF line endings in providers.yaml Previous commit introduced CRLF (edit tool under autocrlf=false). Restore LF to match repo convention and keep the PR diff clean. --- packages/providers/providers.yaml | 47962 ++++++++++++++-------------- 1 file changed, 23981 insertions(+), 23981 deletions(-) diff --git a/packages/providers/providers.yaml b/packages/providers/providers.yaml index b2d81f2a6b..4072dbb272 100644 --- a/packages/providers/providers.yaml +++ b/packages/providers/providers.yaml @@ -1,23981 +1,23981 @@ -# yaml-language-server: $schema=./../../scripts/validation/providers/schema.json -1password-events: - display_name: 1Password (Events API) - categories: - - iam - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.domain} - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /api/v2/auth/introspect - docs: https://nango.dev/docs/api-integrations/1password-events - docs_connect: https://nango.dev/docs/api-integrations/1password-events/connect - connection_config: - domain: - type: string - title: Events API Domain - description: The regional Events API domain for your 1Password account. - order: 1 - enum: - - events.1password.com - - events.1password.ca - - events.1password.eu - credentials: - apiKey: - type: string - title: Bearer Token - description: Your 1Password Events Reporting bearer token - pattern: '^eyJ[a-zA-Z0-9_-]+\.ey[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+$' - example: eyJhbGciOiJF*************.*************CJ9.eyJ**************************************************.*********** - doc_section: '#step-2-generate-a-bearer-token' - -1password-scim: - display_name: 1Password (SCIM) - categories: - - iam - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.domain}/scim - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /Users - docs: https://nango.dev/docs/integrations/all/1password-scim - docs_connect: https://nango.dev/docs/integrations/all/1password-scim/connect - connection_config: - domain: - type: string - title: 1Password SCIM Bridge URL - description: The domain for your 1Password SCIM Bridge. Note this URL is a service hosted in your infrastructure so needs to be setup already by your IT team. Please see the instructions for more info. - example: scim.example.com - pattern: '^[a-zA-Z0-9.-]+$' - prefix: https:// - doc_section: '#step-2-get-your-scim-bridge-url' - credentials: - apiKey: - type: string - title: API Key - description: Your 1Password SCIM API Key - secret: true - doc_section: '#step-1-retrieve-your-1password-scim-api-key' - -1password-users: - display_name: 1Password (Users API) - categories: - - iam - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.domain}/v1beta1/users/oauth2/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.domain}/v1beta1/accounts/${connectionConfig.accountId} - docs: https://nango.dev/docs/api-integrations/1password-users - docs_connect: https://nango.dev/docs/api-integrations/1password-users/connect - connection_config: - domain: - type: string - title: API Domain - description: The regional API domain for your 1Password account. - enum: - - api.1password.com - - api.1password.ca - - api.1password.eu - order: 1 - accountId: - type: string - title: Account ID - description: Your 1Password account ID. - example: XLQMR47VZPBKJHSGWNCYFDE3T9 - pattern: '^[A-Z0-9]{26}$' - order: 2 - credentials: - client_id: - type: string - title: Client ID - description: Your 1Password OAuth application Client ID. - format: uuid - example: 5ab87915-2deb-429c-a1e2-8b0495900f45 - doc_section: '#step-3-obtain-your-client-credentials' - client_secret: - type: string - title: Client Secret - description: Your 1Password OAuth application Client Secret. - secret: true - doc_section: '#step-3-obtain-your-client-credentials' - -3cx: - display_name: 3CX - categories: - - communication - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.domain}/connect/token - token_params: - client_id: ${credentials.clientId} - client_secret: ${credentials.clientSecret} - grant_type: client_credentials - token_headers: - content-type: application/x-www-form-urlencoded - accept: application/json - token_response: - token: access_token - token_expires_in_ms: 3600000 - proxy: - base_url: https://${connectionConfig.domain}/xapi - docs: https://nango.dev/docs/api-integrations/3cx - docs_connect: https://nango.dev/docs/api-integrations/3cx/connect - credentials: - clientId: - type: string - title: Client ID - description: The Client ID from your 3CX API integration - doc_section: '#step-2-create-api-integration' - clientSecret: - type: string - title: API Key - description: The API Key generated when creating your 3CX API integration - secret: true - doc_section: '#step-2-create-api-integration' - connection_config: - domain: - type: string - title: 3CX Domain - description: Your 3CX instance domain - example: mycompany.3cx.us - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-1-find-your-3cx-domain' - -8x8: - display_name: 8x8 - categories: - - communication - auth_mode: OAUTH2_CC - token_url: https://api.8x8.com/oauth/v2/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.8x8.com - docs: https://nango.dev/docs/api-integrations/8x8 - docs_connect: https://nango.dev/docs/api-integrations/8x8/connect - credentials: - client_id: - type: string - title: Client ID - description: Your 8x8 API Client ID from the Admin Console - doc_section: '#step-1-obtaining-your-client-credentials' - client_secret: - type: string - title: Client Secret - description: Your 8x8 API Client Secret from the Admin Console - secret: true - doc_section: '#step-1-obtaining-your-client-credentials' - -absorb-lms: - display_name: Absorb LMS - categories: - - other - auth_mode: OAUTH2 - disable_pkce: true - authorization_url: https://${connectionConfig.portalRoute}/oauth/authorize - token_url: https://${connectionConfig.portalRoute}/oauth/token - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - authorization_params: - response_type: code - proxy: - base_url: https://${connectionConfig.portalRoute} - headers: - x-api-version: ${connectionConfig.apiVersion} - x-api-key: ${connectionConfig.restApiKey} - docs: https://nango.dev/docs/api-integrations/absorb-lms - docs_connect: https://nango.dev/docs/api-integrations/absorb-lms/connect - setup_guide_url: https://nango.dev/docs/api-integrations/absorb-lms/how-to-register-your-own-absorb-lms-api-oauth-app - connection_config: - portalRoute: - type: string - title: Hostname - description: The hostname of your Absorb LMS portal. - example: mycompany.myabsorb.com - prefix: https:// - format: hostname - order: 1 - doc_section: '#step-1-finding-your-portal-route' - restApiKey: - type: string - title: REST API Key - description: Your Absorb LMS REST API Private Key. - secret: true - order: 2 - doc_section: '#step-2-finding-your-rest-api-key' - apiVersion: - type: string - title: '' - description: '' - default_value: 'v1' - hidden: true - -accelo: - display_name: Accelo - categories: - - invoicing - - ticketing - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.api.accelo.com/oauth2/v0/authorize - token_url: https://${connectionConfig.subdomain}.api.accelo.com/oauth2/v0/token - scope_separator: ',' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.api.accelo.com - docs: https://nango.dev/docs/api-integrations/accelo - setup_guide_url: https://nango.dev/docs/api-integrations/accelo/how-to-register-your-own-accelo-api-oauth-app - connection_config: - subdomain: - type: string - title: Accelo Domain - description: The subdomain of your Accelo account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .api.accelo.com - prefix: https:// - -active-campaign: - display_name: ActiveCampaign - categories: - - marketing - - communication - auth_mode: API_KEY - proxy: - headers: - api-token: ${apiKey} - base_url: https://${connectionConfig.hostname}/api - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /3/users/me - docs: https://nango.dev/docs/integrations/all/active-campaign - docs_connect: https://nango.dev/docs/integrations/all/active-campaign/connect - connection_config: - hostname: - type: string - title: Hostname - description: The Hostname for your ActiveCampaign account - format: hostname - prefix: https:// - example: company.activehosted.com - doc_section: '#step-1-finding-your-hostname' - order: 1 - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your ActiveCampaign account - pattern: '^[a-f0-9]{72}$' - example: b4f1a7c9d8e56320a9db472fe6c8351f2e0a4d98b7f6c3e5d9a2f4701b3e8d6c3455abbe - doc_section: '#step-2-finding-your-api-key' - -acuity-scheduling: - display_name: Acuity Scheduling - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://acuityscheduling.com/oauth2/authorize - token_url: https://acuityscheduling.com/oauth2/token - default_scopes: - - api-v1 - proxy: - base_url: https://acuityscheduling.com/api/v1 - docs: https://nango.dev/docs/integrations/all/acuity-scheduling - -acumatica: - display_name: Acumatica - categories: - - erp - - accounting - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.instanceUrl}/identity/connect/token - token_params: - grant_type: password - username: ${connectionConfig.username} - password: ${connectionConfig.password} - proxy: - base_url: https://${connectionConfig.instanceUrl} - docs: https://nango.dev/docs/api-integrations/acumatica - docs_connect: https://nango.dev/docs/api-integrations/acumatica/connect - setup_guide_url: https://nango.dev/docs/api-integrations/acumatica/connect - connection_config: - instanceUrl: - type: string - title: Instance URL - description: The hostname of your Acumatica ERP instance. - format: hostname - example: mycompany.acumatica.com - prefix: https:// - doc_section: '#step-6-identify-your-instance-url' - order: 1 - username: - type: string - title: Username - description: The username of an Acumatica ERP user. - doc_section: '#step-7-enter-credentials-in-the-connect-ui' - order: 2 - password: - type: string - title: Password - description: The password for the specified Acumatica ERP username. - secret: true - doc_section: '#step-7-enter-credentials-in-the-connect-ui' - order: 3 - credentials: - client_id: - type: string - title: Client ID - description: The client ID assigned to your application, including the tenant suffix. - example: 88358B02-A48D-A50E-F710-39C1636C30F6@MyTenant - doc_section: '#step-5-save-to-activate' - client_secret: - type: string - title: Client Secret - description: The client secret created for your application in Acumatica ERP. - secret: true - doc_section: '#step-3-add-a-client-secret' - -addepar: - display_name: Addepar (OAuth) - categories: - - analytics - auth_mode: OAUTH2 - authorization_url: https://id.addepar.com/oauth2/authorize - disable_pkce: true - token_url: https://api.addepar.com/public/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - headers: - addepar-firm: ${connectionConfig.firmId} - retry: - after: - - 'x-ratelimit-retry-after' - base_url: https://api.addepar.com - docs: https://nango.dev/docs/integrations/all/addepar - docs_connect: https://nango.dev/docs/integrations/all/addepar/connect - connection_config: - firmId: - type: string - title: Firm ID - description: Your Addepar Firm ID - pattern: '^[0-9]+$' - doc_section: '#step-1-finding-your-firm-id' - -addepar-basic: - display_name: Addepar (Basic Auth) - categories: - - analytics - auth_mode: BASIC - proxy: - headers: - addepar-firm: ${connectionConfig.firmId} - retry: - after: - - 'x-ratelimit-retry-after' - base_url: https://${connectionConfig.subdomain}.addepar.com/api - docs: https://nango.dev/docs/integrations/all/addepar-basic - docs_connect: https://nango.dev/docs/integrations/all/addepar-basic/connect - credentials: - username: - type: string - title: API Key - description: Your Addepar API Key - example: 5ab87915-2deb-429c-a1e2-8b0495900f45 - format: uuid - doc_section: '#step-4-generating-an-api-key-and-secret' - password: - type: string - title: API Secret - description: Your Addepar API Secret - example: zidcISqfSGh05JsWwuY9ZdSCkXrhANHvCX0U0gkE - pattern: '^[A-Za-z0-9]{40}$' - doc_section: '#step-4-generating-an-api-key-and-secret' - connection_config: - subdomain: - type: string - title: Firm Domain - description: Your Addepar Firm domain - pattern: '^[a-z0-9_-]+$' - example: myfirm - order: 1 - doc_section: '#step-1-finding-your-firm-domain' - firmId: - type: string - title: Firm ID - description: Your Addepar Firm ID - pattern: '^[0-9]+$' - order: 2 - doc_section: '#step-2-finding-your-firm-id' - -adobe: - display_name: Adobe - categories: - - design - auth_mode: OAUTH2 - authorization_url: https://ims-na1.adobelogin.com/ims/authorize/v2 - token_url: https://ims-na1.adobelogin.com/ims/token/v3 - default_scopes: - - offline_access - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://ims-na1.adobelogin.com/ims - docs: https://nango.dev/docs/integrations/all/adobe - -adobe-umapi: - display_name: UMAPI (Adobe User Management API) - categories: - - other - auth_mode: OAUTH2_CC - token_url: https://ims-na1.adobelogin.com/ims/token/v2 - scope_separator: ',' - token_params: - grant_type: client_credentials - proxy: - headers: - x-api-key: ${connectionConfig.clientId} - retry: - after: - - 'retry-after' - base_url: https://usermanagement.adobe.io - docs: https://nango.dev/docs/integrations/all/adobe-umapi - post_connection_script: adobeUmapiPostConnection - docs_connect: https://nango.dev/docs/integrations/all/adobe-umapi/connect - connection_config: - clientId: - type: string - title: '' - description: '' - automated: true - -adobe-workfront: - display_name: Adobe Workfront - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.hostname}/integrations/oauth2/authorize - token_url: https://${connectionConfig.hostname}/integrations/oauth2/api/v1/token - authorization_method: header - body_format: json - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.hostname}/attask/api - docs: https://nango.dev/docs/integrations/all/adobe-workfront - docs_connect: https://nango.dev/docs/integrations/all/adobe-workfront/connect - connection_config: - hostname: - type: string - title: Hostname - prefix: https:// - pattern: '^[a-zA-Z0-9-]+\.my\.workfront(\.adobe)?\.com$' - description: The hostname of your Adobe Workfront account - example: acme.my.workfront.com - -adobe-commerce: - display_name: Adobe Commerce - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.storeDomain}/rest/${connectionConfig.storeCode} - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/api-integrations/adobe-commerce - docs_connect: https://nango.dev/docs/api-integrations/adobe-commerce/connect - connection_config: - storeDomain: - type: string - title: Store Domain - description: The domain of your Adobe Commerce store - format: hostname - prefix: https:// - example: yourstore.com - doc_section: '#step-1-finding-your-store-domain' - order: 1 - storeCode: - type: string - title: Store Code - description: The store code for your Adobe Commerce store - example: default - doc_section: '#step-2-finding-your-store-code' - order: 2 - credentials: - apiKey: - type: string - title: Access Token - example: 3pgsytnpxbyz0waujkw9qllcjb79s379 - pattern: '^[a-z0-9]{32}$' - description: Your Adobe Commerce access token - doc_section: '#step-3-obtaining-your-access-token' - -adp: - display_name: ADP - auth_mode: OAUTH2_CC - categories: - - hr - proxy: - base_url: https://api.adp.com - token_url: https://accounts.adp.com/auth/oauth/v2/token - token_params: - grant_type: client_credentials - require_client_certificate: true - docs: https://nango.dev/docs/integrations/all/adp - docs_connect: https://nango.dev/docs/integrations/all/adp/connect - credentials: - client_certificate: - type: string - title: Client Public Certificate - description: The public certificate (in PEM format) used for Mutual TLS (mTLS) authentication. - example: '-----BEGIN CERTIFICATE-----\\nMIIDdzCCAl+gAwIBAgIEUzZrZDANBgkqhkiG9w0BAQsFADBv\\n...\\n-----END CERTIFICATE-----' - pattern: '^-----BEGIN CERTIFICATE-----\s*([A-Za-z0-9+/=\s]+)\s*-----END CERTIFICATE-----$' - secret: true - doc_section: '#step-2-generating-the-private-key-and-certificate-signing-request' - client_private_key: - type: string - title: Client Private Key - description: The private key (in PEM format) associated with the client certificate, - example: '-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASC...\\n-----END PRIVATE KEY-----' - pattern: '^-----BEGIN PRIVATE KEY-----\s*([A-Za-z0-9+/=\s]+)\s*-----END PRIVATE KEY-----$' - secret: true - doc_section: '#step-2-generating-the-private-key-and-certificate-signing-request' - -adp-lyric: - alias: adp - display_name: ADP Lyric - categories: - - hr - docs: https://nango.dev/docs/integrations/all/adp-lyric - docs_connect: https://nango.dev/docs/integrations/all/adp-lyric/connect - -adp-run: - alias: adp - display_name: RUN Powered by ADP - categories: - - hr - docs: https://nango.dev/docs/integrations/all/adp-run - docs_connect: https://nango.dev/docs/integrations/all/adp-run/connect - -adp-workforce-now: - alias: adp - display_name: ADP Workforce Now - categories: - - hr - docs: https://nango.dev/docs/integrations/all/adp-workforce-now - docs_connect: https://nango.dev/docs/integrations/all/adp-workforce-now/connect - -adp-workforce-now-next-gen: - alias: adp - display_name: ADP Workforce Now Next Generation - categories: - - hr - docs: https://nango.dev/docs/integrations/all/adp-workforce-now-next-gen - docs_connect: https://nango.dev/docs/integrations/all/adp-workforce-now-next-gen/connect - -adyen: - display_name: Adyen - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://ca-${connectionConfig.environment}.adyen.com/ca/ca/oauth/connect.shtml - token_url: https://oauth-${connectionConfig.environment}.adyen.com/v1/token - scope_separator: ' ' - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.resource}-${connectionConfig.environment}.adyen.com - docs: https://nango.dev/docs/integrations/all/adyen - connection_config: - environment: - type: string - title: Environment - description: The environment to use. - enum: - - live - - test - resource: - type: string - title: Resource - description: The resource to use for your various requests - pattern: '^[a-z0-9_-]+$' - example: kyc - suffix: -(live|test).adyen.com - prefix: https:// - -adyntel: - display_name: Adyntel - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.adyntel.com - body: - api_key: ${apiKey} - email: ${connectionConfig.email} - verification: - method: POST - endpoints: - - /domain-keywords - headers: - content-type: application/json - data: - company_domain: example.com - docs: https://nango.dev/docs/api-integrations/adyntel - docs_connect: https://nango.dev/docs/api-integrations/adyntel/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key from your Adyntel dashboard. - example: hd-f66446a8**************-6 - pattern: '^hd-[a-f0-9]+-[a-z0-9]+$' - doc_section: '#step-1-obtain-your-api-key' - connection_config: - email: - type: string - title: Email - description: The login email address for your Adyntel account. - format: email - example: you@company.com - doc_section: '#step-2-find-your-email-address' - -ahrefs: - display_name: Ahrefs - categories: - - marketing - - analytics - auth_mode: OAUTH2 - authorization_url: https://app.ahrefs.com/web/oauth/authorize - token_url: https://ahrefs.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - body_format: form - proxy: - base_url: https://api.ahrefs.com - docs: https://nango.dev/docs/api-integrations/ahrefs - setup_guide_url: https://nango.dev/docs/api-integrations/ahrefs/how-to-register-your-own-ahrefs-api-oauth-app - -affinity: - display_name: Affinity (v1) - categories: - - crm - auth_mode: BASIC - proxy: - base_url: https://api.affinity.co - verification: - method: GET - endpoints: - - /auth/whoami - retry: - at: - - 'x-ratelimit-limit-user' - - 'x-ratelimit-limit-org-reset' - webhook_routing_script: affinityWebhookRouting - docs: https://nango.dev/docs/integrations/all/affinity - docs_connect: https://nango.dev/docs/integrations/all/affinity/connect - credentials: - username: - type: string - title: '' - description: '' - default_value: '' - hidden: true - password: - type: string - title: API Key - description: Your Affinity API Key - pattern: '^[A-Za-z0-9_-]+$' - example: 'nrlW2KR5m-qUCA-rTqKb_EUK1swERlenqn70KNMMrTM' - # https://api-docs.affinity.co/#introduction - # Affinity v1 uses basic auth with an api key - doc_section: '#step-1-generating-your-api-key' - -affinity-v2: - display_name: Affinity (v2) - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.affinity.co - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v2/auth/whoami - retry: - at: - - 'x-ratelimit-limit-user' - - 'x-ratelimit-limit-org-reset' - docs: https://nango.dev/docs/integrations/all/affinity-v2 - docs_connect: https://nango.dev/docs/integrations/all/affinity-v2/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Affinity account - pattern: '^[A-Za-z0-9_-]+$' - example: 'nrlW2KR5m-qUCA-rTqKb_EUK1swERlenqn70KNMMrTM' - doc_section: '#step-1-generating-your-api-key' - -agentline: - display_name: AgentLine - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://api.agentline.cloud - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v1/agents - docs: https://nango.dev/docs/api-integrations/agentline - docs_connect: https://nango.dev/docs/api-integrations/agentline/connect - credentials: - apiKey: - type: string - title: API Key - description: Your AgentLine API key. - pattern: '^sk_live_[a-zA-Z0-9_]+$' - doc_section: '#step-1-finding-your-api-key' - -agiloft: - display_name: Agiloft - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.hostname}/ewws/oauth - token_url: https://${connectionConfig.hostname}/ewws/otoken - token_params: - grant_type: authorization_code - proxy: - base_url: https://${connectionConfig.hostname} - docs: https://nango.dev/docs/api-integrations/agiloft - docs_connect: https://nango.dev/docs/api-integrations/agiloft/connect - setup_guide_url: https://nango.dev/docs/api-integrations/agiloft/how-to-register-your-own-agiloft-api-oauth-app - connection_config: - hostname: - type: string - title: Hostname - description: The hostname of your Agiloft instance. - format: hostname - prefix: https:// - example: example.agiloft.com - order: 1 - doc_section: '#step-1-find-your-hostname' - -agiloft-cc: - display_name: Agiloft (Client Credentials) - categories: - - productivity - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.hostname}/ewws/otoken - body_format: form - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.hostname} - docs: https://nango.dev/docs/api-integrations/agiloft-cc - docs_connect: https://nango.dev/docs/api-integrations/agiloft-cc/connect - connection_config: - hostname: - type: string - title: Hostname - description: The hostname of your Agiloft instance. - format: hostname - prefix: https:// - example: example.agiloft.com - order: 1 - doc_section: '#step-2-find-your-hostname' - credentials: - client_id: - type: string - title: Client ID - description: The Client ID from your Agiloft API application settings. - doc_section: '#step-1-create-an-api-application-and-get-your-credentials' - client_secret: - type: string - title: Client Secret - description: The Client Secret from your Agiloft API application settings. - secret: true - doc_section: '#step-1-create-an-api-application-and-get-your-credentials' - -aimfox: - display_name: Aimfox - categories: - - surveys - auth_mode: API_KEY - proxy: - base_url: https://api.aimfox.com/api - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v2/campaigns - docs: https://nango.dev/docs/integrations/all/aimfox - docs_connect: https://nango.dev/docs/integrations/all/aimfox/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Aimfox account - format: uuid - example: 123e4567-e89b-12d3-a456-426614174000 - doc_section: '#step-1-generating-your-api-key' - -aimfox-oauth: - display_name: Aimfox (OAuth) - categories: - - surveys - auth_mode: OAUTH2 - authorization_url: https://id.aimfox.com/realms/aimfox-prod/protocol/openid-connect/auth - token_url: https://id.aimfox.com/realms/aimfox-prod/protocol/openid-connect/token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.aimfox.com/api - docs: https://nango.dev/docs/integrations/all/aimfox-oauth - -aircall: - display_name: Aircall (OAuth) - categories: - - support - auth_mode: OAUTH2 - authorization_url: https://dashboard.aircall.io/oauth/authorize - token_url: https://api.aircall.io/v1/oauth/token - authorization_params: - response_type: code - scope: public_api - token_params: - grant_type: authorization_code - proxy: - base_url: https://api.aircall.io - retry: - at: - - 'x-aircallapi-reset' - paginate: - type: link - link_path_in_response_body: meta.next_page_link - response_path: results - docs: https://nango.dev/docs/integrations/all/aircall - -aircall-basic: - alias: aircall - display_name: Aircall (Basic Auth) - categories: - - support - auth_mode: BASIC - proxy: - base_url: https://api.aircall.io - retry: - at: - - 'x-aircallapi-reset' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/ping - paginate: - type: link - link_path_in_response_body: meta.next_page_link - response_path: results - docs_connect: https://nango.dev/docs/integrations/all/aircall-basic/connect - docs: https://nango.dev/docs/integrations/all/aircall-basic - credentials: - username: - type: string - title: API ID - description: The Application ID (API ID) for your Aircall account - pattern: '^[a-zA-Z0-9_-]+$' - doc_section: '#step-1-finding-your-admin-api-key-api-token-and-application-id-api-id' - password: - type: string - title: API Token - description: The Admin API Key (API Token) for your Aircall account - pattern: '^[a-zA-Z0-9_-]+$' - secret: true - doc_section: '#step-1-finding-your-admin-api-key-api-token-and-application-id-api-id' -airtable: - display_name: Airtable - categories: - - popular - - productivity - auth_mode: OAUTH2 - authorization_url: https://airtable.com/oauth2/v1/authorize - token_url: https://airtable.com/oauth2/v1/token - authorization_method: header - auth: - response_type: code - proxy: - base_url: https://api.airtable.com - webhook_routing_script: airtableWebhookRouting - docs: https://nango.dev/docs/api-integrations/airtable - setup_guide_url: https://nango.dev/docs/api-integrations/airtable/how-to-register-your-own-airtable-api-oauth-app - -airtable-pat: - display_name: Airtable (Personal Access Token) - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.airtable.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/airtable-pat - docs_connect: https://nango.dev/docs/integrations/all/airtable-pat/connect - credentials: - apiKey: - type: string - title: Personal Access Token - description: The Personal Access Token for your Airtable account - example: 'patoXxYzA1B2C3D4Ef.98a7b6c5d4e3f2g1h0i9j8k7l6m5n4o3p2q1r0s9t8u7v6w5x4y3z2a1b0cdef' - pattern: '^[a-zA-Z0-9\.]+$' - doc_section: '#step-1-generating-your-personal-access-token' - -autodesk: - display_name: Autodesk - categories: - - design - auth_mode: OAUTH2 - authorization_url: https://developer.api.autodesk.com/authentication/v2/authorize - token_url: https://developer.api.autodesk.com/authentication/v2/token - scope_separator: ' ' - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://developer.api.autodesk.com - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/autodesk - -autotask: - display_name: AutoTask - categories: - - support - - ticketing - auth_mode: API_KEY - webhook_routing_script: autotaskWebhookRouting - webhook_user_defined_secret: true - proxy: - base_url: https://${connectionConfig.subdomain}.autotask.net/atservicesrest - headers: - apiintegrationcode: ${connectionConfig.apiIntegrationCode} - username: ${connectionConfig.username} - secret: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1.0/Companies/entityinformation - docs: https://nango.dev/docs/integrations/all/autotask - docs_connect: https://nango.dev/docs/integrations/all/autotask/connect - connection_config: - subdomain: - type: string - title: AutoTask API Zone - description: The zone subdomain for your Autotask instance (e.g., webservices3, webservices1, etc.) - example: webservices3 - doc_section: '#step-1-finding-your-autotask-api-zone' - apiIntegrationCode: - type: string - title: API Integration Code - description: The tracking identifier assigned to your API-only user (27-character string) - example: ASHJKLFDKAHKASLFH85LSA905H - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-3-configure-the-api-user' - username: - type: string - title: API Username - description: The email address of your API-only user account - example: apiuser@example.com - format: email - doc_section: '#step-3-configure-the-api-user' - credentials: - apiKey: - type: string - title: API Secret - pattern: '^[A-Za-z0-9@#$~*]+$' - description: The secret for your API-only user account - doc_section: '#step-4-generate-api-secret' - -algolia: - display_name: Algolia - categories: - - search - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.APP_ID}.algolia.net - headers: - x-algolia-application-id: ${connectionConfig.APP_ID} - x-algolia-api-key: ${apiKey} - verification: - headers: - content-type: application/json - endpoints: - - /1/keys/${credentials.apiKey} - docs: https://nango.dev/docs/integrations/all/algolia - docs_connect: https://nango.dev/docs/integrations/all/algolia/connect - connection_config: - APP_ID: - type: string - title: Application ID - description: The application ID for your Algolia account - example: ERBSOWZO32 - pattern: '^[A-Z0-9]{10}$' - order: 1 - doc_section: '#step-1-finding-your-application-id' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Algolia account - example: c5c28261f9ade4e34891ccf761491b94 - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-2-finding-your-admin-api-key' - -altrata: - display_name: Altrata - categories: - - analytics - auth_mode: TWO_STEP - token_url: https://api-auth.altrata.com/oauth2/token?grant_type=client_credentials - body_format: form - token_headers: - authorization: Basic ${base64(${credentials.username}:${credentials.password})} - x-api-key: ${credentials.apiKey} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://${connectionConfig.hostname} - headers: - x-api-key: ${credentials.apiKey} - docs: https://nango.dev/docs/api-integrations/altrata - docs_connect: https://nango.dev/docs/api-integrations/altrata/connect - connection_config: - hostname: - type: string - title: Service Hostname - description: The Altrata service hostname to connect to. - example: events.altrata.com - format: hostname - pattern: '^(matching|profile|events|relationships)\.altrata\.com$' - order: 1 - doc_section: '#step-2-choose-a-service-hostname' - credentials: - apiKey: - type: string - title: API Key - description: Your Altrata API key. - secret: true - example: mN3pQv8wLc2jXs5rKt4bGy6uFd1eAh7Z******* - pattern: '^[A-Za-z0-9]+$' - doc_section: '#step-1-obtain-your-credentials' - username: - type: string - title: Username - description: Your Altrata account username. - example: john_doe - doc_section: '#step-1-obtain-your-credentials' - password: - type: string - title: Password - description: Your Altrata account password. - secret: true - doc_section: '#step-1-obtain-your-credentials' - -amazon: - display_name: Amazon - categories: - - dev-tools - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://www.amazon.com/ap/oa - token_url: https://api.amazon.${connectionConfig.extension}/auth/o2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.amazon.com - docs: https://nango.dev/docs/api-integrations/amazon - setup_guide_url: https://nango.dev/docs/api-integrations/amazon/how-to-register-your-own-amazon-api-oauth-app - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension for your Amazon account - example: com - pattern: '^[a-z.]+$' - -amazon-selling-partner: - display_name: Amazon Selling Partner - categories: - - dev-tools - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.domain}/apps/authorize/consent - token_url: https://api.amazon.com/auth/o2/token - authorization_code_param_in_callback: spapi_oauth_code - disable_pkce: true - authorization_params: - application_id: ${connectionConfig.applicationId} - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - redirect_uri_metadata: - - selling_partner_id - proxy: - base_url: https://${connectionConfig.subdomain}-${connectionConfig.region}.amazon.com || https://sellingpartnerapi-${connectionConfig.region}.amazon.com - headers: - x-amz-access-token: ${accessToken} - docs: https://nango.dev/docs/api-integrations/amazon-selling-partner - docs_connect: https://nango.dev/docs/api-integrations/amazon-selling-partner/connect - setup_guide_url: https://nango.dev/docs/api-integrations/amazon-selling-partner/how-to-register-your-own-amazon-selling-partner-api-oauth-app - connection_config: - applicationId: - type: string - title: Application ID - description: The unique identifier for your Amazon Selling Partner application. - example: 'amzn1.sellerapps.app.0bf296b5-36a6-4942-a13e-EXAMPLEfcd28' - pattern: '^[a-zA-Z0-9.-]+$' - doc_section: '#step-1-finding-your-app-id' - order: 1 - domain: - type: string - title: Authorization Domain - description: The domain representing the Amazon platform you are integrating with. - example: sellercentral.amazon.com - pattern: '^[a-z0-9.-]+\.amazon\.[a-z.]+$' - prefix: https:// - suffix: /apps - doc_section: '#step-2-finding-your-authorization-domain' - order: 2 - subdomain: - type: string - title: Proxy BaseUrl Subdomain - description: The subdomain prefix for the Amazon Selling Partner API endpoint. - doc_section: '#step-3-finding-your-proxy-baseurl-subdomain' - order: 3 - enum: - - sellingpartnerapi - - sandbox.sellingpartnerapi - region: - type: string - title: Proxy BaseUrl Region - description: The geographical region associated with the Amazon marketplace. - enum: - - na - - eu - - fe - doc_section: '#step-4-finding-your-proxy-baseurl-region' - order: 4 - -amazon-selling-partner-beta: - display_name: Amazon Selling Partner (Beta) - categories: - - dev-tools - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.domain}/apps/authorize/consent - token_url: https://api.amazon.com/auth/o2/token - authorization_code_param_in_callback: spapi_oauth_code - disable_pkce: true - authorization_params: - application_id: ${connectionConfig.applicationId} - version: beta - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - redirect_uri_metadata: - - selling_partner_id - proxy: - base_url: https://sandbox.sellingpartnerapi-${connectionConfig.region}.amazon.com - headers: - x-amz-access-token: ${accessToken} - docs: https://nango.dev/docs/api-integrations/amazon-selling-partner-beta - docs_connect: https://nango.dev/docs/api-integrations/amazon-selling-partner-beta/connect - setup_guide_url: https://nango.dev/docs/api-integrations/amazon-selling-partner-beta/how-to-register-your-own-amazon-selling-partner-beta-api-oauth-app - connection_config: - applicationId: - type: string - title: Application ID - description: The unique identifier for your Amazon Selling Partner application. - example: 'amzn1.sellerapps.app.0bf296b5-36a6-4942-a13e-EXAMPLEfcd28' - pattern: '^[a-zA-Z0-9.-]+$' - doc_section: '#step-1-finding-your-app-id' - order: 1 - domain: - type: string - title: Domain - description: The domain representing the Amazon platform you are integrating with. - example: sellercentral.amazon.com - pattern: '^[a-z0-9.-]+\.amazon\.[a-z.]+$' - prefix: https:// - suffix: /apps - doc_section: '#step-2-finding-your-authorization-domain' - order: 2 - region: - type: string - title: Proxy BaseUrl Region - description: The geographical region associated with the Amazon marketplace. - enum: - - na - - eu - - fe - doc_section: '#step-3-finding-your-proxy-baseurl-region' - order: 3 - -a-leads: - display_name: A-Leads - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.a-leads.co/gateway - headers: - x-api-key: ${apiKey} - docs: https://nango.dev/docs/integrations/all/a-leads - docs_connect: https://nango.dev/docs/integrations/all/a-leads/connect - credentials: - apiKey: - type: string - title: API Key - description: Your A-Leads API key - doc_section: '#step-1-obtain-your-api-key' - example: a3f8b2e1********************d9c4 - pattern: '^[a-f0-9]{32}$' - -anrok: - display_name: Anrok - categories: - - legal - auth_mode: API_KEY - proxy: - base_url: https://api.anrok.com - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/anrok - docs_connect: https://nango.dev/docs/integrations/all/anrok/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Anrok account - doc_section: '#step-1-finding-your-api-key' - -amplitude: - display_name: Amplitude (Event Streaming API) - categories: - - analytics - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.hostname} || https://amplitude.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/2/events/list - docs: https://nango.dev/docs/api-integrations/amplitude - docs_connect: https://nango.dev/docs/api-integrations/amplitude/connect - credentials: - username: - type: string - title: API Key - example: 64371a39e74ad915af75674c0696e356 - pattern: '^[a-f0-9]{32}$' - description: Your Amplitude API Key - password: - type: string - title: Secret Key - example: 6GhPfVz47PKJGSLcDDc9jL5E4Mn - description: Your Amplitude secret key - connection_config: - hostname: - type: string - title: Hostname - description: The hostname associated with your server residency. - optional: true - enum: - - amplitude.com - - analytics.eu.amplitude.com - -amplitude-mcp: - display_name: Amplitude (MCP US) - categories: - - analytics - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://mcp.amplitude.com/authorize - token_url: https://mcp.amplitude.com/token - registration_url: https://mcp.amplitude.com/register - default_scopes: - - offline_access - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://mcp.amplitude.com - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/amplitude-mcp - -amplitude-mcp-eu: - display_name: Amplitude (MCP EU) - categories: - - analytics - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://mcp.eu.amplitude.com/authorize - token_url: https://mcp.eu.amplitude.com/token - registration_url: https://mcp.eu.amplitude.com/register - default_scopes: - - offline_access - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://mcp.eu.amplitude.com - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/amplitude-mcp-eu - -anthropic: - display_name: Anthropic - categories: - - productivity - - dev-tools - - popular - auth_mode: API_KEY - proxy: - base_url: https://api.anthropic.com - headers: - x-api-key: ${apiKey} - anthropic-version: ${connectionConfig.version} - content-type: application/json - retry: - after: - - 'retry-after' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - v1/models - docs: https://nango.dev/docs/integrations/all/anthropic - connection_config: - version: - type: string - title: API Version - description: The version of the Anthropic API to use - pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}$' - example: '2023-06-01' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Anthropic account - -anthropic-admin: - display_name: Anthropic Administrator - categories: - - productivity - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.anthropic.com - headers: - x-api-key: ${apiKey} - anthropic-version: ${connectionConfig.version} - content-type: application/json - retry: - after: - - 'retry-after' - verification: - headers: - content-type: application/json - method: GET - endpoints: - - /v1/organizations/users - docs: https://nango.dev/docs/integrations/all/anthropic-admin - connection_config: - version: - type: string - title: API Version - description: The version of the Anthropic API to use - pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}$' - example: '2023-06-01' - credentials: - apiKey: - type: string - title: API Key - description: The Admin API key for your Anthropic account - -anvil: - display_name: Anvil - categories: - - legal - - productivity - auth_mode: BASIC - proxy: - base_url: https://app.useanvil.com - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/anvil - docs_connect: https://nango.dev/docs/api-integrations/anvil/connect - credentials: - username: - type: string - title: API Key - description: Your Anvil API key - pattern: '^[A-Za-z0-9]+$' - example: rj8T3fa************************* - doc_section: '#step-1-finding-your-api-key' - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -apaleo: - display_name: Apaleo - categories: - - erp - auth_mode: OAUTH2 - authorization_url: https://identity.apaleo.com/connect/authorize - token_url: https://identity.apaleo.com/connect/token - scope_separator: ' ' - token_params: - grant_type: authorization_code - authorization_params: - response_type: code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.apaleo.com - headers: - content-type: application/json - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/apaleo - -apify: - display_name: Apify - categories: - - dev-tools - - analytics - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.apify.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/apify - docs_connect: https://nango.dev/docs/integrations/all/apify/connect - credentials: - apiKey: - type: string - title: API Token - description: The API token for your Apify account - example: apify_api_***************************nt4w - pattern: '^apify_api_[A-Za-z0-9]+$' - doc_section: '#step-1-generating-your-api-key' - -apollo: - display_name: Apollo (API Key) - categories: - - marketing - auth_mode: API_KEY - proxy: - headers: - x-api-key: ${apiKey} - base_url: https://app.apollo.io/api - docs: https://nango.dev/docs/api-integrations/apollo - docs_connect: https://nango.dev/docs/api-integrations/apollo/connect - credentials_verification_script: apolloCredentialsVerification - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Apollo account - example: eh_3LUIFtj04rG4KF_FoFw - doc_section: '#step-1-finding-your-api-key' - -apollo-oauth: - display_name: Apollo (OAuth) - categories: - - marketing - auth_mode: OAUTH2 - authorization_url: https://app.apollo.io - token_url: https://app.apollo.io/api/v1/oauth/token - authorization_url_fragment: oauth/authorize - body_format: json - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://app.apollo.io/api - docs: https://nango.dev/docs/integrations/all/apollo-oauth - -apple-app-store: - display_name: Apple App Store - categories: - - e-commerce - auth_mode: APP_STORE - token_url: https://api.appstoreconnect.apple.com/v1/apps - authorization_params: - audience: appstoreconnect-v1 - proxy: - base_url: https://api.appstoreconnect.apple.com - docs: https://nango.dev/docs/integrations/all/apple-app-store - -apple-business-manager: - display_name: Apple Business Manager - categories: - - productivity - auth_mode: TWO_STEP - body_format: form - token_url: https://account.apple.com/auth/oauth2/v2/token - token_params: - grant_type: client_credentials - client_id: ${credentials.clientId} - client_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer - client_assertion: ${credentials.assertion} - scope: business.api - token_headers: - content-type: application/x-www-form-urlencoded - assertion: - type: jwt - key: ${assertionOption.privateKey} - lifetimeInSeconds: 15552000 - header: - alg: ES256 - kid: ${credentials.keyId} - payload: - iss: ${credentials.clientId} - sub: ${credentials.clientId} - aud: https://account.apple.com/auth/oauth2/v2/token - jti: ${random} - proxy: - base_url: https://api-business.apple.com - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/api-integrations/apple-business-manager - docs_connect: https://nango.dev/docs/api-integrations/apple-business-manager/connect - credentials: - clientId: - type: string - title: Client ID - description: The Client ID generated when you create an API account. - doc_section: '#step-2-note-your-credentials' - keyId: - type: string - title: Key ID - description: The Key ID generated when you create an API account. - doc_section: '#step-2-note-your-credentials' - assertion: - type: string - title: '' - description: '' - automated: true - assertion_option: - privateKey: - type: string - title: Private Key - description: The EC private key (PEM format) used to sign the client assertion JWT. - doc_section: '#step-1-create-an-api-account-and-generate-a-private-key' - -appstle-subscriptions: - display_name: Appstle Subscriptions - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://subscription-admin.appstle.com - headers: - x-api-key: ${apiKey} - docs: https://nango.dev/docs/integrations/all/appstle-subscriptions - docs_connect: https://nango.dev/docs/integrations/all/appstle-subscriptions/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Appstle Subscriptions API Key - secret: true - doc_section: '#step-1-finding-your-api-key' - example: lBfFAdbxUxyv6jYRgOmrEVNkijCKD10T - pattern: ^[a-zA-Z0-9]+$ - -asana: - display_name: Asana - categories: - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://app.asana.com/-/oauth_authorize - token_url: https://app.asana.com/-/oauth_token - token_params: - grant_type: authorization_code - auth: - response_type: code - default_scopes: - - default - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://app.asana.com - retry: - after: - - 'retry-after' - paginate: - type: cursor - cursor_path_in_response: next_page.offset - cursor_name_in_request: offset - response_path: data - limit_name_in_request: limit - docs: https://nango.dev/docs/api-integrations/asana - setup_guide_url: https://nango.dev/docs/api-integrations/asana/how-to-register-your-own-asana-api-oauth-app - -asana-mcp: - display_name: Asana (MCP) - categories: - - productivity - - ticketing - - mcp - auth_mode: MCP_OAUTH2 - client_registration: static - authorization_url: https://app.asana.com/-/oauth_authorize - token_url: https://app.asana.com/-/oauth_token - authorization_params: - response_type: code - resource: https://mcp.asana.com/v2 - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - default_scopes: - - default - proxy: - headers: - accept: application/json,text/event-stream - base_url: https://mcp.asana.com/ - docs: https://nango.dev/docs/api-integrations/asana-mcp - setup_guide_url: https://nango.dev/docs/api-integrations/asana-mcp/how-to-register-your-own-asana-mcp-oauth-app - -asana-scim: - display_name: Asana (SCIM API) - categories: - - productivity - - ticketing - auth_mode: API_KEY - proxy: - base_url: https://app.asana.com/api - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /1.0/scim/Users - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/asana-scim - docs_connect: https://nango.dev/docs/integrations/all/asana-scim/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Asana scim account - doc_section: '#step-1-finding-asana-api-key' - -ashby: - display_name: Ashby - categories: - - ats - - popular - auth_mode: BASIC - proxy: - base_url: https://api.ashbyhq.com - verification: - method: POST - headers: - content-type: application/json - endpoints: - - apiKey.info - docs: https://nango.dev/docs/integrations/all/ashby - docs_connect: https://nango.dev/docs/integrations/all/ashby/connect - credentials: - username: - type: string - title: API Key - description: The API Key of your Ashby account - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -atlas-so: - display_name: Atlas.so - categories: - - support - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.atlas.so/v1 - docs: https://nango.dev/docs/integrations/all/atlas-so - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Atlas.so account - -atlassian: - display_name: Atlassian - categories: - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://auth.atlassian.com/authorize - token_url: https://auth.atlassian.com/oauth/token - default_scopes: - - offline_access - authorization_params: - response_type: code - audience: api.atlassian.com - prompt: consent - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.atlassian.com - docs: https://nango.dev/docs/integrations/all/atlassian - -atlassian-admin: - display_name: Atlassian Cloud Admin - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.atlassian.com - retry: - at: - - 'x-ratelimit-reset' - headers: - authorization: Bearer ${apiKey} - connection_config: - organizationId: ${connectionConfig.organizationId} - docs: https://nango.dev/docs/integrations/all/atlassian-admin - docs_connect: https://nango.dev/docs/integrations/all/atlassian-admin/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Atlassian account - example: ATCTT3xFfGN0_a1B2-c3D4_E5F6-G7H8I9JKLMNOPQRSTUVWXYZ1234567890=DEADBEEF - pattern: '^ATCTT3xFfGN0[\w\-]+=[A-Z0-9]{8}$' - doc_section: '#step-1-generating-your-api-key' - connection_config: - organizationId: - type: string - title: Atlassian Organization Id - optional: true - description: The organization ID of your Atlassian account - pattern: '^[a-f0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$' - example: '9fa3d2b7-k9l3-4bq1-z3d8-7x1m0a9e2b76' - doc_section: '#step-1-generating-your-api-key' - -atlassian-government-cloud: - display_name: Atlassian Government Cloud - categories: - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://auth.atlassian-us-gov-mod.com/authorize - token_url: https://auth.atlassian-us-gov-mod.com/oauth/token - default_scopes: - - offline_access - authorization_params: - audience: api.atlassian-us-gov-mod.com - prompt: consent - proxy: - base_url: https://api.atlassian-us-gov-mod.com - connection_config: - subdomain: ${connectionConfig.subdomain} - retry: - at: - - 'x-ratelimit-reset' - post_connection_script: atlassianGovernmentCloudPostConnection - docs: https://nango.dev/docs/integrations/all/atlassian-government-cloud - docs_connect: https://nango.dev/docs/integrations/all/atlassian-government-cloud/connect - connection_config: - subdomain: - type: string - title: Subdomain - optional: true - description: The subdomain of your Atlassian Government Cloud account - pattern: '^[a-zA-Z0-9.-]+$' - example: acme - suffix: .atlassian-us-gov-mod.net - prefix: https:// - -atlassian-service-account-api-token: - display_name: Atlassian Service Account (API Token) - categories: - - dev-tools - auth_mode: BASIC - proxy: - base_url: https://api.atlassian.com - retry: - at: - - 'x-ratelimit-reset' - connection_config: - cloudId: ${connectionConfig.cloudId} - post_connection_script: atlassianServicAccountPostConnection - docs: https://nango.dev/docs/api-integrations/atlassian-service-account-api-token - docs_connect: https://nango.dev/docs/api-integrations/atlassian-service-account-api-token/connect - connection_config: - cloudId: - type: string - title: Cloud ID - description: Your Atlassian Cloud ID - example: '12345678-1234-1234-1234-123456789012' - format: uuid - doc_section: '#step-1-finding-your-cloud-id' - order: 1 - credentials: - username: - type: string - title: Service Account Email - description: The email address of your Atlassian service account - example: bot@serviceaccount.atlassian.com - format: email - doc_section: '#step-2-finding-your-service-account-email' - password: - type: string - title: API Token - description: Your Atlassian service account API token - secret: true - example: ATSTT3xFfGF07SUw*******************************RvxLUHWs8ZV58TfHI=610694C8 - pattern: '^[A-Za-z0-9_-]{40,}=[A-Fa-f0-9]{8}$' - doc_section: '#step-3-creating-an-api-token' - -atlassian-service-account-oauth2: - display_name: Atlassian Service Account (OAuth 2.0) - categories: - - dev-tools - auth_mode: OAUTH2_CC - token_url: https://auth.atlassian.com/oauth/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.atlassian.com - retry: - at: - - 'x-ratelimit-reset' - connection_config: - subdomain: ${connectionConfig.subdomain} - post_connection_script: atlassianServicAccountPostConnection - docs: https://nango.dev/docs/api-integrations/atlassian-service-account-oauth2 - docs_connect: https://nango.dev/docs/api-integrations/atlassian-service-account-oauth2/connect - connection_config: - subdomain: - type: string - title: Subdomain - optional: true - description: The subdomain of your Attlassian account - pattern: '^[a-zA-Z0-9.-]+$' - example: subdomain - suffix: .atlassian.net - prefix: https:// - doc_section: '#step-2-finding-your-subdomain' - credentials: - client_id: - type: string - title: Client ID - description: The OAuth 2.0 client ID from your service account credential - doc_section: '#step-1-creating-oauth-client-credentials' - client_secret: - type: string - title: Client Secret - description: The OAuth 2.0 client secret from your service account credential - secret: true - doc_section: '#step-1-creating-oauth-client-credentials' - -attention: - display_name: Attention - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.attention.tech - headers: - authorization: Bearer ${apiKey} - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/conversations?size=1 - docs: https://nango.dev/docs/api-integrations/attention - docs_connect: https://nango.dev/docs/api-integrations/attention/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Attention API key. - example: eyJhbGciOi***.eyJzdWIiOi***.xxxxxxxxxxxx - pattern: '^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$' - doc_section: '#step-1-obtaining-your-api-key' - -attio: - display_name: Attio - categories: - - crm - - popular - auth_mode: OAUTH2 - authorization_url: https://app.attio.com/authorize - token_url: https://app.attio.com/oauth/token - token_params: - grant_type: authorization_code - auth: - response_type: code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.attio.com - retry: - after: - - 'retry-after' - post_connection_script: attioPostConnection - webhook_routing_script: attioWebhookRouting - webhook_user_defined_secret: true - docs: https://nango.dev/docs/api-integrations/attio - setup_guide_url: https://nango.dev/docs/api-integrations/attio/how-to-register-your-own-attio-api-oauth-app - -attio-mcp: - display_name: Attio (MCP) - categories: - - crm - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://app.attio.com/oidc/authorize - token_url: https://app.attio.com/oidc/token - registration_url: https://app.attio.com/oauth/register - scope_separator: '+' - authorization_url_skip_encode: - - scopes - authorization_params: - response_type: code - resource: https://mcp.attio.com/mcp - registration_params: - response_types: - - code - grant_types: - - authorization_code - - refresh_token - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://mcp.attio.com - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/attio-mcp - -auth0: - display_name: Auth0 - categories: - - iam - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.auth0.com/authorize - token_url: https://${connectionConfig.subdomain}.auth0.com/oauth/token - authorization_params: - response_type: code - response_mode: query - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - docs: https://nango.dev/docs/integrations/all/auth0 - proxy: - base_url: https://${connectionConfig.subdomain}.auth0.com - connection_config: - subdomain: - type: string - title: Auth0 Domain - description: The subdomain of your Auth0 account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .auth0.com - prefix: https:// - -auth0-cc: - display_name: Auth0 (Client Credentials) - categories: - - iam - auth_mode: OAUTH2_CC - body_format: json - token_url: https://${connectionConfig.hostname}/oauth/token - token_params: - grant_type: client_credentials - audience: ${connectionConfig.audience} - organization: ${connectionConfig.organization} - docs: https://nango.dev/docs/integrations/all/auth0-cc - docs_connect: https://nango.dev/docs/integrations/all/auth0-cc/connect - proxy: - base_url: https://${connectionConfig.hostname} - connection_config: - hostname: - type: string - title: HostName - description: Your Auth0 host name - format: hostname - prefix: https:// - doc_section: '#step-2-finding-your-hostname' - audience: - type: string - title: Audience - description: The audience for the token - example: https://api.example.com/foobar - doc_section: '#step-3-finding-your-audience' - organization: - type: string - title: Organization - description: The organization name you want the request to be associated with - example: example - optional: true - doc_section: '#step-4-finding-your-organization' - -auvik: - display_name: Auvik - categories: - - support - auth_mode: BASIC - proxy: - base_url: https://auvikapi.${connectionConfig.region}.my.auvik.com - verification: - method: GET - endpoints: - - /v1/authentication/verify - credentials: - username: - type: string - title: User Name / Account Email - description: Auvik User Name (usually an individual user's email address) - doc_section: '#step-1-generate-an-api-key' - password: - type: string - title: API Key - description: Auvik API Key (separate from the user's password) - secret: true - # API key is a base64 encoded string - pattern: '^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{4}|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}={2})$' - example: 'aJ7EjSEDD+7+JqlQ1NtUXyY/3/05GGWwfF7vBbPd0Iy8HG1s' - doc_section: '#step-1-generate-an-api-key' - connection_config: - region: - type: string - title: Region - description: The region of your Auvik account (visible in your browser address bar when logging into the Auvik web UI). - doc_section: '#step-2-determine-your-region' - enum: - - us1 - - us2 - - eu1 - docs: https://nango.dev/docs/integrations/all/auvik - docs_connect: https://nango.dev/docs/integrations/all/auvik/connect - -avanan: - display_name: Avanan - categories: - - other - auth_mode: TWO_STEP - token_request_method: GET - token_url: https://${connectionConfig.subdomain}.avanan.net/v1.0/auth - token_headers: - x-av-app-id: ${credentials.appId} - x-av-req-id: ${random} - x-av-date: '${now:YYYY-MM-DDTHH:mm:ss}' - x-av-sig: '${sha256Hex(${base64(${random}${credentials.appId}${now:YYYY-MM-DDTHH:mm:ss}${credentials.secretKey})})}' - token_response: - token: '' - token_expires_in_ms: 3_600_000 - proxy: - base_url: https://${connectionConfig.subdomain}.avanan.net - headers: - x-av-app-id: ${credentials.appId} - x-av-token: ${accessToken} - x-av-req-id: ${random} - x-av-date: '${now:YYYY-MM-DDTHH:mm:ss}' - x-av-sig: '${sha256Hex(${base64(${random}${credentials.appId}${now:YYYY-MM-DDTHH:mm:ss}${endpoint}${credentials.secretKey})})}' - docs: https://nango.dev/docs/api-integrations/avanan - docs_connect: https://nango.dev/docs/api-integrations/avanan/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The Avanan API subdomain for your region. - order: 1 - doc_section: '#step-1-finding-your-subdomain' - enum: - - smart-api-production-1-us - - smart-api-production-1-eu - - smart-api-production-1-ca - - smart-api-production-5-ap - - smart-api-production-1-euw2 - - smart-api-production-1-mec1 - - smart-api-production-1-aps1 - credentials: - appId: - type: string - title: Client ID - description: Your Avanan Client ID from Avanan Support. - example: 9k8m****************ht3w - pattern: '^[a-z0-9]+$' - doc_section: '#step-2-getting-your-client-id-and-secret-key' - secretKey: - type: string - title: Secret Key - description: Your Avanan Secret Key from Avanan Support. - example: 3k9t****************************0uj5gtrpqlz8x2nvy - pattern: '^[a-z0-9]+$' - secret: true - doc_section: '#step-2-getting-your-client-id-and-secret-key' - -availity: - display_name: Availity - categories: - - other - auth_mode: OAUTH2_CC - token_url: https://api.availity.com/v1/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.availity.com - docs: https://nango.dev/docs/api-integrations/availity - docs_connect: https://nango.dev/docs/api-integrations/availity/connect - credentials: - client_id: - type: string - title: API Key - description: Your application API Key - doc_section: '#step-1-obtaining-your-client-credentials' - client_secret: - type: string - title: Secret - description: Your application Secret - secret: true - doc_section: '#step-1-obtaining-your-client-credentials' - -avalara: - display_name: Avalara - categories: - - legal - auth_mode: BASIC - proxy: - headers: - x-avalara-client: ${connectionConfig.avalaraClient} - content-type: application/json - base_url: https://rest.avatax.com/api/v2 - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /utilities/subscriptions - docs: https://nango.dev/docs/integrations/all/avalara - docs_connect: https://nango.dev/docs/integrations/all/avalara/connect - credentials: - username: - type: string - title: User Name / Account ID - description: Avalara User Name / Account ID - doc_section: '#step-1-finding-your-pair-keys' - password: - type: string - title: Avalara Password / License Key - description: Your Password / License Key - # https://developer.avalara.com/avatax/authentication-in-rest/ - # Avalara is using basic auth with combination of (username and password) - # or (Account ID and License Key) - doc_section: '#step-1-finding-your-pair-keys' - connection_config: - avalaraClient: - type: string - title: Avalara Client - description: The Avalara client for your Avalara account - doc_section: '#step-2-generating-an-avalara-client' - -avalara-sandbox: - display_name: Avalara (Sandbox) - categories: - - legal - auth_mode: BASIC - proxy: - headers: - x-avalara-client: ${connectionConfig.avalaraClient} - content-type: application/json - base_url: https://sandbox-rest.avatax.com/api/v2 - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /utilities/subscriptions - docs: https://nango.dev/docs/integrations/all/avalara-sandbox - docs_connect: https://nango.dev/docs/integrations/all/avalara-sandbox/connect - credentials: - username: - type: string - title: User Name / Account ID - description: Avalara User Name / Account ID - doc_section: '#step-1-finding-your-pair-keys' - password: - type: string - title: Password / License Key - description: Avalara Password / License Key - # https://developer.avalara.com/avatax/authentication-in-rest/ - # Avalara is using basic auth with combination of (username and password) - # or (Account ID and License Key) - doc_section: '#step-1-finding-your-pair-keys' - connection_config: - avalaraClient: - type: string - title: Avalara Client - description: The Avalara client for your Avalara account - doc_section: '#step-2-generating-an-avalara-client' - -avoma: - display_name: Avoma - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.avoma.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/users - docs: https://nango.dev/docs/integrations/all/avoma - docs_connect: https://nango.dev/docs/integrations/all/avoma/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Avoma account - pattern: '^[a-z0-9]{10,}:[a-z0-9]{10,}$' - example: '1awcbx0njh:02k6er2pld4q5irffn23' - doc_section: '#step-1-generating-your-api-key' - -axiom: - display_name: Axiom - categories: - - dev-tools - - analytics - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.axiom.co - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/api-integrations/axiom - docs_connect: https://nango.dev/docs/api-integrations/axiom/connect - connection_config: - subdomain: - type: string - title: Edge / region subdomain - description: The subdomain of the API you would wish to connect to. - enum: - - api - - us-east-1.aws.edge - - eu-central-1.aws.edge - order: 1 - doc_section: '#step-1-finding-your-subdomain' - credentials: - apiKey: - type: string - title: API Token - description: Your Axiom API token. - example: 'xaat-********-****-****-****-********8ec6' - pattern: '^xaat-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$' - doc_section: '#step-2-generating-your-api-token' - -aws: - display_name: AWS - categories: - - dev-tools - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.auth.${connectionConfig.extension}.amazoncognito.com/oauth2/authorize - token_url: https://${connectionConfig.subdomain}.auth.${connectionConfig.extension}.amazoncognito.com/oauth2/token - token_params: - grant_type: authorization_code - auth: - response_type: code - refresh_params: - grant_type: refresh_token - default_scopes: - - openid - proxy: - base_url: https://cognito-${apiSubdomain}.amazonaws.com - docs: https://nango.dev/docs/integrations/all/aws - connection_config: - subdomain: - type: string - title: Cognito Domain Prefix - description: The prefix of your Cognito User Pool domain. - pattern: '^[a-z0-9_-]+$' - example: my-app-pool - prefix: https:// - suffix: .auth - extension: - type: string - title: Cognito Region - description: The AWS region where your Cognito User Pool is hosted. - example: eu-north-1 - pattern: '^[a-z0-9-]+$' - prefix: auth. - suffix: .amazoncognito.com - apiSubdomain: - type: string - title: Cognito API Subdomain - description: The Cognito API subdomain. - example: idp.eu-north-1 - pattern: '^[a-z0-9.-]+$' - suffix: .amazonaws.com - prefix: https://cognito- - -aws-iam: - display_name: AWS IAM - categories: - - dev-tools - - iam - auth_mode: BASIC - proxy: - base_url: https://iam.amazonaws.com - headers: - authorization: '${awsSigV4(${credentials.username}, ${credentials.password}, us-east-1, iam)}' - x-amz-date: '${now:YYYYMMDDTHHmmss[Z]}' - connection_config: - region: ${connectionConfig.region} - retry: - at: - - 'x-ratelimit-reset' - credentials_verification_script: awsIamCredentialsVerification - docs: https://nango.dev/docs/api-integrations/aws-iam - docs_connect: https://nango.dev/docs/api-integrations/aws-iam/connect - credentials: - username: - type: string - title: AWS Access Key ID - description: Your Access Key ID - doc_section: '#step-1-finding-your-pair-keys' - password: - type: string - title: AWS Secret Access Key - description: Your Secret Access Key - # https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html - # aws-iam is using basic auth with AWS Access Key ID and Secret Access Key - doc_section: '#step-1-finding-your-pair-keys' - connection_config: - region: - type: string - title: Region - description: The region to where your AWS account is hosted - example: us-east-1 - pattern: '^[a-z0-9-]+$' - doc_section: '#step-2-finding-your-region-host' - -aws-inspector2: - display_name: AWS Inspector2 - categories: - - dev-tools - auth_mode: BASIC - proxy: - base_url: https://inspector2.${connectionConfig.region}.amazonaws.com - headers: - authorization: '${awsSigV4(${credentials.username}, ${credentials.password}, ${connectionConfig.region}, inspector2, inspector2.${connectionConfig.region}.amazonaws.com)}' - x-amz-date: '${now:YYYYMMDDTHHmmss[Z]}' - retry: - at: - - 'x-ratelimit-reset' - credentials_verification_script: awsIamCredentialsVerification - docs: https://nango.dev/docs/api-integrations/aws-inspector2 - docs_connect: https://nango.dev/docs/api-integrations/aws-inspector2/connect - credentials: - username: - type: string - title: AWS Access Key ID - description: Your Access Key ID. - password: - type: string - title: AWS Secret Access Key - description: Your Secret Access Key. - connection_config: - region: - type: string - title: Region - description: The AWS region where Inspector2 is enabled. - example: us-east-1 - prefix: https://inspector2. - suffix: .amazonaws.com - pattern: '^[a-z0-9-]+$' - -aws-multi-service: - display_name: AWS Multi-Service - categories: - - dev-tools - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.service}.${connectionConfig.region}.amazonaws.com - headers: - authorization: '${awsSigV4(${credentials.username}, ${credentials.password}, ${connectionConfig.region}, ${connectionConfig.service}, ${connectionConfig.service}.${connectionConfig.region}.amazonaws.com)}' - x-amz-date: '${now:YYYYMMDDTHHmmss[Z]}' - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/api-integrations/aws-multi-service - docs_connect: https://nango.dev/docs/api-integrations/aws-multi-service/connect - credentials: - username: - type: string - title: AWS Access Key ID - description: Your Access Key ID. - example: AKIAI***MPLE - pattern: '^[A-Za-z0-9]+$' - password: - type: string - title: AWS Secret Access Key - description: Your Secret Access Key. - example: wJalr***EKEY - pattern: '^[A-Za-z0-9+/]+$' - connection_config: - service: - type: string - title: AWS Service - description: The AWS service you want to connect to. - example: athena - pattern: '^[a-z0-9-]+$' - order: 2 - region: - type: string - title: Region - description: The AWS region where the service is available. - example: us-east-1 - pattern: '^[a-z0-9-]+$' - order: 1 - -aws-scim: - display_name: AWS (SCIM) - categories: - - dev-tools - - iam - auth_mode: API_KEY - proxy: - base_url: ${connectionConfig.scimEndpoint} - headers: - authorization: Bearer ${apiKey} - accept: application/json - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /Users - docs: https://nango.dev/docs/integrations/all/aws-scim - docs_connect: https://nango.dev/docs/integrations/all/aws-scim/connect - credentials: - apiKey: - type: string - title: SCIM Access Token - description: The SCIM Access Token generated from your AWS IAM Identity Center - example: 878374852-dea1-47d5-9ae0-4d00a0bdbb13:ff7d4f04-7385-4add-befe-a9ed18341d0d:l6uepDQrHfNOiOYXZ7HYZL8hlvsYHSG7Cnx104tkRLmDbO8l/p5GxLv6Id5BCLicmjeKvhrlqrPvL6VMcAnJS6oitQrz3ZiZr18rnybzyISRlyjxktYtIK1R80YJXBH6U7NSvwGsu5gDbUZDGlCDeh+FFhL8tmUuHytvxuhz3jNhsh&8X9xiLBg=:ICn/+PhEST+8/pizxTmoA0DW9JcQTL4EVRh0z6DpJwQ4vFQ+iwAxNjh16SHdUovAJyMjT+TPDwI8gN63DLE+9EV+lcV+i2H/OTDE4x7L18WRz3ndMf/4dY98mJ41qRYBgh63Pi8PdXkAex2l8HJLMkzjjPirN+8DCBfPVKK+z/nCc04RXWIz6XOmqwgB1sV5jwfAxPhuV6vqgVosoSngSw7Y2Zon70PiI5UbTTZffF6QWFU7i9b3dgMMDAH6f9vm11EB6YpJt/XC74L1pDvKXiSzhel7b7dYzGvrXK0rN29cnjn0o58VYCOgk9c05p/nRsEaSs2Y/v7BqgxXUvI+Aw== - pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}:[A-Za-z0-9+/]+=*:[A-Za-z0-9+/]+=*$' - doc_section: '#step-2-setting-up-automatic-provisioning' - connection_config: - scimEndpoint: - type: string - title: SCIM Endpoint - description: The SCIM Endpoint mentioned in the AWS IAM Identity Center - example: 'https://scim.ap-south-1.amazonaws.com/lSweb811432-ac8a-4a86-8332-f29hha4f5650/scim/v2' - format: uri - pattern: '^https://.*\/.*\/scim\/v2$' - order: 1 - doc_section: '#step-2-setting-up-automatic-provisioning' - -aws-sigv4: - display_name: AWS SigV4 Proxy - categories: - - storage - auth_mode: AWS_SIGV4 - proxy: - base_url: https://${connectionConfig.service}.${connectionConfig.region}.amazonaws.com - docs: https://nango.dev/docs/integrations/all/aws-sigv4 - docs_connect: https://nango.dev/docs/integrations/all/aws-sigv4/connect - credentials: - role_arn: - type: string - title: IAM Role ARN - description: The ARN of the IAM role your customer creates via your onboarding template. - example: arn:aws:iam::123456789012:role/NangoAccessRole - doc_section: '#step-1-provide-the-role-arn' - connection_config: - region: - type: string - title: AWS Region (optional) - description: Override the region if it differs from the integration default set by the integration owner. - example: us-east-1 - optional: true - doc_section: '#step-3-enter-connection-details' - service: - type: string - title: '' - description: '' - automated: true - integration_config: - service: - type: string - title: AWS Service - description: The AWS service requests are signed for (e.g. s3, execute-api). - example: s3 - pattern: ^[a-z0-9-]+$ - order: 1 - defaultRegion: - type: string - title: Default AWS Region - description: Region used to sign requests when a connection does not specify one. - example: us-east-1 - optional: true - order: 2 - stsMode: - type: string - title: STS Mode - description: How temporary AWS credentials are issued. - enum: - - builtin - - custom - default_value: builtin - optional: true - order: 3 - awsAccessKeyId: - type: string - title: AWS Access Key ID - description: Access key for the IAM principal Nango uses to call STS AssumeRole. - secret: true - optional: true - visible_when: - field: stsMode - equals: builtin - order: 4 - awsSecretAccessKey: - type: string - title: AWS Secret Access Key - description: Secret access key paired with the access key ID above. - secret: true - optional: true - visible_when: - field: stsMode - equals: builtin - order: 5 - stsEndpointUrl: - type: string - title: STS Endpoint URL - description: HTTPS endpoint that issues temporary AWS credentials. - format: uri - pattern: ^https:// - example: https://sts.example.com/assume - optional: true - visible_when: - field: stsMode - equals: custom - order: 6 - stsAuthType: - type: string - title: STS Auth Type - description: How Nango authenticates to the custom STS endpoint. - enum: - - none - - api_key - - basic - default_value: none - optional: true - visible_when: - field: stsMode - equals: custom - order: 7 - stsAuthHeader: - type: string - title: STS Auth Header - description: Header name used to send the API key to the custom STS endpoint. - default_value: x-api-key - optional: true - visible_when: - field: stsAuthType - equals: api_key - order: 8 - stsApiKey: - type: string - title: STS API Key - description: API key value sent to the custom STS endpoint. - secret: true - visible_when: - field: stsAuthType - equals: api_key - order: 9 - stsAuthUsername: - type: string - title: STS Username - description: Username for basic auth to the custom STS endpoint. - optional: true - visible_when: - field: stsAuthType - equals: basic - order: 10 - stsAuthPassword: - type: string - title: STS Password - description: Password for basic auth to the custom STS endpoint. - secret: true - visible_when: - field: stsAuthType - equals: basic - order: 11 - -azure-blob-storage: - categories: - - storage - display_name: Azure Blob Storage - alias: microsoft - default_scopes: - - offline_access - - https://storage.azure.com/.default - proxy: - base_url: https://${connectionConfig.accountName}.blob.core.windows.net - headers: - x-ms-version: ${connectionConfig.version} || 2025-05-05 - docs: https://nango.dev/docs/integrations/all/azure-blob-storage - docs_connect: https://nango.dev/docs/integrations/all/azure-blob-storage/connect - connection_config: - accountName: - type: string - title: Account Name - description: The name of the Azure Storage account you want to connect to. - example: nangoStorage - doc_section: '#step-1-finding-your-account-name' - version: - type: string - title: '' - description: '' - automated: true - -azure-devops: - display_name: Azure DevOps - categories: - - dev-tools - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.organizationUrl} - docs: https://nango.dev/docs/integrations/all/azure-devops - docs_connect: https://nango.dev/docs/integrations/all/azure-devops/connect - # Azure DevOps returns a 202 when the credentials are invalid, - # so we need to explicitly check for this and return respective error message - credentials_verification_script: azureDevopsCredentialsVerification - connection_config: - organizationUrl: - type: string - title: Organization URL - description: The URL of your Azure DevOps organization - example: dev.azure.com/myorg or myorg.visualstudio.com - doc_section: '#step-1-finding-your-organization-url' - prefix: https:// - credentials: - username: - type: string - title: '' - description: '' - default_value: '' - hidden: true - password: - type: string - title: Personal Access Token - description: The Personal Access Token of your Azure DevOps account - doc_section: '#step-2-creating-a-personal-access-token' - -bamboohr: - display_name: BambooHR (OAuth) - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.bamboohr.com/authorize.php - token_url: https://${connectionConfig.subdomain}.bamboohr.com/token.php - authorization_params: - response_type: code - request: authorize - token_params: - grant_type: authorization_code - request: token - refresh_params: - grant_type: refresh_token - request: token - proxy: - base_url: https://api.bamboohr.com/api/gateway.php/${connectionConfig.subdomain} - docs: https://nango.dev/docs/api-integrations/bamboohr - setup_guide_url: https://nango.dev/docs/api-integrations/bamboohr/how-to-register-your-own-bamboohr-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/bamboohr/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of your BambooHR account - pattern: '^[a-z0-9_-]+$' - example: acme - suffix: .bamboohr.com - prefix: https:// - order: 1 - -bamboohr-basic: - display_name: BambooHR (Basic Auth) - categories: - - hr - auth_mode: BASIC - proxy: - base_url: https://api.bamboohr.com/api/gateway.php/${connectionConfig.subdomain} - verification: - headers: - content-type: application/json - method: GET - endpoints: - - /v1/meta/fields - docs: https://nango.dev/docs/integrations/all/bamboohr-basic - docs_connect: https://nango.dev/docs/integrations/all/bamboohr-basic/connect - connection_config: - subdomain: - type: string - title: BambooHR Domain - description: The subdomain of your BambooHR account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .bamboohr.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-subdomain' - credentials: - username: - type: string - title: API key - description: The API Key of your BambooHR account - pattern: '^[a-f0-9]{40}$' - example: 59d783083fb25565aba21744e6bba90de8634de0 - secret: true - doc_section: '#step-2-finding-your-api-key' - password: - type: string - title: Password - description: Password - # https://documentation.bamboohr.com/docs/getting-started - # Bamboo HR is using basic auth with an api key - default_value: x - hidden: true - -basecamp: - display_name: Basecamp - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://launchpad.37signals.com/authorization/new - token_url: https://launchpad.37signals.com/authorization/token - authorization_params: - type: web_server - token_params: - type: web_server - refresh_params: - type: refresh - proxy: - base_url: https://3.basecampapi.com/${connectionConfig.accountId} - headers: - user-agent: ${connectionConfig.appDetails} || App (support@nango.dev) - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/basecamp - docs_connect: https://nango.dev/docs/integrations/all/basecamp/connect - post_connection_script: basecampPostConnection - connection_config: - appDetails: - type: string - title: App Details - description: The details of your app - automated: true - accountId: - type: string - title: Account ID - description: Your Account ID - optional: true - example: '5899981' - pattern: '^[0-9]+$' - doc_section: '#step-1-finding-your-account-id' - -battlenet: - display_name: Battle.net - categories: - - gaming - auth_mode: OAUTH2 - authorization_url: https://oauth.battle.${connectionConfig.extension}/authorize - token_url: https://oauth.battle.${connectionConfig.extension}/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://${connectionConfig.apiDomain} - docs: https://nango.dev/docs/integrations/all/battlenet - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Battle.net account. - enum: - - com - - cn - - net - order: 1 - apiDomain: - type: string - title: API Domain - description: The domain to where you will access your API. - enum: - - us.api.blizzard.com - - eu.api.blizzard.com - - kr.api.blizzard.com - - tw.api.blizzard.com - - gateway.battlenet.com.cn - -beehiiv: - display_name: Beehiiv - categories: - - communication - - marketing - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.beehiiv.com/v2/publications/${connectionConfig.publicationId} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /posts - docs: https://nango.dev/docs/integrations/all/beehiiv - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Beehiiv account - example: 8ab3sjxqvHzyUnP9JhvlfT6C0wsbgr5XQrpaZZjxJkYBPy6sntvT1M2Lk94VQeRb - pattern: '^[a-zA-Z0-9]{64}$' - connection_config: - publicationId: - type: string - title: Publication Id - description: The prefixed ID of the publication object - example: pub_a3d1b49e-2a5d-4f4b-97c8-8f32e1d2f7b9 - pattern: '^(pub_[0-9a-fA-F\-]+)$' - -bettercontact: - display_name: BetterContact - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://app.bettercontact.rocks - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /api/v2/account - docs: https://nango.dev/docs/api-integrations/bettercontact - docs_connect: https://nango.dev/docs/api-integrations/bettercontact/connect - credentials: - apiKey: - type: string - title: API Key - description: Your BetterContact API key - example: f1a9b2c3d4e5f6g7h8i9j0 - pattern: '^[a-z0-9]+$' - doc_section: '#step-1-generating-your-api-key' - -bliro: - display_name: Bliro - categories: - - communication - auth_mode: OAUTH2_CC - body_format: json - token_url: https://accounts.bliro.io/oauth/token - token_params: - grant_type: client_credentials - audience: https://api.bliro.io - proxy: - base_url: https://api.bliro.io - docs: https://nango.dev/docs/api-integrations/bliro - docs_connect: https://nango.dev/docs/api-integrations/bliro/connect - credentials: - client_id: - type: string - title: Client ID - description: Your Bliro client application Client ID. - doc_section: '#step-1-creating-a-client-application' - client_secret: - type: string - title: Client Secret - description: Your Bliro client application Client Secret. - secret: true - doc_section: '#step-1-creating-a-client-application' - -bigchange: - display_name: BigChange - categories: - - productivity - auth_mode: OAUTH2_CC - token_url: https://api.bigchange.com/auth/tokens - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.bigchange.com - headers: - customer-id: ${connectionConfig.customer_id} - docs: https://nango.dev/docs/api-integrations/bigchange - docs_connect: https://nango.dev/docs/api-integrations/bigchange/connect - connection_config: - customer_id: - type: string - title: BigChange Customer ID - description: Your numeric BigChange Customer ID. - example: '5690' - pattern: '^[0-9]+$' - doc_section: '#step-2-find-your-bigchange-customer-id' - credentials: - client_id: - type: string - title: Client ID - description: Your BigChange Partner API client_id. - client_secret: - type: string - title: Client Secret - description: Your BigChange Partner API client_secret. - secret: true - -bigcommerce: - display_name: BigCommerce - categories: - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://login.bigcommerce.com/oauth2/authorize - token_url: https://login.bigcommerce.com/oauth2/token - scope_separator: ' ' - authorization_params: - response_type: code - context: stores/${connectionConfig.storeHash} - account_uuid: ${connectionConfig.accountUuid} - token_params: - context: stores/${connectionConfig.storeHash} - grant_type: authorization_code - proxy: - base_url: https://api.bigcommerce.com/stores/${connectionConfig.storeHash} - docs: https://nango.dev/docs/integrations/all/bigcommerce - connection_config: - storeHash: - type: string - title: Store Hash - description: The store hash of your BigCommerce account - pattern: '^[a-zA-Z0-9]+$' - accountUuid: - type: string - title: Account UUID - description: The account UUID of your BigCommerce account - format: uuid - example: 123e4567-e89b-12d3-a456-426614174000 - -bill-sandbox: - display_name: Bill (Connect API Sandbox) - categories: - - payment - auth_mode: BILL - token_url: https://gateway.stage.bill.com/connect/v3/login - proxy: - base_url: https://gateway.stage.bill.com/connect - docs: https://nango.dev/docs/integrations/all/bill-sandbox - docs_connect: https://nango.dev/docs/integrations/all/bill-sandbox/connect - -bill: - display_name: Bill (Connect API) - categories: - - payment - auth_mode: BILL - token_url: https://gateway.prod.bill.com/connect/v3/login - proxy: - base_url: https://gateway.prod.bill.com/connect - docs: https://nango.dev/docs/integrations/all/bill - -bing-webmasters: - display_name: Bing Webmasters - categories: - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://www.bing.com/webmasters/oauth/authorize - token_url: https://www.bing.com/webmasters/oauth/token - refresh_url: https://www.bing.com/webmasters/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_token_params: - grant_type: refresh_token - proxy: - base_url: https://www.bing.com/webmaster/api.svc/json - docs: https://nango.dev/docs/api-integrations/bing-webmasters - setup_guide_url: https://nango.dev/docs/api-integrations/bing-webmasters/how-to-register-your-own-bing-webmasters-api-oauth-app - -bitbucket: - display_name: Bitbucket - categories: - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://bitbucket.org/site/oauth2/authorize - token_url: https://bitbucket.org/site/oauth2/access_token - proxy: - base_url: https://api.bitbucket.org - docs: https://nango.dev/docs/integrations/all/bitbucket - -bitdefender: - display_name: Bitdefender - categories: - - other - auth_mode: BASIC - proxy: - base_url: ${connectionConfig.ACCESS_URL} - retry: - after: - - 'retry-after' - credentials_verification_script: bitdefenderCredentialsVerification - docs: https://nango.dev/docs/integrations/all/bitdefender - docs_connect: https://nango.dev/docs/integrations/all/bitdefender/connect - credentials: - username: - type: string - title: API Key - description: The API Key of your Bitdefender account - doc_section: '#step-1-finding-your-api-key' - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - connection_config: - ACCESS_URL: - type: string - title: Access URL - description: The access URL of your Bitdefender account - example: https://api.bitdefender.com - format: uri - pattern: '^https://.*' - doc_section: '#step-1-finding-your-api-key' - -bitly: - display_name: Bitly - categories: - - marketing - - social - auth_mode: OAUTH2 - authorization_url: https://bitly.com/oauth/authorize - token_url: https://api-ssl.bitly.com/oauth/access_token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://api-ssl.bitly.com - docs: https://nango.dev/docs/integrations/all/bitly - -blackbaud: - display_name: Blackbaud - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://app.blackbaud.com/oauth/authorize - token_url: https://oauth2.sky.blackbaud.com/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.sky.blackbaud.com - docs: https://nango.dev/docs/integrations/all/blackbaud - -blackbaud-basic: - display_name: Blackbaud (Basic Auth) - categories: - - crm - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.hostName} - headers: - content-type: application/soap+xml; charset=utf-8 - docs: https://nango.dev/docs/integrations/all/blackbaud-basic - docs_connect: https://nango.dev/docs/integrations/all/blackbaud-basic - connection_config: - hostName: - type: string - title: Host Name - description: Your Blackbaud host name - example: https://altrurig01bo3.blackbaudhosting.com - pattern: '^https?:\/\/[a-z0-9.-]+(:\d+)?(\/.*)?$' - order: 1 - doc_section: '#step-1-finding-your-host-name' - credentials: - username: - type: string - title: Username - description: Your Username - doc_section: '#step-3-finding-your-username' - password: - type: string - title: Password - description: Your Password - doc_section: '#step-2-finding-your-password' - -blandai: - display_name: BlandAI - categories: - - support - auth_mode: API_KEY - proxy: - base_url: https://api.bland.ai - headers: - authorization: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - v1/calls - docs: https://nango.dev/docs/integrations/all/blandai - credentials: - apiKey: - type: string - title: API Key - description: The API key for your BlandAI account - -bird: - display_name: Bird - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.bird.com - headers: - authorization: AccessKey ${apiKey} - connection_config: - workspaceId: ${connectionConfig.workspaceId} - docs: https://nango.dev/docs/api-integrations/bird - docs_connect: https://nango.dev/docs/api-integrations/bird/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of your Bird API instance - example: api - suffix: .bird.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-subdomain' - workspaceId: - type: string - title: Workspaces Id - description: The Workspaces Id of your Bird - format: uuid - order: 2 - example: 332bb273-0caf-4240-a5b6-8046b5d3074f - doc_section: '#step-3-finding-your-workspace-id' - credentials: - apiKey: - type: string - title: Access Key - description: Your Bird access key - example: 6BPC******************Rzh3F4x - pattern: '^[A-Za-z0-9]+$' - doc_section: '#step-2-creating-an-access-key' - -boldsign: - display_name: BoldSign - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://account.boldsign.com/connect/authorize - token_url: https://account.boldsign.com/connect/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.boldsign.com - docs: https://nango.dev/docs/integrations/all/boldsign - -boondmanager: - display_name: BoondManager - categories: - - erp - auth_mode: OAUTH2 - authorization_url: https://ui.boondmanager.com/api/oauth2/authorize - token_url: https://ui.boondmanager.com/api/oauth2/token - proxy: - base_url: https://ui.boondmanager.com/api - docs: https://nango.dev/docs/api-integrations/boondmanager - setup_guide_url: https://nango.dev/docs/api-integrations/boondmanager/how-to-register-your-own-boondmanager-api-oauth-app - -box: - display_name: Box - categories: - - knowledge-base - - storage - auth_mode: OAUTH2 - authorization_url: https://account.box.com/api/oauth2/authorize - token_url: https://api.box.com/oauth2/token - proxy: - base_url: https://api.box.com - docs: https://nango.dev/docs/api-integrations/box - setup_guide_url: https://nango.dev/docs/api-integrations/box/how-to-register-your-own-box-api-oauth-app - -booking-com: - display_name: Booking.com - categories: - - e-commerce - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.environmentType}-xml.booking.com - docs: https://nango.dev/docs/integrations/all/booking-com - connection_config: - environmentType: - type: string - title: Environment Type - description: The environment type for your various requests. - enum: - - secure-supply - - supply - credentials: - username: - type: string - title: Machine Account Username - description: The username for your Booking.com machine account - password: - type: string - title: Machine Account Password - description: The password for your Booking.com machine account - -braintree: - display_name: Braintree - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://api.braintreegateway.com/oauth/connect - token_url: https://api.braintreegateway.com/oauth/access_tokens - scope_separator: ',' - authorization_method: header - body_format: json - token_params: - grant_type: authorization_code - redirect_uri_metadata: - - merchantId - proxy: - base_url: https://api.braintreegateway.com - docs: https://nango.dev/docs/integrations/all/braintree - -braintree-sandbox: - display_name: Braintree (Sandbox) - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://api.sandbox.braintreegateway.com/oauth/connect - token_url: https://api.sandbox.braintreegateway.com/oauth/access_tokens - scope_separator: ',' - authorization_method: header - body_format: json - token_params: - grant_type: authorization_code - redirect_uri_metadata: - - merchantId - proxy: - base_url: https://api.sandbox.braintreegateway.com - docs: https://nango.dev/docs/integrations/all/braintree-sandbox - -braze: - display_name: Braze - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://rest.${connectionConfig.instanceUrl} - headers: - authorization: Bearer ${apiKey} - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/integrations/all/braze - docs_connect: https://nango.dev/docs/integrations/all/braze/connect - connection_config: - instanceUrl: - type: string - title: Instance URL - description: The REST API URL of your Braze instance - example: iad-02.braze.com - format: hostname - prefix: https://rest. - order: 1 - doc_section: '#step-1-finding-your-instance-url' - credentials: - apiKey: - type: string - title: API Key - description: The API key to your Braze account - doc_section: '#step-2-finding-your-api-key' - -brevo-api-key: - display_name: Brevo - categories: - - marketing - auth_mode: API_KEY - proxy: - headers: - api-key: ${apiKey} - base_url: https://api.brevo.com/v3 - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /account - docs: https://nango.dev/docs/integrations/all/brevo-api-key - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Brevo account - -breezy-hr: - display_name: Breezy HR - categories: - - hr - - ats - auth_mode: TWO_STEP - body_format: json - token_url: https://api.breezy.hr/v3/signin - token_params: - email: ${credentials.email} - password: ${credentials.password} - token_headers: - content-type: application/json - token_response: - token: access_token - proxy: - base_url: https://api.breezy.hr - headers: - authorization: ${accessToken} - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/integrations/all/breezy-hr - docs_connect: https://nango.dev/docs/integrations/all/breezy-hr/connect - credentials: - email: - type: string - title: Email - description: The email address associated with your Breezy HR account - format: email - doc_section: '#step-1-finding-your-credentials' - password: - type: string - title: Password - description: The password for your Breezy HR account - secret: true - doc_section: '#step-1-finding-your-credentials' - -brex: - display_name: Brex (OAuth) - categories: - - banking - auth_mode: OAUTH2 - authorization_url: https://accounts-api.brex.com/oauth2/default/v1/authorize - token_url: https://accounts-api.brex.com/oauth2/default/v1/token - default_scopes: - - openid - - offline_access - proxy: - base_url: https://platform.brexapis.com - docs: https://nango.dev/docs/api-integrations/brex - setup_guide_url: https://nango.dev/docs/api-integrations/brex/how-to-register-your-own-brex-oauth-app - -brex-api-key: - display_name: Brex (API Key) - categories: - - banking - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://platform.brexapis.com - docs: https://nango.dev/docs/api-integrations/brex-api-key - docs_connect: https://nango.dev/docs/api-integrations/brex-api-key/connect - credentials: - apiKey: - type: string - title: API Token - description: The API Token to your Brex account - example: bxt_vRUwQT3snBmA1IDVq5iK1kXc4N0bhxr377z4 - pattern: '^bxt_[a-zA-Z0-9]+$' - doc_section: '#step-1-finding-your-api-token' - -brex-staging: - display_name: Brex (Staging OAuth) - categories: - - banking - auth_mode: OAUTH2 - authorization_url: https://accounts-api.staging.brexapps.com/oauth2/default/v1/authorize - token_url: https://accounts-api.staging.brexapps.com/oauth2/default/v1/token - proxy: - base_url: https://platform.staging.brexapps.com - docs: https://nango.dev/docs/api-integrations/brex-staging - setup_guide_url: https://nango.dev/docs/api-integrations/brex-staging/how-to-register-your-own-brex-staging-oauth-app - -brightcrowd: - display_name: BrightCrowd - categories: - - social - auth_mode: OAUTH2_CC - token_url: https://bcb-staging.auth.us-east-1.amazoncognito.com/oauth2/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.brightcrowd.com/partner - paginate: - type: cursor - cursor_path_in_response: nextPageToken - cursor_name_in_request: pageToken - docs: https://nango.dev/docs/integrations/all/brightcrowd - docs_connect: https://nango.dev/docs/integrations/all/brightcrowd/connect - -builder-io-private: - display_name: Builder.io (Private) - categories: - - dev-tools - - design - - cms - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.domain} - headers: - authorization: Bearer ${apiKey} - verification: - method: POST - headers: - content-type: application/json - endpoints: - - /api/v1/write/page - docs: https://nango.dev/docs/api-integrations/builder-io-private - docs_connect: https://nango.dev/docs/api-integrations/builder-io-private/connect - connection_config: - domain: - type: string - title: Domain - description: The domain used to access your Builder.io write API. - example: builder.io - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-api-domain' - credentials: - apiKey: - type: string - title: API Key - description: The private key for your Builder.io account. - pattern: '^bpk-[a-f0-9]+$' - example: bpk-**************************** - doc_section: '#step-2-finding-your-api-key' - -builder-io-public: - display_name: Builder.io (Public) - categories: - - dev-tools - - design - - cms - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.domain} - query: - apiKey: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v1/content/page - docs: https://nango.dev/docs/api-integrations/builder-io-public - docs_connect: https://nango.dev/docs/api-integrations/builder-io-public/connect - connection_config: - domain: - type: string - title: Domain - description: The domain used to access your Builder.io content API. - example: cdn.builder.io - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-api-domain' - credentials: - apiKey: - type: string - title: API Key - description: The public api key for your Builder.io account. - pattern: '^[a-zA-Z0-9]+$' - example: bb209fb71eh2412dbe0114bdae18fd15 - doc_section: '#step-2-finding-your-api-key' - -buildium: - display_name: Buildium - categories: - - accounting - - crm - - payment - auth_mode: API_KEY - proxy: - base_url: https://api.buildium.com - headers: - x-buildium-client-id: ${connectionConfig.clientId} - x-buildium-client-secret: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/rentals - docs: https://nango.dev/docs/integrations/all/buildium - docs_connect: https://nango.dev/docs/integrations/all/buildium/connect - connection_config: - clientId: - type: string - title: Client ID - description: Your API Key Client ID - pattern: '^[a-f0-9-]+$' - example: a228f0e7-b4a3-4150-b9ae-8552fc2880d3 - doc_section: '#step-2-finding-your-client-id-and-secret' - order: 1 - credentials: - apiKey: - type: string - title: Secret - description: The Secret for your Buildium account - pattern: '^[A-Za-z0-9+/]+$' - example: uOq2p+xlgpFdijfV/HqY+EvYpZKHRwlyhGuAVbJIxXs - doc_section: '#step-2-finding-your-client-id-and-secret' - -builtwith: - display_name: BuiltWith - categories: - - dev-tools - - analytics - - crm - - marketing - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://api.builtwith.com - query: - KEY: ${apiKey} - docs: https://nango.dev/docs/integrations/all/builtwith - docs_connect: https://nango.dev/docs/integrations/all/builtwith/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your BuiltWith account - example: 1bc32cba-a5d6-438a-bbcc-af312f560a3c - format: uuid - doc_section: '#step-1-finding-your-api-key' - -buffer: - display_name: Buffer - categories: - - marketing - - social - auth_mode: OAUTH2 - authorization_url: https://auth.buffer.com/auth - token_url: https://auth.buffer.com/token - scope_separator: ' ' - authorization_params: - response_type: code - prompt: consent - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - default_scopes: - - offline_access - proxy: - base_url: https://api.buffer.com - docs: https://nango.dev/docs/api-integrations/buffer - setup_guide_url: https://nango.dev/docs/api-integrations/buffer/how-to-register-your-own-buffer-oauth-app - -bullhorn: - display_name: Bullhorn - categories: - - hr - - ats - auth_mode: OAUTH2 - authorization_url: https://auth-west.bullhornstaffing.com/oauth/authorize - token_url: https://auth-west.bullhornstaffing.com/oauth/token - disable_pkce: true - authorization_params: - response_type: code - username: ${connectionConfig.username} - password: ${connectionConfig.password} - action: Login - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: ${connectionConfig.restUrl} - headers: - bhresttoken: ${accessToken} - post_connection_script: bullhornPostConnection - token_response_metadata: - - restUrl - refresh_token_response_metadata: - - restUrl - docs: https://nango.dev/docs/integrations/all/bullhorn - docs_connect: https://nango.dev/docs/integrations/all/bullhorn/connect - connection_config: - restUrl: - type: string - title: '' - description: '' - automated: true - username: - type: string - title: Username - description: Your API Username - doc_section: '#step-1-obtain-your-api-credentials' - password: - type: string - title: Password - description: Your API Password - secret: true - doc_section: '#step-1-obtain-your-api-credentials' - -cal-com-v1: - display_name: Cal.com (v1) - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.cal.com/v1 - query: - apiKey: ${apiKey} - retry: - at: - - 'x-ratelimit-reset' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /me - docs: https://nango.dev/docs/integrations/all/cal-com-v1 - docs_connect: https://nango.dev/docs/integrations/all/cal-com-v1/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Cal.com account - pattern: '^cal_[a-zA-Z0-9_]+$' - example: cal_xxxxxx - doc_section: '#step-1-finding-your-api-key' -cal-com-v2: - display_name: Cal.com (v2) - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.cal.com/v2 - headers: - authorization: Bearer ${apiKey} - paginate: - type: cursor - cursor_name_in_request: cursor - cursor_path_in_response: data.data.nextCursor - limit_name_in_request: limit - retry: - at: - - 'x-ratelimit-reset' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /me - webhook_routing_script: calComWebhookRouting - webhook_user_defined_secret: true - webhook_allowed_query_params: - - nangoConnectionId - docs: https://nango.dev/docs/api-integrations/cal-com-v2 - docs_connect: https://nango.dev/docs/api-integrations/cal-com-v2/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Cal.com account - pattern: '^cal_[a-zA-Z0-9_]+$' - example: cal_xxxxxx - doc_section: '#step-1-finding-your-api-key' - -cal-com-oauth: - display_name: Cal.com (OAuth) - categories: - - productivity - auth_mode: OAUTH2 - body_format: json - authorization_url: https://app.cal.com/auth/oauth2/authorize - token_url: https://api.cal.com/v2/auth/oauth2/token - disable_pkce: true - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.cal.com - retry: - at: - - 'x-ratelimit-reset' - webhook_routing_script: calComWebhookRouting - webhook_user_defined_secret: true - webhook_allowed_query_params: - - nangoConnectionId - docs: https://nango.dev/docs/api-integrations/cal-com-oauth - setup_guide_url: https://nango.dev/docs/api-integrations/cal-com-oauth/how-to-register-your-own-cal-com-oauth-app - -calendly: - display_name: Calendly - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://auth.calendly.com/oauth/authorize - token_url: https://auth.calendly.com/oauth/token - authorization_params: - response_type: code - proxy: - base_url: https://api.calendly.com - paginate: - type: link - link_path_in_response_body: pagination.next_page - retry: - at: - - 'x-ratelimit-reset' - token_response_metadata: - - owner - post_connection_script: calendlyPostConnection - webhook_routing_script: calendlyWebhookRouting - webhook_user_defined_secret: true - docs: https://nango.dev/docs/api-integrations/calendly - setup_guide_url: https://nango.dev/docs/api-integrations/calendly/how-to-register-your-own-calendly-api-oauth-app - -callrail: - display_name: Callrail - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.callrail.com - headers: - authorization: Token token=${apiKey} - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v3/a.json - docs_connect: https://nango.dev/docs/integrations/all/callrail/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Callrail account - pattern: '^[a-f0-9]{32}$' - example: '4f3c12efb9659a0b5c123b568745dbf9' - doc_section: '#step-1-finding-your-api-key' - docs: https://nango.dev/docs/integrations/all/callrail - -canny: - display_name: Canny - categories: - - support - auth_mode: API_KEY - proxy: - base_url: https://canny.io/api/v1 - query: - apiKey: ${apiKey} - verification: - method: POST - headers: - content-type: application/json - endpoints: - - /boards/list - docs: https://nango.dev/docs/integrations/all/canny - docs_connect: https://nango.dev/docs/integrations/all/canny/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Canny account - example: a1f5937c-82df-bd29-4e3a-7b6fda8c54d1 - pattern: '^[a-zA-Z0-9-]+$' - doc_section: '#step-1-finding-your-api-key' - -candis: - display_name: Candis - categories: - - accounting - auth_mode: OAUTH2 - authorization_url: https://id.my.candis.io/auth/realms/candis/protocol/openid-connect/auth - token_url: https://id.my.candis.io/auth/realms/candis/protocol/openid-connect/token - token_request_auth_method: basic - scope_separator: ' ' - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.candis.io - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/candis - setup_guide_url: https://nango.dev/docs/api-integrations/candis/how-to-register-your-own-candis-oauth-app - post_connection_script: candisPostConnection - -canva: - display_name: Canva - categories: - - design - auth_mode: OAUTH2 - authorization_url: https://www.canva.com/api/oauth/authorize - token_url: https://api.canva.com/rest/v1/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.canva.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /rest/v1/users/me - docs: https://nango.dev/docs/integrations/all/canva - token_request_auth_method: basic - -canva-mcp: - display_name: Canva (MCP) - categories: - - design - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://mcp.canva.com/authorize - token_url: https://mcp.canva.com/token - registration_url: https://mcp.canva.com/register - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://mcp.canva.com - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/canva-mcp - -canvas-lms: - display_name: Canvas LMS - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.hostname}/login/oauth2/auth - token_url: https://${connectionConfig.hostname}/login/oauth2/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.hostname} - docs: https://nango.dev/docs/api-integrations/canvas-lms - setup_guide_url: https://nango.dev/docs/api-integrations/canvas-lms/how-to-register-your-own-canvas-lms-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/canvas-lms/connect - connection_config: - hostname: - type: string - title: Canvas Install URL - description: The base URL of your Canvas instance - example: canvas.instructure.com - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-canvas-install-url' - -canva-scim: - display_name: Canva (SCIM API) - categories: - - design - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://www.canva.com/_scim - headers: - authorization: Bearer ${apiKey} - accept: application/json - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/Users - docs: https://nango.dev/docs/integrations/all/canva-scim - docs_connect: https://nango.dev/docs/integrations/all/canva-scim/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Canva scim account - doc_section: '#step-1-finding-canva-api-key' - -certn: - display_name: Certn - categories: - - legal - auth_mode: API_KEY - proxy: - base_url: https://api.certn.co - headers: - authorization: Bearer ${apiKey} - paginate: - type: link - link_path_in_response_body: next - response_path: results - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v2/teams - docs: https://nango.dev/docs/integrations/all/certn - docs_connect: https://nango.dev/docs/integrations/all/certn - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Certn account - doc_section: '#step-1-creating-an-api-key' - -certn-partner: - display_name: Certn Partner - categories: - - legal - auth_mode: OAUTH2_CC - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.certn.co - paginate: - type: offset - offset_name_in_request: page - response_path: data - limit_name_in_request: limit - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v2/teams - docs: https://nango.dev/docs/integrations/all/certn-partner - -chargebee: - display_name: Chargebee - categories: - - payment - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.chargebee.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v2/business_entities - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/chargebee - docs_connect: https://nango.dev/docs/integrations/all/chargebee/connect - connection_config: - subdomain: - type: string - title: Chargebee Domain - description: The subdomain of your Chargebee account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .chargebee.com - prefix: https:// - doc_section: '#step-1-creating-an-api-key' - credentials: - username: - type: string - title: API Key - description: The API key for your Chargebee account - pattern: '^[a-zA-Z0-9_-]+$' - secret: true - password: - type: string - title: Password - description: Password - # https://apidocs.chargebee.com/docs/api/auth?lang=curl - # Chargebee is using basic auth with an api key - default_value: '' - hidden: true - -chatarmin: - display_name: Chatarmin - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://api.chatarmin.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /api/public/contacts?limit=1 - docs: https://nango.dev/docs/api-integrations/chatarmin - docs_connect: https://nango.dev/docs/api-integrations/chatarmin/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Chatarmin API key. - -chattermill: - display_name: Chattermill - categories: - - support - - analytics - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.chattermill.com - headers: - authorization: Bearer ${apiKey} - accept: application/json - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/projects - docs: https://nango.dev/docs/integrations/all/chattermill - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Chattermill account - connection_config: - subdomain: - type: string - title: Chattermill subdomain - description: The subdomain for your api requests. - enum: - - app - - api - - backend - -checkhq: - display_name: Check - categories: - - accounting - auth_mode: API_KEY - proxy: - base_url: https://api.checkhq.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/checkhq - docs_connect: https://nango.dev/docs/integrations/all/checkhq/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your CheckHQ account - doc_section: '#step-1-finding-check-api-token' - -checkr-partner: - display_name: Checkr Partner - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://partners.checkr.com/authorize/${connectionConfig.client_id} - token_url: https://api.checkr.com/oauth/tokens - disable_pkce: true - token_params: - grant_type: authorization_code - proxy: - retry: - at: - - 'x-ratelimit-reset' - base_url: https://api.checkr.com - token_response_metadata: - - checkr_account_id - webhook_routing_script: checkrPartnerWebhookRouting - post_connection_script: checkrPartnerPostConnection - docs: https://nango.dev/docs/integrations/all/checkr-partner - connection_config: - client_id: - type: string - title: Client ID - description: The client ID of your Checkr Partner account - -checkr-partner-staging: - display_name: Checkr Partner (Staging) - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://partners.checkrhq-staging.net/authorize/${connectionConfig.client_id} - token_url: https://api.checkr-staging.com/oauth/tokens - disable_pkce: true - token_params: - grant_type: authorization_code - proxy: - retry: - at: - - 'x-ratelimit-reset' - base_url: https://api.checkr-staging.com - token_response_metadata: - - checkr_account_id - webhook_routing_script: checkrPartnerWebhookRouting - post_connection_script: checkrPartnerPostConnection - docs: https://nango.dev/docs/integrations/all/checkr-partner-staging - connection_config: - client_id: - type: string - title: Client ID - description: The client ID of your Checkr Partner account - -checkout-com: - display_name: Checkout.com - categories: - - payment - auth_mode: OAUTH2_CC - token_url: https://access.checkout.com/connect/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - headers: - content-type: application/json - accept: application/json - base_url: https://api.checkout.com - docs: https://nango.dev/docs/integrations/all/checkout-com - docs_connect: https://nango.dev/docs/integrations/all/checkout-com/connect - -checkout-com-sandbox: - display_name: Checkout.com (Sandbox) - categories: - - payment - auth_mode: OAUTH2_CC - token_url: https://access.sandbox.checkout.com/connect/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - headers: - content-type: application/json - accept: application/json - base_url: https://api.sandbox.checkout.com - docs: https://nango.dev/docs/integrations/all/checkout-com-sandbox - docs_connect: https://nango.dev/docs/integrations/all/checkout-com-sandbox/connect - -chorus: - display_name: Chorus - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://chorus.ai - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v1/users/me - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/chorus - docs_connect: https://nango.dev/docs/integrations/all/chorus/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Chorus account - doc_section: '#step-1-generating-your-chorus-api-key' - -cin7-core: - display_name: Cin7 Core - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://inventory.dearsystems.com/externalapi - headers: - api-auth-accountid: ${connectionConfig.accountId} - api-auth-applicationkey: ${apiKey} - verification: - method: GET - endpoints: - - /v2/me - docs: https://nango.dev/docs/api-integrations/cin7-core - docs_connect: https://nango.dev/docs/api-integrations/cin7-core/connect - connection_config: - accountId: - type: string - title: Account ID - description: Your Cin7 Core Account ID. - doc_section: '#step-1-find-your-account-id-and-api-application-key' - example: a1b2c3d4-****-****-****-ef1234567890 - format: uuid - credentials: - apiKey: - type: string - title: API Application Key - description: Your Cin7 Core API Application Key. - secret: true - pattern: '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$' - doc_section: '#step-1-find-your-account-id-and-api-application-key' - example: 6d6f4999-****-****-****-4e4ed450df0f - -circle-so: - display_name: Circle.so - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://app.circle.so - headers: - authorization: Token ${apiKey} - docs: https://nango.dev/docs/integrations/all/circle-so - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Circle.so account - -circleback-mcp: - display_name: Circleback (MCP) - categories: - - productivity - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://app.circleback.ai/api/oauth/authorize - token_url: https://app.circleback.ai/api/oauth/access-token - registration_url: https://app.circleback.ai/api/oauth/register - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://app.circleback.ai/api/ - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/circleback-mcp - -clari-copilot: - display_name: Clari Copilot - categories: - - marketing - auth_mode: API_KEY - proxy: - headers: - x-api-key: ${apiKey} - x-api-password: ${connectionConfig.API_PASSWORD} - base_url: https://rest-api.copilot.clari.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /calls - docs: https://nango.dev/docs/integrations/all/clari-copilot - connection_config: - API_PASSWORD: - type: string - title: API Password - description: The API password of your Clari Copilot account - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Clari Copilot account - -clay: - display_name: Clay - categories: - - crm - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.clay.com - headers: - authorization: ${apiKey} - verification: - method: GET - endpoints: - - /v3/my-workspaces - connection_config: - workspaceId: ${connectionConfig.workspaceId} - docs: https://nango.dev/docs/api-integrations/clay - docs_connect: https://nango.dev/docs/api-integrations/clay/connect - connection_config: - workspaceId: - type: string - title: Workspace ID - description: The ID of your Clay workspace. - example: '10608232' - pattern: '^\d+$' - doc_section: '#step-2-finding-your-workspace-id' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Clay account. - example: 7de4ba****e439d39**** - pattern: '^[a-f0-9]+$' - doc_section: '#step-1-finding-your-api-key' - -cleverreach: - display_name: CleverReach - categories: - - marketing - auth_mode: OAUTH2 - authorization_url: https://rest.cleverreach.com/oauth/authorize.php - token_url: https://rest.cleverreach.com/oauth/token.php - authorization_params: - response_type: code - grant: basic - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://rest.cleverreach.com - docs: https://nango.dev/docs/api-integrations/cleverreach - setup_guide_url: https://nango.dev/docs/api-integrations/cleverreach/how-to-register-your-own-cleverreach-api-oauth-app - -clickhouse: - display_name: ClickHouse - categories: - - dev-tools - auth_mode: BASIC - proxy: - base_url: https://api.clickhouse.cloud - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/organizations - docs: https://nango.dev/docs/api-integrations/clickhouse - docs_connect: https://nango.dev/docs/api-integrations/clickhouse/connect - credentials: - username: - type: string - title: Key ID - description: Your ClickHouse Cloud API Key ID. - pattern: '^[a-zA-Z0-9]+$' - example: 'Mlx1****************' - doc_section: '#step-1-create-an-api-key' - password: - type: string - title: Key Secret - description: Your ClickHouse Cloud API Key Secret. - secret: true - pattern: '^[a-zA-Z0-9]+$' - example: '4b1d2i7O**********************************' - doc_section: '#step-1-create-an-api-key' - -clicksend: - display_name: ClickSend - categories: - - communication - auth_mode: BASIC - proxy: - base_url: https://rest.clicksend.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v3/account - docs: https://nango.dev/docs/integrations/all/clicksend - docs_connect: https://nango.dev/docs/integrations/all/clicksend/connect - credentials: - username: - type: string - title: Username - description: Your ClickSend account username - doc_section: '#step-1-finding-your-username-and-api-key' - password: - type: string - title: API Key - description: Your ClickSend API Key - secret: true - doc_section: '#step-1-finding-your-username-and-api-key' - -clickup: - display_name: ClickUp - categories: - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://app.clickup.com/api - token_url: https://api.clickup.com/api/v2/oauth/token - proxy: - base_url: https://api.clickup.com - docs: https://nango.dev/docs/api-integrations/clickup - setup_guide_url: https://nango.dev/docs/api-integrations/clickup/how-to-register-your-own-clickup-api-oauth-app - -clio: - display_name: Clio - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.hostname}/oauth/authorize - token_url: https://${connectionConfig.hostname}/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.hostname} - docs: https://nango.dev/docs/api-integrations/clio - docs_connect: https://nango.dev/docs/api-integrations/clio/connect - setup_guide_url: https://nango.dev/docs/api-integrations/clio/how-to-register-your-own-clio-api-oauth-app - connection_config: - hostname: - type: string - title: Hostname - description: The hostname for your Clio region (e.g. app.clio.com for US, eu.app.clio.com for EU, ca.app.clio.com for CA, au.app.clio.com for AU). - default_value: app.clio.com - format: hostname - enum: - - app.clio.com - - eu.app.clio.com - - ca.app.clio.com - - au.app.clio.com - order: 1 - doc_section: '#step-1-finding-your-hostname' - -cloudbeds: - display_name: Cloudbeds - categories: - - other - auth_mode: OAUTH2 - authorization_url: https://api.cloudbeds.com/api/v1.3/oauth - token_url: https://api.cloudbeds.com/api/v1.3/access_token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.cloudbeds.com - docs: https://nango.dev/docs/api-integrations/cloudbeds - setup_guide_url: https://nango.dev/docs/api-integrations/cloudbeds/how-to-register-your-own-cloudbeds-oauth-app - -cloudtalk: - display_name: CloudTalk - categories: - - communication - auth_mode: BASIC - proxy: - base_url: https://my.cloudtalk.io/api - retry: - at: - - 'x-cloudtalkapi-resettime' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /contacts/index.json?limit=1 - docs: https://nango.dev/docs/api-integrations/cloudtalk - docs_connect: https://nango.dev/docs/api-integrations/cloudtalk/connect - credentials: - username: - type: string - title: ID - description: Your CloudTalk API Access ID. - pattern: '^[A-Za-z0-9.%@?_-]+$' - example: 'E1ZH****************RRM' - doc_section: '#step-1-getting-your-api-credentials' - password: - type: string - title: Key - description: Your CloudTalk API Access Key. - secret: true - pattern: '^[A-Za-z0-9.%@?_-]+$' - example: 'bQI*******************************eZ' - doc_section: '#step-1-getting-your-api-credentials' - -clerk: - display_name: Clerk - categories: - - dev-tools - - iam - auth_mode: API_KEY - proxy: - base_url: https://api.clerk.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/jwks - docs: https://nango.dev/docs/integrations/all/clerk - docs_connect: https://nango.dev/docs/integrations/all/clerk/connect - credentials: - apiKey: - type: string - title: Secret Key - description: Your Clerk Secret Key (starts with sk_test_ or sk_live_) - secret: true - pattern: '^sk_(test|live)_[a-zA-Z0-9]+$' - example: 'sk_test_abcdefghijklmnop123456789' - doc_section: '#step-1-retrieve-your-clerk-secret-key' - -cloudentity: - display_name: Cloudentity - auth_mode: OAUTH2_CC - categories: - - iam - token_url: https://${connectionConfig.tenantID}.${connectionConfig.regionID}.authz.cloudentity.io/${connectionConfig.tenantID}/${connectionConfig.workspaceID}/oauth2/token - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.tenantID}.${connectionConfig.regionID}.authz.cloudentity.io/${connectionConfig.tenantID}/${connectionConfig.workspaceID} - docs: https://nango.dev/docs/integrations/all/cloudentity - docs_connect: https://nango.dev/docs/integrations/all/cloudentity/connect - connection_config: - tenantID: - type: string - title: Tenant ID - description: The tenant ID of your Cloudentity account - doc_section: '#step-2-retrieving-the-tenant-id' - regionID: - type: string - title: Region ID - description: The region ID of your Cloudentity account - doc_section: '#step-3-retrieving-the-region-id' - workspaceID: - type: string - title: Workspace ID - description: The workspace ID of your Cloudentity account - doc_section: '#step-4-retrieving-the-workspace-id' - -cloudflare: - display_name: Cloudflare - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.cloudflare.com/client - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/cloudflare - docs_connect: https://nango.dev/docs/api-integrations/cloudflare/connect - credentials: - apiKey: - type: string - title: API Token - description: The API token for your Cloudflare user or account - example: lGlHlGZN3iPR9z7CupZlMB3nzMpTCdfxeUPNj_pf - pattern: '^[a-zA-Z0-9_-]+$' - -cloudflare-mcp: - display_name: Cloudflare (MCP) - categories: - - dev-tools - - mcp - auth_mode: MCP_OAUTH2_GENERIC - proxy: - base_url: ${connectionConfig.mcp_server_url} - headers: - accept: application/json,text/event-stream - connection_config: - mcp_server_url: - type: string - title: Worker URL - description: The full URL of your Cloudflare Worker MCP server. - example: https://my-mcp.myusername.workers.dev - pattern: '^https://[a-zA-Z0-9.-]+(?:\:[0-9]+)?(?:/.*)?$' - doc_section: '#step-1-finding-your-worker-url' - docs: https://nango.dev/docs/api-integrations/cloudflare-mcp - docs_connect: https://nango.dev/docs/api-integrations/cloudflare-mcp/connect - -clover: - display_name: Clover - categories: - - e-commerce - auth_mode: OAUTH2 - body_format: json - authorization_url: https://${connectionConfig.authorizeHost}/oauth/v2/authorize - token_url: https://${connectionConfig.apiHost}/oauth/v2/token - refresh_url: https://${connectionConfig.apiHost}/oauth/v2/refresh - disable_pkce: true - authorization_params: - response_type: code - refresh_params: - grant_type: refresh_token - redirect_uri_metadata: - - merchant_id - - employee_id - proxy: - base_url: https://${connectionConfig.apiHost} - docs: https://nango.dev/docs/api-integrations/clover - setup_guide_url: https://nango.dev/docs/api-integrations/clover/how-to-register-your-own-clover-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/clover/connect - connection_config: - authorizeHost: - type: string - title: Authorization Host - description: The Clover authorization hostname for your region. - enum: - - www.clover.com - - www.eu.clover.com - - www.la.clover.com - - sandbox.dev.clover.com - apiHost: - type: string - title: API Host - description: The Clover API hostname for your region. - enum: - - api.clover.com - - api.eu.clover.com - - api.la.clover.com - - apisandbox.dev.clover.com - -close: - display_name: Close - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://app.close.com/oauth2/authorize - token_url: https://api.close.com/oauth2/token/ - authorization_params: - response_type: code - default_scopes: - - offline_access - proxy: - base_url: https://api.close.com/api - docs: https://nango.dev/docs/integrations/all/close - -coda: - display_name: Coda - categories: - - knowledge-base - - productivity - auth_mode: API_KEY - proxy: - base_url: https://coda.io/apis/v1 - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /whoami - docs: https://nango.dev/docs/integrations/all/coda - docs_connect: https://nango.dev/docs/integrations/all/coda/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Coda account - doc_section: '#step-1-creating-an-api-key' - -codeclimate: - display_name: Code Climate - categories: - - dev-tools - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.domain} - headers: - accept: application/vnd.api+json - authorization: Token token=${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/user - docs: https://nango.dev/docs/integrations/all/codeclimate - docs_connect: https://nango.dev/docs/integrations/all/codeclimate/connect - connection_config: - domain: - type: string - title: Domain - description: The domain of your Code Climate account - format: hostname - prefix: https:// - doc_section: '#step-1-obtaining-the-domain-url' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Code Climate account - doc_section: '#step-2-creating-an-api-key' -codegen: - display_name: Codegen - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.codegen.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/organizations - docs: https://nango.dev/docs/integrations/all/codegen - docs_connect: https://nango.dev/docs/integrations/all/codegen/connect - credentials: - apiKey: - type: string - title: API Token - description: The API Key for your Codegen account - pattern: '^sk-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$' - example: 'sk-897bd628-de64-4018-8e3b-c6f717ca3e1d' - doc_section: '#step-1-finding-your-api-key' - -commercetools: - display_name: Commercetools - categories: - - e-commerce - auth_mode: OAUTH2_CC - token_url: https://auth.${connectionConfig.region}.${connectionConfig.cloudProvider}.commercetools.com/oauth/token - token_request_auth_method: basic - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.${connectionConfig.region}.${connectionConfig.cloudProvider}.commercetools.com/${connectionConfig.projectKey} - headers: - authorization: Bearer ${accessToken} - docs: https://nango.dev/docs/integrations/all/commercetools - docs_connect: https://nango.dev/docs/integrations/all/commercetools/connect - connection_config: - region: - type: string - title: Region - description: The region of your Commercetools account. Use the full region identifier (e.g., 'us-central1' for GCP or 'us-east-2' for AWS). - example: us-central1 - pattern: '^[a-z]+-[a-z0-9-]+$' - doc_section: '#step-3-identify-your-region-and-cloud-provider' - projectKey: - type: string - title: Project Key - description: The project key of your Commercetools account - example: demo-project-slug - pattern: '^[a-zA-Z0-9-_]+$' - doc_section: '#step-2-save-the-api-environment-variables' - cloudProvider: - type: string - title: Cloud Provider - description: Cloud provider used to host your Commercetools project (e.g., 'gcp' or 'aws'). - enum: - - gcp - - aws - doc_section: '#step-3-identify-your-region-and-cloud-provider' - -crowdstrike: - display_name: CrowdStrike - categories: - - dev-tools - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.baseUrl}/oauth2/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.baseUrl} - retry: - after: - - 'x-ratelimit-retryafter' - docs: https://nango.dev/docs/integrations/all/crowdstrike - docs_connect: https://nango.dev/docs/integrations/all/crowdstrike/connect - connection_config: - baseUrl: - type: string - title: Base URL - description: The CrowdStrike API base URL for your cloud environment - example: api.crowdstrike.com - pattern: '^api(?:\.[a-z0-9-]+)*\.crowdstrike\.(?:com|mil)$' - prefix: https:// - doc_section: '#step-1-creating-an-api-client' - order: 1 - -companycam: - display_name: CompanyCam - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.companycam.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/company - docs: https://nango.dev/docs/integrations/all/companycam - credentials: - apiKey: - type: string - title: Access Token - description: The Access Token for your CompanyCam company - -constant-contact: - display_name: Constant Contact - categories: - - marketing - auth_mode: OAUTH2 - authorization_url: https://authz.constantcontact.com/oauth2/default/v1/authorize - token_url: https://authz.constantcontact.com/oauth2/default/v1/token - disable_pkce: true - scope_separator: ' ' - default_scopes: - - offline_access - proxy: - base_url: https://api.cc.email - docs: https://nango.dev/docs/api-integrations/constant-contact - setup_guide_url: https://nango.dev/docs/api-integrations/constant-contact/how-to-register-your-own-constant-contact-oauth-app - -conductorone: - display_name: ConductorOne - categories: - - productivity - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.hostname}/auth/v1/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.hostname}/api - docs: https://nango.dev/docs/api-integrations/conductorone - docs_connect: https://nango.dev/docs/api-integrations/conductorone/connect - connection_config: - hostname: - type: string - title: Hostname - description: The hostname extracted from your Client ID - example: acme.conductor.one - format: hostname - order: 1 - doc_section: '#step-2-obtaining-your-hostname' - credentials: - client_id: - type: string - title: Client ID - description: Your ConductorOne Client ID - example: strange-hydra-68836@acme.conductor.one/pcc - doc_section: '#step-1-obtaining-your-client-credentials' - client_secret: - type: string - title: Client Secret - description: Your ConductorOne Client Secret - example: 'secret-token:conductorone.com:v1:eyJrdHkiOiJPS1AiLCJjcnYiOiJFZDI1NTE5IiwieCI6IkMySEx5Y0d6eUhfZDQwcjJvejZoNkpqdndvRVFBZ0FTRVc2eDB6emh6Y2MiLCJkIjoiLTgzVkxXUVUtZVhQY0ZCWVhDb2NpU29XVmhrYnRXUm9zdkZUZ3JqcXNVbyJ9' - doc_section: '#step-1-obtaining-your-client-credentials' - -copper: - display_name: Copper (OAuth) - categories: - - crm - auth_mode: OAUTH2 - proxy: - base_url: https://api.copper.com/developer_api - default_scopes: - - developer/v1/all - authorization_url: https://app.copper.com/oauth/authorize - token_url: https://app.copper.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - docs: https://nango.dev/docs/integrations/all/copper - -copper-api-key: - display_name: Copper (API Key) - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.copper.com/developer_api - headers: - x-pw-accesstoken: ${apiKey} - x-pw-application: developer_api - x-pw-useremail: ${connectionConfig.userEmail} - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/account - docs_connect: https://nango.dev/docs/integrations/all/copper-api-key/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Copper account - pattern: '^[a-f0-9]{32}$' - example: '4f3c12efb9659a0b5c123b568745dbf9' - doc_section: '#step-1-finding-copper-api-key' - connection_config: - userEmail: - type: string - title: User Email - description: Email address of the user who generated the token - docs: https://nango.dev/docs/integrations/all/copper-api-key - -connectwise-psa: - display_name: ConnectWise PSA - categories: - - support - - ticketing - auth_mode: BASIC - webhook_routing_script: connectwisePsaWebhookRouting - proxy: - base_url: https://${connectionConfig.hostname}/v4_6_release/apis/3.0 || https://${connectionConfig.subdomain}.myconnectwise.net/v4_6_release/apis/3.0 - headers: - accept: application/vnd.connectwise.com+json; version=${connectionConfig.apiVersion} - clientid: ${connectionConfig.clientId} - docs: https://nango.dev/docs/api-integrations/connectwise-psa - docs_connect: https://nango.dev/docs/api-integrations/connectwise-psa/connect - connection_config: - hostname: - type: string - title: Hostname - description: The full ConnectWise PSA hostname. - example: api-na.myconnectwise.net - format: hostname - prefix: https:// - suffix: /v4_6_release/apis/3.0 - subdomain: - type: string - title: '' - description: '' - default_value: '' - hidden: true # deprecating this in favor of hostname - apiVersion: - type: string - title: Api version - description: The API version to connect to ConnectWise PSA - clientId: - type: string - title: Client ID - description: The Client ID assigned to your integration - credentials: - username: - type: string - title: Username - description: The ConnectWise PSA CompanyId followed by either the Public Key, Integrator Username, or MemberId - password: - type: string - title: Password - description: Your ConnectWise PSA private key, integrator password, or member hash - -connectwise-psa-staging: - display_name: ConnectWise PSA (Staging) - categories: - - support - - ticketing - auth_mode: BASIC - webhook_routing_script: connectwisePsaWebhookRouting - proxy: - base_url: https://api-staging.connectwisedev.com/v4_6_release/apis/3.0 - headers: - accept: application/vnd.connectwise.com+json; version=${connectionConfig.apiVersion} - clientid: ${connectionConfig.clientId} - docs: https://nango.dev/docs/integrations/all/connectwise-psa-staging - connection_config: - apiVersion: - type: string - title: Api version - description: The API version to connect to ConnectWise PSA - clientId: - type: string - title: Client ID - description: The Client ID assigned to your integration - -connectwise-rmm: - display_name: ConnectWise RMM - categories: - - support - auth_mode: OAUTH2_CC - body_format: json - token_url: https://openapi.service.${connectionConfig.subdomain}/v1/token - token_params: - grant_type: client_credentials - scope_separator: ' ' - proxy: - base_url: https://openapi.service.${connectionConfig.subdomain} - docs: https://nango.dev/docs/api-integrations/connectwise-rmm - docs_connect: https://nango.dev/docs/api-integrations/connectwise-rmm/connect - connection_config: - subdomain: - type: string - title: API Subdomain - description: The ConnectWise RMM OpenAPI subdomain for your region. - enum: - - itsupport247.net - - euplatform.connectwise.com - - auplatform.connectwise.com - doc_section: '#step-1-find-your-api-subdomain' - credentials: - client_id: - type: string - title: Client ID - description: Your ConnectWise RMM OAuth client ID - example: '6500023' - pattern: '^[A-Za-z0-9._-]+$' - doc_section: '#step-2-create-api-credentials' - client_secret: - type: string - title: Client Secret - description: Your ConnectWise RMM OAuth client secret - secret: true - pattern: '^[A-Za-z0-9._~+/=-]{8,}$' - doc_section: '#step-2-create-api-credentials' - -conta-azul: - display_name: Conta Azul - categories: - - accounting - - erp - auth_mode: OAUTH2 - authorization_url: https://auth.contaazul.com/login - token_url: https://auth.contaazul.com/oauth2/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - scope_separator: ' ' - proxy: - base_url: https://api-v2.contaazul.com - disable_pkce: true - docs: https://nango.dev/docs/api-integrations/conta-azul - setup_guide_url: https://nango.dev/docs/api-integrations/conta-azul/how-to-register-your-own-conta-azul-api-oauth-app - -confluence: - display_name: Confluence - categories: - - knowledge-base - - popular - alias: jira - docs: https://nango.dev/docs/api-integrations/confluence - setup_guide_url: https://nango.dev/docs/api-integrations/confluence/how-to-register-your-own-confluence-api-oauth-app - -confluence-basic: - display_name: Confluence (Basic Auth) - categories: - - knowledge-base - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.atlassian.net - headers: - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /wiki/api/v2/spaces - docs: https://nango.dev/docs/integrations/all/confluence-basic - docs_connect: https://nango.dev/docs/integrations/all/confluence-basic/connect - connection_config: - subdomain: - type: string - title: Confluence Subdomain - description: The subdomain of your Confluence account - pattern: '^[a-z0-9_-]+$' - example: subdomain - suffix: .atlassian.net - prefix: https:// - order: 1 - doc_section: '#step-2-finding-your-atlassian-domain' - credentials: - username: - type: string - title: Email Address - format: email - description: The email address for your Confluence account - doc_section: '#step-1-getting-your-api-token' - password: - type: string - title: API token - description: The API token for your Confluence account - secret: true - doc_section: '#step-1-getting-your-api-token' - -confluence-data-center: - display_name: Confluence Data Center - categories: - - productivity - - ticketing - alias: jira-data-center - proxy: - retry: - after: - - 'retry-after' - base_url: https://${connectionConfig.endpointURL} - docs: https://nango.dev/docs/integrations/all/confluence-data-center - docs_connect: https://nango.dev/docs/integrations/all/confluence-data-center/connect - connection_config: - endpointURL: - type: string - title: Domain - description: The domain of your Confluence Data Center instance - prefix: https:// - pattern: '^[a-zA-Z0-9.-]+(:\d+(/[a-zA-Z0-9.-]*)?)?$' - example: confluence.company.com - doc_section: '#step-1-finding-your-domain' - -contentful: - display_name: Contentful - categories: - - dev-tools - - design - - cms - auth_mode: OAUTH2 - authorization_url: https://be.contentful.com/oauth/authorize - token_url: https://be.contentful.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.contentful.com - retry: - after: - - x-contentful-ratelimit-reset - docs: https://nango.dev/docs/integrations/all/contentful - connection_config: - subdomain: - type: string - title: Contentful Domain - description: The subdomain of your Contentful account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .contentful.com - prefix: https:// - -contentstack: - display_name: Contentstack - categories: - - cms - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.contentstack.com/apps/${connectionConfig.appId}/authorize - token_url: https://${connectionConfig.subdomain}.contentstack.com/apps-api/apps/token - docs: https://nango.dev/docs/integrations/all/contentstack - proxy: - base_url: https://${connectionConfig.apiDomain} - connection_config: - subdomain: - type: string - title: Contentstack Domain - description: The subdomain of your Contentstack account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .contentstack.com - prefix: https:// - order: 2 - appId: - type: string - title: App ID - description: The app ID of your Contentstack account - order: 1 - apiDomain: - type: string - title: API Domain - description: The domain to where you will access your API - pattern: '^[a-z0-9_-]+$' - example: eu-api.contentstack.com - prefix: https:// - order: 3 - -coros: - display_name: Coros - categories: - - sports - auth_mode: OAUTH2 - authorization_url: https://open.coros.com/oauth2/authorize - token_url: https://open.coros.com/oauth2/accesstoken - refresh_url: https://open.coros.com/oauth2/refresh-token - authorization_params: - response_type: code - token_response_metadata: - - openId - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://open.coros.com - docs: https://nango.dev/docs/integrations/all/coros - -coros-sandbox: - display_name: Coros (Sandbox) - categories: - - sports - auth_mode: OAUTH2 - authorization_url: https://opentest.coros.com/oauth2/authorize - token_url: https://opentest.coros.com/oauth2/accesstoken - refresh_url: https://opentest.coros.com/oauth2/refresh-token - authorization_params: - response_type: code - token_response_metadata: - - openId - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://opentest.coros.com - docs: https://nango.dev/docs/integrations/all/coros-sandbox - -coupa-compass: - display_name: Coupa Compass - categories: - - payment - - invoicing - auth_mode: OAUTH2_CC - scope_separator: ' ' - token_url: https://${connectionConfig.instanceDomain}/oauth2/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.instanceDomain} - docs: https://nango.dev/docs/integrations/all/coupa-compass - connection_config: - instanceDomain: - type: string - title: Instance Domain - description: The domain of your Coupa Compass account - format: hostname - prefix: https:// - -cyberimpact: - display_name: Cyberimpact - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.cyberimpact.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /ping - docs: https://nango.dev/docs/integrations/all/cyberimpact - docs_connect: https://nango.dev/docs/integrations/all/cyberimpact/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Cyberimpact account - pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' - example: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...' - doc_section: '#step-1-creating-a-cyberimpact-api-key' - -customer-io: - display_name: Customer.io - categories: - - marketing - - analytics - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.customer.io - docs: https://nango.dev/docs/api-integrations/customer-io - docs_connect: https://nango.dev/docs/api-integrations/customer-io/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The region where your Customer.io instance is hosted. - enum: - - cdp - - cdp-eu - order: 1 - doc_section: '#step-2-choose-your-subdomain' - credentials: - username: - type: string - title: API Key - description: Your Customer.io Pipelines API key. - pattern: '^[a-f0-9]{20}$' - example: 36c7a4***********ab022a3 - doc_section: '#step-1-getting-authentication-credentials' - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -cursor: - display_name: Cursor - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.cursor.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v0/me - docs: https://nango.dev/docs/integrations/all/cursor - docs_connect: https://nango.dev/docs/integrations/all/cursor/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Cursor account - doc_section: '#step-1-finding-api-key' - example: key_9164000970ca2f15c999047a0e2b7e03127885be41198616a6975af08b28239b - pattern: '^(key_[a-f0-9]{64}|crsr_[a-f0-9]{64})$' - -cursor-admin: - display_name: Cursor Admin - categories: - - dev-tools - auth_mode: BASIC - proxy: - base_url: https://api.cursor.com - verification: - method: GET - endpoints: - - /teams/members - docs: https://nango.dev/docs/integrations/all/cursor-admin - docs_connect: https://nango.dev/docs/integrations/all/cursor-admin/connect - credentials: - username: - type: string - title: API key - description: The API Key of your Greenhouse account - example: key_9164000970ca2f15c999047a0e2b7e03127885be41198616a6975af08b28239b - pattern: '^(key_[a-f0-9]{64}|crsr_[a-f0-9]{64})$' - secret: true - doc_section: '#step-1-finding-api-key' - password: - type: string - title: Password - description: Password - default_value: '' - hidden: true - -databricks-account: - display_name: Databricks (Account Level) - categories: - - analytics - auth_mode: OAUTH2_CC - token_url: https://accounts.cloud.databricks.com/oidc/accounts/${connectionConfig.accountId}/v1/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://accounts.cloud.databricks.com/api/2.0/accounts/${connectionConfig.accountId} - docs: https://nango.dev/docs/integrations/all/databricks-account - connection_config: - accountId: - type: string - title: Account ID - description: The ID to your account - format: uuid - example: 123e4567-e89b-12d3-a456-426614174000 - -databricks-workspace: - display_name: Databricks (Workspace Level) - categories: - - analytics - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.databricksInstance}/oidc/v1/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.databricksInstance}/api/2.0/ - docs: https://nango.dev/docs/integrations/all/databricks-workspace - connection_config: - databricksInstance: - type: string - title: Databricks Instance - description: The instance to your databricks deployment - pattern: '^[a-z0-9_-]+(\.[a-z0-9_-]+)*$' - example: dbc-a1b2345c-d6e7.cloud.databricks.com - -# Untested configuration. Please reach out if you have a test account that we can use to test it. -datev: - display_name: Datev - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://login.datev.de/openid/authorize - token_url: https://api.datev.de/token - token_request_auth_method: basic - scope_separator: ' ' - default_scopes: - - openid - authorization_params: - response_type: code id_token - response_mode: query - nonce: AnotherRandomStringDatev - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.datev.de - docs: https://nango.dev/docs/integrations/all/datev - -datacandy: - display_name: DataCandy - categories: - - payment - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.application_url}/api2 - query: - application_key: ${connectionConfig.application_key} - accesskey: ${connectionConfig.access_key} - verification: - method: GET - endpoints: - - /merchant?application_key=${connectionConfig.application_key}&accesskey=${connectionConfig.access_key}&limit=1 - connection_config: - application_url: - type: string - title: Application URL - description: The application URL for DataCandy - example: app.datacandy.com - format: hostname - application_key: - type: string - title: Application Key - description: The application key required for read data access - example: c4f9375f9834b4e7f0a528cc65c055702bf5f24a - access_key: - type: string - title: Access Key - description: The access key required for read data access - example: '3CLJII' - credentials: - username: - type: string - title: Username - description: DataCandy username - password: - type: string - title: Password - description: DataCandy password - secret: true - docs: https://nango.dev/docs/integrations/all/datacandy - -datadog: - display_name: Datadog - categories: - - analytics - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.${connectionConfig.siteParameter}/api - headers: - dd-api-key: ${apiKey} - dd-application-key: ${connectionConfig.applicationKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/validate - retry: - after: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/api-integrations/datadog - docs_connect: https://nango.dev/docs/api-integrations/datadog/connect - connection_config: - siteParameter: - type: string - title: Site Parameter - description: The Datadog site for your account. - enum: - - datadoghq.com - - us3.datadoghq.com - - us5.datadoghq.com - - datadoghq.eu - - ddog-gov.com - - ap1.datadoghq.com - order: 1 - doc_section: '#step-1-finding-your-datadog-domain' - applicationKey: - type: string - title: Application Key - description: The application key required for read data access. - pattern: '^[A-Za-z0-9_]+$' - example: '5d8a7b3f2dc8bce1b234e7f1a1ac54728dbf9e4a7' - doc_section: '#step-3-datadog-application-key' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Datadog account. - pattern: '^[a-f0-9]{32}$' - example: '4f3c12efb9659a0b5c123b568745dbf9' - doc_section: '#step-2-datadog-api-key' - -dayforce: - display_name: Dayforce - categories: - - hr - auth_mode: TWO_STEP - body_format: form - proxy: - base_url: https://${connectionConfig.clientHostname}/api || https://www.dayforcehcm.com/api - forward_headers_on_redirect: true - token_url: https://${connectionConfig.identityHostname}/connect/token || https://dfid.dayforcehcm.com/connect/token - token_params: - grant_type: password - companyId: ${connectionConfig.companyId} - username: ${credentials.username} - password: ${credentials.password} - client_id: Dayforce.HCMAnywhere.Client - token_headers: - content-type: application/x-www-form-urlencoded - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/api-integrations/dayforce - docs_connect: https://nango.dev/docs/api-integrations/dayforce/connect - credentials: - username: - type: string - title: Username - description: Your Dayforce account username. - doc_section: '#step-2-configure-your-dayforce-user' - password: - type: string - title: Password - description: Your Dayforce account password. - doc_section: '#step-2-configure-your-dayforce-user' - connection_config: - companyId: - type: string - title: Company ID - description: The company ID for your Dayforce account. - doc_section: '#step-1-finding-your-company-id' - clientHostname: - type: string - title: API hostname - description: Hostname for the Dayforce API, leave empty for production. - format: hostname - prefix: https:// - suffix: /api - optional: true - example: test.dayforcehcm.com - doc_section: '#step-4-identifying-your-client-host' - identityHostname: - type: string - title: Identity hostname - description: Hostname for the Dayforce Identity token endpoint, leave empty for production. - format: hostname - optional: true - prefix: https:// - suffix: /connect/token - example: dfid.dayforcehcm.com - doc_section: '#step-3-identifying-your-identity-host' - -datto-rmm: - display_name: Datto RMM - categories: - - support - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.platform}-api.centrastage.net/auth/oauth/authorize - token_url: https://${connectionConfig.platform}-api.centrastage.net/auth/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - token_request_auth_method: basic - disable_pkce: true - proxy: - base_url: https://${connectionConfig.platform}-api.centrastage.net/api - docs: https://nango.dev/docs/integrations/all/datto-rmm - docs_connect: https://nango.dev/docs/integrations/all/datto-rmm/connect - connection_config: - platform: - type: string - title: Platform - description: The Datto RMM platform (region) for your account. - enum: - - pinotage - - merlot - - concord - - vidal - - zinfandel - - syrah - order: 1 - doc_section: '#step-2-select-your-platform' - -datto-rmm-password-grant: - display_name: Datto RMM (Password Grant) - categories: - - support - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.platform}-api.centrastage.net/auth/oauth/token - token_params: - grant_type: password - username: ${credentials.username} - password: ${credentials.password} - token_headers: - authorization: Basic ${base64(${credentials.default_username}:${credentials.default_password})} - proxy: - base_url: https://${connectionConfig.platform}-api.centrastage.net/api - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/integrations/all/datto-rmm-password-grant - docs_connect: https://nango.dev/docs/integrations/all/datto-rmm-password-grant/connect - connection_config: - platform: - type: string - title: Platform - description: The Datto RMM platform (region) for your account. - enum: - - pinotage - - merlot - - concord - - vidal - - zinfandel - - syrah - order: 1 - doc_section: '#step-2-select-your-platform' - credentials: - default_username: - type: string - title: '' - description: '' - default_value: 'public-client' - hidden: true - default_password: - type: string - title: '' - description: '' - default_value: 'public' - hidden: true - username: - type: string - title: API Key - pattern: '^[A-Z0-9]{32}$' - example: 'AB7KLM90PQW4XJ8H2TUVN1YZ3R5C6FDG' - doc_section: '#step-1-enable-api-access-and-generate-api-keys' - description: Your Datto RMM API Key - password: - type: string - title: API Secret Key - pattern: '^[A-Z0-9]{32}$' - example: '9XQ7MZB4H1L2WKC0RDFTPY5J8VUNSG3E' - doc_section: '#step-1-enable-api-access-and-generate-api-keys' - description: Your Datto RMM Secret Key - -deel: - display_name: Deel - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://app.deel.com/oauth2/authorize - token_url: https://app.deel.com/oauth2/tokens - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.letsdeel.com - docs: https://nango.dev/docs/integrations/all/deel - -deel-sandbox: - display_name: Deel (Sandbox) - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://demo.deel.com/oauth2/authorize - token_url: https://demo.deel.com/oauth2/tokens - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api-sandbox.demo.deel.com - docs: https://nango.dev/docs/integrations/all/deel-sandbox - -devin: - display_name: Devin - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.devin.ai - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/sessions - docs: https://nango.dev/docs/integrations/all/devin - docs_connect: https://nango.dev/docs/integrations/all/devin/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Devin account - pattern: '^apk_user_[A-Za-z0-9+/=]+$' - example: 'apk_user_dGVzdF9vcmdfeDY1NzRBUElLRVl8Njc1OTdjNDQzMjFhOTZlODhlMmE4MTI0X29yZ194NnB5QlVJa042anVKWWtMOjQ3NzQxYTVmYWE5MTRiNjQ5' - doc_section: '#step-1-finding-your-api-key' - -demodesk: - display_name: DemoDesk - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://demodesk.com - headers: - api-key: ${apiKey} - docs: https://nango.dev/docs/api-integrations/demodesk - docs_connect: https://nango.dev/docs/api-integrations/demodesk/connect - credentials: - apiKey: - type: string - title: API Key - description: Your DemoDesk API key - doc_section: '#step-1-obtaining-your-api-key' - -dialpad: - display_name: Dialpad - categories: - - communication - auth_mode: OAUTH2 - authorization_url: https://dialpad.com/oauth2/authorize - token_url: https://dialpad.com/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://dialpad.com - docs: https://nango.dev/docs/integrations/all/dialpad - -dialpad-sandbox: - display_name: Dialpad (Sandbox) - categories: - - communication - auth_mode: OAUTH2 - authorization_url: https://sandbox.dialpad.com/oauth2/authorize - token_url: https://sandbox.dialpad.com/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://sandbox.dialpad.com - docs: https://nango.dev/docs/integrations/all/dialpad-sandbox - -dialpad-wfm: - display_name: Dialpad WFM - categories: - - hr - auth_mode: API_KEY - proxy: - base_url: https://api.teamsurfboard.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/api-integrations/dialpad-wfm - docs_connect: https://nango.dev/docs/api-integrations/dialpad-wfm/connect - credentials: - apiKey: - type: string - title: Access Token - description: The access token for your account. - secret: true - doc_section: '#step-1-obtain-your-access-token' - -diffbot: - display_name: Diffbot - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://api.diffbot.com - query: - token: ${apiKey} - verification: - method: GET - endpoints: - - /v4/account - docs: https://nango.dev/docs/api-integrations/diffbot - docs_connect: https://nango.dev/docs/api-integrations/diffbot/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Diffbot API token. - example: c4f82a1b********************e7d3 - pattern: '^[a-f0-9]{32}$' - doc_section: '#step-1-obtain-your-api-token' - -digitalocean: - display_name: DigitalOcean - categories: - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://cloud.digitalocean.com/v1/oauth/authorize - token_url: https://cloud.digitalocean.com/v1/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.digitalocean.com - docs: https://nango.dev/docs/integrations/all/digitalocean - -digits: - display_name: Digits - categories: - - accounting - auth_mode: OAUTH2 - authorization_url: https://connect.digits.com/v1/oauth/authorize - token_url: https://connect.digits.com/v1/oauth/token - body_format: json - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://connect.digits.com - docs: https://nango.dev/docs/api-integrations/digits - setup_guide_url: https://nango.dev/docs/api-integrations/digits/how-to-register-your-own-digits-api-oauth-app - -digits-mcp: - display_name: Digits (MCP) - categories: - - accounting - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://api.digits.com/oauth/authorize - token_url: https://api.digits.com/oauth/token - registration_url: https://api.digits.com/oauth/register - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.digits.com - docs: https://nango.dev/docs/api-integrations/digits-mcp - -discolike: - display_name: DiscoLike - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.discolike.com - headers: - x-discolike-key: ${apiKey} - verification: - method: GET - endpoints: - - /v1/count - docs: https://nango.dev/docs/api-integrations/discolike - docs_connect: https://nango.dev/docs/api-integrations/discolike/connect - credentials: - apiKey: - type: string - title: API Key - description: Your DiscoLike API key. - doc_section: '#step-1-obtain-your-api-key' - example: 123e4567-e89b-12d3-a456-426614174000 - format: uuid - -discord: - display_name: Discord - categories: - - gaming - - social - auth_mode: OAUTH2 - authorization_url: https://discord.com/api/oauth2/authorize - token_url: https://discord.com/api/oauth2/token - authorization_params: - response_type: code - proxy: - base_url: https://discord.com - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/discord - setup_guide_url: https://nango.dev/docs/api-integrations/discord/how-to-register-your-own-discord-api-oauth-app - -discourse: - display_name: Discourse - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.defaultHost} - retry: - after: - - 'retry-after' - headers: - api-username: ${connectionConfig.apiUsername} - api-key: ${apiKey} - accept: application/json - docs: https://nango.dev/docs/integrations/all/discourse - connection_config: - defaultHost: - type: string - title: Domain - description: The domain of your Discourse account - format: hostname - prefix: https:// - apiUsername: - type: string - title: API Username - description: The API username of your Discourse account - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Discourse account - -crisp: - display_name: Crisp - categories: - - communication - - support - auth_mode: BASIC - proxy: - base_url: https://api.crisp.chat - headers: - x-crisp-tier: plugin - verification: - method: GET - endpoints: - - /v1/plugin/connect/account - docs: https://nango.dev/docs/integrations/all/crisp - docs_connect: https://nango.dev/docs/integrations/all/crisp/connect - credentials: - username: - type: string - title: Token Identifier - description: The identifier part of your Crisp token keypair - example: 123e4567-e89b-12d3-a456-426614174000 - format: uuid - doc_section: '#step-1-generating-your-token-keypair' - password: - type: string - title: Token Key - pattern: '^[a-f0-9]{64}$' - example: a3f5c8d2b9e4713f2c0a7b4d5e6f8c9b1a2d3e4f5b6c7d8e9f0a1b2c3d4e5f6a7 - description: The key part of your Crisp token keypair - doc_section: '#step-1-generating-your-token-keypair' - -crisp-plugin-install: - display_name: Crisp (Plugin Install) - categories: - - communication - - support - auth_mode: INSTALL_PLUGIN - auth_type: BASIC - redirect_uri_metadata: - - website_id - proxy: - base_url: https://api.crisp.chat - headers: - x-crisp-tier: plugin - verification: - method: GET - endpoints: - - /v1/plugin/connect/account - docs: https://nango.dev/docs/api-integrations/crisp-plugin-install - setup_guide_url: https://nango.dev/docs/api-integrations/crisp-plugin-install/how-to-register-your-own-crisp-plugin - -crunchbase: - display_name: Crunchbase - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.crunchbase.com/ - headers: - x-cb-user-key: ${apiKey} - verification: - method: GET - endpoints: - - /v4/data/autocompletes?query=instantly&limit=1 - docs: https://nango.dev/docs/api-integrations/crunchbase - docs_connect: https://nango.dev/docs/api-integrations/crunchbase/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Crunchbase API key. - doc_section: '#step-1-get-your-api-key' - pattern: '^[a-zA-Z0-9]{32}$' - example: 0f9c************************5336 - -dixa: - display_name: Dixa - categories: - - support - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.apiType}.dixa.io - headers: - authorization: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/agents - base_url_override: https://dev.dixa.io - docs: https://nango.dev/docs/integrations/all/dixa - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Dixa account - connection_config: - apiType: - type: string - title: API Type - description: The Dixa API type to use for requests. - enum: - - dev - - exports - -document360: - display_name: Document360 - categories: - - knowledge-base - auth_mode: API_KEY - proxy: - headers: - api_token: ${apiKey} - base_url: https://api.document360.com - docs: https://nango.dev/docs/integrations/all/document360 - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Document360 account - -docusign: - display_name: DocuSign - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://account.docusign.com/oauth/auth - token_url: https://account.docusign.com/oauth/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://www.docusign.net - post_connection_script: docusignPostConnection - docs: https://nango.dev/docs/integrations/all/docusign - -docusign-sandbox: - display_name: DocuSign (Sandbox) - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://account-d.docusign.com/oauth/auth - token_url: https://account-d.docusign.com/oauth/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://demo.docusign.net - post_connection_script: docusignPostConnection - docs: https://nango.dev/docs/integrations/all/docusign-sandbox - -docuware: - display_name: DocuWare - categories: - - productivity - auth_mode: TWO_STEP - token_url: https://${connectionConfig.domain}/DocuWare/Platform/Home/IdentityServiceInfo - body_format: form - token_request_method: GET - token_headers: - content-type: application/x-www-form-urlencoded - additional_steps: - - body_format: form - token_url: ${step1.IdentityServiceUrl}/.well-known/openid-configuration - token_request_method: GET - - body_format: form - token_url: ${step2.token_endpoint} - token_headers: - content-type: application/x-www-form-urlencoded - token_params: - grant_type: password - scope: docuware.platform - client_id: docuware.platform.net.client - username: ${credentials.username} - password: ${credentials.password} - proxy: - base_url: https://${connectionConfig.domain}/DocuWare/Platform - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/integrations/all/docuware - docs_connect: https://nango.dev/docs/integrations/all/docuware/connect - connection_config: - domain: - type: string - title: Domain - description: The domain to your DocuWare account - format: hostname - prefix: https:// - example: example.docuware.cloud - order: 1 - doc_section: '#step-1-finding-your-domain' - credentials: - username: - type: string - title: Username - description: The Username to your DocuWare account - doc_section: '#step-2-finding-your-credentials' - password: - type: string - title: Password - secret: true - description: The Password to your DocuWare account - doc_section: '#step-2-finding-your-credentials' - -domo: - display_name: Domo - categories: - - productivity - - other - auth_mode: OAUTH2_CC - token_url: https://api.domo.com/oauth/token - scope_separator: ',' - token_params: - grant_type: client_credentials - token_request_auth_method: basic - proxy: - base_url: https://api.domo.com - docs: https://nango.dev/docs/api-integrations/domo - docs_connect: https://nango.dev/docs/api-integrations/domo/connect - credentials: - client_id: - type: string - title: Your Client ID - description: The Client ID of your API client - format: uuid - example: 123e4567-e89b-12d3-a456-426614174000 - doc_section: '#step-1-creating-your-api-client' - client_secret: - type: string - title: Your Client Secret - secret: true - example: a14e6b49******************************768ece - pattern: '^[a-fA-F0-9]{64}$' - description: The Client secret of your API client - doc_section: '#step-1-creating-your-api-client' - -dropbox: - display_name: Dropbox - categories: - - knowledge-base - - storage - auth_mode: OAUTH2 - authorization_url: https://www.dropbox.com/oauth2/authorize - token_url: https://api.dropboxapi.com/oauth2/token - authorization_params: - token_access_type: offline - proxy: - base_url: https://api.dropboxapi.com - docs: https://nango.dev/docs/api-integrations/dropbox - setup_guide_url: https://nango.dev/docs/api-integrations/dropbox/how-to-register-your-own-dropbox-api-oauth-app - -dropbox-sign: - display_name: Dropbox Sign - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://app.hellosign.com/oauth/authorize - token_url: https://app.hellosign.com/oauth/token - authorization_url_skip_empty: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - refresh_url: https://app.hellosign.com/oauth/token?refresh - proxy: - retry: - at: - - 'x-ratelimit-reset' - base_url: https://api.hellosign.com - docs: https://nango.dev/docs/integrations/all/dropbox-sign - -drchrono: - display_name: DrChrono - categories: - - other - auth_mode: OAUTH2 - authorization_url: https://app.drchrono.com/o/authorize/ - token_url: https://app.drchrono.com/o/token/ - authorization_url_skip_empty: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://app.drchrono.com - docs: https://nango.dev/docs/integrations/all/drchrono - -drata: - display_name: Drata - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://public-api.drata.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/api-integrations/drata - docs_connect: https://nango.dev/docs/api-integrations/drata/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Drata API key - -cisco-duo-admin: - display_name: Cisco Duo Admin API - categories: - - iam - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.hostname} - headers: - date: '${now:ddd, DD MMM YYYY HH:mm:ss ZZ}' - authorization: "Basic ${base64(${credentials.username}:${hmacSha1Hex(${now:ddd, DD MMM YYYY HH:mm:ss ZZ}\n${method}\n${host}\n${path}\n${params}, ${credentials.password})})}" - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/cisco-duo-admin - docs_connect: https://nango.dev/docs/api-integrations/cisco-duo-admin/connect - connection_config: - hostname: - type: string - title: API Hostname - description: Your Duo API hostname. - example: api-xxxxxxxx.duosecurity.com - pattern: 'api-[a-z0-9]+\.duosecurity\.com' - order: 1 - credentials: - username: - type: string - title: Integration Key - description: Your Duo application's integration key. - example: DIWJ8X6**********TQ1 - pattern: 'DI[A-Z0-9]{18}' - password: - type: string - title: Secret Key - description: Your Duo application's secret key. - example: Zh5eGm**************************zLJ4Ep - pattern: '[A-Za-z0-9]{40}' - -contactout: - display_name: ContactOut - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.contactout.com - headers: - authorization: basic - token: ${apiKey} - retry: - after: - - 'retry-after' - verification: - method: GET - endpoints: - - /v1/stats - docs: https://nango.dev/docs/integrations/all/contactout - docs_connect: https://nango.dev/docs/integrations/all/contactout/connect - credentials: - apiKey: - type: string - title: API Key - example: ab7KxYpR1qLmN9Zs3TvUeFgH - description: Your ContactOut API Key - -drupal: - display_name: Drupal - categories: - - dev-tools - - design - - cms - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.baseUrl}/rest_api/access_token - token_params: - client_id: ${credentials.clientId} - client_secret: ${credentials.clientSecret} - username: ${credentials.userName} - grant_type: client_credentials - token_headers: - content-type: application/x-www-form-urlencoded - accept: application/json - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://${connectionConfig.baseUrl} - docs: https://nango.dev/docs/integrations/all/drupal - docs_connect: https://nango.dev/docs/integrations/all/drupal/connect - credentials: - clientId: - type: string - title: Client ID - description: Your Client ID - secret: true - doc_section: '#step-3-generating-your-drupal-client-credentials' - clientSecret: - type: string - title: Client Secret - description: Your Client Secret - secret: true - doc_section: '#step-3-generating-your-drupal-client-credentials' - userName: - type: string - title: User Name - description: Your Drupal User Name - doc_section: '#step-2-finding-your-drupal-user-name' - connection_config: - baseUrl: - type: string - title: Base Url - description: Your Drupal base url - example: example.drupal.com - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-drupal-base-url' - -dualentry-mcp: - display_name: Dualentry (MCP) - categories: - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://api.dualentry.com/mcp/authorize - token_url: https://api.dualentry.com/mcp/token - registration_url: https://api.dualentry.com/mcp/register - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.dualentry.com - docs: https://nango.dev/docs/api-integrations/dualentry-mcp - -dynatrace: - display_name: Dynatrace - categories: - - analytics - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.environmentId}.live.dynatrace.com - headers: - authorization: Api-Token ${apiKey} - docs: https://nango.dev/docs/api-integrations/dynatrace - docs_connect: https://nango.dev/docs/api-integrations/dynatrace/connect - connection_config: - environmentId: - type: string - title: Environment ID - description: Your Dynatrace environment ID. - pattern: '^[a-z0-9]+$' - example: mew08*** - order: 1 - doc_section: '#step-1-find-your-environment-id' - credentials: - apiKey: - type: string - title: API Token - description: Your Dynatrace API token. - pattern: '^dt0[a-z]\d+\.[A-Z0-9]+\.[A-Z0-9]+$' - example: dt0s01.ST2EY72KQINMH5***********.G3DFPBEJYMODIDAEX454M7YWB*************************** - doc_section: '#step-2-generate-an-api-token' - -dynatrace-oauth: - display_name: Dynatrace (OAuth) - categories: - - analytics - - dev-tools - auth_mode: OAUTH2_CC - token_url: https://sso.dynatrace.com/sso/oauth2/token - scope_separator: ' ' - token_params: - grant_type: client_credentials - resource: urn:dtaccount:${connectionConfig.accountUuid} - proxy: - base_url: https://api.dynatrace.com - docs: https://nango.dev/docs/api-integrations/dynatrace-oauth - docs_connect: https://nango.dev/docs/api-integrations/dynatrace-oauth/connect - connection_config: - accountUuid: - type: string - title: Account UUID - description: Your Dynatrace account UUID. - example: 9a8b7c6d-1234-5678-abcd-ef0123456789 - format: uuid - order: 1 - doc_section: '#step-1-find-your-account-uuid' - credentials: - client_id: - type: string - title: Client ID - description: Your Dynatrace OAuth client ID. - example: dt0s03.**************** - doc_section: '#step-2-create-an-oauth-client' - client_secret: - type: string - title: Client Secret - description: Your Dynatrace OAuth client secret. - secret: true - example: dt0s03.5NJ******.GYWJPBF****************** - doc_section: '#step-2-create-an-oauth-client' - -emarsys: - display_name: Emarsys Core API (WSSE) - categories: - - marketing - auth_mode: SIGNATURE - signature: - protocol: WSSE - proxy: - base_url: https://api.emarsys.net - headers: - content-type: application/json - x-wsse: ${accessToken} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v2/settings - retry: - at: - - 'x-ratelimit-reset' - token: - expires_in_ms: 300000 - docs: https://nango.dev/docs/integrations/all/emarsys - credentials: - username: - type: string - title: ID - description: The ID of your Emarsys WSSE API Credentials - pattern: '^[a-zA-Z0-9_-]+$' - password: - type: string - title: Client Secret - description: The Client Secret of your Emarsys WSSE API Credentials - pattern: '^[a-zA-Z0-9-]+$' - -emarsys-oauth: - display_name: Emarsys (OAuth) - categories: - - marketing - auth_mode: OAUTH2_CC - token_url: https://auth.emarsys.net/oauth2/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.emarsys.net - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/integrations/all/emarsys-oauth - docs_connect: https://nango.dev/docs/integrations/all/emarsys-oauth/connect - -employment-hero: - display_name: Employment Hero - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://oauth.employmenthero.com/oauth2/authorize - token_url: https://oauth.employmenthero.com/oauth2/token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.employmenthero.com/api - docs: https://nango.dev/docs/integrations/all/employment-hero - -ebay: - display_name: eBay - categories: - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://auth.ebay.com/oauth2/authorize - token_url: https://api.ebay.com/identity/v1/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - token_request_auth_method: basic - proxy: - base_url: https://api.ebay.com/ - docs: https://nango.dev/docs/integrations/all/ebay - -ebay-sandbox: - display_name: eBay (Sandbox) - categories: - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://auth.sandbox.ebay.com/oauth2/authorize - token_url: https://api.sandbox.ebay.com/identity/v1/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - token_request_auth_method: basic - proxy: - base_url: https://api.sandbox.ebay.com/ - docs: https://nango.dev/docs/integrations/all/ebay-sandbox - -easypost: - display_name: EasyPost - categories: - - e-commerce - auth_mode: BASIC - proxy: - base_url: https://api.easypost.com - docs: https://nango.dev/docs/api-integrations/easypost - docs_connect: https://nango.dev/docs/api-integrations/easypost/connect - credentials: - username: - type: string - title: API Key - description: Your EasyPost API key. - pattern: '^EZ(AK|TK)[a-zA-Z0-9]+$' - example: EZTK****************************PCHxBDQG3lpZjneEFUxKmg - doc_section: '#step-1-get-your-api-key' - password: - type: string - title: '' - description: '' - hidden: true - default_value: '' - -e-conomic: - display_name: e-conomic - categories: - - accounting - auth_mode: BASIC - proxy: - base_url: https://restapi.e-conomic.com - headers: - content-type: application/json - docs: https://nango.dev/docs/integrations/all/e-conomic - credentials: - username: - type: string - title: Private Token - description: The Private Token for your e-conomic account - password: - type: string - title: Agreement Grant Token - description: The Agreement Grant Token for your e-conomic account - -ecu360: - display_name: ECU360 (Test) - categories: - - other - auth_mode: TWO_STEP - body_format: json - token_url: https://apim-test.ecu360.com/auth/v1/authenticate - token_params: - userName: ${credentials.userName} - password: ${credentials.password} - isEncrypted: false - mfaToken: '' - token_headers: - ecu360-api-key: ${credentials.apiKey} - content-type: application/json - token_response: - token: jwtToken - token_expires_in_ms: 900000 - proxy: - base_url: https://apim-test.ecu360.com - docs: https://nango.dev/docs/api-integrations/ecu360 - docs_connect: https://nango.dev/docs/api-integrations/ecu360/connect - credentials: - apiKey: - type: string - title: API Key - description: Your ECU360 API Key - secret: true - doc_section: '#step-2-obtaining-your-api-key' - userName: - type: string - title: Username - description: Your ECU360 username - doc_section: '#step-1-finding-your-credentials' - password: - type: string - title: Password - description: Your ECU360 password - secret: true - doc_section: '#step-1-finding-your-credentials' - -ecu360-production: - display_name: ECU360 (Production) - categories: - - other - alias: ecu360 - token_url: https://apim.ecu360.com/auth/v1/authenticate - proxy: - base_url: https://apim.ecu360.com - docs: https://nango.dev/docs/api-integrations/ecu360-production - docs_connect: https://nango.dev/docs/api-integrations/ecu360-production/connect - -egnyte: - display_name: Egnyte - categories: - - storage - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.egnyte.com/puboauth/token - token_url: https://${connectionConfig.subdomain}.egnyte.com/puboauth/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.egnyte.com/pubapi - docs: https://nango.dev/docs/integrations/all/egnyte - connection_config: - subdomain: - type: string - title: Egnyte Domain - description: The subdomain of your Egnyte account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .egnyte.com - prefix: https:// - -elevenlabs: - display_name: Eleven Labs - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.elevenlabs.io - headers: - xi-api-key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/user - docs: https://nango.dev/docs/integrations/all/elevenlabs - credentials: - apiKey: - type: string - title: API Key - description: The API key for your ElevenLabs account - -elevio: - display_name: Elevio - categories: - - knowledge-base - - support - auth_mode: API_KEY - proxy: - base_url: https://api.elev.io - headers: - x-api-key: ${apiKey} - authorization: Bearer ${connectionConfig.jwt} - docs: https://nango.dev/docs/integrations/all/elevio - credentials: - apiKey: - type: string - title: API Key - description: The API key to your Elevio account - pattern: '\b[a-f0-9]{40}\b' - example: 'x12z67890dd34t8gq5j01ycc75912348' - connection_config: - jwt: - type: string - title: JWT - description: The JWT to your Elevio account - pattern: '^[A-Za-z0-9-_]+\.([A-Za-z0-9-_]+\.[A-Za-z0-9-_]+)$' - -entrata: - display_name: Entrata - categories: - - other - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.entrata.com - docs: https://nango.dev/docs/integrations/all/entrata - connection_config: - subdomain: - type: string - title: Entrata Domain - description: The subdomain of your Entrata account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .entrata.com - prefix: https:// - -envoy: - display_name: Envoy - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://app.envoy.com/a/auth/v0/authorize - token_url: https://app.envoy.com/a/auth/v0/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.envoy.com - docs: https://nango.dev/docs/integrations/all/envoy - -epc-gov-uk: - display_name: Energy Performance Certificates (Gov.UK) - categories: - - other - auth_mode: API_KEY - proxy: - base_url: https://api.get-energy-performance-data.communities.gov.uk - headers: - authorization: Bearer ${apiKey} - accept: application/json - verification: - method: GET - endpoints: - - /api/codes - docs: https://nango.dev/docs/api-integrations/epc-gov-uk - docs_connect: https://nango.dev/docs/api-integrations/epc-gov-uk/connect - credentials: - apiKey: - type: string - title: API Key - description: The API bearer token of your account. - pattern: '^[A-Za-z0-9]{64}$' - example: 'a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2' - doc_section: '#step-2-finding-your-api-key' - -epic-games: - display_name: Epic Games - categories: - - gaming - auth_mode: OAUTH2 - authorization_url: https://www.epicgames.com/id/authorize - token_url: https://api.epicgames.dev/epic/oauth/v1/token - authorization_method: header - proxy: - base_url: https://api.epicgames.dev - docs: https://nango.dev/docs/integrations/all/epic-games - -evaluagent: - display_name: EvaluAgent - categories: - - support - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.region}.evaluagent.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/ping - docs: https://nango.dev/docs/integrations/all/evaluagent - connection_config: - region: - type: string - title: Region - description: The region of your EvaluAgent account. - enum: - - api - - api.us-east - - api.aus - credentials: - username: - type: string - title: Access Key Id - description: The Access Key ID for your EvaluAgent account - pattern: '^[a-zA-Z0-9-]+$' - password: - type: string - title: Secret Key - description: The Secret Key for your EvaluAgent account - pattern: '^[a-zA-Z0-9-]+$' - -eventbrite: - display_name: Eventbrite - categories: - - marketing - auth_mode: OAUTH2 - authorization_url: https://www.eventbrite.com/oauth/authorize - token_url: https://www.eventbrite.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://www.eventbriteapi.com - docs: https://nango.dev/docs/integrations/all/eventbrite - -everflow: - display_name: Everflow - categories: - - marketing - - analytics - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.eflow.team - headers: - x-eflow-api-key: ${apiKey} - docs: https://nango.dev/docs/api-integrations/everflow - docs_connect: https://nango.dev/docs/api-integrations/everflow/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: Your Everflow API subdomain. - enum: - - api - - api-eu - order: 1 - doc_section: '#step-2-find-your-subdomain' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Everflow account. - doc_section: '#step-1-generate-your-api-key' - -etsy: - display_name: Etsy - categories: - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://www.etsy.com/oauth/connect - token_url: https://api.etsy.com/v3/public/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.etsy.com - headers: - x-api-key: ${clientId}:${clientSecret} - docs: https://nango.dev/docs/api-integrations/etsy - setup_guide_url: https://nango.dev/docs/api-integrations/etsy/how-to-register-your-own-etsy-api-oauth-app - -exa: - display_name: Exa - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://api.exa.ai - headers: - x-api-key: ${apiKey} - docs: https://nango.dev/docs/integrations/all/exa - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Exa account - -exact-online: - display_name: Exact Online - categories: - - accounting - - erp - auth_mode: OAUTH2 - authorization_url: https://start.exactonline.${connectionConfig.extension}/api/oauth2/auth - token_url: https://start.exactonline.${connectionConfig.extension}/api/oauth2/token - authorization_method: header - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - token_expiration_buffer: 30 - proxy: - base_url: https://start.exactonline.${connectionConfig.extension}/ - headers: - accept: application/json - retry: - at: - - 'x-ratelimit-minutely-reset' - - 'x-ratelimit-reset' - error_code: - - '429' - - '503' - paginate: - type: link - link_path_in_response_body: d.__next - docs: https://nango.dev/docs/integrations/all/exact-online - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Exact Online account. - enum: - - nl - - be - - de - - fr - - es - - co.uk - - com - -exist: - display_name: Exist - categories: - - other - auth_mode: OAUTH2 - authorization_url: https://exist.io/oauth2/authorize - token_url: https://exist.io/oauth2/access_token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://exist.io/ - paginate: - type: link - link_path_in_response_body: next - docs: https://nango.dev/docs/integrations/all/exist - -expensify: - display_name: Expensify - categories: - - productivity - auth_mode: BASIC - proxy: - base_url: https://integrations.expensify.com/Integration-Server/ - headers: - content-type: application/x-www-form-urlencoded - credentials: - username: - type: string - title: Partner User ID - description: Your unique account identifier of Expensify - doc_section: '#step-1-finding-your-partneruserid-and-partnerusersecret' - password: - type: string - title: Partner User Secret - description: Unique secret for your account - doc_section: '#step-1-finding-your-partneruserid-and-partnerusersecret' - credentials_verification_script: expensifyCredentialsVerification - docs: https://nango.dev/docs/integrations/all/expensify - docs_connect: https://nango.dev/docs/integrations/all/expensify/connect - -factorial: - display_name: Factorial - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://api.factorialhr.com/oauth/authorize - token_url: https://api.factorialhr.com/oauth/token - disable_pkce: true - proxy: - base_url: https://api.factorialhr.com/api - docs: https://nango.dev/docs/integrations/all/factorial - -fairing: - display_name: Fairing - categories: - - marketing - - analytics - auth_mode: API_KEY - proxy: - base_url: https://app.fairing.co/api - headers: - authorization: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /questions - docs: https://nango.dev/docs/integrations/all/fairing - docs_connect: https://nango.dev/docs/integrations/all/fairing/connect - credentials: - apiKey: - type: string - title: Secret Token - description: The Secret Token for your Fairing account - pattern: '^[A-Za-z0-9_-]{64}$' - example: '3UjYpDjuk70Lt7AxC4M1x_7XvxoxkeX-OV7uTahJowilqLb2eLLvrtlvCGZgku1q' - doc_section: '#step-1-finding-your-secret-token' - -facebook: - display_name: Facebook - categories: - - marketing - - social - auth_mode: OAUTH2 - authorization_url: https://www.facebook.com/v22.0/dialog/oauth - token_url: https://graph.facebook.com/v22.0/oauth/access_token - proxy: - base_url: https://graph.facebook.com - docs: https://nango.dev/docs/api-integrations/facebook - setup_guide_url: https://nango.dev/docs/api-integrations/facebook/how-to-register-your-own-facebook-api-oauth-app - -fanvue: - display_name: Fanvue - categories: - - other - auth_mode: OAUTH2 - authorization_url: https://auth.fanvue.com/oauth2/auth - token_url: https://auth.fanvue.com/oauth2/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - default_scopes: - - offline_access - - offline - scope_separator: ' ' - proxy: - base_url: https://api.fanvue.com - headers: - x-fanvue-api-version: ${connectionConfig.version} || 2025-06-26 - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/fanvue - connection_config: - version: - type: string - title: '' - description: '' - automated: true - -fiber-ai: - display_name: Fiber AI - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://api.fiber.ai - query: - apiKey: ${apiKey} - verification: - method: GET - endpoints: - - /v1/get-org-credits - docs: https://nango.dev/docs/api-integrations/fiber-ai - docs_connect: https://nango.dev/docs/api-integrations/fiber-ai/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Fiber AI API key. - doc_section: '#step-1-getting-your-api-key' - -fathom: - display_name: Fathom - categories: - - communication - - video - auth_mode: API_KEY - proxy: - base_url: https://api.fathom.ai - headers: - x-api-key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /external/v1/teams - webhook_routing_script: fathomWebhookRouting - webhook_user_defined_secret: true - docs: https://nango.dev/docs/integrations/all/fathom - docs_connect: https://nango.dev/docs/integrations/all/fathom/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Fathom account - -fathom-oauth: - display_name: Fathom (OAuth) - categories: - - communication - - video - auth_mode: OAUTH2 - authorization_url: https://fathom.video/external/v1/oauth2/authorize - token_url: https://fathom.video/external/v1/oauth2/token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - webhook_routing_script: fathomWebhookRouting - webhook_user_defined_secret: true - proxy: - base_url: https://api.fathom.ai - retry: - at: - - 'ratelimit-reset' - docs: https://nango.dev/docs/api-integrations/fathom-oauth - setup_guide_url: https://nango.dev/docs/api-integrations/fathom-oauth/how-to-register-your-own-fathom-oauth-app - -fellow: - display_name: Fellow - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.fellow.app/api - headers: - x-api-key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/me - docs: https://nango.dev/docs/api-integrations/fellow - docs_connect: https://nango.dev/docs/api-integrations/fellow/connect - connection_config: - subdomain: - type: string - title: Workspace Subdomain - description: The subdomain of your Fellow workspace - pattern: '^[a-z0-9_-]+$' - example: myworkspace - order: 1 - doc_section: '#step-1-finding-your-workspace-subdomain' - credentials: - apiKey: - type: string - title: API Key - description: Your Fellow API Key - example: ab84bc2056614635866e4a98c153d7a1ab30541032fd433793d402f2a5db2404 - pattern: '^[a-f0-9]{64}$' - doc_section: '#step-2-generating-your-api-key' - -fern: - display_name: Fern (Public API) - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.baseUrl} - headers: - fern_api_key: ${apiKey} - docs: https://nango.dev/docs/api-integrations/fern - docs_connect: https://nango.dev/docs/api-integrations/fern/connect - credentials: - apiKey: - type: string - title: Fern API key - description: Your Fern API key. - doc_section: '#step-1-generate-your-fern-api-key' - connection_config: - baseUrl: - type: string - title: Docs URL - description: The domain of your Fern docs site. - example: docs.example.com - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-2-find-your-docs-url' - -freeagent: - display_name: FreeAgent - categories: - - accounting - - invoicing - auth_mode: OAUTH2 - authorization_url: https://api.freeagent.com/v2/approve_app - token_url: https://api.freeagent.com/v2/token_endpoint - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.freeagent.com - docs: https://nango.dev/docs/api-integrations/freeagent - setup_guide_url: https://nango.dev/docs/api-integrations/freeagent/how-to-register-your-own-freeagent-oauth-app - -freeagent-sandbox: - display_name: FreeAgent (Sandbox) - categories: - - accounting - - invoicing - auth_mode: OAUTH2 - authorization_url: https://api.sandbox.freeagent.com/v2/approve_app - token_url: https://api.sandbox.freeagent.com/v2/token_endpoint - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.sandbox.freeagent.com - docs: https://nango.dev/docs/api-integrations/freeagent-sandbox - setup_guide_url: https://nango.dev/docs/api-integrations/freeagent-sandbox/how-to-register-your-own-freeagent-oauth-app - -freepik: - display_name: Freepik - categories: - - other - auth_mode: API_KEY - proxy: - base_url: https://api.freepik.com - headers: - x-freepik-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v1/resources - docs: https://nango.dev/docs/api-integrations/freepik - docs_connect: https://nango.dev/docs/api-integrations/freepik/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Freepik account. - doc_section: '#step-1-obtain-your-freepik-api-key' - example: FPSXc7b3**********************5b2a - pattern: 'FPSX[0-9a-f]{32}' - -figjam: - display_name: FigJam - categories: - - design - - productivity - alias: figma - docs: https://nango.dev/docs/integrations/all/figjam - -figma: - display_name: Figma - categories: - - design - - productivity - auth_mode: OAUTH2 - authorization_url: https://www.figma.com/oauth - token_url: https://api.figma.com/v1/oauth/token - refresh_url: https://api.figma.com/v1/oauth/refresh - token_request_auth_method: basic - scope_separator: ',' - disable_pkce: true - proxy: - base_url: https://api.figma.com - docs: https://nango.dev/docs/integrations/all/figma - -figma-scim: - display_name: Figma (SCIM) - categories: - - design - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.host}/scim/v2/${connectionConfig.tenantId} - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /Users - docs: https://nango.dev/docs/integrations/all/figma-scim - docs_connect: https://nango.dev/docs/integrations/all/figma-scim/connect - credentials: - apiKey: - type: string - title: API Token - description: The API token for your Figma account - doc_section: '#step-3-generating-your-api-token' - connection_config: - host: - type: string - title: Host - description: The Figma host for your account. - format: hostname - enum: - - www.figma.com - - figma-gov.com - order: 1 - doc_section: '#step-1-finding-your-host' - tenantId: - type: string - title: Tenant ID - description: The tenant ID of your Figma account - order: 2 - doc_section: '#step-2-finding-your-tenant-id' - -falai: - display_name: fal.ai - categories: - - productivity - - dev-tools - auth_mode: API_KEY - proxy: - headers: - authorization: Key ${apiKey} - base_url: https://queue.fal.run - verification: - method: POST - headers: - content-type: application/json - endpoints: - - /fal-ai/fast-sdxl - docs: https://nango.dev/docs/integrations/all/falai - credentials: - apiKey: - type: string - title: API Key - description: The API key for your fal.ai account - -findymail: - display_name: FindyMail - categories: - - marketing - - crm - auth_mode: API_KEY - proxy: - base_url: https://app.findymail.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/findymail - docs_connect: https://nango.dev/docs/integrations/all/findymail/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your FindyMail account - -firefish: - display_name: Firefish - scope_separator: ' ' - categories: - - crm - auth_mode: OAUTH2_CC - token_url: https://api.firefishsoftware.com/authorization/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.firefishsoftware.com - docs: https://nango.dev/docs/integrations/all/firefish - -fireflies: - display_name: Fireflies - categories: - - analytics - - communication - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.fireflies.ai - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /graphql?query=%7B__schema%7Btypes%7Bname%7D%7D%7D - docs: https://nango.dev/docs/integrations/all/fireflies - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Fireflies account - -firstbase: - display_name: Firstbase - categories: - - hr - auth_mode: API_KEY - proxy: - base_url: https://apipub.firstbasehq.com - headers: - authorization: ApiKey ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/orders?size=1 - docs: https://nango.dev/docs/api-integrations/firstbase - docs_connect: https://nango.dev/docs/api-integrations/firstbase/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Firstbase account - doc_section: '#step-1-generating-your-api-key' - -fiserv: - display_name: Fiserv (OAuth) - categories: - - banking - - payment - auth_mode: OAUTH2_CC - token_url: https://cert.api.fiservapps.com/fts-apim/oauth2/v2 - token_request_auth_method: basic - expires_in_unit: milliseconds - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.hostUrl} - docs: https://nango.dev/docs/integrations/all/fiserv - connection_config: - hostUrl: - type: string - title: Domain - description: The domain of your Fiserv account - format: hostname - prefix: https:// - -fiserv-api-key: - display_name: Fiserv (API Key) - categories: - - banking - - payment - auth_mode: API_KEY - proxy: - base_url: https://prod.emea.api.fiservapps.com - headers: - api-key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /sandbox/exp/v1/authorisations - docs: https://nango.dev/docs/integrations/all/fiserv-api-key - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Fiserv account - -fitbit: - display_name: Fitbit - categories: - - sports - auth_mode: OAUTH2 - authorization_url: https://www.fitbit.com/oauth2/authorize - token_url: https://api.fitbit.com/oauth2/token - authorization_method: header - proxy: - base_url: https://api.fitbit.com - docs: https://nango.dev/docs/integrations/all/fitbit - -fillout-api-key: - display_name: Fillout (API Key) - categories: - - surveys - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.hostname} - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v1/api/forms - webhook_routing_script: filloutWebhookRouting - docs: https://nango.dev/docs/integrations/all/fillout-api-key - docs_connect: https://nango.dev/docs/integrations/all/fillout-api-key/connect - connection_config: - hostname: - type: string - title: Hostname - description: The hostname of your Fillout account - example: api.fillout.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-hostname-and-api-key' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Fillout account - example: sk_prod_n5ZEod5AwJQCtG3ncuzgXvpSWx19joz4KMSJlC2nVul9B48zhkCLuPc9Kq97tK7smlOcMChnk1uyaUeZ5Gm4GVrUUnDMxHI7TZH_31032 - pattern: '^sk_prod_[A-Za-z0-9]+_[0-9]+$' - doc_section: '#step-1-finding-your-hostname-and-api-key' - -fillout: - display_name: Fillout (Oauth) - categories: - - surveys - auth_mode: OAUTH2 - authorization_url: https://build.fillout.com/authorize/oauth - token_url: https://server.fillout.com/public/oauth/accessToken - proxy: - base_url: ${connectionConfig.base_url} - token_response_metadata: - - base_url - webhook_routing_script: filloutWebhookRouting - docs: https://nango.dev/docs/integrations/all/fillout - connection_config: - base_url: - type: string - title: '' - description: '' - automated: true - -float: - display_name: Float - categories: - - productivity - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - user-agent: ${connectionConfig.appDetails} || App (support@nango.dev) - base_url: https://api.float.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v3/tasks - docs: https://nango.dev/docs/integrations/all/float - docs_connect: https://nango.dev/docs/integrations/all/float/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Float account - pattern: '^[a-f0-9]{16}[a-zA-Z0-9+/]+=$' - example: c9b38e5af69912d0rq9tE/fbT5/RPLk8Ua7tfHo9s6xMiCKvmCOvenR/Krc= - doc_section: '#step-1-finding-your-api-key' - - connection_config: - appDetails: - type: string - title: App Details - description: The details of your app - automated: true - -folk: - display_name: Folk - categories: - - crm - auth_mode: API_KEY - webhook_routing_script: folkWebhookRouting - webhook_user_defined_secret: true - proxy: - base_url: https://api.folk.app - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'retry-after' - verification: - method: GET - endpoints: - - /v1/users/me - webhook_allowed_query_params: - - nangoConnectionId - docs: https://nango.dev/docs/api-integrations/folk - docs_connect: https://nango.dev/docs/api-integrations/folk/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Folk account - example: 'FOLKLrHVSoYB6TaAF39aNGtEpEi3oxuo' - pattern: '^FOLK[a-zA-Z0-9]+$' - doc_section: '#step-1-generating-your-api-key' - -followupboss: - display_name: Follow Up Boss - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://app.followupboss.com/oauth/authorize - token_url: https://app.followupboss.com/oauth/token - disable_pkce: true - authorization_params: - response_type: auth_code - proxy: - base_url: https://api.followupboss.com - docs: https://nango.dev/docs/api-integrations/followupboss - setup_guide_url: https://nango.dev/docs/api-integrations/followupboss/how-to-register-your-own-followupboss-oauth-app - -fortnox: - display_name: Fortnox - categories: - - accounting - - invoicing - auth_mode: OAUTH2 - authorization_url: https://apps.fortnox.se/oauth-v1/auth - token_url: https://apps.fortnox.se/oauth-v1/token - token_request_auth_method: basic - scope_separator: ' ' - authorization_params: - response_type: code - access_type: offline - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.fortnox.se/3 - docs: https://nango.dev/docs/integrations/all/fortnox - -freshbooks: - display_name: FreshBooks - categories: - - accounting - auth_mode: OAUTH2 - authorization_url: https://auth.freshbooks.com/oauth/authorize - token_url: https://api.freshbooks.com/auth/oauth/token - authorization_params: - response_type: code - proxy: - base_url: https://api.freshbooks.com - docs: https://nango.dev/docs/integrations/all/freshbooks - -freshdesk: - display_name: FreshDesk - categories: - - support - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.freshdesk.com - verification: - headers: - content-type: application/json - endpoints: - - /api/v2/settings/helpdesk - docs: https://nango.dev/docs/api-integrations/freshdesk - docs_connect: https://nango.dev/docs/api-integrations/freshdesk/connect - credentials: - username: - type: string - title: FreshDesk API Key - description: The API Key of your FreshDesk account - doc_section: '#step-1-finding-your-freshdesk-api-key' - secret: true - password: - type: string - title: '' - description: '' - default_value: X - hidden: true - connection_config: - subdomain: - type: string - title: FreshDesk Domain - description: The subdomain of your FreshDesk account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .freshdesk.com - prefix: https:// - doc_section: '#step-2-finding-your-freshdesk-domain' - -freshsales: - display_name: Freshsales - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.bundleAlias} || https://${connectionConfig.subdomain}.freshsales.io - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/settings/leads/fields - headers: - authorization: Token token=${apiKey} - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/freshsales - docs_connect: https://nango.dev/docs/api-integrations/freshsales/connect - connection_config: - bundleAlias: - type: string - title: Bundle Alias - description: The bundle alias for your Freshsales account - prefix: https:// - example: acme.myfreshworks.com/crm/sales - doc_section: '#step-2-finding-your-bundle-alias' - subdomain: - type: string - title: '' - description: '' - default_value: '' - hidden: true # deprecating this in favor of bundleAlias - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Freshsales account - example: 4oBqA_AzM_G3xbW3TJGvrA - pattern: '[A-Za-z0-9_-]+' - doc_section: '#step-1-finding-your-freshsales-api-key' - -freshservice: - display_name: Freshservice - categories: - - support - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.freshservice.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v2/tickets - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/freshservice - docs_connect: https://nango.dev/docs/integrations/all/freshservice/connect - connection_config: - subdomain: - type: string - title: Freshservice subdomain - description: The subdomain of your Freshservice account - pattern: '^[a-z0-9_-]+$' - example: subdomain - suffix: .freshservice.com - prefix: https:// - doc_section: '#step-2-finding-your-freshservice-subdomain' - credentials: - username: - type: string - title: API key - description: The API Key of your Freshservice account - secret: true - doc_section: '#step-1-finding-your-freshservice-api-key' - password: - type: string - title: '' - description: '' - # https://api.freshservice.com/#authentication - # FreshService is using basic auth with an api key, the basic username/password was deprecated - default_value: 'X' - hidden: true - -freshteam: - display_name: Freshteam - categories: - - hr - - ats - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.accountName}.freshteam.com - headers: - authorization: Bearer ${apiKey} - accept: application/json - docs: https://nango.dev/docs/integrations/all/freshteam - docs_connect: https://nango.dev/docs/integrations/all/freshteam/connect - connection_config: - accountName: - type: string - title: Account Name - description: The account name of your Freshteam account - example: nango - format: hostname - suffix: .freshteam.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-account-name' - credentials: - apiKey: - type: string - title: API Key - description: The API key to your Freshteam account - doc_section: '#step-2-finding-your-api-key' - example: 'XtoF94LMNyKPbd5AvR1QJh' - pattern: '^[a-zA-Z0-9_!@#$%^&*()\\-+=]+$' - -freshworks: - display_name: Freshworks - categories: - - crm - - support - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.hostname}/org/oauth/v2/authorize - token_url: https://${connectionConfig.hostname}/org/oauth/v2/token - disable_pkce: true - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.bundleAlias} - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/freshworks - docs_connect: https://nango.dev/docs/api-integrations/freshworks/connect - connection_config: - hostname: - type: string - title: Freshworks Hostname - description: The hostname of your Freshworks account. - format: hostname - example: acme.myfreshworks.com - prefix: https:// - doc_section: '#step-1-finding-your-freshworks-hostname' - bundleAlias: - type: string - title: API Hostname - description: The hostname of your Freshworks product used for API calls. - format: hostname - example: acme.freshservice.com - prefix: https:// - doc_section: '#step-2-finding-your-api-hostname' - -front: - display_name: Front - categories: - - support - - ticketing - auth_mode: OAUTH2 - authorization_url: https://app.frontapp.com/oauth/authorize - token_url: https://app.frontapp.com/oauth/token - proxy: - base_url: https://api2.frontapp.com - retry: - after: - - 'retry-after' - paginate: - type: link - response_path: _results - link_path_in_response_body: _pagination.next - docs: https://nango.dev/docs/integrations/all/front - -front-api-key: - display_name: Front (API Key) - categories: - - support - - ticketing - auth_mode: API_KEY - proxy: - base_url: https://api2.frontapp.com - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'retry-after' - verification: - method: GET - endpoints: - - /me - docs: https://nango.dev/docs/api-integrations/front-api-key - docs_connect: https://nango.dev/docs/api-integrations/front-api-key/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Front API token. - example: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.**** - doc_section: '#step-1-finding-your-api-token' - -fullenrich: - display_name: FullEnrich - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://app.fullenrich.com/api - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v2/account/credits - docs: https://nango.dev/docs/api-integrations/fullenrich - docs_connect: https://nango.dev/docs/api-integrations/fullenrich/connect - credentials: - apiKey: - type: string - title: API Key - description: Your FullEnrich API key. - example: 123e4567-e89b-12d3-a456-426614174000 - format: uuid - doc_section: '#step-1-getting-your-api-key' - -gainsight-cc: - display_name: Gainsight CC - categories: - - support - - crm - auth_mode: OAUTH2_CC - token_url: https://api2-${connectionConfig.region}.insided.com/oauth2/token - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://api2-${connectionConfig.region}.insided.com - docs: https://nango.dev/docs/integrations/all/gainsight-cc - docs_connect: https://nango.dev/docs/integrations/all/gainsight-cc/connect - connection_config: - region: - type: string - title: Region - description: The region of your Gainsight account - example: eu-west-1 - pattern: '^[a-z]{2}-[a-z]+-[1-9]$' - doc_section: '#step-2-finding-your-region' - -garmin: - display_name: Garmin - categories: - - sports - auth_mode: OAUTH1 - request_url: https://connectapi.garmin.com/oauth-service/oauth/request_token - authorization_url: https://connect.garmin.com/oauthConfirm - token_url: https://connectapi.garmin.com/oauth-service/oauth/access_token - signature_method: 'HMAC-SHA1' - proxy: - base_url: https://apis.garmin.com - docs: https://nango.dev/docs/integrations/all/garmin - -gebruder-weiss: - display_name: GebrΓΌder Weiss - categories: - - erp - auth_mode: OAUTH2_CC - authorization_url: https://my.api.gw-world.com/authorize - token_url: https://my.api.gw-world.com/token - token_request_auth_method: basic - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - headers: - accept-language: en-US - base_url: https://my.api.gw-world.com - docs: https://nango.dev/docs/integrations/all/gebruder-weiss - -google-gemini: - display_name: Google Gemini - categories: - - productivity - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://generativelanguage.googleapis.com - query: - key: ${apiKey} - headers: - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/models - docs: https://nango.dev/docs/api-integrations/google-gemini - docs_connect: https://nango.dev/docs/api-integrations/google-gemini/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Gemini account - doc_section: '#step-1-generating-your-api-key' - example: 'AQ.Ab8RN6I5RF**********-0Fe3mTuqX3**' - pattern: '^[0-9A-Za-z_.\-]+$' - -gem: - display_name: Gem - categories: - - ats - auth_mode: API_KEY - proxy: - base_url: https://api.gem.com - headers: - x-api-key: ${apiKey} - x-application-secret: ${connectionConfig.appSecret} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v0/users - docs: https://nango.dev/docs/integrations/all/gem - docs_connect: https://nango.dev/docs/integrations/all/gem/connect - credentials: - apiKey: - type: string - title: Shareable Access Key - description: The Shareable Access Key for your Integration - example: Xk9t3HZbWqLp7AeGvM4sUdYjBnR2TfQxCVi81oNz - pattern: '^[a-zA-Z0-9]{40}$' - doc_section: '#step-1-finding-your-shareable-access-key' - connection_config: - appSecret: - type: string - title: '' - description: '' - hidden: true - -gerrit: - display_name: Gerrit - categories: - - dev-tools - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.host} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /config/server/version - docs: https://nango.dev/docs/integrations/all/gerrit - docs_connect: https://nango.dev/docs/integrations/all/gerrit/connect - connection_config: - host: - type: string - title: Gerrit Host - description: The host to where you Gerrit instance is hosted - pattern: '^https?:\/\/[a-z0-9.-]+(:\d+)?(\/.*)?$' - example: http://localhost:8080 - doc_section: '#step-1-finding-your-host' - order: 1 - -getty-images: - display_name: Getty Images - categories: - - design - auth_mode: OAUTH2 - authorization_url: https://authentication.gettyimages.com/oauth2/auth - token_url: https://authentication.gettyimages.com/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.gettyimages.com - headers: - api-key: ${clientId} - docs: https://nango.dev/docs/api-integrations/getty-images - setup_guide_url: https://nango.dev/docs/api-integrations/getty-images/how-to-register-your-own-getty-images-oauth-app - -grammarly: - display_name: Grammarly - categories: - - productivity - auth_mode: OAUTH2_CC - token_url: https://auth.grammarly.com/v4/api/oauth2/token - scope_separator: ',' - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.grammarly.com/ecosystem/api - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/analytics/users - docs: https://nango.dev/docs/integrations/all/grammarly - -grammarly-scim: - display_name: Grammarly SCIM - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://sso.grammarly.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/scim/Users - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/grammarly-scim - docs_connect: https://nango.dev/docs/integrations/all/grammarly-scim/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Grammarly account - doc_section: '#step-1-finding-grammarly-scim-credentials' - example: 'Xk9t3HZbWqLp7AeGvM4sUdYjBnR2TfQxCVi81oNz' - -granola: - display_name: Granola - categories: - - productivity - - knowledge-base - auth_mode: API_KEY - proxy: - base_url: https://public-api.granola.ai - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v1/notes?page_size=1 - docs: https://nango.dev/docs/api-integrations/granola - docs_connect: https://nango.dev/docs/api-integrations/granola/connect - credentials: - apiKey: - type: string - title: API Token - description: The API key for your Granola account - example: grn_2isA***************_7HRD*********************** - pattern: '^grn_[A-Za-z0-9]+_[A-Za-z0-9]+$' - doc_section: '#step-1-generating-your-granola-api-token' - -granola-mcp: - display_name: Granola (MCP) - categories: - - productivity - - knowledge-base - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://mcp-auth.granola.ai/oauth2/authorize - token_url: https://mcp-auth.granola.ai/oauth2/token - registration_url: https://mcp-auth.granola.ai/oauth2/register - default_scopes: - - offline_access - authorization_params: - response_type: code - resource: https://mcp.granola.ai/ - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - headers: - accept: application/json,text/event-stream - base_url: https://mcp.granola.ai - docs: https://nango.dev/docs/api-integrations/granola-mcp - -guru: - display_name: Guru - categories: - - knowledge-base - auth_mode: BASIC - proxy: - base_url: https://api.getguru.com/api/v1 - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /whoami - docs: https://nango.dev/docs/integrations/all/guru - docs_connect: https://nango.dev/docs/integrations/all/guru/connect - credentials: - username: - type: string - title: User/Collection ID - description: The user or collection ID of your Guru account - doc_section: '#step-1-finding-your-user-collection-id' - password: - type: string - title: User/Collection Token - description: The user or collection token of your Guru account - secret: true - format: uuid - example: 123e4567-e89b-12d3-a456-426614174000 - doc_section: '#step-2-generating-your-user-collection-token' - -guru-scim: - display_name: Guru (SCIM) - categories: - - knowledge-base - auth_mode: BASIC - proxy: - base_url: https://api.getguru.com/api/scim - headers: - content-type: application/scim+json - verification: - method: GET - endpoints: - - /v2/Users - headers: - content-type: application/scim+json - docs: https://nango.dev/docs/integrations/all/guru-scim - docs_connect: https://nango.dev/docs/integrations/all/guru-scim/connect - credentials: - username: - type: string - title: SCIM Username - description: The SCIM username for your Guru account - doc_section: '#step-1-finding-guru-scim-credentials' - password: - type: string - title: SCIM Token - description: The SCIM token for your Guru account - doc_section: '#step-1-finding-guru-scim-credentials' - -github: - display_name: GitHub (User OAuth) - categories: - - dev-tools - - support - - ticketing - auth_mode: OAUTH2 - authorization_url: https://github.com/login/oauth/authorize - token_url: https://github.com/login/oauth/access_token - proxy: - base_url: https://api.github.com - retry: - at: - - 'x-ratelimit-reset' - remaining: 'x-ratelimit-remaining' - error_code: - - '403' - - '5xx' - - '401' - - '429' - paginate: - type: link - limit_name_in_request: per_page - link_rel_in_response_header: next - docs: https://nango.dev/docs/api-integrations/github - setup_guide_url: https://nango.dev/docs/api-integrations/github/how-to-register-your-own-github-api-oauth-app - -github-app: - display_name: GitHub (App) - categories: - - dev-tools - - popular - - ticketing - alias: github - auth_mode: APP - authorization_url: ${connectionConfig.appPublicLink}/installations/new - token_url: https://api.github.com/app/installations/${connectionConfig.installation_id}/access_tokens - webhook_routing_script: githubAppWebhookRouting - docs: https://nango.dev/docs/api-integrations/github-app - setup_guide_url: https://nango.dev/docs/api-integrations/github-app/how-to-register-your-own-github-app-api-app - connection_config: - appPublicLink: - type: string - title: App Public Link - description: The public link of your GitHub App - format: uri - pattern: '^https?://.*$' - automated: true - installation_id: - type: string - title: Installation ID - description: The installation ID of your GitHub App - example: '38631545' - automated: true - -github-app-oauth: - display_name: GitHub (App OAuth) - categories: - - dev-tools - - ticketing - alias: github - auth_mode: CUSTOM - authorization_url: ${connectionConfig.appPublicLink}/installations/new - authorization_url_skip_encode: - - base_url - token_url: - OAUTH2: https://github.com/login/oauth/access_token - APP: https://api.github.com/app/installations/${connectionConfig.installation_id}/access_tokens - webhook_routing_script: githubAppOauthWebhookRouting - post_connection_script: githubAppOauthPostConnection - docs: https://nango.dev/docs/api-integrations/github-app-oauth - setup_guide_url: https://nango.dev/docs/api-integrations/github-app-oauth/how-to-register-your-own-github-app-api-oauth-app - connection_config: - appPublicLink: - type: string - title: App Public Link - description: The public link of your GitHub App - format: uri - pattern: '^https?://.*$' - automated: true - installation_id: - type: string - title: Installation ID - description: The installation ID of your GitHub App - example: '38631545' - automated: true - -github-pat: - display_name: Github (Personal Access Token) - categories: - - dev-tools - - ticketing - auth_mode: API_KEY - proxy: - base_url: https://api.github.com - retry: - at: - - 'x-ratelimit-reset' - remaining: 'x-ratelimit-remaining' - error_code: - - '403' - - '5xx' - - '401' - - '429' - headers: - authorization: Bearer ${apiKey} - x-github-api-version: ${connectionConfig.version} || 2022-11-28 - accept: application/vnd.github+json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /user - docs: https://nango.dev/docs/integrations/all/github-pat - docs_connect: https://nango.dev/docs/integrations/all/github-pat/connect - connection_config: - version: - type: string - title: '' - description: '' - automated: true - credentials: - apiKey: - type: string - title: Personal Access Token - description: The Personal Access Token to your Github account - pattern: '^(?:github_pat|ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{36,255}$' - example: 'github_pat_***********************xRIoxmseCYRHDDIOFfTOyKex' - doc_section: '#step-1-finding-your-personal-access-token' - -gitlab: - display_name: GitLab - categories: - - dev-tools - - ticketing - auth_mode: OAUTH2 - authorization_url: https://gitlab.com/oauth/authorize - token_url: https://gitlab.com/oauth/token - authorization_params: - response_type: code - proxy: - base_url: https://gitlab.com - docs: https://nango.dev/docs/integrations/all/gitlab - -gitlab-pat: - display_name: GitLab (Personal Access Token) - categories: - - dev-tools - - ticketing - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.hostname} - headers: - private-token: ${apiKey} - retry: - at: - - 'x-ratelimit-reset' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v4/users - docs: https://nango.dev/docs/integrations/all/gitlab-pat - docs_connect: https://nango.dev/docs/integrations/all/gitlab-pat/connect - credentials: - apiKey: - type: string - title: Personal Access Token - example: glpat-PMJoma_*******.***.***xwve - pattern: '^glpat-[A-Za-z0-9._-]+$' - description: The Personal Access Token for your GitLab account - doc_section: '#step-2-creating-your-personal-access-token' - connection_config: - hostname: - type: string - title: Hostname - description: The hostname of your Gitlab instance - format: hostname - example: gitlab.com - doc_section: '#step-1-finding-your-hostname' - order: 1 - -ghost-admin: - display_name: Ghost (Admin API) - categories: - - dev-tools - - design - - cms - auth_mode: JWT - signature: - protocol: HMAC - token: - signing_key: ${credentials.privateKey.secret} - expires_in_ms: 300000 - header: - alg: HS256 - kid: ${credentials.privateKey.id} - payload: - aud: /admin/ - proxy: - headers: - accept: application/json - accept-version: ${connectionConfig.version} - authorization: Ghost ${accessToken} - base_url: https://${connectionConfig.adminDomain}/ghost/api/admin/ - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /users - docs: https://nango.dev/docs/integrations/all/ghost-admin - connection_config: - adminDomain: - type: string - title: Ghost Admin Domain - description: The domain of your Ghost Admin which can be different from your main domain - example: 'mock.ghost.io' - pattern: '^([a-z0-9_-]+\.|)(ghost\.io|[a-z0-9_-]+\.[a-z]{2,})$' - order: 1 - version: - type: string - title: API Version - description: The version of the Ghost Admin API to use - example: 'v3.0' - pattern: '^v\d+\.\d+$' - order: 2 - credentials: - privateKey: - type: string - title: API Key - description: The private key for your Ghost account - pattern: '^[a-fA-F0-9]{24}:[a-fA-F0-9]{64}$' - example: 1234567890abcdef12345678:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890 - -ghost-content: - display_name: Ghost (Content API) - categories: - - dev-tools - - design - - cms - auth_mode: API_KEY - proxy: - headers: - accept-version: ${connectionConfig.version} - base_url: https://${connectionConfig.adminDomain}/ghost/api/content/ - query: - key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /tags - docs: https://nango.dev/docs/integrations/all/ghost-content - connection_config: - version: - type: string - title: API Version - description: The version of the Ghost Admin API to use - example: 'v3.0' - pattern: '^v\d+\.\d+$' - adminDomain: - type: string - title: Ghost Admin Domain - description: The domain of your Ghost Admin which can be different from your main domain - example: 'mock.ghost.io' - pattern: '^([a-z0-9_-]+\.|)(ghost\.io|[a-z0-9_-]+\.[a-z]{2,})$' - credentials: - apiKey: - type: string - title: API Key - description: The content API key for your Ghost account - pattern: '^[a-zA-Z0-9]{26}$' - example: a1b2c3d4e5f6g7h8i9j0k1l2m3 - -gong: - display_name: Gong (Basic Auth) - categories: - - communication - - marketing - - productivity - - video - auth_mode: BASIC - proxy: - base_url: https://api.gong.io - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/gong - docs_connect: https://nango.dev/docs/integrations/all/gong/connect - credentials: - username: - type: string - title: Access Key - description: Your Gong Access Key - pattern: '^[a-zA-Z0-9-]+$' - doc_section: '#step-1-finding-gong-api-key-and-api-key-secret' - password: - type: string - title: Access Key Secret - description: Your Gong Access Key Secret - default_value: '' - doc_section: '#step-1-finding-gong-api-key-and-api-key-secret' - -gong-oauth: - display_name: Gong (Oauth) - auth_mode: OAUTH2 - categories: - - communication - - marketing - - productivity - - video - - popular - authorization_url: https://app.gong.io/oauth2/authorize - token_url: https://app.gong.io/oauth2/generate-customer-token - token_response_metadata: - - api_base_url_for_customer - authorization_params: - response_type: code - access_type: offline - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - disable_pkce: true - token_request_auth_method: basic - proxy: - base_url: ${connectionConfig.api_base_url_for_customer} || https://api.gong.io - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/gong-oauth - connection_config: - api_base_url_for_customer: - type: string - title: API Base URL - description: The base URL of your Gong account - format: uri - automated: true - pattern: '^https?://.*$' - -glyphic: - display_name: Glyphic - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://api.glyphic.ai - headers: - x-api-key: ${apiKey} - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/test/ping - docs: https://nango.dev/docs/api-integrations/glyphic - docs_connect: https://nango.dev/docs/api-integrations/glyphic/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Glyphic API key - doc_section: '#step-1-getting-your-api-key' - -gamma: - display_name: Gamma - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://public-api.gamma.app - headers: - x-api-key: ${apiKey} - content-type: application/json - verification: - method: GET - headers: - accept: application/json - endpoints: - - /v1.0/folders - docs: https://nango.dev/docs/api-integrations/gamma - docs_connect: https://nango.dev/docs/api-integrations/gamma/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Gamma API key. - example: 'sk-gamma-xxxxxxxx' - pattern: '^sk-gamma-' - doc_section: '#step-1-getting-your-gamma-api-key' - -google: - display_name: Google - categories: - - communication - - dev-tools - - productivity - - social - auth_mode: OAUTH2 - authorization_url: https://accounts.google.com/o/oauth2/v2/auth - token_url: https://oauth2.googleapis.com/token - authorization_params: - response_type: code - access_type: offline - prompt: consent - proxy: - retry: - in_body: - path: error.message - value: /User-rate limit exceeded\. +Retry after (.+)/ - strategy: at - base_url: https://www.googleapis.com - paginate: - type: cursor - cursor_path_in_response: nextPageToken - limit_name_in_request: maxSize - cursor_name_in_request: pageToken - response_path: items - docs: https://nango.dev/docs/api-integrations/google - setup_guide_url: https://nango.dev/docs/api-integrations/google/how-to-register-your-own-google-api-oauth-app - webhook_routing_script: googleWebhookRouting - -google-analytics: - display_name: Google Analytics - alias: google - categories: - - analytics - docs: https://nango.dev/docs/api-integrations/google-analytics - setup_guide_url: https://nango.dev/docs/api-integrations/google-analytics/how-to-register-your-own-google-analytics-api-oauth-app - -google-bigquery: - display_name: Google BigQuery - categories: - - productivity - alias: google - proxy: - base_url: https://bigquery.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-bigquery - setup_guide_url: https://nango.dev/docs/api-integrations/google-bigquery/how-to-register-your-own-google-bigquery-api-oauth-app - -google-calendar: - display_name: Google Calendar - categories: - - popular - - productivity - alias: google - proxy: - base_url: https://www.googleapis.com - paginate: - type: cursor - cursor_path_in_response: nextPageToken - limit_name_in_request: maxSize - cursor_name_in_request: pageToken - response_path: items - retry: - error_code: - - '403' - - '5xx' - - '401' - - '429' - webhook_routing_script: googleCalendarWebhookRouting - post_connection_script: googleCalendarPostConnection - docs: https://nango.dev/docs/api-integrations/google-calendar - setup_guide_url: https://nango.dev/docs/api-integrations/google-calendar/how-to-register-your-own-google-calendar-api-oauth-app - -google-contacts: - display_name: Google Contacts - categories: - - productivity - alias: google - proxy: - base_url: https://people.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-contacts - setup_guide_url: https://nango.dev/docs/api-integrations/google-contacts/how-to-register-your-own-google-contacts-api-oauth-app - -google-chat: - display_name: Google Chat - alias: google - categories: - - productivity - proxy: - base_url: https://chat.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-chat - setup_guide_url: https://nango.dev/docs/api-integrations/google-chat/how-to-register-your-own-google-chat-api-oauth-app - -google-docs: - display_name: Google Docs - categories: - - productivity - alias: google - proxy: - base_url: https://docs.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-docs - setup_guide_url: https://nango.dev/docs/api-integrations/google-docs/how-to-register-your-own-google-docs-api-oauth-app - -google-mail: - display_name: Gmail - categories: - - popular - - productivity - alias: google - proxy: - base_url: https://gmail.googleapis.com - webhook_routing_script: gmailWebhookRouting - post_connection_script: googleMailPostConnection - docs: https://nango.dev/docs/api-integrations/google-mail - setup_guide_url: https://nango.dev/docs/api-integrations/google-mail/how-to-register-your-own-gmail-api-oauth-app - -google-maps: - display_name: Google Maps - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://maps.googleapis.com - query: - key: ${apiKey} - docs: https://nango.dev/docs/api-integrations/google-maps - docs_connect: https://nango.dev/docs/api-integrations/google-maps/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Google Maps API Key. - example: AIzaSyAY4P9A***************1YMSYBI - pattern: ^AIza[0-9A-Za-z\-_]+$ - doc_section: '#step-3-obtain-your-google-maps-api-key' - -google-search-console: - display_name: Google Search Console - alias: google - categories: - - productivity - proxy: - base_url: https://www.googleapis.com/webmasters - docs: https://nango.dev/docs/api-integrations/google-search-console - setup_guide_url: https://nango.dev/docs/api-integrations/google-search-console/how-to-register-your-own-google-search-console-oauth-app - -google-sheet: - display_name: Google Sheet - categories: - - productivity - alias: google - proxy: - base_url: https://sheets.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-sheet - setup_guide_url: https://nango.dev/docs/api-integrations/google-sheet/how-to-register-your-own-google-sheet-api-oauth-app - -google-slides: - display_name: Google Slides - categories: - - productivity - alias: google - proxy: - base_url: https://slides.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-slides - setup_guide_url: https://nango.dev/docs/api-integrations/google-slides/how-to-register-your-own-google-slides-api-oauth-app - -google-drive: - display_name: Google Drive - categories: - - knowledge-base - - popular - - storage - alias: google - docs: https://nango.dev/docs/api-integrations/google-drive - setup_guide_url: https://nango.dev/docs/api-integrations/google-drive/how-to-register-your-own-google-drive-api-oauth-app - -google-forms: - display_name: Google Forms - categories: - - productivity - alias: google - proxy: - base_url: https://forms.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-forms - setup_guide_url: https://nango.dev/docs/api-integrations/google-forms/how-to-register-your-own-google-forms-api-oauth-app - -google-tasks: - display_name: Google Tasks - categories: - - productivity - alias: google - proxy: - base_url: https://tasks.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-tasks - setup_guide_url: https://nango.dev/docs/api-integrations/google-tasks/how-to-register-your-own-google-tasks-api-oauth-app - -google-meet: - display_name: Google Meet - categories: - - communication - - productivity - alias: google - proxy: - base_url: https://meet.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-meet - setup_guide_url: https://nango.dev/docs/api-integrations/google-meet/how-to-register-your-own-google-meet-api-oauth-app - -google-ads: - display_name: Google Ads - categories: - - marketing - alias: google - token_url: https://www.googleapis.com/oauth2/v3/token - proxy: - base_url: https://googleads.googleapis.com - paginate: - type: cursor - cursor_path_in_response: nextPageToken - limit_name_in_request: pageSize - cursor_name_in_request: pageToken - response_path: results - docs: https://nango.dev/docs/api-integrations/google-ads - setup_guide_url: https://nango.dev/docs/api-integrations/google-ads/how-to-register-your-own-google-ads-api-oauth-app - -google-play: - display_name: Google Play - categories: - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://accounts.google.com/o/oauth2/auth - token_url: https://accounts.google.com/o/oauth2/token - authorization_params: - response_type: code - access_type: offline - prompt: consent - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://play.googleapis.com - docs: https://nango.dev/docs/integrations/all/google-play - -google-cloud-storage: - display_name: Google Cloud Storage - alias: google - categories: - - storage - docs: https://nango.dev/docs/api-integrations/google-cloud-storage - setup_guide_url: https://nango.dev/docs/api-integrations/google-cloud-storage/how-to-register-your-own-google-cloud-storage-api-oauth-app - -google-workspace-admin: - display_name: Google Workspace Admin - alias: google - categories: - - productivity - proxy: - base_url: https://admin.googleapis.com - docs: https://nango.dev/docs/api-integrations/google-workspace-admin - setup_guide_url: https://nango.dev/docs/api-integrations/google-workspace-admin/how-to-register-your-own-google-workspace-admin-api-oauth-app - -google-service-account: - display_name: Google Service Account - categories: - - dev-tools - auth_mode: TWO_STEP - signature: - protocol: RSA - body_format: form - token: - signing_key: ${credentials.privateKey} - expires_in_ms: 3600000 - header: - alg: RS256 - typ: JWT - payload: - iss: ${credentials.serviceAccountEmailAddress} - scope: ${credentials.scopes} - aud: https://oauth2.googleapis.com/token - sub: ${credentials.delegatedAccessEmailAddress} - token_url: https://oauth2.googleapis.com/token - token_params: - grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer - assertion: ${token} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://www.googleapis.com - docs: https://nango.dev/docs/integrations/all/google-service-account - docs_connect: https://nango.dev/docs/integrations/all/google-service-account/connect - credentials: - serviceAccountEmailAddress: - type: string - title: Service Account Email Address - description: The email address of the service account - pattern: '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.iam\.gserviceaccount\.com$' - example: 'test@project.iam.gserviceaccount.com' - doc_section: '#step-1-create-a-service-account' - scopes: - type: string - title: Scopes - description: Scopes that your application should be granted access to - pattern: '^https://[^\s]+( https://[^\s]+)*$' - example: 'https://www.googleapis.com/auth/drive' - doc_section: '#step-4-finding-your-applications-scopes' - privateKey: - type: string - title: Private Key - description: The private key associated with your Google service account - example: '-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n-----END PRIVATE KEY-----' - pattern: '^-----BEGIN PRIVATE KEY-----\\n([A-Za-z0-9+/=\\n]+)\\n-----END PRIVATE KEY-----\\n?$' - doc_section: '#step-3-delegate-domain-wide-authority-optional-for-google-workspace' - delegatedAccessEmailAddress: - type: string - title: Delegated Access Email Address - description: The email address of the user for which the application is requesting delegated access - format: email - example: 'some.user@example.com' - optional: true - doc_section: '#step-2-generate-a-service-account-key' - -gorgias: - display_name: Gorgias - categories: - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.gorgias.com/oauth/authorize - token_url: https://${connectionConfig.subdomain}.gorgias.com/oauth/token - token_request_auth_method: basic - default_scopes: - - offline - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.gorgias.com - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/gorgias - connection_config: - subdomain: - type: string - title: Gorgias Domain - description: The subdomain of your Gorgias account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .gorgias.com - prefix: https:// - -gorgias-basic: - display_name: Gorgias (Basic Auth) - auth_mode: BASIC - categories: - - e-commerce - proxy: - base_url: https://${connectionConfig.subdomain}.gorgias.com - docs: https://nango.dev/docs/integrations/all/gorgias-basic - docs_connect: https://nango.dev/docs/integrations/all/gorgias-basic/connect - credentials: - username: - type: string - title: Username - description: Your Gorgias account Username - password: - type: string - title: API Key - description: Your Gorgias API Key - default_value: '' - doc_section: '#step-1-finding-gorgias-api-key-secret' - connection_config: - subdomain: - type: string - title: Gorgias Domain - description: The subdomain of your Gorgias account - pattern: '^[a-z0-9_-]+$' - prefix: https:// - order: 1 - -grafana: - display_name: Grafana - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.domain} - verification: - headers: - content-type: application/json - endpoints: - - /api/access-control/user/permissions - method: GET - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/grafana - docs_connect: https://nango.dev/docs/integrations/all/grafana/connect - connection_config: - domain: - type: string - title: Domain - description: Your Grafana domain - example: example.grafana.net - prefix: https:// - format: hostname - order: 1 - doc_section: '#step-1-finding-your-domain' - credentials: - apiKey: - type: string - title: Token - description: The Token for your Grafana service account - example: glsa_***************************************** - pattern: '^[A-Za-z0-9_-]+$' - doc_section: '#step-2-generating-your-service-account-token' - -grain: - display_name: Grain (OAuth) - categories: - - video - - communication - - productivity - auth_mode: OAUTH2 - authorization_url: https://grain.com/_/public-api/oauth2/authorize - token_url: https://api.grain.com/_/public-api/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://api.grain.com - docs: https://nango.dev/docs/integrations/all/grain - -grain-api-key: - display_name: Grain (API Key) - categories: - - video - - communication - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.grain.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /_/public-api/me - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/grain-api-key - credentials: - apiKey: - type: string - title: API Key - description: The personal access token to your Grain account - -greenhouse: - display_name: Greenhouse (OAuth) - categories: - - ats - auth_mode: OAUTH2 - authorization_url: https://api.greenhouse.io/oauth/authorize - token_url: https://api.greenhouse.io/oauth/token - proxy: - base_url: https://${connectionConfig.resource}.greenhouse.io - retry: - after: - - 'retry-after' - paginate: - type: link - limit_name_in_request: per_page - link_rel_in_response_header: next - docs: https://nango.dev/docs/integrations/all/greenhouse - docs_connect: https://nango.dev/docs/integrations/all/greenhouse/connect - connection_config: - resource: - type: string - title: Greenhouse API Domain - description: The Greenhouse API product domain you want to connect to - pattern: '^[a-z0-9_-]+$' - example: api - suffix: .greenhouse.io - prefix: https:// - doc_section: '#step-1-finding-your-greenhouse-api-domain' - -greenhouse-basic: - display_name: Greenhouse (Basic Auth) - categories: - - ats - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.resource}.greenhouse.io - retry: - after: - - 'retry-after' - paginate: - type: link - limit_name_in_request: per_page - link_rel_in_response_header: next - verification: - headers: - content-type: application/json - endpoints: - - /v1/candidates/ - docs: https://nango.dev/docs/integrations/all/greenhouse-basic - docs_connect: https://nango.dev/docs/integrations/all/greenhouse-basic/connect - connection_config: - resource: - type: string - title: Greenhouse API Domain - description: The Greenhouse API product domain you want to connect to - pattern: '^[a-z0-9_-]+$' - example: harvest - suffix: .greenhouse.io - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-greenhouse-api-domain' - credentials: - username: - type: string - title: API key - description: The API Key of your Greenhouse account - pattern: '^[a-zA-Z0-9-]+$' - secret: true - doc_section: '#step-2-generating-your-greenhouse-api-key' - password: - type: string - title: Password - description: Password - # https://developers.greenhouse.io/harvest.html#authentication - # Greenhouse is using basic auth with an api key - default_value: '' - hidden: true - -greenhouse-harvest: - display_name: Greenhouse (Harvest API) - auth_mode: BASIC - categories: - - ats - proxy: - base_url: https://harvest.greenhouse.io - retry: - after: - - 'retry-after' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/candidates - docs: https://nango.dev/docs/integrations/all/greenhouse-harvest - docs_connect: https://nango.dev/docs/integrations/all/greenhouse-harvest/connect - credentials: - username: - type: string - title: API key - description: The API Key of your Greenhouse account - pattern: '^[a-zA-Z0-9-]+$' - secret: true - doc_section: '#step-1-generating-your-greenhouse-api-key' - password: - type: string - title: Password - description: Password - # https://developers.greenhouse.io/harvest.html#authentication - # Greenhouse is using basic auth with an api key - default_value: '' - hidden: true - -greenhouse-harvest-partner: - display_name: Greenhouse Harvest Partner (V3) - categories: - - ats - auth_mode: OAUTH2 - authorization_url: https://auth.greenhouse.io/authorize - token_url: https://auth.greenhouse.io/token - token_request_auth_method: basic - disable_pkce: true - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://harvest.greenhouse.io - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/api-integrations/greenhouse-harvest-partner - setup_guide_url: https://nango.dev/docs/api-integrations/greenhouse-harvest-partner/how-to-register-your-own-greenhouse-harvest-partner-oauth-app - -greenhouse-harvest-oauth2-cc: - display_name: Greenhouse Harvest (Client Credentials V3) - categories: - - ats - auth_mode: OAUTH2_CC - token_url: https://auth.greenhouse.io/token?grant_type=client_credentials - token_request_auth_method: basic - body_format: json - token_params: - sub: ${connectionConfig.sub} - proxy: - base_url: https://harvest.greenhouse.io - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/api-integrations/greenhouse-harvest-oauth2-cc - docs_connect: https://nango.dev/docs/api-integrations/greenhouse-harvest-oauth2-cc/connect - connection_config: - sub: - type: string - title: User ID - description: The optional ID of the user to act on-behalf-of. - optional: true - example: '4212952002' - pattern: '^[0-9]+$' - doc_section: '#step-2-finding-your-user-id' - credentials: - client_id: - type: string - title: Client ID - description: Your Greenhouse client ID for authentication - doc_section: '#step-1-generating-your-client-credentials' - client_secret: - type: string - title: Client Secret - description: Your Greenhouse client secret for authentication - doc_section: '#step-1-generating-your-client-credentials' - -greenhouse-job-board: - display_name: Greenhouse (Job Board API) - auth_mode: BASIC - categories: - - ats - proxy: - base_url: https://boards-api.greenhouse.io - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/boards/${connectionConfig.boardToken} - docs: https://nango.dev/docs/integrations/all/greenhouse-job-board - docs_connect: https://nango.dev/docs/integrations/all/greenhouse-job-board/connect - credentials: - username: - type: string - title: API key - description: The API Key of your Greenhouse account - pattern: '^[a-zA-Z0-9-]+$' - secret: true - doc_section: '#step-2-generating-your-greenhouse-api-key' - password: - type: string - title: Password - description: Password - # https://developers.greenhouse.io/harvest.html#authentication - # Greenhouse is using basic auth with an api key - default_value: '' - hidden: true - connection_config: - boardToken: - type: string - title: Board Token - description: The Job Board URL token to your Greenhouse account - order: 1 - doc_section: '#step-1-finding-your-board-token' - -greenhouse-assessment: - display_name: Greenhouse (Assessment API) - auth_mode: BASIC - categories: - - ats - proxy: - base_url: https://${connectionConfig.baseUrl} - verification: - headers: - content-type: application/json - endpoints: - - /list_tests - docs: https://nango.dev/docs/integrations/all/greenhouse-assessment - docs_connect: https://nango.dev/docs/integrations/all/greenhouse-assessment/connect - connection_config: - baseUrl: - type: string - title: Assessment Base Url - description: The Assessment API Base Url you want to connect to - pattern: '^[a-z0-9_-]+$' - example: www.testing-partner.com - prefix: https:// - format: hostname - order: 1 - doc_section: '#step-1-obtaining-your-assessment-base-url' - credentials: - username: - type: string - title: API key - description: The API Key of your Greenhouse account - pattern: '^[a-zA-Z0-9-]+$' - secret: true - doc_section: '#step-2-obtaining-your-api-key' - password: - type: string - title: Password - description: Password - # https://developers.greenhouse.io/harvest.html#authentication - # Greenhouse is using basic auth with an api key - default_value: '' - hidden: true - -greenhouse-ingestion: - display_name: Greenhouse (Ingestion API) - auth_mode: OAUTH2 - authorization_url: https://api.greenhouse.io/oauth/authorize - token_url: https://api.greenhouse.io/oauth/token - categories: - - ats - proxy: - base_url: https://api.greenhouse.io - docs: https://nango.dev/docs/integrations/all/greenhouse-ingestion - -greenhouse-onboarding: - display_name: Greenhouse (Onboarding API) - auth_mode: BASIC - categories: - - ats - proxy: - base_url: https://onboarding-api.greenhouse.io - verification: - headers: - content-type: application/json - endpoints: - - /graphql?query=%7B__schema%7Btypes%7Bname,kind,fields%7Bname%7D%7D%7D%7D - credentials: - username: - type: string - title: Access Key - description: The Access Key to your Greenhouse Onboarding account - pattern: '^[a-zA-Z0-9-]+$' - doc_section: '#step-1-generating-your-access-and-secret-keys' - password: - type: string - title: Secret Key - description: The Secret Key to your Greenhouse Onboarding account - pattern: '^[a-zA-Z0-9-]+$' - doc_section: '#step-1-generating-your-access-and-secret-keys' - docs: https://nango.dev/docs/integrations/all/greenhouse-onboarding - docs_connect: https://nango.dev/docs/integrations/all/greenhouse-onboarding/connect - -grist: - display_name: Grist - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.environment}.getgrist.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /api/orgs - docs: https://nango.dev/docs/api-integrations/grist - docs_connect: https://nango.dev/docs/api-integrations/grist/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Grist API key - pattern: '^[a-f0-9]{40}$' - example: 980cb267c8fa52ae5b6a0a5b4977ec915add8c07 - connection_config: - environment: - type: string - title: Environment - description: The environment you want to connect to. - enum: - - team - - docs - order: 1 - doc_section: '#step-1-selecting-your-environment' - -gumroad: - display_name: Gumroad - categories: - - design - - e-commerce - - payment - auth_mode: OAUTH2 - authorization_url: https://gumroad.com/oauth/authorize - token_url: https://api.gumroad.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.gumroad.com - docs: https://nango.dev/docs/integrations/all/gumroad - -gusto: - display_name: Gusto - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://api.gusto.com/oauth/authorize - token_url: https://api.gusto.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.gusto.com - post_connection_script: gustoPostConnection - docs: https://nango.dev/docs/integrations/all/gusto - -gusto-demo: - display_name: Gusto (Demo) - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://api.gusto-demo.com/oauth/authorize - token_url: https://api.gusto-demo.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.gusto-demo.com - post_connection_script: gustoPostConnection - docs: https://nango.dev/docs/integrations/all/gusto-demo - -hackerrank-work: - display_name: HackerRank Work - categories: - - ats - auth_mode: BASIC - proxy: - base_url: https://www.hackerrank.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /x/api/v3/users?limit=10&offset=10 - docs: https://nango.dev/docs/integrations/all/hackerrank-work - docs_connect: https://nango.dev/docs/integrations/all/hackerrank-work/connect - credentials: - username: - type: string - title: API Key - description: Your HackerRank Work API Key - doc_section: '#step-1-finding-hackerrank-api-key' - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -halo-psa: - display_name: Halo PSA - categories: - - support - - ticketing - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.hostname}/auth/token - token_request_auth_method: basic - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.hostname}/api - docs: https://nango.dev/docs/api-integrations/halo-psa - docs_connect: https://nango.dev/docs/api-integrations/halo-psa/connect - connection_config: - hostname: - type: string - title: Hostname - description: Your Halo PSA hostname. - example: example.halopsa.com - format: hostname - prefix: https:// - doc_section: '#step-1-find-your-halo-api-details' - order: 1 - credentials: - client_id: - type: string - title: Client ID - description: Your Halo PSA API application Client ID - doc_section: '#step-3-create-an-api-application' - client_secret: - type: string - title: Client Secret - description: Your Halo PSA API application Client Secret - secret: true - doc_section: '#step-3-create-an-api-application' - -harvest: - display_name: Harvest - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://id.getharvest.com/oauth2/authorize - token_url: https://id.getharvest.com/api/v2/oauth2/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - headers: - user-agent: ${connectionConfig.appDetails} || App (support@nango.dev) - retry: - after: - - 'retry-after' - base_url: https://api.harvestapp.com - docs: https://nango.dev/docs/integrations/all/harvest - connection_config: - appDetails: - type: string - title: App Details - description: The details of your app - automated: true - -health-gorilla: - display_name: Health Gorilla - categories: - - other - auth_mode: OAUTH2 - authorization_url: https://api.healthgorilla.com/oauth/authorize - token_url: https://api.healthgorilla.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://healthgorilla.com - docs: https://nango.dev/docs/integrations/all/health-gorilla - -heap: - display_name: Heap - categories: - - other - auth_mode: TWO_STEP - proxy: - base_url: https://heapanalytics.com/api - token_url: https://heapanalytics.com/api/public/v0/auth_token - token_headers: - authorization: Basic ${base64(${credentials.appId}:${credentials.apiKey})} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/integrations/all/heap - docs_connect: https://nango.dev/docs/integrations/all/heap/connect - credentials: - appId: - type: string - title: App ID - description: Your Heap application ID - example: '3207896401' - pattern: '^\d+$' - doc_section: '#step-1-generating-your-api-key-and-app-id' - apiKey: - type: string - title: API Key - description: Your Heap API Key - secret: true - example: 1bc32cba-a5d6-438a-bbcc-af312f560a3c - format: uuid - doc_section: '#step-1-generating-your-api-key-and-app-id' - -hex: - display_name: Hex - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.hex.tech/api - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/hex - docs_connect: https://nango.dev/docs/api-integrations/hex/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Hex API Token. - example: hxtp_a1b2c3d4e5f6*** - pattern: '^hxt[pw]_[a-f0-9]+$' - doc_section: '#step-1-creating-your-api-token' - connection_config: - subdomain: - type: string - title: Subdomain - description: Your Hex subdomain. - pattern: '^[a-z0-9]([a-z0-9-]*[a-z0-9])?$' - example: app - doc_section: '#step-2-finding-your-subdomain' - -heyreach: - display_name: HeyReach - categories: - - social - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.heyreach.io/api - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /public/auth/CheckApiKey - docs: https://nango.dev/docs/integrations/all/heyreach - docs_connect: https://nango.dev/docs/integrations/all/heyreach/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your HeyReach account - pattern: '^[A-Za-z0-9+/]+={0,2}$' - example: 'FoVLZoM+nVyMELhqr7vH120O2FS1gZcAG5d2qs1bndg=' - doc_section: '#step-1-generating-an-api-key' - -hibob-service-user: - display_name: Hibob Service User - categories: - - hr - - popular - auth_mode: BASIC - proxy: - base_url: https://api.hibob.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/company/named-lists - retry: - at: - - 'x-ratelimit-reset' - credentials: - username: - type: string - title: Hibob ID - description: Your Hibob ID - doc_section: '#step-1-finding-your-hibob-service-user-id' - password: - type: string - title: Hibob Token - description: Your Hibob Token - default_value: '' - secret: true - doc_section: '#step-2-finding-your-hibob-token' - docs: https://nango.dev/docs/integrations/all/hibob-service-user - docs_connect: https://nango.dev/docs/integrations/all/hibob-service-user/connect - -heygen: - display_name: HeyGen - categories: - - video - auth_mode: OAUTH2 - authorization_url: https://app.heygen.com/oauth/authorize - token_url: https://api2.heygen.com/v1/oauth/token - refresh_url: https://api2.heygen.com/v1/oauth/refresh_token - proxy: - base_url: https://api2.heygen.com - docs: https://nango.dev/docs/api-integrations/heygen - setup_guide_url: https://nango.dev/docs/api-integrations/heygen/how-to-register-your-own-heygen-oauth-app - -heymarket: - display_name: Heymarket - categories: - - communication - - marketing - auth_mode: JWT - signature: - protocol: HMAC - hmac_secret_encoding: utf8 - token: - signing_key: ${credentials.apiSecretId}||${credentials.apiSecretKey} - expires_in_ms: 300000 - header: - alg: HS256 - typ: JWT - payload: - iss: ${credentials.apiSecretId} - proxy: - base_url: https://api.heymarket.com - headers: - accept: application/json - authorization: Bearer ${accessToken} - verification: - method: GET - headers: - accept: application/json - endpoints: - - /v1/team - docs: https://nango.dev/docs/api-integrations/heymarket - docs_connect: https://nango.dev/docs/api-integrations/heymarket/connect - credentials: - apiSecretId: - type: string - title: API Secret ID - description: Your Heymarket API Secret ID. - example: a0ee0000-0000-4000-8000-00000000abcd - format: uuid - doc_section: '#step-1-finding-your-api-secret-id-and-secret-key' - apiSecretKey: - type: string - title: API Secret Key - description: Your Heymarket API Secret Key. - secret: true - example: Aa0***Cc2***Ee4***Gg6***Ii8***Kk0 - pattern: ^[A-Za-z0-9]+$ - doc_section: '#step-1-finding-your-api-secret-id-and-secret-key' - -highlevel: - display_name: HighLevel - categories: - - marketing - auth_mode: OAUTH2 - authorization_url: https://marketplace.gohighlevel.com/oauth/chooselocation - token_url: https://services.leadconnectorhq.com/oauth/token - scope_separator: ' ' - proxy: - base_url: https://services.leadconnectorhq.com - disable_pkce: true - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - post_connection_script: highlevelPostConnection - webhook_routing_script: highlevelWebhookRouting - webhook_user_defined_secret: true - docs: https://nango.dev/docs/api-integrations/highlevel - setup_guide_url: https://nango.dev/docs/api-integrations/highlevel/how-to-register-your-own-highlevel-api-oauth-app - -highlevel-white-label: - display_name: HighLevel (LeadConnector) - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://marketplace.leadconnectorhq.com/oauth/chooselocation - token_url: https://services.leadconnectorhq.com/oauth/token - scope_separator: ' ' - proxy: - base_url: https://services.leadconnectorhq.com - disable_pkce: true - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - post_connection_script: highlevelPostConnection - webhook_routing_script: highlevelWebhookRouting - webhook_user_defined_secret: true - docs: https://nango.dev/docs/api-integrations/highlevel-white-label - setup_guide_url: https://nango.dev/docs/api-integrations/highlevel-white-label/how-to-register-your-own-highlevel-white-label-api-oauth-app - -holded: - display_name: Holded - categories: - - accounting - - crm - - invoicing - auth_mode: API_KEY - proxy: - base_url: https://api.holded.com/api - headers: - key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /invoicing/v1/contacts - docs: https://nango.dev/docs/integrations/all/holded - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Holded account - -hover: - display_name: Hover - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://hover.to/oauth/authorize - token_url: https://hover.to/oauth/token - disable_pkce: true - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.hover.to - docs: https://nango.dev/docs/integrations/all/hover - -huntress: - display_name: Huntress - categories: - - other - auth_mode: BASIC - proxy: - base_url: https://api.huntress.io - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/organizations - docs: https://nango.dev/docs/api-integrations/huntress - docs_connect: https://nango.dev/docs/api-integrations/huntress/connect - credentials: - username: - type: string - title: API Key - description: Your Huntress API key. - pattern: '^hk_[A-Za-z0-9]+$' - example: hk_XXXXXXXXXXXXXXXX - doc_section: '#step-1-generate-api-keys' - password: - type: string - title: API Secret - description: Your Huntress API secret. - secret: true - pattern: '^hs_[A-Za-z0-9]+$' - example: hs_XXXXXXXXXXXXXXXX - doc_section: '#step-1-generate-api-keys' - -hubspot: - display_name: HubSpot - categories: - - marketing - - support - - crm - - popular - auth_mode: OAUTH2 - authorization_url: https://app.hubspot.com/oauth/authorize - token_url: https://api.hubapi.com/oauth/v1/token - connection_configuration: - - portalId - post_connection_script: hubspotPostConnection - pre_connection_deletion_script: hubspotPreConnectionDeletion - webhook_routing_script: hubspotWebhookRouting - proxy: - retry: - remaining: 'x-hubspot-ratelimit-remaining' - base_url: https://api.hubapi.com - decompress: true - paginate: - type: cursor - cursor_path_in_response: paging.next.after - limit_name_in_request: limit - cursor_name_in_request: after - response_path: results - docs: https://nango.dev/docs/api-integrations/hubspot - setup_guide_url: https://nango.dev/docs/api-integrations/hubspot/how-to-register-your-own-hubspot-api-oauth-app - -hubspot-mcp: - display_name: HubSpot (MCP) - categories: - - marketing - - support - - crm - - mcp - auth_mode: MCP_OAUTH2 - client_registration: static - authorization_url: https://mcp.hubspot.com/oauth/authorize/user - token_url: https://mcp.hubspot.com/oauth/v3/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://mcp.hubspot.com - docs: https://nango.dev/docs/api-integrations/hubspot-mcp - setup_guide_url: https://nango.dev/docs/api-integrations/hubspot-mcp/how-to-register-your-own-hubspot-mcp-api-oauth-app - -incident-io: - display_name: Incident.io - categories: - - ticketing - auth_mode: API_KEY - proxy: - base_url: https://api.incident.io - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/identity - docs: https://nango.dev/docs/integrations/all/incident-io - docs_connect: https://nango.dev/docs/integrations/all/incident-io/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Incident.io account - example: 'inc_************************************f2c5e6a7b3d4**********' - pattern: 'inc_[a-f0-9]{64}$' - doc_section: '#step-1-generating-your-api-key' - -insightly: - display_name: Insightly - categories: - - crm - auth_mode: BASIC - proxy: - base_url: https://api.${connectionConfig.pod}.insightly.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v3.1/Contacts - docs: https://nango.dev/docs/integrations/all/insightly - connection_config: - pod: - type: string - title: Insightly Domain - description: The subdomain of your Insightly account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .insightly.com - prefix: https:// - credentials: - username: - type: string - title: API Key - description: Your Insightly API key - password: - type: string - title: '' - description: '' - hidden: true - default_value: '' - -instantly: - display_name: Instantly - categories: - - marketing - - communication - auth_mode: API_KEY - proxy: - base_url: https://api.instantly.ai/api - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/instantly - docs_connect: https://nango.dev/docs/integrations/all/instantly/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Instantly account - pattern: '^[A-Za-z0-9._=-]+$' - example: ZTQ****************************************QQ== - doc_section: '#step-1-generate-an-api-key' - -instagram: - display_name: Instagram - categories: - - marketing - - social - auth_mode: OAUTH2 - scope_separator: ',' - authorization_url: https://api.instagram.com/oauth/authorize - token_url: https://api.instagram.com/oauth/access_token - refresh_url: https://graph.instagram.com/refresh_access_token - proxy: - base_url: https://graph.instagram.com - docs: https://nango.dev/docs/api-integrations/instagram - setup_guide_url: https://nango.dev/docs/api-integrations/instagram/how-to-register-your-own-instagram-api-oauth-app - -icypeas: - display_name: Icypeas - categories: - - marketing - - crm - auth_mode: API_KEY - proxy: - base_url: https://app.icypeas.com/api - headers: - authorization: ${apiKey} - verification: - method: POST - endpoints: - - /email-search - docs: https://nango.dev/docs/integrations/all/icypeas - docs_connect: https://nango.dev/docs/integrations/all/icypeas/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Icypeas account - example: ab84bc2056614635866e4a98c153d7a1ab30541032fd433793d402f2a5db2404 - pattern: '^[a-f0-9]{64}$' - doc_section: '#step-1-finding-your-api-key' - -itglue: - display_name: IT Glue - categories: - - productivity - - other - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.itglue.com - headers: - x-api-key: ${apiKey} - content-type: application/vnd.api+json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /organizations - docs: https://nango.dev/docs/integrations/all/itglue - docs_connect: https://nango.dev/docs/integrations/all/itglue/connect - credentials: - apiKey: - type: string - title: API Key - description: Your IT Glue API key - doc_section: '#step-2-generating-your-api-key' - pattern: '^ITG\.[a-zA-Z0-9._-]+$' - example: ITG.12cca334567890_123456vasfagas7890 - connection_config: - subdomain: - type: string - title: Subdomain - description: Your IT Glue subdomain. - enum: - - api - - api.eu - - api.au - doc_section: '#step-1-finding-your-subdomain' - order: 1 - -immybot: - display_name: ImmyBot - categories: - - dev-tools - - support - auth_mode: OAUTH2_CC - body_format: form - token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token - token_params: - grant_type: client_credentials - scope: https://${connectionConfig.instanceSubdomain}.immy.bot/.default - proxy: - base_url: https://${connectionConfig.instanceSubdomain}.immy.bot - headers: - accept: application/json - docs: https://nango.dev/docs/api-integrations/immybot - docs_connect: https://nango.dev/docs/api-integrations/immybot/connect - connection_config: - tenantId: - type: string - title: Microsoft Entra Tenant ID - description: The Azure tenant ID that owns the ImmyBot app registration. - format: uuid - example: 00000000-0000-0000-0000-000000000000 - order: 1 - doc_section: '#step-1-create-or-find-your-microsoft-entra-app-registration' - instanceSubdomain: - type: string - title: ImmyBot Instance Subdomain - description: The first segment of your ImmyBot instance URL. - pattern: '^[a-z0-9][a-z0-9-]*[a-z0-9]$' - example: acme - prefix: https:// - suffix: .immy.bot - order: 2 - doc_section: '#step-6-find-your-immybot-instance-subdomain' - credentials: - client_id: - type: string - title: Client ID - description: The Application client ID from the Microsoft Entra app registration. - format: uuid - example: 00000000-0000-0000-0000-000000000000 - doc_section: '#step-1-create-or-find-your-microsoft-entra-app-registration' - client_secret: - type: string - title: Client Secret - description: The client secret value from the Microsoft Entra app registration. - secret: true - doc_section: '#step-2-create-a-client-secret' - -intercom: - display_name: Intercom - categories: - - marketing - - popular - - support - - surveys - - ticketing - auth_mode: OAUTH2 - authorization_url: https://app.${connectionConfig.region}.intercom.com/oauth || https://app.intercom.com/oauth - token_url: https://api.${connectionConfig.region}.intercom.io/auth/eagle/token || https://api.intercom.io/auth/eagle/token - proxy: - base_url: https://api.${connectionConfig.region}.intercom.io || https://api.intercom.io - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/api-integrations/intercom - setup_guide_url: https://nango.dev/docs/api-integrations/intercom/how-to-register-your-own-intercom-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/intercom/connect - pre_connection_deletion_script: intercomPreConnectionDeletion - connection_config: - region: - type: string - title: Region - description: The API region for your Intercom workspace. - enum: - - eu - - au - optional: true - doc_section: '#step-1-finding-your-region' - -intuit: - display_name: Intuit - categories: - - accounting - auth_mode: OAUTH2 - authorization_url: https://appcenter.intuit.com/connect/oauth2 - token_url: https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer - proxy: - base_url: https://quickbooks.api.intuit.com - docs: https://nango.dev/docs/integrations/all/intuit - -ironclad: - display_name: Ironclad - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://ironcladapp.com/oauth/authorize - token_url: https://${connectionConfig.subdomain}.ironcladapp.com/oauth/token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.ironcladapp.com - docs: https://nango.dev/docs/integrations/all/ironclad - docs_connect: https://nango.dev/docs/integrations/all/ironclad/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: Your Ironclad Environment Subdomain. - enum: - - na1 - - demo - - eu1 - doc_section: '#step-1-finding-your-subdomain' - -ironclad-cc: - display_name: Ironclad (Client Credentials) - categories: - - legal - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.subdomain}.ironcladapp.com/oauth/token - token_params: - grant_type: client_credentials - scope_separator: ' ' - proxy: - base_url: https://${connectionConfig.subdomain}.ironcladapp.com - headers: - x-as-user-email: ${connectionConfig.userEmail} - docs: https://nango.dev/docs/api-integrations/ironclad-cc - docs_connect: https://nango.dev/docs/api-integrations/ironclad-cc/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: Your Ironclad environment subdomain. - enum: - - na1 - - demo - - eu1 - order: 1 - userEmail: - type: string - title: User Email - description: The email of the Ironclad user on whose behalf API requests are made. - example: user@yourcompany.com - format: email - order: 2 - -jamf: - display_name: Jamf Pro (Client Credentials) - categories: - - other - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.instance}.jamfcloud.com/api/v1/oauth/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.instance}.jamfcloud.com - scope_separator: ' ' - docs: https://nango.dev/docs/integrations/all/jamf - connection_config: - instance: - type: string - title: Jamf Pro Instance - description: Your Jamf Pro instance - example: example - prefix: https:// - suffix: .jamfcloud.com - order: 1 - -jamf-basic: - display_name: Jamf Pro (Basic Auth) - categories: - - other - auth_mode: TWO_STEP - proxy: - base_url: https://${connectionConfig.instance}.jamfcloud.com - headers: - authorization: Bearer ${accessToken} - token_url: https://${connectionConfig.instance}.jamfcloud.com/api/v1/auth/token - token_headers: - authorization: Basic ${base64(${credentials.username}:${credentials.password})} - token_response: - token: token - token_expiration: expires - token_expiration_strategy: expireAt - docs: https://nango.dev/docs/integrations/all/jamf-basic - connection_config: - instance: - type: string - title: Jamf Pro Instance - description: Your Jamf Pro instance - example: example - prefix: https:// - suffix: .jamfcloud.com - order: 1 - credentials: - username: - type: string - title: Username - description: Your Jamf Pro username - password: - type: string - title: Password - description: Your Jamf Pro password - secret: true - -jamie: - display_name: Jamie - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://beta-api.meetjamie.ai - headers: - x-api-key: ${apiKey} - docs: https://nango.dev/docs/api-integrations/jamie - docs_connect: https://nango.dev/docs/api-integrations/jamie/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Jamie workspace or personal API key. - example: jk_your_api_key - pattern: '^jk_[a-zA-Z0-9_-]+$' - doc_section: '#step-1-create-an-api-key' - -jazzhr: - display_name: JazzHR - categories: - - hr - - ats - auth_mode: API_KEY - proxy: - base_url: https://api.resumatorapi.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/users?apikey=${credentials.apiKey} - query: - apikey: ${apiKey} - docs: https://nango.dev/docs/integrations/all/jazzhr - docs_connect: https://nango.dev/docs/integrations/all/jazzhr/connect - credentials: - apiKey: - type: string - title: API Key - description: Your JazzHR API Key - doc_section: '#step-1-finding-your-api-key' - -jiminny: - display_name: Jiminny - categories: - - productivity - - communication - auth_mode: API_KEY - proxy: - base_url: https://app.jiminny.${connectionConfig.region}/customer/api - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v1/me - docs: https://nango.dev/docs/api-integrations/jiminny - docs_connect: https://nango.dev/docs/api-integrations/jiminny/connect - connection_config: - region: - type: string - title: Region - description: The region your Jiminny account is hosted in. - enum: - - eu - - com - doc_section: '#step-1-find-your-region' - credentials: - apiKey: - type: string - title: API Key - description: Your Jiminny API key. - example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c - pattern: '^eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' - doc_section: '#step-2-generate-an-api-key' - -jira: - display_name: Jira (OAuth) - categories: - - popular - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://auth.atlassian.com/authorize - token_url: https://auth.atlassian.com/oauth/token - default_scopes: - - offline_access - authorization_params: - audience: api.atlassian.com - prompt: consent - connection_configuration: - - cloudId - - accountId - proxy: - base_url: https://api.atlassian.com - connection_config: - subdomain: ${connectionConfig.subdomain} - paginate: - type: link - link_rel_in_response_header: next - limit_name_in_request: limit - response_path: results - link_path_in_response_body: _links.next - post_connection_script: jiraPostConnection - webhook_routing_script: jiraWebhookRouting - docs: https://nango.dev/docs/api-integrations/jira - setup_guide_url: https://nango.dev/docs/api-integrations/jira/how-to-register-your-own-jira-api-oauth-app - connection_config: - subdomain: - type: string - title: Subdomain - optional: true - description: The subdomain of your Attlassian account - pattern: '^[a-zA-Z0-9.-]+$' - example: subdomain - suffix: .atlassian.net - prefix: https:// - -justworks: - display_name: Justworks - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://payroll.justworks.com/oauth/authorize - token_url: https://public-api.justworks.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - scope_separator: ' ' - proxy: - base_url: https://public-api.justworks.com - docs: https://nango.dev/docs/api-integrations/justworks - setup_guide_url: https://nango.dev/docs/api-integrations/justworks/how-to-register-your-own-justworks-oauth-app - -jira-basic: - display_name: Jira (Basic Auth) - categories: - - productivity - - ticketing - auth_mode: BASIC - proxy: - retry: - after: - - 'retry-after' - base_url: https://${connectionConfig.subdomain}.atlassian.net - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /rest/api/3/myself - docs: https://nango.dev/docs/integrations/all/jira-basic - connection_config: - subdomain: - type: string - title: Jira Domain - description: The subdomain of your Jira account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .atlassian.net - prefix: https:// - order: 1 - doc_section: '#step-2-finding-your-atlassian-domain' - credentials: - username: - type: string - title: Email Address - description: The Email Address of your Jira account - format: email - doc_section: '#step-3-finding-your-user-name' - password: - type: string - title: API Key - description: The API Key of your Jira account - doc_section: '#step-1-finding-atlassian-api-key' - docs_connect: https://nango.dev/docs/integrations/all/jira-basic/connect - -jira-data-center: - display_name: Jira Data Center - categories: - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.endpointURL}/rest/oauth2/latest/authorize - authorization_params: - grant_type: authorization_code - token_url: https://${connectionConfig.endpointURL}/rest/oauth2/latest/token - docs: https://nango.dev/docs/integrations/all/jira-data-center - proxy: - base_url: https://${connectionConfig.endpointURL}/rest/api/latest - connection_config: - endpointURL: - type: string - title: Domain - description: The domain of your Jira Data Center account - pattern: '^[a-zA-Z0-9.-]+(:\d+)?(/[a-zA-Z0-9._~-]+)*/?$' - prefix: https:// - example: foobar.atlassian.net - -jira-data-center-api-key: - display_name: Jira Data Center (API Key) - categories: - - productivity - - ticketing - auth_mode: API_KEY - proxy: - base_url: ${connectionConfig.baseUrl} - retry: - after: - - 'retry-after' - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/jira-data-center-api-key - docs_connect: https://nango.dev/docs/integrations/all/jira-data-center-api-key/connect - connection_config: - baseUrl: - type: string - title: Instance Base Url - description: The base Url for your Jira Data Center instance - pattern: '^(https?:\/\/)?[A-Za-z0-9.-]+(:\d+)?(\/[A-Za-z0-9._-]*)?$' - example: https://foobar.atlassian.net - doc_section: '#step-1-finding-your-instance-base-url' - order: 1 - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Jira Data Center - doc_section: '#step-2-generating-your-api-key' - -jira-data-center-basic: - display_name: Jira Data Center (Basic Auth) - categories: - - productivity - - ticketing - auth_mode: BASIC - proxy: - base_url: ${connectionConfig.baseUrl} - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/jira-data-center-basic - docs_connect: https://nango.dev/docs/integrations/all/jira-data-center-basic/connect - connection_config: - baseUrl: - type: string - title: Instance Base Url - description: The base Url for your Jira Data Center instance - pattern: '^(https?:\/\/)?[A-Za-z0-9.-]+(:\d+)?(\/[A-Za-z0-9._-]*)?$' - example: https://foobar.atlassian.net - doc_section: '#step-1-finding-your-instance-base-url' - order: 1 - credentials: - username: - type: string - title: Username - description: The username for your Jira Data Center - doc_section: '#step-2-finding-your-credentials' - password: - type: string - title: Password - description: The password for your Jira Data Center - doc_section: '#step-2-finding-your-credentials' - -jobadder: - display_name: Jobadder - categories: - - hr - - ats - auth_mode: OAUTH2 - disable_pkce: true - authorization_url: https://id.jobadder.com/connect/authorize - token_url: https://id.jobadder.com/connect/token - default_scopes: - - offline_access - authorization_params: - response_type: code - proxy: - base_url: https://api.jobadder.com - docs: https://nango.dev/docs/integrations/all/jobadder - -jobdiva: - display_name: JobDiva - categories: - - hr - - ats - auth_mode: TWO_STEP - token_url: https://api.jobdiva.com/apiv2/authenticate?clientid=${credentials.clientId}&username=${credentials.username}&password=${credentials.password} - token_request_method: GET - proxy: - base_url: https://api.jobdiva.com - token_response: - token: '' - webhook_routing_script: jobdivaWebhookRouting - webhook_user_defined_secret: true - docs: https://nango.dev/docs/integrations/all/jobdiva - docs_connect: https://nango.dev/docs/integrations/all/jobdiva/connect - credentials: - clientId: - type: string - title: Client ID - description: Your JobDiva Client ID - example: '3050' - doc_section: '#step-1-obtaining-your-client-id' - pattern: '^[0-9]{4}$' - username: - type: string - title: Username - description: Your JobDiva API username - example: username - doc_section: '#step-2-creating-an-api-user' - password: - type: string - title: Password - description: Your JobDiva API password - secret: true - example: password - doc_section: '#step-2-creating-an-api-user' - -jobber: - display_name: Jobber - categories: - - crm - - invoicing - auth_mode: OAUTH2 - authorization_url: https://api.getjobber.com/api/oauth/authorize - token_url: https://api.getjobber.com/api/oauth/token - authorization_params: - response_type: code - proxy: - headers: - x-jobber-graphql-version: ${connectionConfig.version} || 2025-01-20 - base_url: https://api.getjobber.com/api - docs: https://nango.dev/docs/integrations/all/jobber - connection_config: - version: - type: string - title: '' - description: '' - automated: true - -jobvite: - display_name: Jobvite - categories: - - ats - auth_mode: API_KEY - proxy: - base_url: https://api.jobvite.com/api - headers: - x-jvi-api: ${apiKey} - x-jvi-sc: ${connectionConfig.secretKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/candidate - docs: https://nango.dev/docs/integrations/all/jobvite - docs_connect: https://nango.dev/docs/integrations/all/jobvite/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Jobvite account - doc_section: '#step-1-getting-your-api-key-and-secret-key' - connection_config: - secretKey: - type: string - title: Secret Key - description: The secret key for your Jobvite account - secret: true - doc_section: '#step-1-getting-your-api-key-and-secret-key' - -jotform: - display_name: Jotform - categories: - - surveys - auth_mode: API_KEY - proxy: - base_url: https://api.jotform.com - headers: - apikey: ${apiKey} - docs: https://nango.dev/docs/integrations/all/jotform - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Jotform account - -jumpcloud: - display_name: JumpCloud - categories: - - iam - auth_mode: API_KEY - proxy: - base_url: https://console.jumpcloud.com/api - headers: - x-api-key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /organizations - docs: https://nango.dev/docs/integrations/all/jumpcloud - docs_connect: https://nango.dev/docs/integrations/all/jumpcloud/connect - credentials: - apiKey: - type: string - title: API Key - description: Your JumpCloud API Key. - example: jca_9mK4pL2xR8vN6qW1sT7uY3eA5bC9dF0hG2jM - pattern: '^[A-Za-z0-9_-]+$' - doc_section: '#step-1-generate-your-jumpcloud-api-key' - -helpscout-docs: - display_name: Help Scout Docs - categories: - - knowledge-base - - support - auth_mode: BASIC - proxy: - retry: - after: - - 'x-ratelimit-reset' - base_url: https://docsapi.helpscout.net - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/sites - docs: https://nango.dev/docs/integrations/all/helpscout-docs - docs_connect: https://nango.dev/docs/integrations/all/helpscout-docs/connect - credentials: - username: - type: string - title: API Key - description: Your Help Scout Docs API Key - secret: true - doc_section: '#step-1-finding-help-scout-api-key' - password: - type: string - title: '' - description: '' - default_value: 'X' - hidden: true - -helpscout-mailbox: - display_name: Help Scout Mailbox - categories: - - support - auth_mode: OAUTH2 - authorization_url: https://secure.helpscout.net/authentication/authorizeClientApplication - token_url: https://api.helpscout.net/v2/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - retry: - after: - - 'x-ratelimit-retry-after' - base_url: https://api.helpscout.net - docs: https://nango.dev/docs/integrations/all/helpscout-mailbox - -kandji: - display_name: Kandji - categories: - - support - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.kandji.io - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/kandji - docs_connect: https://nango.dev/docs/integrations/all/kandji/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain to your kandji account - doc_section: '#step-1-finding-your-subdomain' - order: 1 - credentials: - apiKey: - type: string - title: API Token - description: The API Token for your Kandji account - example: 1bc32cba-a5d6-438a-bbcc-af312f560a3c - format: uuid - doc_section: '#step-2-generating-your-api-token' - -keap: - display_name: Keap - categories: - - marketing - auth_mode: OAUTH2 - authorization_url: https://accounts.infusionsoft.com/app/oauth/authorize - token_url: https://api.infusionsoft.com/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.infusionsoft.com - docs: https://nango.dev/docs/integrations/all/keap - -keeper-scim: - display_name: Keeper (SCIM) - categories: - - productivity - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://keepersecurity.com/api/rest/scim/v2/${connectionConfig.node} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /Users - docs: https://nango.dev/docs/integrations/all/keeper-scim - docs_connect: https://nango.dev/docs/integrations/all/keeper-scim/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your node keeper account - pattern: '^[A-Za-z0-9+/=]+$' - example: 'J9b7kgdL2gf14d5F9p67zYXVrTZPTMEnl3/EmwwI9K2=' - doc_section: '#step-2-finding-your-api-key-api-token' - connection_config: - node: - type: string - title: Node - description: The node id to your Keeper account - pattern: '^\d{15}$' - example: '123435384338765' - doc_section: '#step-1-finding-your-node-id' - -kintone: - display_name: Kintone - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.kintone.com/oauth2/authorization - token_url: https://${connectionConfig.subdomain}.kintone.com/oauth2/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.kintone.com - docs: https://nango.dev/docs/integrations/all/kintone - docs_connect: https://nango.dev/docs/integrations/all/kintone/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain for your Kintone account - doc_section: '#step-1-finding-your-subdomain' - example: urdzw8p24agp - pattern: '^[a-z0-9_-]+$' - -kintone-user-api: - display_name: Kintone User API - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.kintone.com - verification: - method: GET - endpoints: - - /v1/users.json - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/kintone-user-api - docs_connect: https://nango.dev/docs/integrations/all/kintone-user-api/connect - credentials: - apiKey: - type: string - title: API Token - description: The API Token for your Kintone account - example: cy.s.api1.eyJraWQiOiJ2MSIsInR5cCI6IkpXVCIsImFsZyI6IkhTMjU2In0.eyJyYW5kIjoiNWQ4ZmNiOGYtMDk3ZC00MWNhLWJkZjAtYTAxN2ZiMDZkYjNlIiwiaXNzIjoieTkwNzgyIiwiZXhwIjoxNzU4MTg1Mzg5fQ.GUoYL6hBFGOywcfjxQB3Y3vSwEq67evDGcmVQvzPY94 - pattern: '^cy\.s\.api1\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' - doc_section: '#step-2-generating-your-api-token' - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain for your Kintone account - doc_section: '#step-1-finding-your-subdomain' - example: urdzw8p24agp - order: 1 - pattern: '^[a-z0-9_-]+$' - -konnektive: - display_name: Konnektive - categories: - - crm - - e-commerce - auth_mode: BASIC - proxy: - base_url: https://api.konnektive.com - query: - loginId: ${credentials.username} - password: ${credentials.password} - docs: https://nango.dev/docs/api-integrations/konnektive - docs_connect: https://nango.dev/docs/api-integrations/konnektive/connect - credentials: - username: - type: string - title: API Login ID - description: Your Konnektive API Login ID. - doc_section: '#step-1-find-your-api-credentials' - password: - type: string - title: API Password - description: Your Konnektive API password. - secret: true - doc_section: '#step-1-find-your-api-credentials' - -knowbe4: - display_name: KnowBe4 - categories: - - support - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.knowbe4.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/api-integrations/knowbe4 - docs_connect: https://nango.dev/docs/api-integrations/knowbe4/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your KnowBe4 account - doc_section: '#step-2-generating-your-knowbe4-api-key' - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain to your API base URL. - doc_section: '#step-1-finding-your-subdomain' - enum: - - us.api - - eu.api - - ca.api - - uk.api - - de.api - order: 1 - -klipfolio: - display_name: Klipfolio - categories: - - productivity - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://app.klipfolio.com - headers: - kf-api-key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/1.0/profile - docs: https://nango.dev/docs/integrations/all/klipfolio - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Klipfolio account - -klaviyo: - display_name: Klaviyo (API Key) - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://a.klaviyo.com - headers: - authorization: Klaviyo-API-Key ${apiKey} - revision: '2024-07-15' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/accounts - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/klaviyo - docs_connect: https://nango.dev/docs/integrations/all/klaviyo/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Klaviyo account - doc_section: '#step-1-finding-klaviyo-api-key' - -klaviyo-oauth: - display_name: Klaviyo (OAuth) - categories: - - marketing - auth_mode: OAUTH2 - authorization_url: https://www.klaviyo.com/oauth/authorize - token_url: https://a.klaviyo.com/oauth/token - token_request_auth_method: basic - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://a.klaviyo.com - headers: - revision: '2024-07-15' - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/klaviyo-oauth - -klicktipp: - display_name: KlickTipp - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.klicktipp.com - credentials: - apiKey: - type: string - title: API Key - description: Your KlickTipp API key. - example: a1b2c3d4e5f6g7h8 - pattern: '^[a-z0-9]{16}$' - secret: true - doc_section: '#step-1-getting-your-api-key' - docs: https://nango.dev/docs/api-integrations/klicktipp - docs_connect: https://nango.dev/docs/api-integrations/klicktipp/connect - -kno-commerce: - display_name: Kno Commerce - categories: - - e-commerce - auth_mode: OAUTH2_CC - token_url: https://app-api.knocommerce.com/api/oauth2/token - token_request_auth_method: basic - body_format: query - token_params: - grant_type: client_credentials - proxy: - base_url: https://app-api.knocommerce.com - docs: https://nango.dev/docs/api-integrations/kno-commerce - docs_connect: https://nango.dev/docs/api-integrations/kno-commerce/connect - credentials: - client_id: - type: string - title: Client ID - description: Your Kno Commerce API client ID - doc_section: '#step-1-creating-an-api-client' - client_secret: - type: string - title: Client Secret - description: Your Kno Commerce API client secret - secret: true - doc_section: '#step-1-creating-an-api-client' - -kustomer: - display_name: Kustomer - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.extension}.kustomerapp.com - retry: - after: - - 'x-ratelimit-reset' - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/kustomer - connection_config: - extension: - type: string - title: Kustomer Domain - description: The subdomain of your Kustomer account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .kustomerapp.com - prefix: https:// - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Kustomer account - -lagrowthmachine: - display_name: La Growth Machine - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://apiv2.lagrowthmachine.com - query: - KEY: ${apiKey} - docs: https://nango.dev/docs/integrations/all/lagrowthmachine - docs_connect: https://nango.dev/docs/integrations/all/lagrowthmachine/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your La Growth Machine account - example: 1bc32cba-a5d6-438a-bbcc-af312f560a3c - format: uuid - doc_section: '#step-1-finding-your-api-key' - -lastpass: - display_name: LastPass - categories: - - productivity - auth_mode: BASIC - proxy: - base_url: https://lastpass.com - docs: https://nango.dev/docs/integrations/all/lastpass - docs_connect: https://nango.dev/docs/integrations/all/lastpass/connect - credentials_verification_script: lastpassCredentialsVerification - credentials: - username: - type: string - title: CID - description: Your LastPass Account number - doc_section: '#step-1-finding-your-cid' - password: - type: string - title: Provhash - description: 'Your LastPass API key' - secret: true - doc_section: '#step-2-generating-your-provhash' - -lattice: - display_name: Lattice - categories: - - hr - auth_mode: API_KEY - proxy: - base_url: https://api.latticehq.com/ - headers: - authorization: Bearer ${apiKey} - accept: application/json - content-type: application/json - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/lattice - docs_connect: https://nango.dev/docs/integrations/all/lattice/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Lattice account - doc_section: '#step-1-finding-lattice-api-key' - -leadmagic: - display_name: LeadMagic - categories: - - marketing - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.leadmagic.io - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v1/credits - docs: https://nango.dev/docs/integrations/all/leadmagic - docs_connect: https://nango.dev/docs/integrations/all/leadmagic/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your LeadMagic account - example: 1e30029c105a89d36b76b879f01208d8 - pattern: '^[a-f0-9]{32}$' - doc_section: '#step-1-finding-your-api-key' - -leadfeeder: - display_name: Leadfeeder - categories: - - marketing - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.leadfeeder.com - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v1/accounts - docs: https://nango.dev/docs/api-integrations/leadfeeder - docs_connect: https://nango.dev/docs/api-integrations/leadfeeder/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key from your Leadfeeder account. - example: a3f8c2b1****************************8805 - pattern: '^[a-f0-9]{40}$' - doc_section: '#step-1-obtain-your-api-key' - -lessonly: - display_name: Lessonly - categories: - - productivity - auth_mode: BASIC - proxy: - base_url: https://api.lessonly.com/api - docs: https://nango.dev/docs/integrations/all/lessonly - credentials: - username: - type: string - title: Subdomain - description: Your Lessonly Subdomain - password: - type: string - title: API Key - description: Your Lessonly API key - secret: true - -lemlist: - display_name: lemlist - categories: - - marketing - - communication - auth_mode: BASIC - proxy: - base_url: https://api.lemlist.com - verification: - headers: - content-type: application/json - endpoints: - - /api/team - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/lemlist - docs_connect: https://nango.dev/docs/integrations/all/lemlist/connect - credentials: - username: - type: string - title: '' - description: '' - default_value: '' - hidden: true - password: - type: string - title: API Key - description: The API key for your Lemlist account - secret: true - example: a1b2c3d4e5f67890abcdefabcdefabcd - pattern: '[a-f0-9]$' - doc_section: '#step-1-generating-your-api-key' - -lever: - display_name: Lever (OAuth) - categories: - - ats - auth_mode: OAUTH2 - authorization_url: https://auth.lever.co/authorize - token_url: https://auth.lever.co/oauth/token - authorization_params: - response_type: code - audience: https://api.lever.co/v1/ - proxy: - base_url: https://api.lever.co - docs: https://nango.dev/docs/integrations/all/lever - -lever-basic: - display_name: Lever (Basic Auth) - auth_mode: BASIC - categories: - - ats - proxy: - base_url: https://api.lever.co - docs: https://nango.dev/docs/integrations/all/lever-basic - docs_connect: https://nango.dev/docs/integrations/all/lever-basic/connect - credentials: - username: - type: string - title: User name - description: The API Key of your lever account - doc_section: '#step-1-finding-lever-api-key' - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -lever-sandbox: - display_name: Lever (OAuth Sandbox) - categories: - - ats - auth_mode: OAUTH2 - authorization_url: https://sandbox-lever.auth0.com/authorize - token_url: https://sandbox-lever.auth0.com/oauth/token - authorization_params: - response_type: code - prompt: consent - audience: https://api.sandbox.lever.co/v1/ - proxy: - base_url: https://api.sandbox.lever.co - docs: https://nango.dev/docs/integrations/all/lever-sandbox - -lever-basic-sandbox: - display_name: Lever (Basic Auth Sandbox)) - categories: - - ats - auth_mode: BASIC - proxy: - base_url: https://api.sandbox.lever.co - docs: https://nango.dev/docs/integrations/all/lever-basic-sandbox - credentials: - username: - type: string - title: User name - description: The API Key of your Lever sandbox account - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -lightfield: - display_name: Lightfield - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.lightfield.app - headers: - authorization: Bearer ${apiKey} - lightfield-version: '2026-03-01' - verification: - method: GET - endpoints: - - /v1/auth/validate - docs: https://nango.dev/docs/api-integrations/lightfield - docs_connect: https://nango.dev/docs/api-integrations/lightfield/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Lightfield API key - example: sk_lf_0_... - pattern: '^sk_lf_0_[A-Za-z0-9_-]+$' - doc_section: '#step-1-create-an-api-key' - -lightspeed-retail: - display_name: Lightspeed Retail (X-Series) - categories: - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://secure.retail.lightspeed.app/connect - token_url: https://${connectionConfig.domain_prefix}.retail.lightspeed.app/api/1.0/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - redirect_uri_metadata: - - domain_prefix - disable_pkce: true - proxy: - base_url: https://${connectionConfig.domain_prefix}.retail.lightspeed.app - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/api-integrations/lightspeed-retail - setup_guide_url: https://nango.dev/docs/api-integrations/lightspeed-retail/how-to-register-your-own-lightspeed-retail-api-oauth-app - connection_config: - domain_prefix: - type: string - title: '' - description: '' - automated: true - -linear: - display_name: Linear - categories: - - popular - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://linear.app/oauth/authorize - token_url: https://api.linear.app/oauth/token - scope_separator: ',' - authorization_params: - prompt: consent - proxy: - base_url: https://api.linear.app - retry: - at: - - 'x-ratelimit-requests-reset' - remaining: 'x-ratelimit-requests-remaining' - error_code: - - '400' - - '5xx' - - '401' - - '429' - disable_pkce: true - webhook_routing_script: linearWebhookRouting - post_connection_script: linearPostConnection - pre_connection_deletion_script: linearPreConnectionDeletion - webhook_user_defined_secret: true - docs: https://nango.dev/docs/api-integrations/linear - setup_guide_url: https://nango.dev/docs/api-integrations/linear/how-to-register-your-own-linear-api-oauth-app - -linear-mcp: - display_name: Linear (MCP) - categories: - - popular - - productivity - - ticketing - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://mcp.linear.app/authorize - token_url: https://mcp.linear.app/token - registration_url: https://mcp.linear.app/register - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - docs: https://nango.dev/docs/api-integrations/linear-mcp - -linkedin: - display_name: LinkedIn - categories: - - ats - - social - auth_mode: OAUTH2 - authorization_url: https://www.linkedin.com/oauth/v2/authorization - token_url: https://www.linkedin.com/oauth/v2/accessToken - disable_pkce: true - proxy: - base_url: https://api.linkedin.com - docs: https://nango.dev/docs/api-integrations/linkedin - setup_guide_url: https://nango.dev/docs/api-integrations/linkedin/how-to-register-your-own-linkedin-api-oauth-app - -linkhut: - display_name: LinkHut - categories: - - social - auth_mode: OAUTH2 - authorization_url: https://ln.ht/_/oauth/authorize - token_url: https://api.ln.ht/v1/oauth/token - proxy: - base_url: https://api.ln.ht - docs: https://nango.dev/docs/integrations/all/linkhut - -lokalise: - display_name: Lokalise - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://app.lokalise.com/oauth2/auth - token_url: https://app.lokalise.com/oauth2/token - body_format: json - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - disable_pkce: true - proxy: - base_url: https://api.lokalise.com/api2 - docs: https://nango.dev/docs/api-integrations/lokalise - setup_guide_url: https://nango.dev/docs/api-integrations/lokalise/how-to-register-your-own-lokalise-oauth-app - -loom-scim: - display_name: Loom (SCIM) - categories: - - other - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.domain}/scim - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /Users - docs: https://nango.dev/docs/integrations/all/loom-scim - docs_connect: https://nango.dev/docs/integrations/all/loom-scim/connect - connection_config: - domain: - type: string - title: Loom SCIM Bridge URL - description: The domain for your Loom SCIM Bridge - example: scim.example.com - pattern: '^[a-zA-Z0-9.-]+$' - prefix: https:// - doc_section: '#step-4-get-your-scim-bridge-url' - credentials: - apiKey: - type: string - title: SCIM API Key - description: Your Loom SCIM API Key - secret: true - doc_section: '#step-3-retrieve-your-loom-scim-api-key' - -loops-so: - display_name: Loops.so - categories: - - marketing - - communication - auth_mode: API_KEY - proxy: - base_url: https://app.loops.so/api - headers: - accept: application/json - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/api-key - docs: https://nango.dev/docs/integrations/all/loops-so - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Loops.so account - pattern: '^[a-f0-9]{32}$' - example: d2d561f5ff80136f69b4b5a31b9fb3c9 - -loop-returns: - display_name: Loop Returns - categories: - - e-commerce - auth_mode: API_KEY - proxy: - headers: - x-authorization: ${apiKey} - base_url: https://api.loopreturns.com/api - docs: https://nango.dev/docs/integrations/all/loop-returns - docs_connect: https://nango.dev/docs/integrations/all/loop-returns/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Loop Returns account - doc_section: '#step-1-generating-your-api-key' - -looker: - display_name: Looker - categories: - - analytics - auth_mode: TWO_STEP - token_url: https://${connectionConfig.hostname}/api/4.0/login - body_format: form - token_params: - client_id: ${credentials.clientId} - client_secret: ${credentials.clientSecret} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://${connectionConfig.hostname}/api - docs: https://nango.dev/docs/api-integrations/looker - docs_connect: https://nango.dev/docs/api-integrations/looker/connect - connection_config: - hostname: - type: string - title: Looker Instance Hostname - description: Your Looker instance hostname - prefix: https:// - example: mycompany.looker.com - order: 1 - pattern: '^[a-zA-Z0-9.-]+(:[0-9]+)?$' - doc_section: '#step-1-finding-your-looker-hostname' - credentials: - clientId: - type: string - title: Client ID - description: Your Looker Client ID - doc_section: '#step-2-obtaining-your-client-credentials' - clientSecret: - type: string - title: Client Secret - description: Your Looker Client Secret - secret: true - doc_section: '#step-2-obtaining-your-client-credentials' - -looker-oauth: - display_name: Looker (OAuth) - categories: - - analytics - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.hostname}/auth - token_url: https://${connectionConfig.apiHostname}/api/token - authorization_params: - response_type: code - default_scopes: - - cors_api - body_format: json - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.apiHostname}/api - docs: https://nango.dev/docs/api-integrations/looker-oauth - setup_guide_url: https://nango.dev/docs/api-integrations/looker-oauth/how-to-register-your-own-looker-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/looker-oauth/connect - connection_config: - hostname: - type: string - title: Looker UI Hostname - description: Your Looker instance UI hostname. - format: hostname - prefix: https:// - example: mycompany.looker.com - order: 1 - doc_section: '#step-1-finding-your-looker-ui-hostname' - apiHostname: - type: string - title: Looker API Hostname - description: Your Looker API hostname including port. - pattern: '^[a-zA-Z0-9.-]+(:[0-9]+)?$' - prefix: https:// - example: mycompany.looker.com:19999 - order: 2 - doc_section: '#step-2-finding-your-looker-api-hostname' - -lucid-scim: - display_name: Lucid (SCIM) - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://users.lucid.app/scim - headers: - authorization: Bearer ${apiKey} - accept: application/json - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/Users - docs: https://nango.dev/docs/integrations/all/lucid-scim - docs_connect: https://nango.dev/docs/integrations/all/lucid-scim/connect - credentials: - apiKey: - type: string - title: API Key - description: The SCIM API key generated from the Lucid admin panel - doc_section: '#step-1-generate-the-bearer-token' - -luma: - display_name: Luma - categories: - - productivity - - ticketing - auth_mode: API_KEY - proxy: - headers: - x-luma-api-key: ${apiKey} - base_url: https://api.lu.ma - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /public/v1/user/get-self - docs: https://nango.dev/docs/integrations/all/luma - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Luma account - -lumos: - display_name: Lumos - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.lumos.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/api-integrations/lumos - docs_connect: https://nango.dev/docs/api-integrations/lumos/connect - credentials: - apiKey: - type: string - title: API Token - description: The API token to your Lumos account - example: 'lsk_example_1234' - doc_section: '#step-1-creating-your-api-token' - -listmonk: - display_name: Listmonk - categories: - - marketing - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.domain}/api - headers: - content-type: application/json - retry: - after: - - 'retry-after' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /lists - docs: https://nango.dev/docs/integrations/all/listmonk - connection_config: - domain: - type: string - title: Domain - description: The domain of your Listmonk account - format: hostname - prefix: https:// - credentials: - username: - type: string - title: API User - description: The API user to your Listmonk account - password: - type: string - title: Token - description: The token to your Listmonk account - secret: true - -listrak: - display_name: Listrak - categories: - - marketing - auth_mode: OAUTH2_CC - token_url: https://auth.listrak.com/oauth2/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.listrak.com/email - docs: https://nango.dev/docs/api-integrations/listrak - docs_connect: https://nango.dev/docs/api-integrations/listrak/connect - credentials: - client_id: - type: string - title: Client ID - description: Your Listrak API Client ID - doc_section: '#step-1-create-api-credentials' - client_secret: - type: string - title: Client Secret - description: Your Listrak API Client Secret - secret: true - doc_section: '#step-1-create-api-credentials' - -lob: - display_name: Lob - categories: - - marketing - auth_mode: BASIC - proxy: - base_url: https://api.lob.com - verification: - method: GET - endpoints: - - /v1/addresses - docs: https://nango.dev/docs/api-integrations/lob - docs_connect: https://nango.dev/docs/api-integrations/lob/connect - credentials: - username: - type: string - title: Secret API Key - description: Your Lob Secret API Key. - secret: true - example: 'live_0dc8d***************************5b0cc' - pattern: '^(test|live)_[a-f0-9]{35}$' - doc_section: '#step-1-getting-your-secret-api-key' - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -make: - display_name: Make - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.environmentUrl}/api/v2 - headers: - authorization: Token ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /users/me - docs: https://nango.dev/docs/integrations/all/make - docs_connect: https://nango.dev/docs/integrations/all/make/connect - connection_config: - environmentUrl: - type: string - title: Domain - description: The domain of your Make account - format: hostname - prefix: https:// - doc_section: '#step-2-finding-your-domain' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Make account - doc_section: '#step-1-generating-an-api-key' - -mailgun: - display_name: Mailgun - categories: - - marketing - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.region}.mailgun.net - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v4/domains - docs: https://nango.dev/docs/integrations/all/mailgun - docs_connect: https://nango.dev/docs/integrations/all/mailgun/connect - connection_config: - region: - type: string - title: Region - description: The region of your Mailgun account. - enum: - - api - - api.eu - doc_section: '#step-1-finding-your-mailgun-region' - -mailchimp: - display_name: Mailchimp - categories: - - marketing - - surveys - auth_mode: OAUTH2 - authorization_url: https://login.mailchimp.com/oauth2/authorize - token_url: https://login.mailchimp.com/oauth2/token - authorization_params: - response_type: code - proxy: - base_url: https://${connectionConfig.dc}.api.mailchimp.com - docs: https://nango.dev/docs/integrations/all/mailchimp - post_connection_script: mailchimpPostConnection - connection_config: - dc: - type: string - title: Data Center - description: The data center for your account - pattern: '^[a-z]+\d*$' - example: us6 - automated: true - -mailjet: - display_name: Mailjet - categories: - - marketing - auth_mode: BASIC - proxy: - base_url: https://api.mailjet.com - verification: - method: GET - endpoints: - - /v3/REST/myprofile - docs: https://nango.dev/docs/api-integrations/mailjet - docs_connect: https://nango.dev/docs/api-integrations/mailjet/connect - credentials: - username: - type: string - title: API Key - description: Your Mailjet API Key. - secret: true - pattern: '^[a-f0-9]{32}$' - example: 'a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6' - doc_section: '#step-1-getting-your-credentials' - password: - type: string - title: Secret Key - description: Your Mailjet Secret Key. - secret: true - pattern: '^[a-f0-9]{32}$' - example: 'f6e5d4c3b2a1f0e9d8c7b6a5f4e3d2c1' - doc_section: '#step-1-getting-your-credentials' - -mcp-generic: - display_name: MCP Server OAuth2 (Generic) - categories: - - mcp - auth_mode: MCP_OAUTH2_GENERIC - connection_config: - mcp_server_url: - type: string - title: MCP Server URL - description: The base URL of your MCP server - example: https://mcp.notion.com/mcp - pattern: '^https://[a-zA-Z0-9.-]+(?:\:[0-9]+)?(?:/.*)?$' - docs: https://nango.dev/docs/integrations/all/mcp-generic - -# Untested configuration. Please reach out if you have a test account that we can use to test it. -manatal: - display_name: Manatal - auth_mode: API_KEY - categories: - - crm - - hr - - ats - proxy: - base_url: https://api.manatal.com/open/v3 - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /users - headers: - authorization: Token ${apiKey} - paginate: - type: link - limit_name_in_request: page_size - link_path_in_response_body: next - response_path: results - docs: https://nango.dev/docs/integrations/all/manatal - docs_connect: https://nango.dev/docs/integrations/all/manatal/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Manatal account - doc_section: '#step-2-generate-an-api-key' - -marketo: - display_name: Marketo - categories: - - marketing - auth_mode: OAUTH2_CC - proxy: - base_url: https://${connectionConfig.endpointURL} - token_url: https://${connectionConfig.identityURL}/identity/oauth/token - token_params: - grant_type: client_credentials - docs: https://nango.dev/docs/integrations/all/marketo - docs_connect: https://nango.dev/docs/integrations/all/marketo/connect - connection_config: - endpointURL: - type: string - title: Domain - description: The domain of your Marketo account - format: hostname - example: xxx.mktorest.com - prefix: https:// - suffix: / - order: 1 - doc_section: '#step-3-find-your-domain-and-identity-url' - identityURL: - type: string - title: Identity URL - description: The identity URL of your Marketo account - format: hostname - prefix: https:// - example: xxx.mktorest.com - suffix: /identity/oauth/token - order: 2 - doc_section: '#step-3-find-your-domain-and-identity-url' - -mattermost: - display_name: Mattermost - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.hostname}/api - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'x-ratelimit-reset' - verification: - method: GET - endpoints: - - /v4/users/me - docs: https://nango.dev/docs/api-integrations/mattermost - docs_connect: https://nango.dev/docs/api-integrations/mattermost/connect - connection_config: - hostname: - type: string - title: Server URL - description: The hostname of your Mattermost server. - example: mattermost.example.com - pattern: '^[a-zA-Z0-9.-]+(?::[0-9]+)?$' - prefix: https:// - order: 1 - doc_section: '#step-1-find-your-mattermost-server-url' - credentials: - apiKey: - type: string - title: Personal Access Token - description: Your Mattermost personal access token. - example: 'hx3mq8n0vy6***************' - pattern: '^[a-z0-9]+$' - doc_section: '#step-2-generate-a-personal-access-token' - -malwarebytes: - display_name: Malwarebytes - categories: - - other - auth_mode: OAUTH2_CC - token_url: https://api.malwarebytes.com/oauth2/token - token_request_auth_method: basic - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.malwarebytes.com - headers: - accountid: ${connectionConfig.accountId} - connection_config: - accountId: - type: string - title: Account Id - description: Your Nebula account id - pattern: '[\da-fA-F]{8}-?[\da-fA-F]{4}-?[\da-fA-F]{4}-?[\da-fA-F]{4}-?[\da-fA-F]{12}$' - example: 9256034b-7967-4253-a5d9-260663e4fa4f - order: 1 - doc_section: '#step-1-finding-your-account-id' - - docs: https://nango.dev/docs/integrations/all/malwarebytes - docs_connect: https://nango.dev/docs/integrations/all/malwarebytes/connect - -medallia: - display_name: Medallia - categories: - - crm - - support - - surveys - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.reportingInstance}/oauth/${connectionConfig.tenantName}/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - retry: - after: - - 'x-ratelimit-reset' - base_url: https://${connectionConfig.apiHostUrl} || https://${connectionConfig.gatewayUrl}.apis.medallia.com - docs: https://nango.dev/docs/integrations/all/medallia - docs_connect: https://nango.dev/docs/integrations/all/medallia/connect - connection_config: - reportingInstance: - type: string - title: Domain - description: The base domain for your Medallia instance - format: hostname - prefix: https:// - suffix: /oauth - example: instance.medallia.com - order: 1 - doc_section: '#step-2-identifying-your-domain' - tenantName: - type: string - title: Tenant Name - description: The tenant name of your Medallia account - order: 2 - example: acme - doc_section: '#step-3-identifying-your-tenant-name' - apiHostUrl: - type: string - title: API Host URL - description: The base API endpoint (gateway URL) for your Medallia account - format: hostname - prefix: https:// - order: 3 - example: fo-acme.apis.medallia.eu - doc_section: '#step-4-identifying-your-api-host-url' - gatewayUrl: - type: string - title: '' - description: '' - default_value: '' - hidden: true # deprecating this in favor of apiHostUrl - -metabase: - display_name: Metabase - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.hostname} || https://${connectionConfig.domain}.com - headers: - x-api-key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/database - docs: https://nango.dev/docs/api-integrations/metabase - docs_connect: https://nango.dev/docs/api-integrations/metabase/connect - connection_config: - hostname: - type: string - title: Hostname - description: The Metabase hostname - example: acme.metabaseapp.com - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-metabase-hostname' - domain: - type: string - title: '' - description: '' - default_value: '' - hidden: true # deprecating this in favor of hostname - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Metabase account - example: mb_**************************kR9mZw= - pattern: '^mb_[A-Za-z0-9+/]+=*$' - doc_section: '#step-2-generating-an-api-key' - -mercury: - display_name: Mercury - categories: - - accounting - auth_mode: OAUTH2 - scope_separator: ' ' - authorization_method: header - authorization_url: https://${connectionConfig.oauth_hostname}/oauth2/auth || https://oauth2.mercury.com/oauth2/auth - token_url: https://${connectionConfig.oauth_hostname}/oauth2/token || https://oauth2.mercury.com/oauth2/token - default_scopes: - - offline_access - proxy: - base_url: https://${connectionConfig.hostname} || https://api.mercury.com - docs: https://nango.dev/docs/api-integrations/mercury - docs_connect: https://nango.dev/docs/api-integrations/mercury/connect - setup_guide_url: https://nango.dev/docs/api-integrations/mercury/how-to-register-your-own-mercury-oauth-app - connection_config: - oauth_hostname: - type: string - title: OAuth Hostname - description: Your Mercury OAuth hostname. - optional: true - enum: - - oauth2.mercury.com - - oauth2-sandbox.mercury.com - hostname: - type: string - title: API Hostname - description: Your Mercury API hostname. - optional: true - enum: - - api.mercury.com - - api-sandbox.mercury.com - -meta-marketing-api: - display_name: Meta Marketing API - categories: - - marketing - alias: facebook - docs: https://nango.dev/docs/api-integrations/meta-marketing-api - setup_guide_url: https://nango.dev/docs/api-integrations/meta-marketing-api/how-to-register-your-own-meta-marketing-api-oauth-app - -microsoft: - display_name: Microsoft - auth_mode: OAUTH2 - categories: - - communication - - dev-tools - - productivity - authorization_url: https://login.microsoftonline.com/common/oauth2/v2.0/authorize - token_url: https://login.microsoftonline.com/common/oauth2/v2.0/token - disable_pkce: true - default_scopes: - - offline_access - - .default - authorization_params: - response_type: code - response_mode: query - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://graph.microsoft.com - retry: - after: - - 'retry-after' - decompress: true - docs: https://nango.dev/docs/api-integrations/microsoft - setup_guide_url: https://nango.dev/docs/api-integrations/microsoft/how-to-register-your-own-microsoft-api-oauth-app - -microsoft-admin: - display_name: Microsoft (Admin) - auth_mode: OAUTH2 - categories: - - communication - - dev-tools - - productivity - - iam - authorization_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/adminconsent - token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token - authorization_code_param_in_callback: tenant - proxy: - base_url: https://graph.microsoft.com - retry: - after: - - 'retry-after' - decompress: true - docs: https://nango.dev/docs/integrations/all/microsoft-admin - docs_connect: https://nango.dev/docs/integrations/all/microsoft-admin/connect - connection_config: - tenantId: - type: string - title: Tenant ID - description: The unique identifier for your organization that uses Microsoft services - format: uuid - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-1-finding-your-tenant-id' - order: 1 - -microsoft-teams-bot: - display_name: Microsoft Teams Bot - auth_mode: OAUTH2 - categories: - - communication - authorization_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/authorize - token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token - disable_pkce: true - default_scopes: - - offline_access - - .default - authorization_params: - response_type: code - response_mode: query - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://smba.trafficmanager.net/teams - connection_config: - botHostTenantId: ${connectionConfig.botHostTenantId} - webhook_routing_script: microsoftTeamsWebhookRouting - post_connection_script: microsoftTeamsBotPostConnection - docs: https://nango.dev/docs/api-integrations/microsoft-teams-bot - docs_connect: https://nango.dev/docs/api-integrations/microsoft-teams-bot/connect - connection_config: - tenantId: - type: string - title: Tenant ID - description: The unique identifier for your Microsoft Entra ID tenant. - format: uuid - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-1-finding-your-tenant-id' - order: 1 - botHostTenantId: - type: string - title: '' - description: '' - automated: true - -microsoft-excel: - display_name: Microsoft Excel - categories: - - productivity - - analytics - alias: microsoft - docs: https://nango.dev/docs/integrations/all/microsoft-excel - -microsoft-oauth2-cc: - display_name: Microsoft (Client Credentials) - auth_mode: OAUTH2_CC - categories: - - communication - - dev-tools - - productivity - token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://graph.microsoft.com - webhook_routing_script: microsoftClientCredentialsWebhookRouting - webhook_user_defined_secret: true - webhook_allowed_query_params: - - validationToken - docs: https://nango.dev/docs/api-integrations/microsoft-oauth2-cc - docs_connect: https://nango.dev/docs/api-integrations/microsoft-oauth2-cc/connect - connection_config: - tenantId: - type: string - title: Tenant ID - description: The unique identifier for your organization that uses Microsoft services - format: uuid - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-1-finding-your-tenant-id' - order: 1 - -microsoft-oauth2-cc-cert: - display_name: Microsoft (Client Credentials - Certificate) - auth_mode: TWO_STEP - categories: - - communication - - dev-tools - - productivity - body_format: form - token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token - token_params: - grant_type: client_credentials - client_id: ${credentials.clientId} - scope: ${connectionConfig.oauth_scopes} - client_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer - client_assertion: ${credentials.assertion} - token_headers: - content-type: application/x-www-form-urlencoded - assertion: - type: jwt - key: ${credentials.privateKey} - lifetimeInSeconds: 3600 - header: - alg: PS256 - x5t#S256: ${credentials.certificateThumbprint} - payload: - iss: ${credentials.clientId} - sub: ${credentials.clientId} - aud: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token - jti: ${random} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://graph.microsoft.com - docs: https://nango.dev/docs/api-integrations/microsoft-oauth2-cc-cert - docs_connect: https://nango.dev/docs/api-integrations/microsoft-oauth2-cc-cert/connect - connection_config: - tenantId: - type: string - title: Tenant ID - description: The unique identifier for your organization that uses Microsoft services. - format: uuid - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-1-finding-your-tenant-id' - order: 1 - oauth_scopes: - type: string - title: Scope - description: The resource scope to request access for. - example: https://graph.microsoft.com/.default - doc_section: '#step-5-granting-api-permissions' - order: 2 - credentials: - clientId: - type: string - title: Client ID - description: The application (client) ID assigned to your app in Azure. - format: uuid - example: 11112222-bbbb-3333-cccc-4444dddd5555 - doc_section: '#step-2-registering-your-application-and-finding-your-client-id' - privateKey: - type: string - title: Private Key - description: The RSA private key (PEM format) matching the certificate uploaded to your Azure app registration. - example: "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n-----END PRIVATE KEY-----" - secret: true - doc_section: '#step-3-generating-a-certificate-and-uploading-it-to-azure' - certificateThumbprint: - type: string - title: Certificate Thumbprint (x5t#S256) - description: The base64url-encoded SHA-256 thumbprint of your certificate. - example: rCnkMH5GKJI03tRpdjBh8OG2U8I - doc_section: '#step-4-computing-the-certificate-thumbprint-x5t' - assertion: - type: string - title: '' - description: '' - automated: true - -microsoft-intune: - display_name: Microsoft Intune - categories: - - dev-tools - alias: microsoft-oauth2-cc - docs: https://nango.dev/docs/api-integrations/microsoft-intune - docs_connect: https://nango.dev/docs/api-integrations/microsoft-intune/connect - -microsoft-planner: - display_name: Microsoft Planner - categories: - - productivity - - analytics - alias: microsoft - docs: https://nango.dev/docs/api-integrations/microsoft-planner - setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-planner/how-to-register-your-own-microsoft-planner-api-oauth-app - -microsoft-powerpoint: - display_name: Microsoft PowerPoint - categories: - - productivity - alias: microsoft - docs: https://nango.dev/docs/api-integrations/microsoft-powerpoint - setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-powerpoint/how-to-register-your-own-microsoft-powerpoint-api-oauth-app - -microsoft-teams: - display_name: Microsoft Teams - categories: - - productivity - - video - - popular - alias: microsoft - webhook_routing_script: microsoftTeamsWebhookRouting - post_connection_script: microsoftTeamsPostConnection - docs: https://nango.dev/docs/api-integrations/microsoft-teams - setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-teams/how-to-register-your-own-microsoft-teams-api-oauth-app - -microsoft-people: - display_name: Microsoft People - categories: - - productivity - alias: microsoft - docs: https://nango.dev/docs/api-integrations/microsoft-people - setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-people/how-to-register-your-own-microsoft-people-api-oauth-app - -microsoft-word: - display_name: Microsoft Word - categories: - - productivity - alias: microsoft - docs: https://nango.dev/docs/api-integrations/microsoft-word - setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-word/how-to-register-your-own-microsoft-word-api-oauth-app - -microsoft-tenant-specific: - display_name: Microsoft (Tenant) - categories: - - erp - auth_mode: OAUTH2 - authorization_url: https://login.microsoftonline.com/${connectionConfig.tenant}/oauth2/v2.0/authorize - token_url: https://login.microsoftonline.com/${connectionConfig.tenant}/oauth2/v2.0/token - disable_pkce: true - default_scopes: - - offline_access - authorization_params: - response_type: code - response_mode: query - prompt: consent - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://graph.microsoft.com - docs: https://nango.dev/docs/integrations/all/microsoft-tenant-specific - connection_config: - tenant: - type: string - title: Tenant - description: The tenant of your Microsoft account - -microsoft-business-central: - display_name: Microsoft Business Central - categories: - - erp - auth_mode: OAUTH2_CC - token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.businesscentral.dynamics.com/v2.0/${connectionConfig.tenantId}/${connectionConfig.environmentName} - docs: https://nango.dev/docs/integrations/all/microsoft-business-central - docs_connect: https://nango.dev/docs/integrations/all/microsoft-business-central/connect - connection_config: - tenantId: - type: string - title: Tenant ID - description: The unique identifier for your organization that uses Microsoft services - format: uuid - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-1-finding-your-tenant-id' - order: 1 - environmentName: - type: string - title: Enrivonment Name - description: The environment name to your organization - example: production - pattern: '^[a-zA-Z0-9-_]+$' - doc_section: '#step-2-finding-your-enrivonment-name' - order: 2 - -microsoft-ads: - display_name: Microsoft Ads - alias: microsoft - categories: - - marketing - default_scopes: - - https://ads.microsoft.com/msads.manage - - offline_access - proxy: - base_url: https://clientcenter.api.bingads.microsoft.com/Api - refresh_params: - grant_type: refresh_token - scope: https://ads.microsoft.com/msads.manage - docs: https://nango.dev/docs/integrations/all/microsoft-ads - -microsoft-entra-id: - display_name: Microsoft Entra ID - categories: - - iam - alias: microsoft - docs: https://nango.dev/docs/integrations/all/microsoft-entra-id - -microsoft-power-bi: - display_name: Microsoft Power BI - categories: - - productivity - alias: microsoft - proxy: - base_url: https://api.powerbi.com - docs: https://nango.dev/docs/integrations/all/microsoft-power-bi - -maximizer: - display_name: Maximizer (Cloud) - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.region}.maximizercrmlive.com/oauth2/${connectionConfig.company_alias}/authorize - token_url: https://${connectionConfig.region}.maximizercrmlive.com/oauth2/${connectionConfig.company_alias}/token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.region}.maximizercrmlive.com - docs: https://nango.dev/docs/api-integrations/maximizer - setup_guide_url: https://nango.dev/docs/api-integrations/maximizer/how-to-register-your-own-maximizer-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/maximizer/connect - connection_config: - region: - type: string - title: Region - description: Region-specific subdomain. - enum: - - caw - - ukw - company_alias: - type: string - title: Company Alias - description: The company alias of your Maximizer cloud account. - example: acme - -maximizer-on-premise: - display_name: Maximizer (On-Premise) - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.hostname}/MaximizerWebAuthentication/OAuth2/Authorize - token_url: https://${connectionConfig.hostname}/MaximizerWebAuthentication/OAuth2/Token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.hostname} - docs: https://nango.dev/docs/api-integrations/maximizer-on-premise - setup_guide_url: https://nango.dev/docs/api-integrations/maximizer-on-premise/how-to-register-your-own-maximizer-on-premise-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/maximizer-on-premise/connect - connection_config: - hostname: - type: string - title: Hostname - description: The hostname of your Maximizer on premise instance. - example: maximizer.mycompany.com - format: hostname - -maxio: - display_name: Maxio - categories: - - payment - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.hostname} - verification: - method: GET - endpoints: - - /subscriptions.json - docs: https://nango.dev/docs/api-integrations/maxio - docs_connect: https://nango.dev/docs/api-integrations/maxio/connect - credentials: - username: - type: string - title: API Key - description: Your Maxio API Key. - doc_section: '#step-2-retrieving-your-api-key' - password: - type: string - title: '' - description: '' - default_value: 'X' - hidden: true - connection_config: - hostname: - type: string - title: Hostname - description: Your Maxio site hostname. - pattern: '^[a-zA-Z0-9-]+\.(chargify\.com|ebilling\.maxio\.com)$' - example: acme.chargify.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-hostname' - -mindbody: - display_name: Mindbody - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.mindbodyonline.com - headers: - api-key: ${apiKey} - siteid: ${connectionConfig.siteId} - authorization: ${connectionConfig.staffUserToken} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /public/v6/site/locations - docs: https://nango.dev/docs/integrations/all/mindbody - docs_connect: https://nango.dev/docs/integrations/all/mindbody/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Mindbody account - pattern: '^[a-f0-9]{32}$' - example: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4 - doc_section: '#step-2-generate-api-key' - connection_config: - siteId: - type: string - title: Site ID - description: The site ID for your Mindbody account - pattern: '^\d+$' - example: '-99' - doc_section: '#step-3-obtain-site-id-and-staff-user-token' - staffUserToken: - type: string - title: Staff User Token - description: The staff user token for your Mindbody account - pattern: '^[a-f0-9]{32}$' - example: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4 - doc_section: '#step-3-obtain-site-id-and-staff-user-token' - -minimax: - display_name: MiniMax - categories: - - productivity - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.minimaxi.chat - headers: - authorization: Bearer ${apiKey} - group-id: ${connectionConfig.groupId} - query: - GroupId: ${connectionConfig.groupId} - docs: https://nango.dev/docs/integrations/all/minimax - docs_connect: https://nango.dev/docs/integrations/all/minimax/connect - connection_config: - groupId: - type: string - title: Group ID - description: The unique identifier for your MiniMax account, linked to your account's privileges. - example: '1234567890123456789' - pattern: '^\d{19}$' - doc_section: '#step-1-retrieve-your-group-id' - credentials: - apiKey: - type: string - title: API Key - description: The API key for securely accessing the MiniMax API. - doc_section: '#step-2-generate-an-api-key' - -mip-cloud: - display_name: MIP Cloud - categories: - - accounting - auth_mode: TWO_STEP - proxy: - base_url: https://api.mip.com - headers: - authorization-token: ${accessToken} - token_url: https://${connectionConfig.domain}/api/v1/sso/mipadv/login - token_params: - username: ${credentials.username} - password: ${credentials.password} - org: ${credentials.org} - token_headers: - content-type: application/json - token_response: - token: AccessToken - docs: https://nango.dev/docs/integrations/all/mip-cloud - docs_connect: https://nango.dev/docs/integrations/all/mip-cloud/connect - credentials: - username: - type: string - title: ID - description: Your Login ID for MIP Fund Accounting - password: - type: string - title: Password - description: Your Password for MIP Fund Accounting. - secret: true - org: - type: string - title: ORG - description: The MIP Fund Accounting database you will be using. - optional: true - example: ZQXP_98421_NTO - connection_config: - domain: - type: string - title: HOST REST Service URL - description: The rest service URL for the cloud-based API service - prefix: https:// - suffix: /api/v1/sso/mipadv/login - format: hostname - -mip-on-premise: - display_name: MIP On Premise - categories: - - accounting - auth_mode: TWO_STEP - proxy: - base_url: https://api.mip.com - headers: - authorization-token: ${accessToken} - token_url: https://${connectionConfig.domain}/api/security/login - token_params: - login: ${credentials.login} - password: ${credentials.password} - org: ${credentials.org} - token_headers: - content-type: application/json - token_response: - token: AccessToken - docs: https://nango.dev/docs/integrations/all/mip-on-premise - docs_connect: https://nango.dev/docs/integrations/all/mip-on-premise/connect - credentials: - login: - type: string - title: ID - description: Your Login ID for MIP Fund Accounting - password: - type: string - title: Password - description: Your Password for MIP Fund Accounting. - secret: true - org: - type: string - title: ORG - description: The MIP Fund Accounting database you will be using. - connection_config: - domain: - type: string - title: HOST REST Service URL - description: The URL of your locally installed REST API server. - prefix: https:// - suffix: /api/security/login - format: hostname - -mixpanel: - display_name: Mixpanel - categories: - - analytics - auth_mode: BASIC - proxy: - base_url: https://mixpanel.com - credentials: - # https://developer.mixpanel.com/reference/service-accounts - username: - type: string - title: Service Account Username - description: Mixpanel Service Account Username - doc_section: '#step-1-finding-mixpanel-api-key' - password: - type: string - title: Service Account Secret - description: Mixpanel Service Account Secret - doc_section: '#step-1-finding-mixpanel-api-key' - docs: https://nango.dev/docs/integrations/all/mixpanel - docs_connect: https://nango.dev/docs/integrations/all/mixpanel/connect - -mimecast: - display_name: Mimecast - categories: - - communication - auth_mode: OAUTH2_CC - token_url: https://api.services.mimecast.com/oauth/token - body_format: form - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.services.mimecast.com - docs: https://nango.dev/docs/integrations/all/mimecast - docs_connect: https://nango.dev/docs/integrations/all/mimecast/connect - -miro: - display_name: Miro - categories: - - design - - productivity - auth_mode: OAUTH2 - authorization_url: https://miro.com/oauth/authorize - token_url: https://api.miro.com/v1/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.miro.com - docs: https://nango.dev/docs/integrations/all/miro - -miro-scim: - display_name: Miro (SCIM API) - categories: - - design - - productivity - auth_mode: API_KEY - proxy: - base_url: https://miro.com/api - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/scim/Users - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/miro-scim - docs_connect: https://nango.dev/docs/integrations/all/miro-scim/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Miro scim account - doc_section: '#step-1-finding-miro-api-key' -missive: - display_name: Missive - categories: - - productivity - auth_mode: API_KEY - proxy: - headers: - api_token: ${apiKey} - base_url: https://missiveapp.com - docs: https://nango.dev/docs/integrations/all/missive - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Missive account - -juniper-mist: - display_name: Juniper Mist - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.mist.com - headers: - authorization: Token ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v1/self - docs: https://nango.dev/docs/api-integrations/juniper-mist - docs_connect: https://nango.dev/docs/api-integrations/juniper-mist/connect - connection_config: - subdomain: - type: string - title: API Subdomain - description: The API subdomain for your Juniper Mist region - example: api - pattern: '^api(\.[a-z0-9]+)*$' - doc_section: '#step-1-finding-your-api-subdomain' - credentials: - apiKey: - type: string - title: API Token - description: Your Juniper Mist API token - doc_section: '#step-2-generating-your-api-token' - example: 3n69xDYMlT36fulLwIq7PDaDopc5W0b***************************************************************** - pattern: '^[A-Za-z0-9]{96}$' - -monday: - display_name: Monday - categories: - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://auth.monday.com/oauth2/authorize - token_url: https://auth.monday.com/oauth2/token - disable_pkce: true - authorization_params: - force_install_if_needed: true - authorization_url_replacements: - response_type: '' - proxy: - base_url: https://api.monday.com - docs: https://nango.dev/docs/api-integrations/monday - setup_guide_url: https://nango.dev/docs/api-integrations/monday/how-to-register-your-own-monday-oauth-app - -momentum-io: - display_name: Momentum.io - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.momentum.io - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v1/meetings?from=1970-01-01T00:00:00.000Z&pageSize=1 - docs: https://nango.dev/docs/integrations/all/momentum-io - docs_connect: https://nango.dev/docs/integrations/all/momentum-io/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Make account - doc_section: '#step-1-generating-an-api-key' - -modjo-ai: - display_name: Modjo AI - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.modjo.ai - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v1/users?page=1&perPage=1 - docs: https://nango.dev/docs/api-integrations/modjo-ai - docs_connect: https://nango.dev/docs/api-integrations/modjo-ai/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Modjo AI API key. - doc_section: '#step-1-generate-your-api-key' - -mollie: - display_name: Mollie - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://my.mollie.com/oauth2/authorize - token_url: https://api.mollie.com/oauth2/tokens - scope_separator: ' ' - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.mollie.com - docs: https://nango.dev/docs/api-integrations/mollie - setup_guide_url: https://nango.dev/docs/api-integrations/mollie/how-to-register-your-own-mollie-oauth-app -modmed: - display_name: ModMed - categories: - - other - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.environment}/firm/${connectionConfig.firmUrlPrefix}/ema/ws/oauth2/grant - token_params: - grant_type: password - username: ${credentials.username} - password: ${credentials.password} - token_headers: - x-api-key: ${credentials.apiKey} - accept: application/json - content-type: application/x-www-form-urlencoded - proxy: - base_url: https://${connectionConfig.environment}/firm/${connectionConfig.firmUrlPrefix} - headers: - accept: application/fhir+json - x-api-key: ${credentials.apiKey} - token_response: - token: access_token - docs: https://nango.dev/docs/api-integrations/modmed - docs_connect: https://nango.dev/docs/api-integrations/modmed/connect - connection_config: - environment: - type: string - title: Environment - description: The ModMed API environment. - enum: - - stage.ema-api.com/ema-dev - - stage.ema-api.com/ema-training - - stage.ema-api.com/ema-prod - - mmapi.ema-api.com/ema-dev - - mmapi.ema-api.com/ema-training - - mmapi.ema-api.com/ema-prod - doc_section: '#step-3-selecting-your-environment' - order: 1 - firmUrlPrefix: - type: string - title: Firm URL Prefix - description: The firm URL prefix for your practice - example: emapmsandbox01 - doc_section: '#step-2-finding-your-firm-url-prefix' - order: 2 - credentials: - username: - type: string - title: Username - description: Your API username - example: fhir_QfLlo - doc_section: '#step-1-request-access-to-modmed-sandbox' - password: - type: string - title: Password - description: Your API password - secret: true - doc_section: '#step-1-request-access-to-modmed-sandbox' - apiKey: - type: string - title: API Key - description: Your API key (x-api-key) - secret: true - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-1-request-access-to-modmed-sandbox' - -mural: - display_name: Mural - categories: - - design - auth_mode: OAUTH2 - authorization_url: https://app.mural.co/api/public/v1/authorization/oauth2 - token_url: https://app.mural.co/api/public/v1/authorization/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://app.mural.co - docs: https://nango.dev/docs/integrations/all/mural - -nable-ncentral: - display_name: N-able N-central - categories: - - support - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.serverUrl}/api/auth/authenticate - token_headers: - authorization: Bearer ${credentials.userApiToken} - accept: application/json - token_response: - token: tokens.access.token - token_expiration: tokens.access.expirySeconds - token_expiration_strategy: expireIn - proxy: - base_url: https://${connectionConfig.serverUrl}/api - verification: - method: GET - endpoints: - - /auth/validate - docs: https://nango.dev/docs/api-integrations/nable-ncentral - docs_connect: https://nango.dev/docs/api-integrations/nable-ncentral/connect - connection_config: - serverUrl: - type: string - title: N-central server URL - description: Your N-central server hostname. - example: ncentral.example.com - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-1-find-your-n-central-server-url' - credentials: - userApiToken: - type: string - title: User-API token - description: Your N-central User-API token (JWT) - pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' - example: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJOX2NlbnRyYWwifQ.c2lnbmF0dXJl - secret: true - doc_section: '#step-2-generate-a-user-api-token' - -nationbuilder: - display_name: NationBuilder - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.accountId}.nationbuilder.com/oauth/authorize - token_url: https://${connectionConfig.accountId}.nationbuilder.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - default_scopes: - - default - docs: https://nango.dev/docs/integrations/all/nationbuilder - proxy: - base_url: https://${connectionConfig.accountId}.nationbuilder.com/api - connection_config: - accountId: - type: string - title: Account ID - description: The account ID of your NationBuilder account - -namely: - display_name: Namely - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.company}.namely.com/api/v1/oauth2/authorize - token_url: https://${connectionConfig.company}.namely.com/api/v1/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.company}.namely.com/api - docs: https://nango.dev/docs/integrations/all/namely - docs_connect: https://nango.dev/docs/integrations/all/namely/connect - connection_config: - company: - type: string - title: Company - description: The name of your Namely company - example: example - doc_section: '#step-1-finding-your-company-name' - -namely-pat: - display_name: Namely (PAT) - categories: - - hr - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://${connectionConfig.company}.namely.com/api - docs: https://nango.dev/docs/integrations/all/namely-pat - docs_connect: https://nango.dev/docs/integrations/all/namely-pat/connect - connection_config: - company: - type: string - title: Company Name - description: The name of your Namely company - example: example - order: 1 - doc_section: '#step-1-finding-your-company-name' - credentials: - apiKey: - type: string - title: Personal Access Token - description: The Personal Access Token for your Namely account - doc_section: '#step-2-generating-your-personal-access-token' - -nerdio: - display_name: Nerdio - categories: - - other - auth_mode: OAUTH2_CC - token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token - token_params: - grant_type: client_credentials - scope: ${connectionConfig.scope} - proxy: - base_url: https://${connectionConfig.hostname}/rest-api - docs: https://nango.dev/docs/api-integrations/nerdio - docs_connect: https://nango.dev/docs/api-integrations/nerdio/connect - connection_config: - hostname: - type: string - title: Nerdio Instance URL - description: The hostname of your Nerdio Manager instance - format: hostname - example: web-admin-portal-3e3a4zfp4peo4.azurewebsites.net - doc_section: '#step-1-finding-your-nerdio-instance-url' - order: 1 - tenantId: - type: string - title: Azure Tenant ID - description: Your Azure Active Directory Tenant ID - format: uuid - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-2-getting-your-azure-credentials' - order: 2 - scope: - type: string - title: API Scope - description: The Application ID URI scope - example: api://g0cb288e-ff16-1861-9393-50219a19453c/.default - doc_section: '#step-3-configuring-the-api-scope' - order: 3 - credentials: - client_id: - type: string - title: Client ID - description: The Application (client) ID from your Azure App Registration - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - format: uuid - doc_section: '#step-2-getting-your-azure-credentials' - client_secret: - type: string - title: Client Secret - description: The client secret from your Azure App Registration - secret: true - doc_section: '#step-2-getting-your-azure-credentials' - -netsuite: - display_name: NetSuite (OAuth) - categories: - - accounting - - erp - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.accountId}.app.netsuite.com/app/login/oauth2/authorize.nl - authorization_params: - prompt: consent - token_url: https://${connectionConfig.accountId}.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token - default_scopes: - - rest_webservices - proxy: - base_url: https://${connectionConfig.accountId}.suitetalk.api.netsuite.com/services/rest/record/v1 - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/netsuite - connection_config: - accountId: - type: string - title: Account ID - description: The account ID of your NetSuite account - pattern: '^[a-zA-Z0-9-_]+$' - example: tstdrv231585 - -netsuite-tba: - alias: netsuite - display_name: NetSuite (TBA) - auth_mode: TBA - categories: - - accounting - - erp - - popular - docs: https://nango.dev/docs/api-integrations/netsuite-tba - setup_guide_url: https://nango.dev/docs/api-integrations/netsuite-tba/how-to-set-up-netsuite-tba-with-nango - -netsuite-client-credentials: - alias: netsuite - display_name: NetSuite (Client Credentials) - categories: - - accounting - - erp - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.accountId}.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token - token_params: - grant_type: client_credentials - client_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer - client_assertion: ${credentials.assertion} - token_headers: - content-type: application/x-www-form-urlencoded - assertion: - type: jwt - key: ${assertionOption.privateKey} - lifetimeInSeconds: 3600 - header: - alg: RS256 - kid: ${credentials.certificateId} - payload: - iss: ${credentials.clientId} - aud: https://${connectionConfig.accountId}.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token - jti: ${random} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/api-integrations/netsuite-client-credentials - docs_connect: https://nango.dev/docs/api-integrations/netsuite-client-credentials/connect - credentials: - clientId: - type: string - title: Client ID - description: The Client ID from your NetSuite integration record. - example: 1c343a716c1d****************************976dde7d8e3e2 - certificateId: - type: string - title: Certificate ID - description: The ID of the certificate registered in your NetSuite integration. - example: HRril7Vwkk********************eWT2Fgks - assertion: - type: string - title: '' - description: '' - automated: true - connection_config: - accountId: - type: string - title: Account ID - description: Your NetSuite Account ID (e.g. 1234567 or 1234567_SB1 for sandbox). - example: '1234567' - assertion_option: - privateKey: - type: string - title: Private Key - description: The RSA private key (PEM format) used to sign the JWT assertion. - example: "-----BEGIN RSA PRIVATE KEY-----\nMIIEow...\n-----END RSA PRIVATE KEY-----" - -next-cloud-ocs: - display_name: Next Cloud OCS - categories: - - storage - - productivity - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.domain}/ocs/v1.php - headers: - 'ocs-apirequest': 'true' - docs: http://nango.dev/docs/integrations/all/next-cloud-ocs - docs_connect: https://nango.dev/docs/integrations/all/next-cloud-ocs/connect - connection_config: - domain: - type: string - title: Domain - description: The domain of your Next Cloud account - format: hostname - prefix: https:// - doc_section: '#step-1-locate-your-next-cloud-domain' - -nexthink: - display_name: Nexthink - categories: - - analytics - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.instance}-login.${connectionConfig.region}.nexthink.cloud/oauth2/default/v1/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - default_scopes: - - service:integration - proxy: - base_url: https://${connectionConfig.instance}.api.${connectionConfig.region}.nexthink.cloud - docs: https://nango.dev/docs/api-integrations/nexthink - docs_connect: https://nango.dev/docs/api-integrations/nexthink/connect - credentials: - client_id: - type: string - title: Client ID - description: Your Nexthink API Client ID. - doc_section: '#step-2-create-api-credentials' - client_secret: - type: string - title: Client Secret - description: Your Nexthink API Client Secret. - secret: true - doc_section: '#step-2-create-api-credentials' - connection_config: - instance: - type: string - title: Instance Name - description: The name of your Nexthink instance. - example: acme - order: 1 - doc_section: '#step-1-locate-your-instance-name-and-region' - region: - type: string - title: Region - description: 'Your Nexthink region' - example: eu - pattern: '^(us|eu|pac|meta)$' - order: 2 - doc_section: '#step-1-locate-your-instance-name-and-region' - -ninjaone-rmm: - display_name: NinjaOne RMM - categories: - - support - auth_mode: OAUTH2_CC - token_url: https://app.ninjarmm.com/ws/oauth/token - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://app.ninjarmm.com - credentials: - client_id: - type: string - title: Client ID - description: Your NinjaOne RMM OAuth Client ID - example: KTmhkNf1_dZZVPmIQTK_lH2DCNJ - pattern: '^[A-Za-z0-9_/+-]{10,}$' - doc_section: '#step-1-create-an-oauth-client-application' - client_secret: - type: string - title: Client Secret - description: Your NinjaOne RMM OAuth Client Secret - example: 'Ilfs4crKIU1t-5bde-2OMBsB9v3LGmfg82XJO7_q9TtgTnfNRmK' - pattern: '^[A-Za-z0-9_/+-]{10,}$' - secret: true - doc_section: '#step-2-copy-your-credentials' - docs: https://nango.dev/docs/integrations/all/ninjaone-rmm - docs_connect: https://nango.dev/docs/integrations/all/ninjaone-rmm/connect - -ninjaone-rmm-oauth2: - display_name: NinjaOne RMM (OAuth2) - categories: - - support - auth_mode: OAUTH2 - authorization_url: https://app.ninjarmm.com/ws/oauth/authorize - token_url: https://app.ninjarmm.com/ws/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - scope_separator: ' ' - default_scopes: - - offline_access - proxy: - base_url: https://app.ninjarmm.com - docs: https://nango.dev/docs/api-integrations/ninjaone-rmm-oauth2 - setup_guide_url: https://nango.dev/docs/api-integrations/ninjaone-rmm-oauth2/how-to-register-your-own-ninjaone-rmm-api-oauth-app - -ninjaone-saas-backup: - display_name: NinjaOne SaaS Backup - categories: - - storage - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.apiHost}/api - headers: - x-reseller-token: ${connectionConfig.resellerToken} - x-access-token: ${apiKey} - verification: - method: GET - endpoints: - - /accounts - docs: https://nango.dev/docs/api-integrations/ninjaone-saas-backup - docs_connect: https://nango.dev/docs/api-integrations/ninjaone-saas-backup/connect - connection_config: - apiHost: - type: string - title: API Host - description: The host from your NinjaOne SaaS Backup API URL. - example: dropsuite.us - pattern: '^(dropsuite\.com|dropsuite\.(us|uk|ca)|dropsuite-au\.com|[a-z0-9.-]+\.dropsuite\.com)$' - prefix: https:// - suffix: /api - order: 1 - doc_section: '#step-1-find-your-api-credentials' - resellerToken: - type: string - title: Reseller Token - description: The Reseller Token from NinjaOne SaaS Backup API Settings. - format: uuid - order: 2 - doc_section: '#step-1-find-your-api-credentials' - credentials: - apiKey: - type: string - title: Authentication Token - description: The Authentication Token from NinjaOne SaaS Backup API Settings. - format: uuid - secret: true - doc_section: '#step-1-find-your-api-credentials' - -nocrm: - display_name: nocrm.io - categories: - - crm - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.nocrm.io - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /api/v2/ping - docs: https://nango.dev/docs/api-integrations/nocrm - docs_connect: https://nango.dev/docs/api-integrations/nocrm/connect - credentials: - apiKey: - type: string - title: API Key - description: Your nocrm.io API key - pattern: ^[a-f0-9]{48}$ - example: 4b945b************************************4991 - doc_section: '#step-2-obtaining-your-api-key' - connection_config: - subdomain: - type: string - title: Account subdomain - description: Your nocrm.io account subdomain - example: acme - prefix: https:// - pattern: '^[a-z0-9-]+$' - suffix: .nocrm.io - order: 1 - doc_section: '#step-1-finding-your-subdomain' - -northbeam: - display_name: Northbeam - categories: - - analytics - - marketing - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.northbeam.io - headers: - authorization: ${apiKey} - data-client-id: ${connectionConfig.dataClientId} - verification: - method: GET - endpoints: - - /v1/exports/attribution-models - docs: https://nango.dev/docs/api-integrations/northbeam - docs_connect: https://nango.dev/docs/api-integrations/northbeam/connect - connection_config: - subdomain: - type: string - title: API Subdomain - description: Use api for production or api-uat for testing/development. - enum: - - api - - api-uat - order: 1 - doc_section: '#step-1-getting-authentication-credentials' - dataClientId: - type: string - title: Data Client ID - description: Your Northbeam Data Client ID (UUID). - format: uuid - example: '123e4567-e89b-12d3-a456-426614174000' - doc_section: '#step-1-getting-authentication-credentials' - credentials: - apiKey: - type: string - title: API Key - description: Your Northbeam API Key. - format: uuid - example: f1c2d3a4-5b67-4c89-ae01-123456789abc - doc_section: '#step-1-getting-authentication-credentials' - -notion: - display_name: Notion - categories: - - knowledge-base - - popular - - productivity - auth_mode: OAUTH2 - authorization_url: https://api.notion.com/v1/oauth/authorize - token_url: https://api.notion.com/v1/oauth/token - authorization_params: - response_type: code - owner: user - authorization_method: header - body_format: json - webhook_routing_script: notionWebhookRouting - webhook_user_defined_secret: true - token_response_metadata: - - workspace_id - proxy: - retry: - after: - - 'retry-after' - base_url: https://api.notion.com - headers: - 'notion-version': '2022-06-28' - paginate: - type: cursor - cursor_path_in_response: next_cursor - cursor_name_in_request: start_cursor - limit_name_in_request: page_size - response_path: results - docs: https://nango.dev/docs/api-integrations/notion - setup_guide_url: https://nango.dev/docs/api-integrations/notion/how-to-register-your-own-notion-api-oauth-app - -notion-mcp: - display_name: Notion (MCP) - categories: - - knowledge-base - - productivity - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://mcp.notion.com/authorize - token_url: https://mcp.notion.com/token - registration_url: https://mcp.notion.com/register - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - docs: https://nango.dev/docs/api-integrations/notion-mcp - -notion-scim: - display_name: Notion (SCIM API) - categories: - - knowledge-base - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.notion.com/scim - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/Users - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/notion-scim - docs_connect: https://nango.dev/docs/integrations/all/notion-scim/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Notion scim account - doc_section: '#step-1-finding-your-scim-api-key-token' - -nyne-ai: - display_name: Nyne AI - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://api.nyne.ai - headers: - x-api-key: ${connectionConfig.apiKey} - x-api-secret: ${apiKey} - content-type: application/json - verification: - method: POST - headers: - content-type: application/json - endpoints: - - /person/events - data: - event: 'test' - docs: https://nango.dev/docs/api-integrations/nyne-ai - docs_connect: https://nango.dev/docs/api-integrations/nyne-ai/connect - connection_config: - apiKey: - type: string - title: API Key - description: Your Nyne AI API key. - pattern: '^[a-fA-F0-9]{32}$' - example: '48f0****************************892' - order: 1 - doc_section: '#step-1-getting-your-api-credentials' - credentials: - apiKey: - type: string - title: API Secret - description: Your Nyne AI API secret. - pattern: '^[a-fA-F0-9]{16}$' - example: '97e7********0463' - doc_section: '#step-1-getting-your-api-credentials' - -ocean-io: - display_name: Ocean.io - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.ocean.io - headers: - x-api-token: ${apiKey} - retry: - after: - - 'retry-after' - verification: - method: GET - endpoints: - - /v2/credits/balance - docs: https://nango.dev/docs/api-integrations/ocean-io - docs_connect: https://nango.dev/docs/api-integrations/ocean-io/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Ocean.io API token. - example: api_7Zs******_************************mhS - pattern: '^api_[A-Za-z0-9]+_[A-Za-z0-9]+' - doc_section: '#step-1-generate-your-api-token' - -odoo: - display_name: Odoo (OAuth) - categories: - - erp - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.serverUrl}/restapi/1.0/common/oauth2/authorize - token_url: https://${connectionConfig.serverUrl}/restapi/1.0/common/oauth2/access_token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.serverUrl} - docs: https://nango.dev/docs/integrations/all/odoo - connection_config: - serverUrl: - type: string - title: Domain - description: The domain of your Odoo account - format: hostname - prefix: https:// - -odoo-cc: - display_name: Odoo (Client Credentials) - categories: - - erp - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.serverUrl}/restapi/1.0/common/oauth2/access_token - token_params: - client_id: ${credentials.consumerId} - client_secret: ${credentials.consumerSecret} - grant_type: client_credentials - token_headers: - content-type: application/x-www-form-urlencoded - token_response: - token: access_token - token_expiration: access_token_validity - token_expiration_strategy: expireIn - proxy: - base_url: https://${connectionConfig.serverUrl}/restapi - docs: https://nango.dev/docs/integrations/all/odoo-cc - docs_connect: https://nango.dev/docs/integrations/all/odoo-cc/connect - credentials: - consumerId: - type: string - title: Consumer ID - description: Your App Consumer ID - secret: true - doc_section: '#step-2-generating-your-odoo-client-credentials' - consumerSecret: - type: string - title: Consumer Secret - description: Your App Consumer Secret - secret: true - doc_section: '#step-2-generating-your-odoo-client-credentials' - connection_config: - serverUrl: - type: string - title: Domain - description: The domain to your Odoo account - format: hostname - example: example.odoo.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-odoo-domain' - -okta: - display_name: Okta - auth_mode: OAUTH2 - categories: - - dev-tools - - iam - authorization_url: https://${connectionConfig.subdomain}.okta.com/oauth2/v1/authorize - token_url: https://${connectionConfig.subdomain}.okta.com/oauth2/v1/token - authorization_params: - response_type: code - response_mode: query - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.okta.com - retry: - at: - - 'x-rate-limit-reset' - paginate: - type: 'link' - limit_name_in_request: 'limit' - link_rel_in_response_header: 'next' - docs: https://nango.dev/docs/integrations/all/okta - connection_config: - subdomain: - type: string - title: Okta Domain - description: The subdomain of your Okta account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .okta.com - prefix: https:// - -okta-cc: - display_name: Okta (Client Credentials) - categories: - - dev-tools - - iam - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.hostname}/oauth2/v1/token || https://${connectionConfig.subdomain}.okta.com/oauth2/v1/token - token_request_auth_method: private_key_jwt - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.hostname} || https://${connectionConfig.subdomain}.okta.com - retry: - at: - - 'x-rate-limit-reset' - paginate: - type: 'link' - limit_name_in_request: 'limit' - link_rel_in_response_header: 'next' - docs: https://nango.dev/docs/api-integrations/okta-cc - docs_connect: https://nango.dev/docs/api-integrations/okta-cc/connect - credentials: - client_id: - type: string - title: Client ID - description: The Client ID of your Okta API Services application - doc_section: '#step-1-creating-your-okta-api-services-application' - client_private_key: - type: string - title: Private Key (JWK) - description: The private JWK JSON (including kid, kty, n, e, d, p, q, dp, dq, qi) whose public key is registered in your Okta API Services application - secret: true - doc_section: '#step-2-generating-and-registering-your-rsa-key-pair' - connection_config: - hostname: - type: string - title: Okta Domain - description: The full hostname of your Okta account - format: hostname - prefix: https:// - example: dev-12345678.okta.com - doc_section: '#step-3-finding-your-okta-domain' - subdomain: - type: string - title: '' - description: '' - hidden: true # deprecating this in favor of hostname - oauth_scopes: - type: string - title: Scopes - description: Space-separated list of Okta Management API scopes (e.g. okta.users.read okta.users.manage). Must be granted under Okta API Scopes on your application. - example: okta.users.read okta.users.manage okta.groups.read - doc_section: '#step-4-grant-api-scopes-to-your-application' - -okta-preview: - alias: okta - display_name: Okta (Preview) - categories: - - dev-tools - - iam - authorization_url: https://${connectionConfig.subdomain}.oktapreview.com/oauth2/v1/authorize - token_url: https://${connectionConfig.subdomain}.oktapreview.com/oauth2/v1/token - proxy: - base_url: https://${connectionConfig.subdomain}.oktapreview.com - docs: https://nango.dev/docs/integrations/all/okta-preview - connection_config: - subdomain: - type: string - title: Okta Preview Domain - description: The subdomain of your Okta Preview account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .oktapreview.com - prefix: https:// - -onlogist: - display_name: Onlogist - categories: - - other - auth_mode: API_KEY - proxy: - base_url: https://dev.portal.onlogist.com/api - headers: - authorization: ${apiKey} - docs: https://nango.dev/docs/api-integrations/onlogist - docs_connect: https://nango.dev/docs/api-integrations/onlogist/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your OnLogist account - doc_section: '#step-1-finding-your-api-key' - -one-drive: - display_name: OneDrive for Business - categories: - - knowledge-base - - storage - alias: microsoft - post_connection_script: onedrivePostConnection - docs: https://nango.dev/docs/api-integrations/one-drive - setup_guide_url: https://nango.dev/docs/api-integrations/one-drive/how-to-register-your-own-onedrive-for-business-api-oauth-app - -one-drive-personal: - display_name: OneDrive Personal - categories: - - knowledge-base - - storage - auth_mode: OAUTH2 - authorization_url: https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize - token_url: https://login.microsoftonline.com/consumers/oauth2/v2.0/token - disable_pkce: true - default_scopes: - - offline_access - authorization_params: - response_type: code - response_mode: query - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.onedrive.com - retry: - after: - - 'retry-after' - decompress: true - docs: https://nango.dev/docs/integrations/all/one-drive-personal - -one-note: - display_name: One Note - categories: - - productivity - alias: microsoft - docs: https://nango.dev/docs/integrations/all/one-note - -onelogin: - display_name: OneLogin - categories: - - dev-tools - - iam - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.subdomain}.onelogin.com/auth/oauth2/v2/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.subdomain}.onelogin.com - pre_connection_deletion_script: oneloginPreConnectionDeletion - docs: https://nango.dev/docs/integrations/all/onelogin - docs_connect: https://nango.dev/docs/integrations/all/onelogin/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: Your OneLogin subdomain - example: acme - order: 1 - prefix: https:// - suffix: .onelogin.com - doc_section: '#step-1-finding-your-subdomain' - -oomnitza: - display_name: Oomnitza - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.oomnitza.com - headers: - authorization2: ${apiKey} - content-type: application/json - verification: - method: GET - endpoints: - - /api/v3/assets/meta - docs: https://nango.dev/docs/api-integrations/oomnitza - docs_connect: https://nango.dev/docs/api-integrations/oomnitza/connect - connection_config: - subdomain: - type: string - title: Oomnitza Subdomain - description: The subdomain of your Oomnitza instance - example: mycompany - prefix: https:// - suffix: .oomnitza.com - order: 1 - doc_section: '#step-1-finding-your-subdomain' - credentials: - apiKey: - type: string - title: API Token - description: Your Oomnitza API token - doc_section: '#step-2-generating-your-api-token' - -orange-logic: - display_name: Orange Logic - categories: - - storage - auth_mode: TWO_STEP - body_format: json - token_url: https://${connectionConfig.serverUrl}/webapi/security/clientcredentialsauthentication/authenticate_46H_v1 - token_params: - client_id: ${credentials.clientId} - client_secret: ${credentials.clientSecret} - token_headers: - content-type: application/json - accept: application/json - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://${connectionConfig.serverUrl} - docs: https://nango.dev/docs/api-integrations/orange-logic - docs_connect: https://nango.dev/docs/api-integrations/orange-logic/connect - credentials: - clientId: - type: string - title: Client ID - description: The Client ID from your Orange Logic OAuth 2.0 Client Credentials. - doc_section: '#step-2-obtain-client-credentials' - clientSecret: - type: string - title: Client Secret - description: The Client Secret from your Orange Logic OAuth 2.0 Client Credentials. - secret: true - doc_section: '#step-2-obtain-client-credentials' - connection_config: - serverUrl: - type: string - title: Orange Logic Server URL - description: The base URL of your Orange Logic instance - example: mycompany.orangelogic.com - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-1-find-your-orange-logic-url' - -openai: - display_name: OpenAI - categories: - - productivity - - dev-tools - - popular - auth_mode: API_KEY - proxy: - base_url: https://api.openai.com - headers: - authorization: Bearer ${apiKey} - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/models - retry: - after: - - 'x-ratelimit-reset-requests' - docs: https://nango.dev/docs/integrations/all/openai - docs_connect: https://nango.dev/docs/integrations/all/openai/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your OpenAI account - doc_section: '#step-1-retrieve-your-openai-api-key' -openai-admin: - display_name: OpenAI (Admin) - categories: - - productivity - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.openai.com - headers: - authorization: Bearer ${apiKey} - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/organization/users - retry: - after: - - 'x-ratelimit-reset-requests' - docs: https://nango.dev/docs/integrations/all/openai-admin - docs_connect: https://nango.dev/docs/integrations/all/openai-admin/connect - credentials: - apiKey: - type: string - title: Admin Key - description: The Admin API key for your OpenAI account - doc_section: '#step-1-retrieve-your-openai-admin-key' -open-hands: - display_name: Open Hands - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://app.all-hands.dev - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/conversations - docs: https://nango.dev/docs/integrations/all/open-hands - docs_connect: https://nango.dev/docs/integrations/all/open-hands/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Open Hands account - pattern: '^[A-Za-z0-9]{32}$' - example: 'aNVlyRBLGWJgnVp1vwXN7TkO1MCYxeIDz' - doc_section: '#step-1-finding-your-api-key' - -oracle-hcm: - display_name: Oracle Fusion Cloud (HCM) - categories: - - hr - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.restServerUrl} - headers: - content-type: application/vnd.oracle.adf.resourceitem+json - docs: https://nango.dev/docs/integrations/all/oracle-hcm - docs_connect: https://nango.dev/docs/integrations/all/oracle-hcm/connect - credentials: - username: - type: string - title: Username - description: Your Oracle Cloud service username. - doc_section: '#step-2-finding-your-credentials' - password: - type: string - title: Password - description: Your Oracle Cloud service password. - doc_section: '#step-2-finding-your-credentials' - connection_config: - restServerUrl: - type: string - title: REST Server URL - description: The REST server URL for your Oracle Fusion Cloud - format: hostname - prefix: https:// - example: servername.fa.us2.oraclecloud.com - order: 1 - doc_section: '#step-1-finding-your-rest-server-url' - -oracle-cloud-identity: - display_name: Oracle Cloud Identity - categories: - - dev-tools - - iam - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.serviceInstance}.identity.oraclecloud.com/oauth2/v1/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - scope_separator: ' ' - proxy: - base_url: https://${connectionConfig.serviceInstance}.identity.oraclecloud.com - docs: https://nango.dev/docs/api-integrations/oracle-cloud-identity - docs_connect: https://nango.dev/docs/api-integrations/oracle-cloud-identity/connect - connection_config: - serviceInstance: - type: string - title: IDCS Service Instance - description: Your Oracle Identity Cloud Service instance identifier - pattern: '^idcs-[a-f0-9]{32}$' - example: idcs-1234567890abcdef1234567890abcdef - prefix: https:// - suffix: .identity.oraclecloud.com - order: 1 - doc_section: '#step-1-finding-your-service-instance' - -ordinal: - display_name: Ordinal - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://app.tryordinal.com/api - headers: - authorization: Bearer ${apiKey} - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/workspace - docs: https://nango.dev/docs/api-integrations/ordinal - docs_connect: https://nango.dev/docs/api-integrations/ordinal/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Ordinal API key. - example: ord_************* - pattern: '^ord_[A-Za-z0-9-_]+$' - doc_section: '#step-1-generating-your-api-key' - -ory: - display_name: Ory - categories: - - iam - auth_mode: OAUTH2_CC - proxy: - base_url: https://${connectionConfig.projectSlug}.projects.oryapis.com - token_url: https://${connectionConfig.projectSlug}.projects.oryapis.com/oauth2/token - scope_separator: ' ' - token_params: - grant_type: client_credentials - docs: https://nango.dev/docs/integrations/all/ory - connection_config: - projectSlug: - type: string - title: Project Slug - description: The project slug of your Ory project - -osu: - display_name: Osu - categories: - - gaming - auth_mode: OAUTH2 - authorization_url: https://osu.ppy.sh/oauth/authorize - token_url: https://osu.ppy.sh/oauth/token - default_scopes: - - identify - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://osu.ppy.sh - docs: https://nango.dev/docs/integrations/all/osu - -oura: - display_name: Oura - categories: - - sports - auth_mode: OAUTH2 - authorization_url: https://cloud.ouraring.com/oauth/authorize - token_url: https://api.ouraring.com/oauth/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.ouraring.com - docs: https://nango.dev/docs/integrations/all/oura - -outlook: - display_name: Outlook - categories: - - communication - - popular - alias: microsoft - docs: https://nango.dev/docs/api-integrations/outlook - setup_guide_url: https://nango.dev/docs/api-integrations/outlook/how-to-register-your-own-outlook-api-oauth-app - -outreach: - display_name: Outreach - categories: - - marketing - auth_mode: OAUTH2 - authorization_url: https://api.outreach.io/oauth/authorize - token_url: https://api.outreach.io/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.outreach.io - docs: https://nango.dev/docs/integrations/all/outreach - -pagerduty: - display_name: PagerDuty - categories: - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://app.pagerduty.com/oauth/authorize - token_url: https://app.pagerduty.com/oauth/token - webhook_routing_script: pagerdutyWebhookRouting - proxy: - base_url: https://api.pagerduty.com - retry: - after: - - 'ratelimit-reset' - docs: https://nango.dev/docs/integrations/all/pagerduty - -paligo: - display_name: Paligo - categories: - - cms - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.paligoapp.com - verification: - method: GET - endpoints: - - /api/v2/groups?page=1&per_page=1 - docs: https://nango.dev/docs/api-integrations/paligo - docs_connect: https://nango.dev/docs/api-integrations/paligo/connect - connection_config: - subdomain: - type: string - title: Paligo Instance Name - description: The name of your Paligo instance - example: mycompany - suffix: .paligoapp.com - prefix: https:// - order: 1 - doc_section: '#step-1-find-your-paligo-instance-name' - credentials: - username: - type: string - title: Username - description: Your Paligo account username (email address). - example: name@example.com - format: email - doc_section: '#step-3-enter-credentials-in-the-connect-ui' - password: - type: string - title: API Key - description: The API key token generated. - secret: true - pattern: '^[A-F0-9]+$' - example: 74E12F****************************9C5D6F - doc_section: '#step-2-create-an-api-key' - -pandadoc: - display_name: Pandadoc - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://app.pandadoc.com/oauth2/authorize - token_url: https://api.pandadoc.com/oauth2/access_token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.pandadoc.com - docs: https://nango.dev/docs/integrations/all/pandadoc - -pandadoc-api-key: - display_name: Pandadoc (API Key) - categories: - - legal - auth_mode: API_KEY - proxy: - base_url: https://api.pandadoc.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /public/v1/members/current - headers: - authorization: API-Key ${apiKey} - docs: https://nango.dev/docs/integrations/all/pandadoc-api-key - docs_connect: https://nango.dev/docs/integrations/all/pandadoc-api-key/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Pandadoc account - doc_section: '#step-1-generating-your-api-key' - example: 3039ba033eb1410caa0a2227158d63c9d6502cd8 - pattern: '^[a-fA-F0-9]+$' - -paddle: - display_name: Paddle - categories: - - payment - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.paddle.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/api-integrations/paddle - docs_connect: https://nango.dev/docs/api-integrations/paddle/connect - setup_guide_url: https://nango.dev/docs/api-integrations/paddle/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Paddle API key. - example: pdl_live_apikey_01kpb*********************_xRs9*********************_A40 - doc_section: '#step-1-generating-your-api-key' - connection_config: - subdomain: - type: string - title: Environment - description: Use 'api' for live or 'sandbox-api' for sandbox. - enum: - - api - - sandbox-api - doc_section: '#step-2-choose-your-environment' - order: 1 - -passportal: - display_name: Passportal - categories: - - support - auth_mode: TWO_STEP - token_url: https://${connectionConfig.base_url}/api/v2/auth/client_token - token_headers: - x-key: ${credentials.apiKey} - x-hash: ${credentials.hmacToken} - content-type: application/json - token_params: - scope: docs_api - content: ${credentials.content} - token_response: - token: access_token - token_expiration: expiry_time - token_expiration_strategy: expireAt - proxy: - base_url: https://${connectionConfig.base_url} - headers: - x-access-token: ${accessToken} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v2/documents?resultsPerPage=1 - connection_config: - base_url: - type: string - title: Passportal Base URL - description: Your Passportal base URL - example: mycompany.mypasswordapp.com - format: hostname - prefix: https:// - doc_section: '#step-1-find-your-passportal-base-url' - credentials: - apiKey: - type: string - title: API Access Key ID - description: Your Passportal API Access Key ID - example: a14e6b4923ba5027189baded6ba7b68e6fcda742008c5d57b867f43a09768ece - pattern: '^[a-fA-F0-9]{64}$' - doc_section: '#step-2-generate-api-access-key-id-and-secret-access-key' - hmacToken: - type: string - title: HMAC Token - description: Your pre-generated HMAC token, hex encoded - example: 23ec313efecb560a7f44239f6dd439ea56d18911c18b59e1150a3c7299da8202 - pattern: '^[a-fA-F0-9]{64}$' - secret: true - doc_section: '#step-3-generate-hmac-token' - content: - type: string - title: Content String - description: Plain text message used to compute the HMAC token - example: api-content-hash - doc_section: '#step-3-generate-hmac-token' - docs: https://nango.dev/docs/integrations/all/passportal - docs_connect: https://nango.dev/docs/integrations/all/passportal/connect - -paychex: - display_name: Paychex - categories: - - hr - auth_mode: OAUTH2_CC - token_url: https://api.paychex.com/auth/oauth/v2/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.paychex.com - docs: https://nango.dev/docs/integrations/all/paychex - docs_connect: https://nango.dev/docs/integrations/all/paychex/connect - credentials: - client_id: - type: string - title: API Key - description: A unique identifier for your application on Paychex - doc_section: '#step-1-generating-your-client-credentials' - client_secret: - type: string - title: Client Secret - description: A confidential key used to authenticate the identity of application (client) - doc_section: '#step-1-generating-your-client-credentials' - -paycor: - display_name: Paycor - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://hcm.paycor.com/AppActivation/Authorize - token_url: https://apis.paycor.com/sts/v1/common/token?subscription-key=${connectionConfig.subscriptionKey} - authorization_params: - response_type: code - subscription-key: ${connectionConfig.subscriptionKey} - scope_separator: ' ' - default_scopes: - - offline_access - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://apis.paycor.com - headers: - ocp-apim-subscription-key: ${connectionConfig.subscriptionKey} - docs: https://nango.dev/docs/integrations/all/paycor - docs_connect: https://nango.dev/docs/integrations/all/paycor/connect - connection_config: - subscriptionKey: - type: string - title: Subscription Key - description: The subscription key for your Paycor account - automated: true - tenantId: - type: string - title: Company ID - example: '290180' - pattern: '^\d+$' - description: The company ID for your Paycor account - doc_section: '#step-1-finding-your-company-id' - -paycor-sandbox: - display_name: Paycor (Sandbox) - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://hcm-demo.paycor.com/AppActivation/Authorize - token_url: https://apis-sandbox.paycor.com/sts/v1/common/token?subscription-key=${connectionConfig.subscriptionKey} - authorization_params: - response_type: code - subscription-key: ${connectionConfig.subscriptionKey} - scope_separator: ' ' - default_scopes: - - offline_access - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://apis-sandbox.paycor.com - headers: - ocp-apim-subscription-key: ${connectionConfig.subscriptionKey} - docs: https://nango.dev/docs/integrations/all/paycor-sandbox - docs_connect: https://nango.dev/docs/integrations/all/paycor-sandbox/connect - connection_config: - subscriptionKey: - type: string - title: Subscription Key - description: The subscription key for your Paycor sandbox account - automated: true - tenantId: - type: string - title: Company ID - example: '290180' - pattern: '^\d+$' - description: The company ID for your Paycor sandbox account - doc_section: '#step-1-finding-your-company-id' - -paycom: - display_name: Paycom - categories: - - hr - auth_mode: BASIC - proxy: - base_url: https://api.paycomonline.net - docs: https://nango.dev/docs/integrations/all/paycom - docs_connect: https://nango.dev/docs/integrations/all/paycom/connect - credentials: - username: - type: string - title: SID - description: The SID of your Paycom account - doc_section: '#step-1-finding-your-credentials' - password: - type: string - title: API Token - description: The API token of your Paycom account - doc_section: '#step-1-finding-your-credentials' - -payfit: - display_name: Payfit - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://oauth.payfit.com/authorize - token_url: https://app.pagerduty.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://partner-api.payfit.com - docs: https://nango.dev/docs/integrations/all/payfit - -paylocity-nextgen: - display_name: Paylocity (NextGen) - categories: - - hr - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.environment}.paylocity.com/public/security/v1/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.environment}.paylocity.com - connection_config: - companyId: ${connectionConfig.companyId} - docs: https://nango.dev/docs/api-integrations/paylocity-nextgen - docs_connect: https://nango.dev/docs/api-integrations/paylocity-nextgen/connect - connection_config: - environment: - type: string - title: Environment - description: Your Paylocity NextGen environment. - enum: - - dc1prodgwext - - dc1demogwext - order: 1 - doc_section: '#step-1-select-the-correct-paylocity-environment' - companyId: - type: string - title: Company ID - description: The company ID of your Paylocity account - doc_section: '#step-2-find-your-company-id' - pattern: '^[a-zA-Z0-9]+$' - example: S2222 - order: 2 - -paylocity: - display_name: Paylocity (Weblink) - categories: - - hr - auth_mode: OAUTH2_CC - proxy: - base_url: https://${connectionConfig.environment}.paylocity.com - connection_config: - companyId: ${connectionConfig.companyId} - token_url: https://${connectionConfig.environment}.paylocity.com/IdentityServer/connect/token - token_params: - grant_type: client_credentials - docs: https://nango.dev/docs/api-integrations/paylocity - docs_connect: https://nango.dev/docs/api-integrations/paylocity/connect - connection_config: - environment: - type: string - title: Paylocity Environment - enum: - - dc1demogw - - api - description: Your Paylocity Weblink environment. - order: 1 - doc_section: '#step-1-select-the-correct-paylocity-environment' - companyId: - type: string - title: Company ID - description: The company ID of your Paylocity account - doc_section: '#step-2-find-your-company-id' - pattern: '^[a-zA-Z0-9]+$' - example: S2222 - order: 2 - -paypal: - display_name: Paypal - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://www.paypal.com/signin/authorize - token_url: https://api.paypal.com/v1/oauth2/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api-m.paypal.com - docs: https://nango.dev/docs/integrations/all/paypal - -paypal-sandbox: - display_name: Paypal (Sandbox) - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://www.sandbox.paypal.com/signin/authorize - token_url: https://api-m.sandbox.paypal.com/v1/oauth2/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api-m.sandbox.paypal.com - docs: https://nango.dev/docs/integrations/all/paypal-sandbox - -pax8: - display_name: Pax8 - categories: - - other - auth_mode: OAUTH2_CC - body_format: json - token_url: https://api.pax8.com/v1/token - token_params: - grant_type: client_credentials - audience: ${connectionConfig.audience} || https://api.pax8.com - proxy: - base_url: https://api.pax8.com - docs: https://nango.dev/docs/integrations/all/pax8 - docs_connect: https://nango.dev/docs/integrations/all/pax8/connect - connection_config: - audience: - type: string - title: '' - description: '' - automated: true - -pendo: - display_name: Pendo - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://app.pendo.io - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v1/page - headers: - x-pendo-integration-key: ${apiKey} - docs: https://nango.dev/docs/integrations/all/pendo - docs_connect: https://nango.dev/docs/integrations/all/pendo/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Pendo account - doc_section: '#step-1-finding-pendo-api-key' - -pendo-oauth: - display_name: Pendo (OAuth) - categories: - - analytics - auth_mode: OAUTH2_CC - token_url: https://app.pendo.io/oauth/v1/token - token_params: - grant_type: client_credentials - default_scopes: - - read:me - body_format: form - proxy: - base_url: https://app.pendo.io - docs: https://nango.dev/docs/api-integrations/pendo-oauth - docs_connect: https://nango.dev/docs/api-integrations/pendo-oauth/connect - credentials: - client_id: - type: string - title: Client ID - description: Your Pendo OAuth client ID - doc_section: '#step-1-finding-your-pendo-oauth-credentials' - client_secret: - type: string - title: Client Secret - description: Your Pendo OAuth client secret - secret: true - doc_section: '#step-1-finding-your-pendo-oauth-credentials' - -pennylane: - display_name: Pennylane - categories: - - accounting - - banking - - invoicing - - payment - auth_mode: OAUTH2 - authorization_url: https://app.pennylane.com/oauth/authorize - token_url: https://app.pennylane.com/oauth/token - proxy: - base_url: https://app.pennylane.com - retry: - at: - - 'ratelimit-reset' - scope_separator: '+' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - authorization_url_skip_encode: - - scopes - docs: https://nango.dev/docs/integrations/all/pennylane - -pennylane-company-api: - display_name: Pennylane (Company API) - categories: - - accounting - - banking - - invoicing - - payment - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://app.pennylane.com - verification: - method: GET - headers: - accept: application/json - endpoints: - - /api/external/v2/me - retry: - at: - - 'ratelimit-reset' - docs: https://nango.dev/docs/integrations/all/pennylane-company-api - docs_connect: https://nango.dev/docs/integrations/all/pennylane-company-api/connect - credentials: - apiKey: - type: string - title: API Token - description: The company API token for your Pennylane account - pattern: '^[A-Za-z0-9_-]{43}$' - example: aZ9b4Lp3QhN7vXyK1sTcO0WfR8jMdEuD5GrIi2-H6PnU - doc_section: '#step-1-generating-your-company-api-token' - -peopledatalabs: - display_name: People Data Labs - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://api.peopledatalabs.com - query: - api_key: ${apiKey} - docs: https://nango.dev/docs/integrations/all/peopledatalabs - credentials: - apiKey: - type: string - title: API Key - description: The API key for your People Data Labs account - -perdoo: - display_name: Perdoo - categories: - - productivity - - analytics - auth_mode: API_KEY - proxy: - base_url: https://eu.perdoo.com - headers: - authorization: Bearer ${apiKey} - content-type: application/json - verification: - method: GET - endpoints: - - /user - docs: https://nango.dev/docs/api-integrations/perdoo - docs_connect: https://nango.dev/docs/api-integrations/perdoo/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Perdoo API token - example: '5037c64a83d34725a13131b9b28856c0e499887b16c84b6d9bba2756d1e61634' - pattern: '^[a-f0-9]{64}$' - doc_section: '#step-1-generating-your-api-token' - -perplexity: - display_name: Perplexity - categories: - - productivity - - dev-tools - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.perplexity.ai - docs: https://nango.dev/docs/integrations/all/perplexity - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Perplexity account - pattern: '^pplx-[a-zA-Z0-9]+$' - example: pplx-**************************** - -perimeter81: - display_name: Perimeter81 - categories: - - productivity - auth_mode: TWO_STEP - proxy: - base_url: https://api.perimeter81.com/api/rest - token_url: https://api.${connectionConfig.domain}.com/api/v1/auth/authorize - token_params: - apiKey: ${credentials.apiKey} - grantType: api_key - token_headers: - content-type: application/json - token_response: - token: data.accessToken - token_expiration: data.accessTokenExpire - token_expiration_strategy: expireAt - docs: https://nango.dev/docs/integrations/all/perimeter81 - docs_connect: https://nango.dev/docs/integrations/all/perimeter81/connect - connection_config: - domain: - type: string - title: Domain - description: The domain for Perimeter81. - enum: - - perimeter81 - - eu.sase.checkpoint - doc_section: '#step-1-finding-your-perimeter81-domain-and-perimeter81-api-key' - order: 1 - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Perimeter81 account - secret: true - -personio: - display_name: Personio (v1) - categories: - - hr - auth_mode: OAUTH2_CC - proxy: - base_url: https://api.personio.de/v1 - headers: - x-personio-partner-id: ${connectionConfig.partnerId} - x-personio-app-id: ${connectionConfig.appId} - token_url: https://api.personio.de/v1/auth - body_format: json - docs: https://nango.dev/docs/integrations/all/personio - docs_connect: https://nango.dev/docs/integrations/all/personio/connect - connection_config: - partnerId: - type: string - title: Partner ID - description: The partner ID of your Personio account - doc_section: '#step-1-finding-personio-client-id' - appId: - type: string - title: App ID - description: The app ID of your Personio account - doc_section: '#step-2-finding-personio-client-secret' - -personio-v2: - display_name: Personio (v2) - categories: - - hr - auth_mode: OAUTH2_CC - proxy: - base_url: https://api.personio.de/v2 - headers: - content-type: application/x-www-form-urlencoded - token_url: https://api.personio.de/v2/auth/token - scope_separator: ' ' - docs: https://nango.dev/docs/integrations/all/personio-v2 - token_params: - grant_type: client_credentials - -personio-recruiting: - display_name: Personio Recruiting - categories: - - hr - - ats - auth_mode: API_KEY - proxy: - base_url: https://api.personio.de/v1 - headers: - authorization: Bearer ${apiKey} - x-company-id: ${connectionConfig.companyId} - x-personio-partner-id: ${connectionConfig.partnerId} - x-personio-app-id: ${connectionConfig.appId} - verification: - method: GET - endpoints: - - /xml?language=en - base_url_override: https://${connectionConfig.company}.jobs.personio.de - headers: - accept: application/xml - content-type: xml - docs: https://nango.dev/docs/integrations/all/personio-recruiting - connection_config: - companyId: - type: string - title: Company ID - description: The company ID of your Personio account - company: - type: string - title: Company Name - description: The company name of your Personio account - partnerId: - type: string - title: Partner ID - description: The partner ID of your Personio account - appId: - type: string - title: App ID - description: The app ID of your Personio account - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Pingboard account - -pingboard: - display_name: Pingboard - categories: - - productivity - auth_mode: OAUTH2_CC - proxy: - base_url: https://app.pingboard.com/api/v2 - token_url: https://app.pingboard.com/oauth/token - scope_separator: ' ' - token_params: - grant_type: client_credentials - docs: https://nango.dev/docs/integrations/all/pingboard - -pingone: - display_name: PingOne - categories: - - dev-tools - - iam - auth_mode: OAUTH2 - authorization_url: https://auth.pingone.${connectionConfig.tld}/${connectionConfig.environmentId}/as/authorize - token_url: https://auth.pingone.${connectionConfig.tld}/${connectionConfig.environmentId}/as/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.pingone.${connectionConfig.tld} - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/pingone - docs_connect: https://nango.dev/docs/integrations/all/pingone/connect - connection_config: - tld: - type: string - title: Top Level Domain - description: The top level domain for your PingOne account. - enum: - - com - - ca - - eu - - com.au - - sg - - asia - doc_section: '#step-2-finding-your-top-level-domain' - environmentId: - type: string - title: Environment ID - order: 1 - description: The environment ID for your PingOne account - example: f2aba07d-270c-42ba-8811-01af5f63d458 - format: uuid - doc_section: '#step-1-finding-your-environment-id' - -pingone-cc: - display_name: PingOne (Client Credentials) - categories: - - dev-tools - - iam - auth_mode: OAUTH2_CC - token_url: https://auth.pingone.${connectionConfig.tld}/${connectionConfig.environmentId}/as/token - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.pingone.${connectionConfig.tld} - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/pingone-cc - docs_connect: https://nango.dev/docs/integrations/all/pingone-cc/connect - connection_config: - tld: - type: string - title: Top Level Domain - description: The top level domain for your PingOne account. - order: 2 - enum: - - com - - ca - - eu - - com.au - - sg - - asia - doc_section: '#step-3-finding-your-top-level-domain' - environmentId: - type: string - title: Environment ID - order: 1 - description: The environment ID for your PingOne account - example: f2aba07d-270c-42ba-8811-01af5f63d458 - format: uuid - doc_section: '#step-2-finding-your-environment-id' - -pinterest: - display_name: Pinterest - categories: - - design - - marketing - - social - - video - auth_mode: OAUTH2 - authorization_url: https://www.pinterest.com/oauth - token_url: https://api.pinterest.com/v5/oauth/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.pinterest.com - docs: https://nango.dev/docs/integrations/all/pinterest - -rocketlane: - display_name: Rocketlane - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.rocketlane.com/api - headers: - api-key: ${apiKey} - verification: - method: GET - endpoints: - - /1.0/users/?pageSize=1 - docs: https://nango.dev/docs/integrations/all/rocketlane - docs_connect: https://nango.dev/docs/integrations/all/rocketlane/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Rocketlane API key - pattern: ^rl-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$ - example: rl-3d2d4d87-1801-48ca-8948-8d5ed6f05df7 - doc_section: '#step-1-generating-your-api-key' - -pipedrive: - display_name: Pipedrive - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://oauth.pipedrive.com/oauth/authorize - token_url: https://oauth.pipedrive.com/oauth/token - authorization_url_skip_empty: true - token_request_auth_method: basic - disable_pkce: true - token_response_metadata: - - api_domain - proxy: - base_url: ${connectionConfig.api_domain}/api - decompress: true - paginate: - type: offset - offset_name_in_request: start - response_path: data - limit_name_in_request: limit - docs: https://nango.dev/docs/api-integrations/pipedrive - setup_guide_url: https://nango.dev/docs/api-integrations/pipedrive/how-to-register-your-own-pipedrive-oauth-app - connection_config: - api_domain: - type: string - title: '' - description: '' - automated: true - -pylon: - display_name: Pylon - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.usepylon.com - headers: - authorization: Bearer ${apiKey} - accept: '*/*' - verification: - method: GET - endpoints: - - /me - docs: https://nango.dev/docs/api-integrations/pylon - docs_connect: https://nango.dev/docs/api-integrations/pylon/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Pylon API token - doc_section: '#step-1-generating-your-api-token' - -pipedream: - display_name: Pipedream (API Key) - categories: - - dev-tools - - productivity - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.pipedream.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/users/me - docs: https://nango.dev/docs/integrations/all/pipedream - docs_connect: https://nango.dev/docs/integrations/all/pipedream/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Pipedream account - pattern: '^[a-f0-9]{32}$' - example: 9a1b2c3d4e5f67890abcdeffedcba123 - doc_section: '#step-1-finding-your-api-key' - -pipedream-oauth2-cc: - display_name: Pipedream (Client Credentials) - categories: - - dev-tools - - productivity - auth_mode: OAUTH2_CC - token_url: https://api.pipedream.com/v1/oauth/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.pipedream.com - docs: https://nango.dev/docs/integrations/all/pipedream-oauth2-cc - docs_connect: https://nango.dev/docs/integrations/all/pipedream-oauth2-cc/connect - -pivotaltracker: - display_name: Pivotal Tracker - categories: - - productivity - auth_mode: API_KEY - proxy: - headers: - x-trackertoken: ${apiKey} - base_url: https://www.pivotaltracker.com/services/v5 - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /accounts - docs: https://nango.dev/docs/integrations/all/pivotaltracker - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Pivotal Tracker account - -planning-center-online: - display_name: Planning Center Online (OAuth) - categories: - - crm - - productivity - auth_mode: OAUTH2 - authorization_url: https://api.planningcenteronline.com/oauth/authorize - token_url: https://api.planningcenteronline.com/oauth/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.planningcenteronline.com - headers: - accept: application/json - user-agent: Nango (https://nango.dev) - retry: - after: - - 'retry-after' - paginate: - type: offset - offset_name_in_request: offset - limit_name_in_request: per_page - response_path: data - docs: https://nango.dev/docs/api-integrations/planning-center-online - setup_guide_url: https://nango.dev/docs/api-integrations/planning-center-online/how-to-register-your-own-planning-center-oauth-app - -planning-center-online-pat: - display_name: Planning Center Online (Personal Access Token) - categories: - - crm - - productivity - auth_mode: BASIC - proxy: - base_url: https://api.planningcenteronline.com - headers: - accept: application/json - retry: - after: - - 'retry-after' - paginate: - type: offset - offset_name_in_request: offset - limit_name_in_request: per_page - response_path: data - verification: - method: GET - headers: - accept: application/json - user-agent: Nango (https://nango.dev) - endpoints: - - /current/v2/me - docs: https://nango.dev/docs/api-integrations/planning-center-online-pat - docs_connect: https://nango.dev/docs/api-integrations/planning-center-online-pat/connect - credentials: - username: - type: string - title: Client ID - description: The Client ID for your Planning Center Personal Access Token. - pattern: '^[a-zA-Z0-9_-]{4,128}$' - example: 01h2jk3lm4np5qrst6uvw - doc_section: '#step-2-create-a-personal-access-token' - password: - type: string - title: Secret - description: The Secret for your Planning Center Personal Access Token. - pattern: '^[a-zA-Z0-9+/=_-]{8,512}$' - example: 7f8e9d0c1b2a3847564930210fedcba9876543210fedcba9876543210 - doc_section: '#step-2-create-a-personal-access-token' - -pushpay-chms-v1: - display_name: Pushpay ChMS (v1) - categories: - - crm - - productivity - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.ccbchurch.com - retry: - after: - - 'retry-after' - credentials_verification_script: pushpayChmsV1CredentialsVerification - docs: https://nango.dev/docs/api-integrations/pushpay-chms-v1 - docs_connect: https://nango.dev/docs/api-integrations/pushpay-chms-v1/connect - connection_config: - subdomain: - type: string - title: Church subdomain - description: The subdomain for your Pushpay ChMS site. - example: yourchurch - pattern: '^[a-zA-Z0-9-]+$' - order: 1 - prefix: https:// - suffix: .ccbchurch.com - doc_section: '#step-1-finding-your-church-subdomain' - credentials: - username: - type: string - title: API username - description: The API login created in Pushpay ChMS API Admin. - doc_section: '#step-2-create-an-api-user' - password: - type: string - title: API password - description: The password for your Pushpay ChMS API user. - secret: true - doc_section: '#step-2-create-an-api-user' - -plain: - display_name: Plain - categories: - - support - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://core-api.uk.plain.com/graphql - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1?query=%7B__schema%7Btypes%7Bname,kind,fields%7Bname%7D%7D%7D%7D - docs: https://nango.dev/docs/integrations/all/plain - docs_connect: https://nango.dev/docs/integrations/all/plain/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Plain account - doc_section: '#step-1-generating-your-api-key' - -pleo: - display_name: Pleo - categories: - - payment - - invoicing - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.pleo.io/oauth/authorize - token_url: https://${connectionConfig.subdomain}.pleo.io/oauth/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.apiSubdomain}.pleo.io - docs: https://nango.dev/docs/api-integrations/pleo - docs_connect: https://nango.dev/docs/api-integrations/pleo/connect - setup_guide_url: https://nango.dev/docs/api-integrations/pleo/how-to-register-your-own-pleo-api-oauth-app - connection_config: - subdomain: - type: string - title: OAuth Subdomain - description: The OAuth subdomain for your Pleo environment. - enum: - - auth - - auth.staging - apiSubdomain: - type: string - title: API Subdomain - description: The API subdomain for your Pleo environment. - enum: - - external - - external.staging - -podium: - display_name: Podium - categories: - - communication - - marketing - auth_mode: OAUTH2 - authorization_url: https://api.podium.com/oauth/authorize - token_url: https://api.podium.com/oauth/token - scope_separator: ' ' - body_format: json - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - headers: - podium-version: ${connectionConfig.apiVersion} - content-type: application/json - base_url: https://api.podium.com - retry: - after: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/integrations/all/podium - connection_config: - apiVersion: - type: string - title: API Version - description: The API version of your Podium account - -podscribe: - display_name: Podscribe - categories: - - marketing - - analytics - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://backend.podscribe.ai - docs: https://nango.dev/docs/api-integrations/podscribe - docs_connect: https://nango.dev/docs/api-integrations/podscribe/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Podscribe account - pattern: '^[a-zA-Z0-9]+\.[a-zA-Z0-9]+\.[a-zA-Z0-9_-]+$' - example: xkPqbW**********.*********.*******T8mz - doc_section: '#step-1-generating-your-api-key' - -posthog: - display_name: PostHog - categories: - - dev-tools - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://${connectionConfig.subdomain}.posthog.com - docs: https://nango.dev/docs/api-integrations/posthog - docs_connect: https://nango.dev/docs/api-integrations/posthog/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of your PostHog cloud account. - enum: - - us - - us.i - - eu - - eu.i - order: 1 - doc_section: '#step-1-finding-your-subdomain' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your PostHog account - pattern: '^phx_[A-Za-z0-9]+$' - example: phx_1PPf***************************k3D - doc_section: '#step-2-finding-your-api-key' - -posthog-oauth: - display_name: PostHog (OAuth) - categories: - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://oauth.posthog.com/oauth/authorize/ - token_url: https://oauth.posthog.com/oauth/token/ - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.posthog.com - docs: https://nango.dev/docs/api-integrations/posthog-oauth - setup_guide_url: https://nango.dev/docs/api-integrations/posthog-oauth/how-to-register-your-own-posthog-oauth-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/posthog-oauth/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of your PostHog cloud account. - enum: - - us - - us.i - - eu - - eu.i - order: 1 - doc_section: '#step-1-finding-your-subdomain' - -prive: - display_name: Prive - categories: - - e-commerce - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - content-type: application/json - base_url: https://subs.api.tryprive.com - docs: https://nango.dev/docs/integrations/all/prive - docs_connect: https://nango.dev/docs/integrations/all/prive/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Prive account - doc_section: '#step-1-requesting-your-prive-api-key' - -prospeo: - display_name: Prospeo - categories: - - crm - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.prospeo.io - headers: - x-key: ${apiKey} - verification: - method: POST - headers: - content-type: application/json - endpoints: - - /account-information - docs: https://nango.dev/docs/api-integrations/prospeo - docs_connect: https://nango.dev/docs/api-integrations/prospeo/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Prospeo API Key - example: pk_640edfcc************************304fca5e - pattern: '^(pk_[a-f0-9]{64}|[a-f0-9]{32})$' - doc_section: '#step-1-finding-your-api-key' - -prtg-classic: - display_name: PRTG Classic - categories: - - support - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.host} - query: - apitoken: ${apiKey} - verification: - method: GET - endpoints: - - /api/table.json?content=sensors&count=1 - docs: https://nango.dev/docs/api-integrations/prtg-classic - docs_connect: https://nango.dev/docs/api-integrations/prtg-classic/connect - connection_config: - host: - type: string - title: Instance Host - description: The host of your PRTG instance - pattern: '^[A-Za-z0-9.-]+(:\d+)?$' - example: monitor.example.com - prefix: https:// - doc_section: '#step-1-finding-your-instance-host' - order: 1 - credentials: - apiKey: - type: string - title: API Key - description: The API key for your PRTG account - pattern: '^[A-Z2-7]+=*$' - example: RUTOWB5KVJCMEOWHL5MLUWMA324UGNDLPS6JKLTEDT====== - doc_section: '#step-2-finding-your-api-key' - -private-api-bearer: - display_name: Private API (Bearer Auth) - categories: - - other - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://my-private-api - docs: https://nango.dev/docs/integrations/all/private-api-bearer - docs_connect: https://nango.dev/docs/integrations/all/private-api-bearer/connect - credentials: - apiKey: - type: string - title: API Key - description: Your API Key - -private-api-basic: - display_name: Private API (Basic Auth) - categories: - - other - auth_mode: BASIC - proxy: - base_url: https://my-private-api - docs: https://nango.dev/docs/integrations/all/private-api-basic - docs_connect: https://nango.dev/docs/integrations/all/private-api-basic/connect - credentials: - username: - type: string - title: Username - description: Your username - password: - type: string - title: Password - description: Your password -private-api-generic: - display_name: Private API (Generic) - categories: - - other - auth_mode: API_KEY - proxy: - base_url: https://api.nango.dev/ - integration_config: - keyPlacement: - type: string - title: Key placement - description: Where the API key is sent on proxied requests. - enum: - - header - - query - default_value: header - warnings: - query: Sending the key as a query param can expose it in upstream, proxy, and CDN logs. Prefer a header when the API supports it. - order: 1 - keyName: - type: string - title: Key name - description: Header name or query-param name (e.g. Authorization, x-api-key, api_key). - example: Authorization - order: 2 - valueTemplate: - type: string - title: Value template - description: How the key is presented to the upstream API. Use ${apiKey} as the placeholder for the stored key. - example: Api-Key ${apiKey} - default_value: ${apiKey} - pattern: '\$\{apiKey\}' - order: 3 - baseUrl: - type: string - title: Base URL - description: Base URL of the upstream API the proxy will call. - format: uri - pattern: '^https?://' - example: https://api.example.com - order: 4 - keyLabel: - type: string - title: API key label (shown in Connect UI) - description: The label end users see for the API key field in the Connect UI. - default_value: API Key - optional: true - order: 5 - docs: https://nango.dev/docs/integrations/all/private-api-generic - docs_connect: https://nango.dev/docs/integrations/all/private-api-generic/connect - credentials: - apiKey: - type: string - title: API Key - description: Your API Key -precisefp: - display_name: PreciseFP - categories: - - crm - - productivity - auth_mode: OAUTH2 - authorization_url: https://app.precisefp.com/oauth/authorize - token_url: https://app.precisefp.com/oauth/token - authorization_params: - response_type: code - scope: '*' - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - authorization_method: header - proxy: - base_url: https://app.precisefp.com - docs: https://nango.dev/docs/integrations/all/precisefp - -practicefusion: - display_name: PracticeFusion - categories: - - other - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.baseUrl}/authorize - token_url: https://${connectionConfig.baseUrl}/token - authorization_url_skip_empty: true - authorization_params: - response_type: code - aud: https://${connectionConfig.baseUrl} - launch: ${connectionConfig.launch} - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - token_response_metadata: - - patient - - need_patient_banner - - smart_style_url - proxy: - base_url: https://${connectionConfig.baseUrl} - docs: https://nango.dev/docs/api-integrations/practicefusion - setup_guide_url: https://nango.dev/docs/api-integrations/practicefusion/how-to-register-your-own-practicefusion-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/practicefusion/connect - connection_config: - baseUrl: - type: string - title: Base URL - description: The base URL for your Practice authorization server - pattern: '^[a-zA-Z0-9.-]+\.(practice|patient)fusion\.com/.*$' - prefix: https:// - example: api.patientfusion.com/fhir/r4/v1/118b460b-8390-4754-8e4a-1dd5ee20f599/ - doc_section: '#step-1-find-your-base-url' - order: 1 - launch: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -productboard: - display_name: Productboard - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://app.productboard.com/oauth2/authorize - token_url: https://app.productboard.com/oauth2/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - headers: - x-version: '1' - base_url: https://api.productboard.com - docs: https://nango.dev/docs/integrations/all/productboard - -printful: - display_name: Printful - categories: - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://www.printful.com/oauth/authorize - token_url: https://www.printful.com/oauth/token - disable_pkce: true - authorization_url_replacements: - redirect_uri: redirect_url - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.printful.com - docs: https://nango.dev/docs/api-integrations/printful - setup_guide_url: https://nango.dev/docs/api-integrations/printful/how-to-register-your-own-printful-oauth-app - -procore: - display_name: Procore - categories: - - erp - auth_mode: OAUTH2 - authorization_url: https://login.procore.com/oauth/authorize - token_url: https://login.procore.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - post_connection_script: procorePostConnection - proxy: - headers: - procore-company-id: ${connectionConfig.companyId} - base_url: https://api.procore.com - retry: - at: - - 'x-rate-limit-reset' - docs: https://nango.dev/docs/api-integrations/procore - setup_guide_url: https://nango.dev/docs/api-integrations/procore/how-to-register-your-own-procore-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/procore/connect - connection_config: - companyId: - type: string - title: Company ID - description: Your Procore company ID - optional: true - example: '598134325779301' - pattern: '^[0-9]+$' - -provenexpert: - display_name: ProvenExpert - categories: - - marketing - auth_mode: BASIC - proxy: - base_url: https://www.provenexpert.com/api/ - verification: - method: POST - endpoints: - - v1/rating/summary/get - docs: https://nango.dev/docs/api-integrations/provenexpert - docs_connect: https://nango.dev/docs/api-integrations/provenexpert/connect - credentials: - username: - type: string - title: API ID - description: Your ProvenExpert API ID. - pattern: '^[A-Za-z0-9]{32}$' - example: '3yxp1qwZl5UAmyHZ5qRC2Sbpk5KAlEDZ' - doc_section: '#step-1-getting-your-credentials' - password: - type: string - title: API Key - description: Your ProvenExpert API Key. - secret: true - pattern: '^[A-Za-z0-9]{43}$' - example: 'M3A5NwykMKW1BRy6NRrxAwW2MzI3MxOmNRXzNzByMxW' - doc_section: '#step-1-getting-your-credentials' - -pverify: - display_name: pVerify - categories: - - other - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.apiHost}/Token - token_params: - Client_Id: ${credentials.clientId} - Client_Secret: ${credentials.clientSecret} - grant_type: client_credentials - token_headers: - content-type: application/x-www-form-urlencoded - Client-API-Id: ${credentials.clientId} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://${connectionConfig.apiHost} - headers: - client-api-id: ${credentials.clientId} - docs: https://nango.dev/docs/api-integrations/pverify - docs_connect: https://nango.dev/docs/api-integrations/pverify/connect - credentials: - clientId: - type: string - title: Client ID - description: Your pVerify Client ID. - example: f1c2d3a4-5b67-4c89-ae01-123456789abc - format: uuid - doc_section: '#step-1-getting-your-credentials' - clientSecret: - type: string - title: Client Secret - description: Your pVerify Client Secret. - secret: true - example: aB3mNpQr7sXwYz2t*************** - pattern: '^[A-Za-z0-9]+$' - doc_section: '#step-1-getting-your-credentials' - connection_config: - apiHost: - type: string - title: API Host - description: Your pVerify API hostname. - example: api.pverify.com - pattern: '^(api|testapi)\.pverify\.com$' - doc_section: '#step-1-getting-your-credentials' - -qualtrics: - display_name: Qualtrics - categories: - - surveys - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.qualtrics.com/oauth2/auth - token_url: https://${connectionConfig.subdomain}.qualtrics.com/oauth2/token - proxy: - base_url: https://${connectionConfig.subdomain}.qualtrics.com - docs: https://nango.dev/docs/integrations/all/qualtrics - connection_config: - subdomain: - type: string - title: Qualtrics Domain - description: The subdomain of your Qualtrics account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .qualtrics.com - prefix: https:// - -quentn: - display_name: Quentn - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.quentn.com/public/api - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v1/terms - docs: https://nango.dev/docs/api-integrations/quentn - docs_connect: https://nango.dev/docs/api-integrations/quentn/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Quentn API key. - secret: true - example: a1bcDeFgHi-jkLmNoPqRsTuVwXyZ0123456789AbCdE - pattern: '^[A-Za-z0-9_-]{43}$' - doc_section: '#step-1-getting-your-api-key' - connection_config: - subdomain: - type: string - title: Subdomain - description: Your Quentn account subdomain. - format: hostname - example: xk7mdf.eu-5 - suffix: .quentn.com/public/api - prefix: https:// - order: 1 - doc_section: '#step-2-finding-your-subdomain' - -quickbase: - display_name: Quickbase - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.quickbase.com/v1/ - headers: - qb-realm-hostname: ${connectionConfig.domain} - user-agent: ${connectionConfig.appDetails} || App (support@nango.dev) - authorization: QB-USER-TOKEN ${apiKey} - query: - apiKey: ${apiKey} - docs: https://nango.dev/docs/integrations/all/quickbase - docs_connect: https://nango.dev/docs/integrations/all/quickbase/connect - connection_config: - domain: - type: string - title: Realm Hostname - description: Your Quickbase Realm Hostname - example: demo.quickbase.com - format: hostname - doc_section: '#step-1-finding-your-realm-hostname' - appDetails: - type: string - title: App Details - description: The details of your app - automated: true - credentials: - apiKey: - type: string - title: User Token - description: Your User Token - pattern: '^[a-z0-9_-]+$' - example: bb_aa_xxxxxx_xxxxxxxxxxxxxxxxx - doc_section: '#step-2-finding-your-user-token' - -qualia: - display_name: Qualia - categories: - - legal - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.qualia.io/api - docs: https://nango.dev/docs/api-integrations/qualia - docs_connect: https://nango.dev/docs/api-integrations/qualia/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of the Qualia platform you want to connect to. - pattern: '^[a-z0-9-]+$' - example: connect - order: 1 - doc_section: '#step-1-finding-your-subdomain' - credentials: - username: - type: string - title: Username - description: Your Qualia organization username. - doc_section: '#step-2-finding-your-api-key' - password: - type: string - title: Password - description: Your Qualia API password. - secret: true - doc_section: '#step-2-finding-your-api-key' - -quickbooks: - display_name: Quickbooks - categories: - - accounting - - popular - auth_mode: OAUTH2 - authorization_url: https://appcenter.intuit.com/connect/oauth2 - token_url: https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer - redirect_uri_metadata: - - realmId - proxy: - connection_config: - realmId: ${connectionConfig.realmId} - base_url: https://quickbooks.api.intuit.com - docs: https://nango.dev/docs/api-integrations/quickbooks - setup_guide_url: https://nango.dev/docs/api-integrations/quickbooks/how-to-register-your-own-quickbooks-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/quickbooks/connect - connection_config: - realmId: - type: string - title: Quickbooks Realm ID - optional: true - description: The realmId of your quickbooks company - pattern: '^\d{10,19}$' - example: '9341453474484455' - doc_section: '#step-1-finding-your-realm-id' - -quickbooks-sandbox: - alias: quickbooks - display_name: Quickbooks (Sandbox) - categories: - - accounting - proxy: - connection_config: - realmId: ${connectionConfig.realmId} - base_url: https://sandbox-quickbooks.api.intuit.com - docs: https://nango.dev/docs/api-integrations/quickbooks-sandbox - setup_guide_url: https://nango.dev/docs/api-integrations/quickbooks/how-to-register-your-own-quickbooks-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/quickbooks-sandbox/connect - connection_config: - realmId: - type: string - title: Quickbooks Realm ID - optional: true - description: The realmId of your quickbooks sandbox company - pattern: '^\d{10,19}$' - example: '9341453474484455' - doc_section: '#step-1-finding-your-realm-id' - -quipteams: - display_name: Quipteams - categories: - - other - auth_mode: API_KEY - proxy: - base_url: https://api.quipteams.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /api/v1/quotes - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/api-integrations/quipteams - docs_connect: https://nango.dev/docs/api-integrations/quipteams/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Quipteams API key. - doc_section: '#step-1-finding-your-api-key' - -ragieai: - display_name: Ragie AI - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.ragie.ai - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /documents - docs: https://nango.dev/docs/integrations/all/ragieai - credentials: - apiKey: - type: string - title: API Key - description: The API key for your ragie.ai account - example: tnt_IZ56tqGVgX9_k8CKnxQ9MvQgzDXcDGgtcjXABkwusxSOR8QzwxxeA1B - pattern: '^tnt_[a-zA-Z0-9_]+$' - -ramp: - display_name: Ramp - categories: - - banking - auth_mode: OAUTH2 - authorization_url: https://app.ramp.com/v1/authorize - token_url: https://api.ramp.com/developer/v1/token - authorization_method: header - proxy: - base_url: https://api.ramp.com - docs: https://nango.dev/docs/integrations/all/ramp - -ramp-sandbox: - display_name: Ramp (Sandbox) - categories: - - banking - auth_mode: OAUTH2 - authorization_url: https://demo.ramp.com/v1/authorize - token_url: https://demo-api.ramp.com/developer/v1/token - authorization_method: header - proxy: - base_url: https://demo-api.ramp.com - docs: https://nango.dev/docs/integrations/all/ramp-sandbox - -rapidapi: - display_name: RapidAPI - categories: - - dev-tools - auth_mode: API_KEY - proxy: - headers: - x-rapidapi-key: ${apiKey} - x-rapidapi-host: ${connectionConfig.subdomain}.p.rapidapi.com - base_url: https://${connectionConfig.subdomain}.p.rapidapi.com - docs: https://nango.dev/docs/integrations/all/rapidapi - credentials: - apiKey: - type: string - title: API Key - description: The API key for your RapidAPI account - example: b7c156af2dmgh5c635305f3744bap168553jsp75193c8367ef - pattern: '^[a-zA-Z0-9]+$' - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of the Rapid API. - pattern: '^[a-z0-9_-]+$' - example: api-football-v1 - suffix: .p.rapidapi.com - prefix: https:// - -razorpay: - display_name: Razorpay - categories: - - payment - auth_mode: BASIC - proxy: - base_url: https://api.razorpay.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/orders - docs: https://nango.dev/docs/integrations/all/razorpay - docs_connect: https://nango.dev/docs/integrations/all/razorpay/connect - credentials: - username: - type: string - title: Key ID - description: Your Key ID - pattern: '^rzp_(test|live)_[A-Za-z0-9]+$' - example: 'rzp_test_*************' - doc_section: '#step-1-finding-your-key-id-and-secret' - password: - type: string - title: Key Secret - description: Your Key Secret - secret: true - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-1-finding-your-key-id-and-secret' - -read-ai: - display_name: Read.ai - categories: - - productivity - - video - auth_mode: OAUTH2 - authorization_url: https://authn.read.ai/oauth2/auth - token_url: https://authn.read.ai/oauth2/token - token_request_auth_method: basic - authorization_method: header - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.read.ai - docs: https://nango.dev/docs/api-integrations/read-ai - setup_guide_url: https://nango.dev/docs/api-integrations/read-ai/how-to-register-your-own-read-ai-oauth-app - -readwise: - display_name: Readwise - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://readwise.io/api/v2 - headers: - authorization: Token ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /auth - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/readwise - docs_connect: https://nango.dev/docs/integrations/all/readwise/connect - credentials: - apiKey: - type: string - title: Access Token - description: The Access Token for your Readwise account - example: zCDL1fUOpu4Cg3WMlMl1S7ecKsaBQlfCzw7sbVfc0wBqUJMI56 - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-1-generating-your-access-token' - -readwise-reader: - display_name: Readwise Reader - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://readwise.io/api/v3 - headers: - authorization: Token ${apiKey} - verification: - method: GET - headers: - content-type: application/json - base_url_override: https://readwise.io - endpoints: - - /api/v2/auth - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/readwise-reader - docs_connect: https://nango.dev/docs/integrations/all/readwise-reader/connect - credentials: - apiKey: - type: string - title: Access Token - description: The Access Token for your Readwise account - example: zCDL1fUOpu4Cg3WMlMl1S7ecKsaBQlfCzw7sbVfc0wBqUJMI56 - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-1-generating-your-access-token' - -recharge: - display_name: Recharge - categories: - - e-commerce - auth_mode: API_KEY - proxy: - headers: - x-recharge-access-token: ${apiKey} - base_url: https://api.rechargeapps.com - docs: https://nango.dev/docs/integrations/all/recharge - docs_connect: https://nango.dev/docs/integrations/all/recharge/connect - credentials: - apiKey: - type: string - title: API Token - description: The API Token for your Recharge account - example: sk_test_1p1_************************************************** - pattern: '^[a-zA-Z0-9_]+$' - doc_section: '#step-1-generating-your-api-token' - -recall-ai: - display_name: Recall.ai - categories: - - dev-tools - - productivity - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.region}.recall.ai - headers: - authorization: ${apiKey} - verification: - method: GET - endpoints: - - /api/v2/calendar-events - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/recall-ai - docs_connect: https://nango.dev/docs/api-integrations/recall-ai/connect - connection_config: - region: - type: string - title: Region - description: The region where your Recall.ai account is hosted. - enum: - - us-east-1 - - us-west-2 - - eu-central-1 - - ap-northeast-1 - order: 1 - doc_section: '#step-1-determine-your-region' - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Recall.ai account - example: 2d7843e2351dd4afa67eecfb5c723142fcb401b1 - pattern: '^[a-f0-9]{40}$' - doc_section: '#step-2-generating-your-api-key' - -recruitcrm: - display_name: Recruitcrm - categories: - - hr - - ats - auth_mode: API_KEY - proxy: - base_url: https://api.recruitcrm.io - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/candidates/search - docs: https://nango.dev/docs/integrations/all/recruitcrm - docs_connect: https://nango.dev/docs/integrations/all/recruitcrm/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Recruitcrm account - example: 9SKXL************************************** - doc_section: '#step-1-generating-your-api-key' - -recruitee: - display_name: Recruitee - categories: - - ats - auth_mode: API_KEY - proxy: - base_url: https://api.recruitee.com/c/${connectionConfig.companyId} - headers: - authorization: Bearer ${apiKey} - connection_config: - companyName: ${connectionConfig.companyName} - verification: - method: GET - endpoints: - - /departments - docs: https://nango.dev/docs/integrations/all/recruitee - docs_connect: https://nango.dev/docs/integrations/all/recruitee/connect - connection_config: - companyId: - type: string - title: Company ID - description: The Company ID for your Recruitee account - example: '126786' - pattern: '^[0-9]+$' - order: 1 - doc_section: '#step-1-finding-your-company-id-and-company-name' - companyName: - type: string - title: Company Name - description: The Company name for your Recruitee account - example: acme - optional: true - doc_section: '#step-1-finding-your-company-id-and-company-name' - credentials: - apiKey: - type: string - title: Personal API Token - description: The Personal API Token for your Recruitee account - example: 'OTlHOGlWNUFJRkErekoxd1lXMGd6dz09' - pattern: '^[A-Za-z0-9+/]+={0,2}$' - doc_section: '#step-2-generating-your-personal-api-token' - -recruiterflow: - display_name: Recruiterflow - categories: - - hr - - ats - auth_mode: API_KEY - proxy: - base_url: https://api.recruiterflow.com - headers: - rf-api-key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/external/user/list - docs: https://nango.dev/docs/integrations/all/recruiterflow - docs_connect: https://nango.dev/docs/integrations/all/recruiterflow/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Recruiterflow account - doc_section: '#step-1-generating-your-api-key' - example: 7b0c0d**************************** - pattern: '^[a-zA-Z0-9_]+$' - -render-mcp: - display_name: Render (MCP) - categories: - - dev-tools - - mcp - auth_mode: API_KEY - proxy: - base_url: https://mcp.render.com - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/api-integrations/render-mcp - docs_connect: https://nango.dev/docs/api-integrations/render-mcp/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Render API key from Account Settings. - doc_section: '#step-1-create-a-render-api-key' - example: rnd_**************************** - pattern: '^rnd_[A-Za-z0-9]+$' - -raindrop-mcp: - display_name: Raindrop (MCP) - categories: - - dev-tools - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://auth.raindrop.ai/oauth/2.1/authorize - token_url: https://auth.raindrop.ai/oauth/2.1/token - registration_url: https://auth.raindrop.ai/oauth/2.1/register - authorization_params: - response_type: code - resource: https://mcp.raindrop.ai/mcp - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://mcp.raindrop.ai - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/raindrop-mcp - -reddit: - display_name: Reddit - categories: - - social - auth_mode: OAUTH2 - authorization_url: https://www.reddit.com/api/v1/authorize - token_url: https://www.reddit.com/api/v1/access_token - authorization_method: header - authorization_params: - duration: permanent - proxy: - base_url: https://oauth.reddit.com - docs: https://nango.dev/docs/integrations/all/reddit - -redtail-crm-sandbox: - display_name: Redtail CRM (Sandbox) - categories: - - crm - auth_mode: TWO_STEP - token_url: https://review.crm.redtailtechnology.com/api/public/v1/authentication - token_request_method: GET - token_headers: - authorization: Basic ${base64(${credentials.apiKey}:${credentials.username}:${credentials.password})} - token_response: - token: authenticated_user.user_key - proxy: - headers: - authorization: Userkeyauth ${base64(${credentials.apiKey}:${accessToken})} - base_url: https://review.crm.redtailtechnology.com/api/public - docs: https://nango.dev/docs/integrations/all/redtail-crm-sandbox - docs_connect: https://nango.dev/docs/integrations/all/redtail-crm-sandbox/connect - credentials: - username: - type: string - title: Username - description: The username for your Redtail CRM account - doc_section: '#step-2-finding-your-credentials' - password: - type: string - title: Password - description: The password for your Redtail CRM account - secret: true - doc_section: '#step-2-finding-your-credentials' - apiKey: - type: string - title: API Key - description: The API Key for your Redtail CRM account - example: f1c2d3a4-5b67-4c89-ae01-123456789abc - format: uuid - secret: true - doc_section: '#step-1-finding-your-api-token' -refiner: - display_name: Refiner - categories: - - surveys - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.refiner.io/v1 - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /account - docs: https://nango.dev/docs/integrations/all/refiner - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Refiner account - -replicate: - display_name: Replicate - categories: - - dev-tools - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.replicate.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/account - docs: https://nango.dev/docs/integrations/all/replicate - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Replicate account - -reply-io: - display_name: Reply.io - categories: - - marketing - - communication - auth_mode: API_KEY - proxy: - base_url: https://api.reply.io - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v3/whoami - docs: https://nango.dev/docs/api-integrations/reply-io - docs_connect: https://nango.dev/docs/api-integrations/reply-io/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Reply.io account. - example: AKp2Bbuy**************** - pattern: '^[A-Za-z0-9_-]+$' - doc_section: '#step-1-finding-your-api-key' - -researchdesk: - display_name: ResearchDesk - categories: - - other - auth_mode: TWO_STEP - body_format: json - token_url: https://${connectionConfig.subdomain}.researchdesk.com/tokens - token_params: - email: ${credentials.email} - password: ${credentials.password} - token_headers: - content-type: application/json - token_response: - token: token - token_expiration: expires - token_expiration_strategy: expireAt - proxy: - base_url: https://${connectionConfig.subdomain}.researchdesk.com - headers: - authorization: Bearer ${accessToken} - docs: https://nango.dev/docs/api-integrations/researchdesk - docs_connect: https://nango.dev/docs/api-integrations/researchdesk/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of the environment to which you want to connect to. - enum: - - demand - - stage-demand - order: 1 - doc_section: '#step-1-choosing-your-subdomain' - credentials: - email: - type: string - title: Email - description: Your ResearchDesk account email - format: email - doc_section: '#step-2-finding-your-credentials' - password: - type: string - title: Password - description: Your ResearchDesk account password - secret: true - doc_section: '#step-2-finding-your-credentials' - -resend: - display_name: Resend - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://api.resend.com - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'retry-after' - verification: - method: GET - endpoints: - - /domains?limit=1 - docs: https://nango.dev/docs/api-integrations/resend - docs_connect: https://nango.dev/docs/api-integrations/resend/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Resend API key. - pattern: '^re_[A-Za-z0-9_]+$' - example: 're_HW***************************65L' - doc_section: '#step-1-getting-your-api-key' - -retell-ai: - display_name: Retell AI - categories: - - dev-tools - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.retellai.com - headers: - authorization: Bearer ${apiKey} - content-type: application/json - docs: https://nango.dev/docs/integrations/all/retell-ai - docs_connect: https://nango.dev/docs/integrations/all/retell-ai/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for Retell AI - example: key-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - doc_section: '#step-1-finding-your-retell-ai-api-key' - -revivn: - display_name: Revivn - categories: - - other - auth_mode: OAUTH2_CC - token_url: https://api.revivn.dev/oauth/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.revivn.dev - docs: https://nango.dev/docs/api-integrations/revivn - docs_connect: https://nango.dev/docs/api-integrations/revivn/connect - credentials: - client_id: - type: string - title: Client ID - description: Your Revivn OAuth2 client ID. - doc_section: '#step-1-get-your-oauth2-credentials' - client_secret: - type: string - title: Client Secret - description: Your Revivn OAuth2 client secret. - secret: true - doc_section: '#step-1-get-your-oauth2-credentials' - -ring-central: - display_name: RingCentral - categories: - - support - auth_mode: OAUTH2 - authorization_url: https://platform.ringcentral.com/restapi/oauth/authorize - token_url: https://platform.ringcentral.com/restapi/oauth/token - authorization_method: header - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://platform.ringcentral.com - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/ring-central - -ring-central-sandbox: - display_name: RingCentral (Sandbox) - categories: - - communication - auth_mode: OAUTH2 - authorization_url: https://platform.devtest.ringcentral.com/restapi/oauth/authorize - token_url: https://platform.devtest.ringcentral.com/restapi/oauth/token - authorization_method: header - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://platform.devtest.ringcentral.com - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/ring-central-sandbox - -ringover: - display_name: Ringover - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://public-api.ringover.com - headers: - authorization: ${apiKey} - docs: https://nango.dev/docs/api-integrations/ringover - docs_connect: https://nango.dev/docs/api-integrations/ringover/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Ringover API key. - example: 'a3f9e2***************************d8e9f0' - pattern: '^[a-f0-9]{40}$' - doc_section: '#step-1-generating-your-api-key' - -rippling: - display_name: Rippling - categories: - - hr - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - user-agent: Node.js/20.12.2 (linux; x64) - base_url: https://rest.ripplingapis.com - docs: https://nango.dev/docs/integrations/all/rippling - docs_connect: https://nango.dev/docs/integrations/all/rippling/connect - credentials: - apiKey: - type: string - title: API Token - description: The API Token for your Rippling account - doc_section: '#step-1-generating-your-api-token' - -rippling-shop-app: - display_name: Rippling Shop App - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://app.rippling.com/apps/PLATFORM/${connectionConfig.appName}/authorize - token_url: https://api.rippling.com/api/o/token/ - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.rippling.com - post_connection_script: ripplingShopAppPostConnection - docs: https://nango.dev/docs/integrations/all/rippling-shop-app - connection_config: - appName: - type: string - title: '' - description: '' - automated: true - -roam-scim: - display_name: Roam (SCIM API) - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.ro.am/scim - headers: - authorization: Bearer ${apiKey} - accept: application/json - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/Users - docs: https://nango.dev/docs/integrations/all/roam-scim - docs_connect: https://nango.dev/docs/integrations/all/roam-scim/connect - credentials: - apiKey: - type: string - title: SCIM API Token - description: The SCIM API token generated from your Roam organization settings. - example: rmk-uu9zt58h-EYHyLJ3ay4Mc-wuWQTOk-Y2yY-gZlW7Ys8AdVXBRZks_SGrCyZ09_IDvX9ikahdxushGYKcT77Fjw - pattern: '^rmk-[A-Za-z0-9_-]{86}$' - doc_section: '#step-1-generating-your-scim-api-token' - -robinhood-mcp: - display_name: Robinhood (MCP) - categories: - - payment - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://robinhood.com/oauth - token_url: https://api.robinhood.com/oauth2/token/ - registration_url: https://agent.robinhood.com/oauth/trading/register - authorization_params: - response_type: code - resource: https://agent.robinhood.com/mcp/trading - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://agent.robinhood.com - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/robinhood-mcp - -rock-gym-pro: - display_name: Rock Gym Pro - categories: - - crm - auth_mode: BASIC - proxy: - base_url: https://api.rockgympro.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/ping - paginate: - type: offset - offset_name_in_request: page - limit_name_in_request: limit - docs: https://nango.dev/docs/integrations/all/rock-gym-pro - credentials: - username: - type: string - title: API Username - description: Your Rock Gym Pro API username - password: - type: string - title: API Password - description: Your Rock Gym Pro API password - -roller: - display_name: Roller - categories: - - ticketing - auth_mode: OAUTH2_CC - token_url: https://api.roller.app/token - body_format: json - credentials: - client_id: - type: string - title: Client ID - description: Roller client ID - client_secret: - type: string - title: Client Secret - description: Roller client secret - proxy: - base_url: https://api.roller.app - - docs: https://nango.dev/docs/integrations/all/roller - -rocketreach: - display_name: RocketReach - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.rocketreach.co - headers: - api-key: ${apiKey} - retry: - at: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/rocketreach - docs_connect: https://nango.dev/docs/api-integrations/rocketreach/connect - credentials: - apiKey: - type: string - title: API Key - description: Your RocketReach API key. - example: 1e4dfd5***************************e3ca3a - pattern: '^[a-z0-9]+$' - doc_section: '#step-1-get-your-api-key' - -rootly: - display_name: Rootly - categories: - - dev-tools - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.rootly.com - verification: - method: GET - headers: - content-type: application/vnd.api+json - endpoints: - - /v1/users/me - docs: https://nango.dev/docs/api-integrations/rootly - docs_connect: https://nango.dev/docs/api-integrations/rootly/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Rootly account - example: rootly_db86a6β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’ - pattern: '^rootly_[a-f0-9]{64}$' - doc_section: '#step-1-generating-your-api-key' - -reapit: - display_name: Reapit Connect - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://connect.reapit.cloud/authorize - token_url: https://connect.reapit.cloud/token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://platform.reapit.cloud - headers: - api-version: ${connectionConfig.version} || 2020-01-31 - docs: https://nango.dev/docs/api-integrations/reapit - setup_guide_url: https://nango.dev/docs/api-integrations/reapit/how-to-register-your-own-reapit-oauth-app - connection_config: - version: - type: string - title: '' - description: '' - automated: true -rydoo: - display_name: Rydoo - categories: - - accounting - auth_mode: OAUTH2_CC - token_url: https://accounts.rydoo.com/connect/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.rydoo.com - docs: https://nango.dev/docs/api-integrations/rydoo - docs_connect: https://nango.dev/docs/api-integrations/rydoo/connect - credentials: - client_id: - type: string - title: Client ID - description: Your Rydoo Client ID. - client_secret: - type: string - title: Client Secret - description: Your Rydoo Client Secret. - secret: true - -segment: - display_name: Segment - categories: - - analytics - - marketing - auth_mode: OAUTH2 - authorization_url: https://id.segmentapis.com/oauth2/auth - token_url: https://id.segmentapis.com/oauth2/token - token_request_auth_method: basic - proxy: - base_url: https://api.segment.io - docs: https://nango.dev/docs/integrations/all/segment - -sage: - display_name: Sage - categories: - - accounting - - erp - auth_mode: OAUTH2 - authorization_url: https://www.sageone.com/oauth2/auth/central - token_url: https://oauth.accounting.sage.com/token - authorization_params: - filter: apiv3.1 - proxy: - base_url: https://api.accounting.sage.com - docs: https://nango.dev/docs/integrations/all/sage - -sage-200: - display_name: Sage 200 - categories: - - accounting - - erp - auth_mode: OAUTH2 - authorization_url: https://id.sage.com/authorize - token_url: https://id.sage.com/oauth/token - authorization_params: - audience: s200ukipd/sage200 - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - default_scopes: - - offline_access - scope_separator: ' ' - post_connection_script: sage200PostConnection - proxy: - base_url: https://api.columbus.sage.com/uk/${connectionConfig.edition} - headers: - x-company: ${connectionConfig.company_id} - x-site: ${connectionConfig.site_id} - docs: https://nango.dev/docs/api-integrations/sage-200 - setup_guide_url: https://nango.dev/docs/api-integrations/sage-200/how-to-register-your-own-sage-200-oauth-app - connection_config: - edition: - type: string - title: '' - description: '' - automated: true - company_id: - type: string - title: '' - description: '' - automated: true - site_id: - type: string - title: '' - description: '' - automated: true - -sage-hr: - display_name: Sage HR - categories: - - hr - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.sage.hr - headers: - x-auth-token: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/employees - docs: https://nango.dev/docs/integrations/all/sage-hr - docs_connect: https://nango.dev/docs/integrations/all/sage-hr/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Sage HR account - doc_section: '#step-1-enabling-api-access' - example: apikey**************************** - pattern: '^[a-zA-Z0-9.]+$' - connection_config: - subdomain: - type: string - title: Sage HR Subdomain - description: The subdomain of your Sage HR account - pattern: '^[a-zA-Z0-9-]+$' - example: subdomain - suffix: .sage.hr - prefix: https:// - -sage-intacct-oauth: - display_name: Sage Intacct (OAuth) - categories: - - accounting - - erp - - popular - auth_mode: OAUTH2 - authorization_url: https://api.intacct.com/ia/api/v1/oauth2/authorize - token_url: https://api.intacct.com/ia/api/v1/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.intacct.com/ia/api - docs: https://nango.dev/docs/integrations/all/sage-intacct-oauth - -sage-intacct-cc: - display_name: Sage Intacct (Client Credentials) - categories: - - accounting - - erp - auth_mode: TWO_STEP - body_format: form - token_url: https://api.intacct.com/ia/api/v1/oauth2/token - token_params: - grant_type: client_credentials - client_id: ${credentials.clientId} - client_secret: ${credentials.clientSecret} - username: ${credentials.username} - session_id: ${credentials.sessionId} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://api.intacct.com/ia/api - docs: https://nango.dev/docs/api-integrations/sage-intacct-cc - docs_connect: https://nango.dev/docs/api-integrations/sage-intacct-cc/connect - setup_guide_url: https://nango.dev/docs/api-integrations/sage-intacct-cc/connect - credentials: - clientId: - type: string - title: Client ID - description: Your Sage Intacct application Client ID. - clientSecret: - type: string - title: Client Secret - description: Your Sage Intacct application Client Secret. - secret: true - username: - type: string - title: Username - description: The Web Services user ID in userId@companyId|entityId format. Required if not using Session ID. - example: Admin@MyCompany|Central Region - optional: true - sessionId: - type: string - title: Session ID - description: A valid UI or API session ID. Required if not using Username. - secret: true - optional: true - -sage-intacct: - display_name: Sage Intacct - categories: - - accounting - - erp - auth_mode: TWO_STEP - proxy: - base_url: https://api.intacct.com/ia/xml/xmlgw.phtml - token_url: https://api.intacct.com/ia/xml/xmlgw.phtml - body_format: xml - token_params: - request: - control: - senderid: ${credentials.senderId} - password: ${credentials.senderPassword} - controlid: ${now} - uniqueid: false - dtdversion: '3.0' - includewhitespace: false - operation: - authentication: - login: - userid: ${credentials.userId} - companyid: ${credentials.companyId} - password: ${credentials.userPassword} - content: - function: - $controlid: '{{$guid}}' - getAPISession: '' - token_headers: - content-type: application/xml - token_response: - token: response.operation.result.data.api.sessionid - token_expiration: response.operation.authentication.sessiontimeout - token_expiration_strategy: expireAt - docs: https://nango.dev/docs/integrations/all/sage-intacct - docs_connect: https://nango.dev/docs/integrations/all/sage-intacct/connect - credentials: - senderId: - type: string - title: Sender ID - description: Your Sage Intacct Sender ID - doc_section: '#step-1-how-to-retrieve-the-sender-id' - senderPassword: - type: string - title: Sender Password - description: Your Sage Intacct Sender Password - secret: true - userId: - type: string - title: User ID - description: Your Sage Intacct User ID - doc_section: '#step-2-how-to-retrieve-the-user-id' - companyId: - type: string - title: Company ID - description: Your Sage Intacct Company ID - doc_section: '#step-3-how-to-retrieve-the-company-id' - userPassword: - type: string - title: User Password - description: Your Sage Intacct User Password - secret: true - -sage-people: - display_name: Sage People - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://login.salesforce.com/services/oauth2/authorize - token_url: https://login.salesforce.com/services/oauth2/token - authorization_params: - prompt: consent - default_scopes: - - offline_access - - api - proxy: - base_url: https://${connectionConfig.instance_url}/services/apexrest/spapi - headers: - accept: application/json - token_response_metadata: - - instance_url - docs: https://nango.dev/docs/integrations/all/sage-people - docs_connect: https://nango.dev/docs/integrations/all/sage-people/connect - connection_config: - instance_url: - type: string - title: Instance URL - description: The instance URL of your Salesforce account - format: uri - pattern: '^https?://.*$' - automated: true - -sap-ariba: - display_name: SAP Ariba - categories: - - erp - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.subdomain}.ariba.com/v2/oauth/token - token_params: - grant_type: openapi_2lo - token_request_auth_method: basic - body_format: form - proxy: - base_url: https://open${connectionConfig.subdomain}.ariba.com - headers: - apikey: ${connectionConfig.apiKey} - x-ariba-network-id: ${connectionConfig.anid} - retry: - after: - - retry-after - docs: https://nango.dev/docs/api-integrations/sap-ariba - docs_connect: https://nango.dev/docs/api-integrations/sap-ariba/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: Your SAP Ariba API subdomain. - example: api-eu - default_value: api - enum: - - api - - api-eu - - api.au.cloud - doc_section: '#step-1-select-your-subdomain' - order: 1 - apiKey: - type: string - title: Application Key (API Key) - description: Your SAP Ariba application's API Key. - secret: true - doc_section: '#step-2-get-your-api-key' - order: 2 - anid: - type: string - title: Ariba Network ID (ANID) - description: Your SAP Ariba Network ID. - example: AN01234567890 - pattern: '^AN[0-9]+$' - doc_section: '#step-3-find-your-anid' - order: 3 - -salesforce: - display_name: Salesforce - categories: - - crm - - popular - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.hostname}/services/oauth2/authorize || https://login.salesforce.com/services/oauth2/authorize - token_url: https://${connectionConfig.hostname}/services/oauth2/token || https://login.salesforce.com/services/oauth2/token - authorization_params: - prompt: consent - default_scopes: - - offline_access - token_response_metadata: - - instance_url - proxy: - base_url: ${connectionConfig.instance_url} - webhook_routing_script: salesforceWebhookRouting - post_connection_script: salesforcePostConnection - docs: https://nango.dev/docs/api-integrations/salesforce - setup_guide_url: https://nango.dev/docs/api-integrations/salesforce/salesforce-api-oauth-app-setup - docs_connect: https://nango.dev/docs/api-integrations/salesforce/connect - connection_config: - instance_url: - type: string - title: Instance URL - description: The instance URL of your Salesforce account - format: uri - pattern: '^https?://.*$' - automated: true - hostname: - type: string - title: Hostname - description: The hostname to your Salesforce instance - pattern: '^(?!(?:.*\.)?[Ll][Ii][Gg][Hh][Tt][Nn][Ii][Nn][Gg]\.([Ff][Oo][Rr][Cc][Ee]|[Ss][Aa][Ll][Ee][Ss][Ff][Oo][Rr][Cc][Ee])\.[Cc][Oo][Mm]$)[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$' - example: acme.my.salesforce.com - prefix: https:// - optional: true - doc_section: '#step-1-finding-your-hostname' - -salesforce-cc: - display_name: Salesforce (Client Credentials) - categories: - - crm - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.hostname}/services/oauth2/token - token_params: - grant_type: client_credentials - token_response_metadata: - - instance_url - proxy: - base_url: ${connectionConfig.instance_url} - docs: https://nango.dev/docs/api-integrations/salesforce-cc - docs_connect: https://nango.dev/docs/api-integrations/salesforce-cc/connect - token_expires_in_ms: 0 - connection_config: - instance_url: - type: string - title: '' - description: '' - automated: true - hostname: - type: string - title: Hostname - description: The hostname to your Salesforce instance - pattern: '^(?!(?:.*\.)?[Ll][Ii][Gg][Hh][Tt][Nn][Ii][Nn][Gg]\.([Ff][Oo][Rr][Cc][Ee]|[Ss][Aa][Ll][Ee][Ss][Ff][Oo][Rr][Cc][Ee])\.[Cc][Oo][Mm]$)[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$' - example: acme.my.salesforce.com - prefix: https:// - -salesforce-jwt: - display_name: Salesforce (JWT) - categories: - - crm - auth_mode: TWO_STEP - signature: - protocol: RSA - body_format: form - token: - signing_key: ${credentials.privateKey} - expires_in_ms: 3600000 - header: - alg: RS256 - typ: JWT - payload: - iss: ${credentials.clientId} - aud: https://${connectionConfig.authorizationUrl} - sub: ${credentials.username} - token_url: https://${connectionConfig.authorizationUrl}/services/oauth2/token - token_params: - grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer - assertion: ${token} - token_response: - token: access_token - token_response_metadata: - - instance_url - proxy: - base_url: ${connectionConfig.instance_url} - token_expires_in_ms: 0 - docs: https://nango.dev/docs/api-integrations/salesforce-jwt - docs_connect: https://nango.dev/docs/api-integrations/salesforce-jwt/connect - connection_config: - authorizationUrl: - type: string - title: Authorization Server URL - description: Your Salesforce authorization server URL. - format: hostname - example: 'login.salesforce.com' - doc_section: '#step-5-finding-the-authorization-server-url' - credentials: - clientId: - type: string - title: Consumer Key - example: 3MVG9dAEux2v1sLsg0e52***************CJpGsXgqg8E - description: The Consumer Key from your Salesforce Connected App. - doc_section: '#step-3-get-consumer-key-and-consumer-secret' - clientSecret: - type: string - title: Consumer Secret - example: 954F73F4C234***************9D069B8FCF83B5 - pattern: '^[A-F0-9]{64}$' - description: The Consumer Secret from your Salesforce Connected App. - doc_section: '#step-3-get-consumer-key-and-consumer-secret' - username: - type: string - title: Username - description: The Salesforce username of the user the JWT will act on behalf of. - format: email - example: john@acme.com - doc_section: '#step-6-finding-the-username' - privateKey: - type: string - title: Private Key - description: The private key that matches the certificate you uploaded to the Connected App. - example: '-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n-----END PRIVATE KEY-----' - doc_section: '#step-1-create-a-private-key-and-self-signed-digital-certificate' - -salesforce-sandbox: - display_name: Salesforce (Sandbox) - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://test.salesforce.com/services/oauth2/authorize - token_url: https://test.salesforce.com/services/oauth2/token - default_scopes: - - offline_access - token_response_metadata: - - instance_url - proxy: - base_url: ${connectionConfig.instance_url} - docs: https://nango.dev/docs/api-integrations/salesforce-sandbox - setup_guide_url: https://nango.dev/docs/api-integrations/salesforce-sandbox/how-to-register-your-own-salesforce-sandbox-api-oauth-app - connection_config: - instance_url: - type: string - title: Instance URL - description: The instance URL of your Salesforce account - format: uri - pattern: '^https?://.*$' - automated: true - -salesforce-experience-cloud: - display_name: Salesforce Experience Cloud - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.my.site.com/services/oauth2/authorize - token_url: https://${connectionConfig.subdomain}.my.site.com/services/oauth2/token - default_scopes: - - offline_access - token_response_metadata: - - instance_url - proxy: - base_url: ${connectionConfig.instance_url} - docs: https://nango.dev/docs/integrations/all/salesforce-experience-cloud - connection_config: - subdomain: - type: string - title: Salesforce Domain - description: The subdomain of your Salesforce Experience Cloud account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .my.site.com - prefix: https:// - instance_url: - type: string - title: Instance URL - description: The instance URL of your Salesforce Experience Cloud account - format: uri - pattern: '^https?://.*$' - automated: true -salesforce-cdp: - display_name: Salesforce (Data Cloud) - categories: - - storage - auth_mode: TWO_STEP - token_url: https://login.salesforce.com/services/oauth2/token - body_format: form - token_params: - grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer - assertion: ${credentials.jwt} - token_headers: - content-type: application/x-www-form-urlencoded - additional_steps: - - body_format: form - token_params: - grant_type: urn:salesforce:grant-type:external:cdp - subject_token: ${step1.access_token} - subject_token_type: urn:ietf:params:oauth:token-type:access_token - token_headers: - content-type: application/x-www-form-urlencoded - token_url: ${step1.instance_url}/services/a360/token - token_response_metadata: - - instance_url - proxy: - base_url: ${connectionConfig.instance_url} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/integrations/all/salesforce-cdp - docs_connect: https://nango.dev/docs/integrations/all/salesforce-cdp/connect - credentials: - jwt: - type: string - title: Encoded JWT - description: This is your pre-generated, encoded JSON Web Token (JWT) - secret: true - doc_section: '#step-1-generating-your-encoded-jwt' - -salesmsg: - display_name: Salesmsg (PAT) - categories: - - communication - - marketing - auth_mode: TWO_STEP - body_format: json - token_url: https://api.salesmessage.com/pub/v2.2/oauth/personal-token/refresh - token_headers: - authorization: Bearer ${credentials.apiKey} - content-type: application/json - refresh_token_headers: - authorization: Bearer ${refresh_token} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - refresh_token: access_token - proxy: - base_url: https://api.salesmessage.com/pub/ - headers: - authorization: Bearer ${accessToken} - docs: https://nango.dev/docs/api-integrations/salesmsg - docs_connect: https://nango.dev/docs/api-integrations/salesmsg/connect - credentials: - apiKey: - type: string - title: Personal Access Token - description: Your Salesmsg Personal Access Token (PAT). - example: eyJhbGciOi***.eyJzdWIiOi***.xxxxxxxxxxxx - pattern: '^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$' - doc_section: '#step-1-generating-your-personal-access-token' - -salesmsg-oauth2: - display_name: Salesmsg (OAuth2) - categories: - - communication - - marketing - auth_mode: OAUTH2 - authorization_url: https://app.salesmessage.com/auth/oauth - token_url: https://api.salesmessage.com/pub/v2.2/oauth/token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.salesmessage.com/pub/ - docs: https://nango.dev/docs/api-integrations/salesmsg-oauth2 - setup_guide_url: https://nango.dev/docs/api-integrations/salesmsg-oauth2/how-to-register-your-own-salesmsg-oauth-app - -sap-fieldglass: - display_name: SAP Fieldglass - categories: - - erp - body_format: form - auth_mode: TWO_STEP - token_url: https://${connectionConfig.domain}/api/oauth2/v2.0/token?grant_type=client_credentials&response_type=token - token_headers: - authorization: Basic ${base64(${credentials.clientId}:${credentials.clientSecret})} - X-ApplicationKey: ${credentials.appKey} - proxy: - base_url: https://${connectionConfig.domain}/api - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/integrations/all/sap-fieldglass - docs_connect: https://nango.dev/docs/integrations/all/sap-fieldglass/connect - credentials: - clientId: - type: string - title: Client ID - description: Your SAP Fieldglass application Client ID - doc_section: '#step-1-generating-an-application' - clientSecret: - type: string - title: Client secret - description: Your SAP Fieldglass application Client secret - secret: true - doc_section: '#step-1-generating-an-application' - appKey: - type: string - title: Application Key - description: Your SAP Fieldglass application key - secret: true - optional: true - doc_section: '#step-1-generating-an-application' - connection_config: - domain: - type: string - title: Domain - description: Your SAP Fieldglass environment URL - example: auth.fieldglass.net - prefix: https:// - pattern: '^(?:[a-zA-Z0-9_-]+-(?:auth\.)?fgvms\.com|auth\.fieldglass\.net|sso\.fieldglass\.eu)$' - doc_section: '#step-2-determining-your-domain' - -sap-concur: - display_name: SAP Concur - categories: - - erp - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.region}.api.concursolutions.com/oauth2/v0/token - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.region}.api.concursolutions.com - docs: https://nango.dev/docs/integrations/all/sap-concur - docs_connect: https://nango.dev/docs/integrations/all/sap-concur/connect - connection_config: - companyUUID: - type: string - title: Company UUID - description: The unique identifier for your SAP Concur company - doc_section: '#step-2-generate-company-request-token' - companyRequestToken: - type: string - title: Company Request Token - description: The request token generated for the company - doc_section: '#step-2-generate-company-request-token' - region: - type: string - title: Region - description: The SAP Concur Data Center region (e.g., `us`, `eu`, `cn`) - example: us - doc_section: '#step-3-determine-your-region' - -sap-concur-password: - display_name: SAP Concur (Password Grant) - categories: - - erp - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.region}.api.concursolutions.com/oauth2/v0/token - token_params: - grant_type: password - client_id: ${credentials.clientId} - client_secret: ${credentials.clientSecret} - username: ${credentials.username} - password: ${credentials.password} - token_headers: - content-type: application/x-www-form-urlencoded - token_response: - token: access_token - refresh_token: refresh_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://${connectionConfig.region}.api.concursolutions.com - docs: https://nango.dev/docs/api-integrations/sap-concur-password - docs_connect: https://nango.dev/docs/api-integrations/sap-concur-password/connect - credentials: - username: - type: string - title: Username - description: Your SAP Concur username or userId. - doc_section: '#step-2-get-your-user-credentials' - password: - type: string - title: Password - secret: true - description: Your SAP Concur account password. - doc_section: '#step-2-get-your-user-credentials' - clientId: - type: string - title: Client ID - description: Your OAuth application client_id supplied by App Management. - doc_section: '#step-1-get-your-client-credentials' - clientSecret: - type: string - title: Client Secret - secret: true - description: Your OAuth application client_secret supplied by App Management. - doc_section: '#step-1-get-your-client-credentials' - connection_config: - region: - type: string - title: Region - description: The SAP Concur Data Center region. - example: us - pattern: '^[a-z0-9-]+$' - order: 1 - doc_section: '#step-3-determine-your-region' - -sap-business-one: - display_name: SAP Business One - categories: - - erp - body_format: json - auth_mode: TWO_STEP - token_url: https://${connectionConfig.domain}/Login - token_params: - CompanyDB: ${connectionConfig.companyDb} - UserName: ${credentials.userName} - DBInstance: ${connectionConfig.dbInstance} - Password: ${credentials.password} - token_headers: - content-type: application/json - token_expires_in_ms: 1700000 - proxy: - base_url: https://${connectionConfig.domain} - headers: - cookie: ${credentials._cookies} - token_response: - token: SessionId - token_response_headers: - - set-cookie - docs: https://nango.dev/docs/integrations/all/sap-business-one - docs_connect: https://nango.dev/docs/integrations/all/sap-business-one/connect - connection_config: - domain: - type: string - title: Service Layer URL - prefix: https:// - suffix: /Login - pattern: '^[A-Za-z0-9.-]+(?::\d+(?:/[-A-Za-z0-9.]*)*)?$' - order: 1 - description: The base URL for your SAP Business One Service Layer - doc_section: '#step-3-finding-your-service-layer-url' - companyDb: - type: string - title: Company Database Name - description: The name of your SAP Business One company database - example: 10COR0809H - order: 2 - doc_section: '#step-2-identifying-your-company-database' - dbInstance: - type: string - title: Database Instance - description: The database server instance name - optional: true - order: 3 - example: C200@10.58.114.200:30013 - doc_section: '#step-4-finding-your-database-instance' - credentials: - userName: - type: string - title: Username - description: Your SAP Business One username - doc_section: '#step-1-obtaining-your-credentials' - password: - type: string - title: Password - description: Your SAP Business One password - secret: true - doc_section: '#step-1-obtaining-your-credentials' - -sap-success-factors: - display_name: SAP SuccessFactors - categories: - - hr - body_format: form - auth_mode: TWO_STEP - token_url: https://${connectionConfig.apiServer}/oauth/token - token_params: - company_id: ${connectionConfig.companyId} - client_id: ${credentials.apiKey} - grant_type: urn:ietf:params:oauth:grant-type:saml2-bearer - assertion: ${credentials.assertion} - new_token: true - assertion: - type: saml - key: ${assertionOption.privateKey} - issuer: www.successfactors.com - lifetimeInSeconds: '315360000' - audiences: www.successfactors.com - attributes: - api_key: ${credentials.apiKey} - use_username: true - use_email: false - external_user: false - sessionIndex: ${random} - nameIdentifier: ${assertionOption.userName} - recipient: https://${connectionConfig.apiServer}/oauth/token - token_headers: - content-type: application/x-www-form-urlencoded - proxy: - base_url: https://${connectionConfig.apiServer} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/api-integrations/sap-success-factors - docs_connect: https://nango.dev/docs/api-integrations/sap-success-factors/connect - connection_config: - apiServer: - type: string - title: API Server - description: The API Server to connect to your SAP SuccessFactors account - format: hostname - example: api41preview.sapsf.com - prefix: https:// - doc_section: '#step-1-finding-your-api-server' - order: 1 - companyId: - type: string - title: Company ID - description: The company ID of your SAP SuccessFactors account - example: SFSALES012345 - pattern: '^[A-Za-z0-9]+$' - doc_section: '#step-2-finding-your-company-id' - order: 2 - credentials: - apiKey: - type: string - title: API Key - description: The API key for your SAP SuccessFactors account - secret: true - example: YzA4MTVhMTQzZTUzMjc3NTk0ZDY2Nzc1ZmVkOA - pattern: ^[A-Za-z0-9+/]{32,44}={0,2}$ - doc_section: '#step-3-finding-your-api-key-and-private-key' - assertion: - type: string - title: '' - description: '' - automated: true - assertion_option: - userName: - type: string - title: Username - description: The username of your SAP SuccessFactors account - example: johnDoe - doc_section: '#step-4-finding-your-username' - privateKey: - type: string - title: Private Key - description: The Private Key for your SAP SuccessFactors Oauth Client - doc_section: '#step-3-finding-your-api-key-and-private-key' - -sap-odata-oauth2-cc: - display_name: SAP S/4HANA Cloud (Client Credentials) - categories: - - erp - - popular - token_request_auth_method: basic - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.subdomain}.authentication.${connectionConfig.region}.hana.ondemand.com/oauth/token - token_params: - grant_type: client_credentials - scope_separator: ',' - proxy: - base_url: https://${connectionConfig.apiServer} - docs: https://nango.dev/docs/api-integrations/sap-odata-oauth2-cc - docs_connect: https://nango.dev/docs/api-integrations/sap-odata-oauth2-cc/connect - connection_config: - subdomain: - type: string - title: Subdomain - prefix: https:// - pattern: '^[a-z0-9_-]+$' - example: acme - suffix: /hana.ondemand.com - order: 1 - description: The subdomain where your SAP S/4HANA cloud instance is hosted - doc_section: '#step-2-finding-your-subdomain' - region: - type: string - title: Region - description: The region where your SAP S/4HANA cloud instance is hosted - example: eu10 - order: 2 - doc_section: '#step-3-finding-your-region' - apiServer: - type: string - title: API Server - description: The API base URL of the SAP S/4HANA cloud API service you want to connect to - pattern: '^[A-Za-z0-9.-]+(?::\d+(?:/[-A-Za-z0-9.]*)*)?$' - prefix: https:// - format: hostname - example: eu10.cfapps.eu10.hana.ondemand.com - doc_section: '#step-4-finding-your-api-server' - order: 3 - -sap-odata-basic: - display_name: SAP S/4HANA Cloud (Basic Auth) - categories: - - erp - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.apiServer} - docs: https://nango.dev/docs/api-integrations/sap-odata-basic - docs_connect: https://nango.dev/docs/api-integrations/sap-odata-basic/connect - connection_config: - apiServer: - type: string - title: API Server - description: The API base URL of the SAP S/4HANA cloud API service you want to connect to - pattern: '^[A-Za-z0-9.-]+(?::\d+(?:/[-A-Za-z0-9.]*)*)?$' - prefix: https:// - example: eu10.cfapps.eu10.hana.ondemand.com - doc_section: '#step-2-finding-your-api-server' - order: 1 - -schwab: - display_name: Schwab - categories: - - banking - - accounting - auth_mode: OAUTH2 - authorization_url: https://api.schwabapi.com/v1/oauth/authorize - token_url: https://api.schwabapi.com/v1/oauth/token - token_request_auth_method: basic - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.schwabapi.com - docs: https://nango.dev/docs/api-integrations/schwab - setup_guide_url: https://nango.dev/docs/api-integrations/schwab/how-to-register-your-own-schwab-oauth-app - -scrapedo: - display_name: Scrape.do - categories: - - other - auth_mode: API_KEY - proxy: - base_url: https://api.scrape.do - query: - token: ${apiKey} - docs: https://nango.dev/docs/integrations/all/scrapedo - docs_connect: https://nango.dev/docs/integrations/all/scrapedo/connect - credentials: - apiKey: - type: string - title: API Token - description: The API Token for your Scrape.do account - example: 3c12d71308a346c41d10b19a2b2ac1ea5cacb53588d - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-1-finding-your-api-key' - -salesloft: - display_name: Salesloft - categories: - - marketing - auth_mode: OAUTH2 - authorization_url: https://accounts.salesloft.com/oauth/authorize - token_url: https://accounts.salesloft.com/oauth/token - proxy: - base_url: https://api.salesloft.com - docs: https://nango.dev/docs/integrations/all/salesloft - -sendgrid: - display_name: SendGrid - categories: - - marketing - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.sendgrid.com - docs: https://nango.dev/docs/integrations/all/sendgrid - docs_connect: https://nango.dev/docs/integrations/all/sendgrid/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Sendgrid account - doc_section: '#step-1-generating-your-sendgrid-api-key' - -semrush: - display_name: Semrush (v3) - categories: - - marketing - - analytics - auth_mode: API_KEY - proxy: - base_url: https://api.semrush.com - query: - key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /management/v1/projects - docs: https://nango.dev/docs/integrations/all/semrush - docs_connect: https://nango.dev/docs/integrations/all/semrush/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Semrush API key - doc_section: '#step-1-finding-your-api-key' - -sentinelone: - display_name: SentinelOne - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.hostname} - headers: - authorization: ApiToken ${apiKey} - accept: application/json - content-type: application/json - verification: - method: GET - endpoints: - - /web/api/v2.1/sites?limit=1 - docs: https://nango.dev/docs/api-integrations/sentinelone - docs_connect: https://nango.dev/docs/api-integrations/sentinelone/connect - connection_config: - hostname: - type: string - title: Hostname - description: The hostname of your SentinelOne management console - format: hostname - prefix: https:// - example: your-tenant.sentinelone.net - doc_section: '#step-2-find-your-hostname' - order: 1 - credentials: - apiKey: - type: string - title: API Token - description: The API token for your SentinelOne service user - doc_section: '#step-1-generate-your-api-token' - -sentry: - display_name: Sentry - categories: - - dev-tools - - analytics - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.hostname}/api - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/integrations/all/sentry - docs_connect: https://nango.dev/docs/integrations/all/sentry/connect - connection_config: - hostname: - type: string - title: Hostname - description: The Hostname of your Sentry account. - format: hostname - enum: - - sentry.io - - us.sentry.io - - eu.sentry.io - - de.sentry.io - order: 1 - doc_section: '#step-1-finding-your-hostname' - credentials: - apiKey: - type: string - title: Auth Token - description: The Authentication token for your Sentry account - example: sntryu_795225***************b9864a********************* - pattern: '^sntryu_[a-f0-9]{64}$' - doc_section: '#step-2-generating-your-sentry-auth-token' - -sentry-oauth: - display_name: Sentry (Public Integrations) - installation: outbound - categories: - - dev-tools - - analytics - auth_mode: OAUTH2 - token_url: https://sentry.io/api/0/sentry-app-installations/${connectionConfig.installation.uuid}/authorizations/ - webhook_routing_script: sentryOauthWebhookRouting - post_connection_script: sentryOauthPostConnection - authorization_code_param_in_webhook: data.installation.code - webhook_response_metadata: - - installation.uuid - proxy: - base_url: https://${connectionConfig.hostname}/api - connection_config: - actor: ${connectionConfig.actor} - docs: https://nango.dev/docs/integrations/all/sentry-oauth - docs_connect: https://nango.dev/docs/integrations/all/sentry-oauth/connect - connection_config: - hostname: - type: string - title: Hostname - description: The Hostname of your Sentry account. - format: hostname - enum: - - sentry.io - - us.sentry.io - - eu.sentry.io - - de.sentry.io - order: 1 - doc_section: '#step-1-finding-your-hostname' - actor: - type: string - title: User ID - description: The unique identifier of the user who will accept and install the public integration - doc_section: '#step-2-finding-your-user-id' - installation.uuid: - type: string - title: '' - description: '' - automated: true - -sedna: - display_name: Sedna (OAuth) - auth_mode: OAUTH2_CC - categories: - - communication - proxy: - base_url: https://${connectionConfig.tenant}.sednanetwork.com/platform - token_url: https://${connectionConfig.tenant}.sednanetwork.com/platform/oauth/token - token_params: - grant_type: client_credentials - scope_separator: ',' - docs: https://nango.dev/docs/integrations/all/sedna - connection_config: - tenant: - type: string - title: Tenant - description: The tenant name to your sedna account - -sedna-basic: - display_name: Sedna (Basic Auth) - auth_mode: BASIC - categories: - - communication - proxy: - base_url: https://${connectionConfig.tenant}.sednanetwork.com/platform - docs: https://nango.dev/docs/integrations/all/sedna-basic - connection_config: - tenant: - type: string - title: Tenant - description: The tenant name to your sedna account - -setmore: - display_name: Setmore - categories: - - productivity - auth_mode: TWO_STEP - token_request_method: GET - token_url: https://developer.setmore.com/api/v1/o/oauth2/token?refreshToken=${credentials.refreshToken} - proxy: - base_url: https://developer.setmore.com/api - token_response: - token: data.token.access_token - token_expiration: data.token.expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/integrations/all/setmore - docs_connect: https://nango.dev/docs/integrations/all/setmore/connect - credentials: - refreshToken: - type: string - title: Access Token - pattern: '^r1\/[A-Za-z0-9\-]+$' - example: r1/Ab12Cd34Ef56Gh78Ij90KlMnOpQr-StUvWxYz123456 - description: The access token provided to you by Setmore team - doc_section: '#step-1-requesting-access-to-the-api' - -sellercloud: - display_name: Sellercloud - categories: - - e-commerce - auth_mode: TWO_STEP - proxy: - base_url: ${connectionConfig.restApiEndpoint} - token_request_method: GET - token_url: https://api.sellercloud.com/api/server-by-team/?team=${credentials.teamName} - additional_steps: - - body_format: json - token_params: - Username: ${credentials.username} - Password: ${credentials.password} - token_url: ${step1.restApiEndpoint}/api/token - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - token_response_metadata: - - restApiEndpoint - docs: https://nango.dev/docs/api-integrations/sellercloud - docs_connect: https://nango.dev/docs/api-integrations/sellercloud/connect - connection_config: - restApiEndpoint: - type: string - title: '' - description: '' - automated: true - credentials: - teamName: - type: string - title: Team Name - description: Your Sellercloud team name - example: myteam - doc_section: '#step-1-finding-your-team-name' - username: - type: string - title: Username - description: Your Sellercloud username - doc_section: '#step-2-identifying-your-credentials' - password: - type: string - title: Password - description: Your Sellercloud password - secret: true - doc_section: '#step-2-identifying-your-credentials' - -sellsy: - display_name: Sellsy - auth_mode: OAUTH2 - categories: - - invoicing - - accounting - - crm - authorization_url: https://login.sellsy.com/oauth2/authorization - token_url: https://login.sellsy.com/oauth2/access-tokens - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.sellsy.com - webhook_routing_script: sellsyWebhookRouting - webhook_user_defined_secret: true - post_connection_script: sellsyPostConnection - docs: https://nango.dev/docs/integrations/all/sellsy - -sellsy-oauth2-cc: - display_name: Sellsy (Client Credentials) - auth_mode: OAUTH2_CC - categories: - - invoicing - - accounting - - crm - token_url: https://login.sellsy.com/oauth2/access-tokens - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.sellsy.com - webhook_routing_script: sellsyWebhookRouting - webhook_user_defined_secret: true - post_connection_script: sellsyPostConnection - docs: https://nango.dev/docs/integrations/all/sellsy-oauth2-cc - docs_connect: https://nango.dev/docs/integrations/all/sellsy-oauth2-cc/connect - credentials: - client_id: - type: string - title: Client ID - description: Your Client ID - client_secret: - type: string - title: Secret shopper - description: Your Secret shopper - -servicem8: - display_name: ServiceM8 - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://go.servicem8.com/oauth/authorize - token_url: https://go.servicem8.com/oauth/access_token - proxy: - base_url: https://api.servicem8.com - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - docs: https://nango.dev/docs/integrations/all/servicem8 - -signnow: - display_name: SignNow - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://app.signnow.com/authorize - token_url: https://api.signnow.com/oauth2/token - disable_pkce: true - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.signnow.com - docs: https://nango.dev/docs/integrations/all/signnow - -signnow-sandbox: - display_name: SignNow (Sandbox) - categories: - - legal - auth_mode: OAUTH2 - authorization_url: https://app-eval.signnow.com/authorize - token_url: https://api-eval.signnow.com/oauth2/token - disable_pkce: true - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api-eval.signnow.com - docs: https://nango.dev/docs/integrations/all/signnow-sandbox - -servicenow: - display_name: ServiceNow - categories: - - productivity - - popular - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.service-now.com/oauth_auth.do - token_url: https://${connectionConfig.subdomain}.service-now.com/oauth_token.do - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.service-now.com - docs: https://nango.dev/docs/integrations/all/servicenow - connection_config: - subdomain: - type: string - title: ServiceNow Domain - description: The subdomain of your ServiceNow account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .service-now.com - prefix: https:// - -servicenow-oauth2-cc: - display_name: ServiceNow (Client Credentials) - categories: - - productivity - - ticketing - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.subdomain}.service-now.com/oauth_token.do - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.subdomain}.service-now.com - docs: https://nango.dev/docs/api-integrations/servicenow-oauth2-cc - docs_connect: https://nango.dev/docs/api-integrations/servicenow-oauth2-cc/connect - connection_config: - subdomain: - type: string - title: ServiceNow Domain - description: The subdomain of your ServiceNow account - doc_section: '#step-5-enter-credentials-in-the-connect-ui' - pattern: '^[a-z0-9_-]+$' - example: dev12345 - suffix: .service-now.com - prefix: https:// - credentials: - client_id: - type: string - title: Client ID - description: The Client ID from your ServiceNow OAuth Application - doc_section: '#step-4-create-an-oauth-application' - client_secret: - type: string - title: Client Secret - description: The Client Secret from your ServiceNow OAuth Application - secret: true - doc_section: '#step-4-create-an-oauth-application' - -skio: - display_name: Skio - categories: - - e-commerce - auth_mode: API_KEY - proxy: - headers: - authorization: API ${apiKey} - base_url: https://graphql.skio.com - credentials_verification_script: skioCredentialsVerification - docs: https://nango.dev/docs/integrations/all/skio - docs_connect: https://nango.dev/docs/integrations/all/skio/connect - credentials: - apiKey: - type: string - title: API Token - description: The API Token for your Skio account - format: uuid - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-1-generating-your-api-key' - -sharepoint-online: - display_name: SharePoint Online (v2) - categories: - - storage - - communication - - popular - alias: microsoft - post_connection_script: onedrivePostConnection - docs: https://nango.dev/docs/api-integrations/sharepoint-online - setup_guide_url: https://nango.dev/docs/api-integrations/sharepoint-online/how-to-register-your-own-sharepoint-online-api-oauth-app - -sharepoint-online-oauth2-cc: - display_name: SharePoint Online (Client Credentials V2) - categories: - - storage - - communication - auth_mode: OAUTH2_CC - token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://graph.microsoft.com - docs: https://nango.dev/docs/integrations/all/sharepoint-online-oauth2-cc - docs_connect: https://nango.dev/docs/integrations/all/sharepoint-online-oauth2-cc/connect - connection_config: - tenantId: - type: string - title: Tenant ID - description: The unique identifier for your organization that uses Microsoft services - format: uuid - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-1-finding-your-tenant-id' - order: 1 - -sharepoint-online-v1: - display_name: SharePoint Online (v1) - categories: - - storage - - communication - auth_mode: TWO_STEP - token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/token - body_format: form - token_params: - client_id: ${credentials.clientId} - grant_type: client_credentials - resource: https://${connectionConfig.tenantId}.sharepoint.com - client_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer - client_assertion: ${credentials.assertion} - token_headers: - content-type: application/x-www-form-urlencoded - proxy: - base_url: https://${connectionConfig.tenantName}.sharepoint.com - headers: - accept: application/json;odata=verbose - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/integrations/all/sharepoint-online-v1 - docs_connect: https://nango.dev/docs/integrations/all/sharepoint-online-v1/connect - connection_config: - tenantId: - type: string - title: Tenant ID - description: The unique identifier for your organization that uses Microsoft services - format: uuid - example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f - doc_section: '#step-1-finding-your-tenant-id' - order: 1 - tenantName: - type: string - title: Tenant Name - description: The initial domain name for your Microsoft services tenant - example: mycompany - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-2-finding-your-tenant-name' - order: 2 - credentials: - clientId: - type: string - title: Client ID - description: Your application Client ID - secret: true - doc_section: '#step-3-finding-your-client-id' - assertion: - type: string - title: Client Assertion - description: Your generated client assertion - secret: true - doc_section: '#step-4-generating-your-client-assertion' - -shipbob-pat: - display_name: ShipBob (Personal Access Token) - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.apiSubdomain}.shipbob.com - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'x-retry-after' - verification: - method: GET - endpoints: - - /2026-01/channel - docs: https://nango.dev/docs/api-integrations/shipbob-pat - docs_connect: https://nango.dev/docs/api-integrations/shipbob-pat/connect - connection_config: - apiSubdomain: - type: string - title: API Subdomain - description: The ShipBob API subdomain of the environment you want to connect to. - enum: - - api - - sandbox-api - doc_section: '#step-2-identify-your-api-subdomain' - credentials: - apiKey: - type: string - title: Personal Access Token - description: Your ShipBob Personal Access Token - example: 6E4647BB**************************806E464161FBB996DD8E87EEA86DB926-1 - pattern: '^[A-F0-9]{64}-\d+$' - doc_section: '#step-1-generate-your-token' - -shippo: - display_name: Shippo - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://api.goshippo.com - headers: - authorization: ShippoToken ${apiKey} - retry: - at: - - 'x-ratelimit-reset' - verification: - method: GET - endpoints: - - /parcel-templates?page=1&results=1 - docs: https://nango.dev/docs/api-integrations/shippo - docs_connect: https://nango.dev/docs/api-integrations/shippo/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Shippo API token (live or test). - pattern: '^shippo_(live|test)_[a-f0-9]+$' - example: shippo_live_e2848d36**************************** - doc_section: '#step-1-get-your-api-token' - -shipstation: - display_name: Shipstation (v1) - categories: - - e-commerce - auth_mode: BASIC - proxy: - base_url: https://ssapi.shipstation.com - retry: - after: - - 'x-rate-limit-reset' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /users - webhook_routing_script: shipstationWebhookRouting - docs: https://nango.dev/docs/integrations/all/shipstation - docs_connect: https://nango.dev/docs/integrations/all/shipstation/connect - credentials: - username: - type: string - title: API Key - description: Your ShipStation API key - example: '0ff30856c5634da1b5ce1953fdaf3dcd' - pattern: '^[a-f0-9]{32}$' - doc_section: '#step-1-finding-shipstation-api-key-and-api-secret' - password: - type: string - title: API Secret - description: Your Shipstation API secret - example: '17f1c62148b044c687f80e1060224a4e' - pattern: '^[a-f0-9]{32}$' - # https://www.shipstation.com/docs/api/requirements/#authentication - # Shipstation is using basic auth with API key and secret - doc_section: '#step-1-finding-shipstation-api-key-and-api-secret' - -shipstation-v2: - display_name: Shipstation (v2) - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://api.shipstation.com - retry: - after: - - 'retry-after' - headers: - api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v2/users?page_size=1 - webhook_routing_script: shipstationWebhookRouting - docs: https://nango.dev/docs/integrations/all/shipstation-v2 - docs_connect: https://nango.dev/docs/integrations/all/shipstation-v2/connect - credentials: - apiKey: - type: string - title: API Key - description: The API Key for your Shipstation account - example: zEfcI+rouT0q1fjQWHBOYnsGYiax3rGDjtt3O5UhFIw - pattern: '^[A-Za-z0-9+/]+={0,2}$' - doc_section: '#step-1-generating-your-api-key' - -shopify: - display_name: Shopify (OAuth) - categories: - - e-commerce - - popular - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.myshopify.com/admin/oauth/authorize - token_url: https://${connectionConfig.subdomain}.myshopify.com/admin/oauth/access_token - proxy: - base_url: https://${connectionConfig.subdomain}.myshopify.com - headers: - x-shopify-access-token: ${accessToken} - webhook_routing_script: shopifyWebhookRouting - token_params: - expiring: 1 - docs: https://nango.dev/docs/api-integrations/shopify - setup_guide_url: https://nango.dev/docs/api-integrations/shopify/how-to-register-your-own-shopify-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/shopify/connect - connection_config: - subdomain: - type: string - title: Shopify Domain - description: The subdomain of your Shopify account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .myshopify.com - prefix: https:// - doc_section: '#step-1-finding-your-shopify-domain' - -shopify-cc: - display_name: Shopify (Client Credentials) - categories: - - e-commerce - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.subdomain}.myshopify.com/admin/oauth/access_token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.subdomain}.myshopify.com - headers: - x-shopify-access-token: ${accessToken} - docs: https://nango.dev/docs/api-integrations/shopify-cc - docs_connect: https://nango.dev/docs/api-integrations/shopify-cc/connect - connection_config: - subdomain: - type: string - title: Shopify Store Domain - description: The subdomain of the Shopify store the app is installed in. - pattern: '^[a-z0-9_-]+$' - example: my-store - suffix: .myshopify.com - prefix: https:// - order: 1 - doc_section: '#step-2-find-your-shopify-store-domain' - credentials: - client_id: - type: string - title: Client ID - description: The Client ID for your Shopify app. - doc_section: '#step-1-generating-your-client-credentials' - client_secret: - type: string - title: Client Secret - description: The Client Secret for your Shopify app. - secret: true - doc_section: '#step-1-generating-your-client-credentials' - -shopify-api-key: - display_name: Shopify (API Key) - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.myshopify.com - headers: - x-shopify-access-token: ${apiKey} - content-type: application/json - verification: - method: POST - headers: - content-type: application/json - endpoints: - - /admin/api/2024-10/graphql.json?query=%7B__schema%7Btypes%7Bname%2Ckind%2Cfields%7Bname%7D%7D%7D%7D - webhook_routing_script: shopifyWebhookRouting - webhook_user_defined_secret: true - docs: https://nango.dev/docs/integrations/all/shopify-api-key - docs_connect: https://nango.dev/docs/integrations/all/shopify-api-key/connect - connection_config: - subdomain: - type: string - title: Shopify Domain - description: The subdomain of your Shopify account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .myshopify.com - prefix: https:// - doc_section: '#step-1-finding-your-shopify-domain' - order: 1 - credentials: - apiKey: - type: string - title: API Access Token - description: The API access token generated - example: shpat_***************c03266f - pattern: '^(shpat|shpca|shppa)_[a-f0-9]{32}$' - doc_section: '#step-2-generating-your-api-access-token' - -shopify-partner: - display_name: Shopify Partner - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://partners.shopify.com/${connectionConfig.partnerId}/api/ - headers: - x-shopify-access-token: ${apiKey} - content-type: application/json - verification: - method: POST - headers: - content-type: application/json - endpoints: - - 2026-04/graphql.json - docs: https://nango.dev/docs/integrations/all/shopify-partner - docs_connect: https://nango.dev/docs/integrations/all/shopify-partner/connect - credentials: - apiKey: - type: string - title: Partner Access Token - description: The access token for your Shopify Partner account - connection_config: - partnerId: - type: string - title: Partner ID - description: Your Shopify Partner ID - -shopify-scim: - display_name: Shopify (SCIM API) - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://shopifyscim.com/scim - headers: - authorization: Bearer ${apiKey} - accept: application/json - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/Users - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/shopify-scim - docs_connect: https://nango.dev/docs/integrations/all/shopify-scim/connect - credentials: - apiKey: - type: string - title: SCIM API Token - description: The SCIM API token generated from your Shopify organization settings. - doc_section: '#step-1-generating-your-scim-api-token' - -shopvox: - display_name: ShopVox - categories: - - other - auth_mode: TWO_STEP - body_format: json - token_url: https://api.shopvox.com/v1/login - token_params: - user: ${credentials.email} - password: ${credentials.password} - token_headers: - content-type: application/json - token_response: - token: authToken - proxy: - base_url: https://api.shopvox.com/ - query: - authToken: ${accessToken} - account_id: ${credentials.raw.accountID} - docs: https://nango.dev/docs/api-integrations/shopvox - docs_connect: https://nango.dev/docs/api-integrations/shopvox/connect - credentials: - email: - type: string - title: Email - format: email - description: Your ShopVox login email. - doc_section: '#step-1-finding-your-credentials' - password: - type: string - title: Password - description: Your ShopVox login password. - secret: true - doc_section: '#step-1-finding-your-credentials' - -shopware: - display_name: Shopware (Admin API) - categories: - - e-commerce - auth_mode: OAUTH2_CC - body_format: json - token_url: https://${connectionConfig.shopwareUrl}/api/oauth/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.shopwareUrl}/api - docs: https://nango.dev/docs/api-integrations/shopware - docs_connect: https://nango.dev/docs/api-integrations/shopware/connect - credentials: - client_id: - type: string - title: Access key ID - description: The Access key ID of yout integration. - doc_section: '#step-2-create-a-shopware-integration' - client_secret: - type: string - title: Secret access key - description: The Secret access key of your integration. - secret: true - doc_section: '#step-2-create-a-shopware-integration' - connection_config: - shopwareUrl: - type: string - title: Shopware URL - description: The hostname of your Shopware instance. - example: myshop.example.com - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-1-find-your-shopware-url' - -shopworks: - display_name: ShopWorks - categories: - - other - auth_mode: TWO_STEP - body_format: json - token_url: https://${connectionConfig.hostname}/signin - token_params: - username: ${credentials.username} - password: ${credentials.password} - token_headers: - content-type: application/json - token_response: - token: id_token - token_expires_in_ms: 3600000 - proxy: - base_url: https://${connectionConfig.hostname} - headers: - authorization: ${accessToken} - docs: https://nango.dev/docs/api-integrations/shopworks - docs_connect: https://nango.dev/docs/api-integrations/shopworks/connect - connection_config: - hostname: - type: string - title: Hostname - prefix: https:// - suffix: /signin - description: The hostname of the API you want to connect to. - example: manageordersapi.com/onsite - doc_section: '#step-1-find-your-hostname' - credentials: - username: - type: string - title: Username - description: The username for your ShopWorks account. - doc_section: '#step-2-find-your-credentials' - password: - type: string - title: Password - secret: true - description: The password for your ShopWorks account. - doc_section: '#step-2-find-your-credentials' - -slab: - display_name: Slab - categories: - - productivity - - knowledge-base - auth_mode: API_KEY - proxy: - base_url: https://api.slab.com - headers: - authorization: ${apiKey} - content-type: application/json - docs: https://nango.dev/docs/api-integrations/slab - docs_connect: https://nango.dev/docs/api-integrations/slab/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Slab API token - doc_section: '#step-1-generating-your-slab-api-token' - -shortcut: - display_name: Shortcut - categories: - - dev-tools - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.app.shortcut.com - headers: - shortcut-token: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v3/member - docs: https://nango.dev/docs/integrations/all/shortcut - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Shortcut account - -simpro: - display_name: Simpro - categories: - - productivity - - invoicing - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.build}.simprosuite.com/oauth2/login - token_url: https://${connectionConfig.build}.simprosuite.com/oauth2/token - proxy: - base_url: https://${connectionConfig.build}.simprosuite.com - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - docs: https://nango.dev/docs/api-integrations/simpro - docs_connect: https://nango.dev/docs/api-integrations/simpro/connect - connection_config: - build: - type: string - title: Simpro Build Name - description: The subdomain part of your Simpro URL. - pattern: '^[a-z0-9_-]+$' - example: yourcompany - suffix: .simprosuite.com - prefix: https:// - doc_section: '#step-1-find-your-simpro-build-name' - -slack: - display_name: Slack - categories: - - popular - - productivity - auth_mode: OAUTH2 - authorization_url: https://slack.com/oauth/v2/authorize - scope_separator: ',' - alternate_access_token_response_path: authed_user - token_url: https://slack.com/api/oauth.v2.access - disable_pkce: true - token_response_metadata: - - incoming_webhook.url - - incoming_webhook.channel - - incoming_webhook.channel_id - - bot_user_id - - team.id - proxy: - base_url: https://slack.com/api - retry: - after: - - 'retry-after' - paginate: - type: cursor - cursor_path_in_response: response_metadata.next_cursor - cursor_name_in_request: cursor - limit_name_in_request: limit - webhook_routing_script: slackWebhookRouting - docs: https://nango.dev/docs/api-integrations/slack - setup_guide_url: https://nango.dev/docs/api-integrations/slack/how-to-register-your-own-slack-api-oauth-app - -slack-mcp: - display_name: Slack (MCP) - categories: - - popular - - productivity - - communication - - mcp - auth_mode: MCP_OAUTH2 - client_registration: static - authorization_url: https://slack.com/oauth/v2_user/authorize - token_url: https://slack.com/api/oauth.v2.user.access - scope_separator: ',' - alternate_access_token_response_path: authed_user - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://mcp.slack.com - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/slack-mcp - setup_guide_url: https://nango.dev/docs/api-integrations/slack-mcp/how-to-register-your-own-slack-mcp-oauth-app - -smartlead-ai: - display_name: Smartlead.ai - categories: - - communication - - marketing - auth_mode: API_KEY - proxy: - base_url: https://server.smartlead.ai/api - retry: - after: - - x-ratelimit-reset - query: - api_key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/client - docs: https://nango.dev/docs/integrations/all/smartlead-ai - docs_connect: https://nango.dev/docs/integrations/all/smartlead-ai/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Smartlead.ai account - pattern: '^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}_[a-zA-Z0-9]+$' - example: 12345678-1234-1234-1234-123456789012_abcdefg - doc_section: '#step-1-generating-your-api-key' - -sophos-central: - display_name: Sophos Central - categories: - - dev-tools - auth_mode: OAUTH2_CC - token_url: https://id.sophos.com/api/v2/oauth2/token - token_params: - grant_type: client_credentials - scope: token - body_format: form - proxy: - base_url: ${connectionConfig.dataRegion} - headers: - x-tenant-id: ${connectionConfig.tenantId} - post_connection_script: sophosCentralPostConnection - docs: https://nango.dev/docs/api-integrations/sophos-central - docs_connect: https://nango.dev/docs/api-integrations/sophos-central/connect - connection_config: - dataRegion: - type: string - title: '' - description: '' - automated: true - tenantId: - type: string - title: '' - description: '' - automated: true - -smartrecruiters-api-key: - display_name: Smartrecruiters - categories: - - ats - auth_mode: API_KEY - proxy: - base_url: https://api.smartrecruiters.com - headers: - x-smarttoken: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /feed/publications - docs: https://nango.dev/docs/integrations/all/smartrecruiters-api-key - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Smartrecruiters account - -smartsheet: - display_name: Smartsheet - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.app_host}/b/authorize || https://app.smartsheet.com/b/authorize - token_url: https://api.${connectionConfig.domain}/2.0/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.${connectionConfig.domain} - docs: https://nango.dev/docs/api-integrations/smartsheet - docs_connect: https://nango.dev/docs/api-integrations/smartsheet/connect - setup_guide_url: https://nango.dev/docs/api-integrations/smartsheet/how-to-register-your-own-smartsheet-api-oauth-app - connection_config: - app_host: - type: string - title: App Host - description: The app host used for authorization. - example: app.smartsheet.com - optional: true - pattern: '^(app\.smartsheet\.com|app\.test\.smartsheet\.com)$' - domain: - type: string - title: Domain - description: The domain where your account is hosted. - prefix: https://api. - order: 1 - enum: - - smartsheet.com - - smartsheet.eu - - smartsheet.au - - smartsheetgov.com - - test.smartsheet.com - -smugmug: - display_name: Smugmug - categories: - - storage - auth_mode: OAUTH1 - request_url: https://api.smugmug.com/services/oauth/1.0a/getRequestToken - authorization_url: https://api.smugmug.com/services/oauth/1.0a/authorize - token_url: https://api.smugmug.com/services/oauth/1.0a/getAccessToken - scope_separator: ',' - signature_method: 'PLAINTEXT' - proxy: - base_url: https://www.smugmug.com - docs: https://nango.dev/docs/integrations/all/smugmug - -snapchat: - display_name: Snapchat (Ads API) - auth_mode: OAUTH2 - categories: - - video - - social - authorization_url: https://accounts.snapchat.com/login/oauth2/authorize - disable_pkce: true - token_url: https://accounts.snapchat.com/login/oauth2/access_token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://adsapi.snapchat.com - docs: https://nango.dev/docs/integrations/all/snapchat - -snowflake: - display_name: Snowflake - categories: - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.snowflake_account_url}/oauth/authorize - token_url: https://${connectionConfig.snowflake_account_url}/oauth/token-request - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.snowflake_account_url} - post_connection_script: snowflakePostConnection - docs: https://nango.dev/docs/api-integrations/snowflake - docs_connect: https://nango.dev/docs/api-integrations/snowflake/connect - connection_config: - snowflake_account_url: - type: string - title: Domain - description: The domain of your Snowflake account. - format: hostname - example: myorg-myaccount.snowflakecomputing.com - prefix: https:// - -snowflake-jwt: - display_name: Snowflake (JWT) - categories: - - dev-tools - auth_mode: JWT - signature: - protocol: RSA - token: - signing_key: ${credentials.privateKey} - expires_in_ms: 3600000 - header: - alg: RS256 - typ: JWT - payload: - iss: ${credentials.accountIdentifier}.${credentials.userName}.${fingerprint(${credentials.privateKey})} - sub: ${credentials.accountIdentifier}.${credentials.userName} - proxy: - headers: - accept: application/json - authorization: Bearer ${accessToken} - x-snowflake-authorization-token-type: KEYPAIR_JWT - base_url: https://${connectionConfig.subdomain}.snowflakecomputing.com - verification: - method: POST - endpoints: - - /api/v2/statements - data: { 'statement': 'SELECT CURRENT_TIMESTAMP' } - headers: - x-snowflake-authorization-token-type: KEYPAIR_JWT - content-type: application/json - docs: https://nango.dev/docs/integrations/all/snowflake-jwt - docs_connect: https://nango.dev/docs/integrations/all/snowflake-jwt/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain for your Snowflake instance - example: KXOPMLU-RE00572 - order: 1 - doc_section: '#step-1-finding-your-subdomain' - credentials: - accountIdentifier: - type: string - title: Account Identifier - description: The unique identifier for your Snowflake account. - example: KXOPMLU-RE00572 - doc_section: '#step-2-finding-your-account-identifier' - userName: - type: string - title: User Name - description: The username for your Snowflake account used for authentication - example: MYUSER - doc_section: '#step-3-finding-your-user-name' - privateKey: - type: string - title: Private Key - description: The private key associated with your Snowflake account for JWT authentication - example: -----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n-----END PRIVATE KEY----- - pattern: '^-----BEGIN PRIVATE KEY-----\s*([A-Za-z0-9+/=\s]+)\s*-----END PRIVATE KEY-----$' - secret: true - doc_section: '#step-4-generating-your-private-key' - -splitwise: - display_name: Splitwise - categories: - - payment - - social - auth_mode: OAUTH2 - authorization_url: https://secure.splitwise.com/oauth/authorize - token_url: https://secure.splitwise.com/oauth/token - proxy: - base_url: https://secure.splitwise.com - docs: https://nango.dev/docs/integrations/all/splitwise - -spotify: - display_name: Spotify (OAuth) - categories: - - other - auth_mode: OAUTH2 - authorization_url: https://accounts.spotify.com/authorize - token_url: https://accounts.spotify.com/api/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.spotify.com - docs: https://nango.dev/docs/integrations/all/spotify - -spotify-oauth2-cc: - display_name: Spotify (Client Credentials) - categories: - - other - auth_mode: OAUTH2_CC - token_url: https://accounts.spotify.com/api/token - token_request_auth_method: basic - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.spotify.com - docs: https://nango.dev/docs/integrations/all/spotify-oauth2-cc - -squarespace: - display_name: Squarespace - categories: - - dev-tools - - design - auth_mode: OAUTH2 - authorization_url: https://login.squarespace.com/api/1/login/oauth/provider/authorize - token_url: https://login.squarespace.com/api/1/login/oauth/provider/tokens - token_request_auth_method: basic - scope_separator: ',' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.squarespace.com - headers: - user-agent: ${connectionConfig.customappDescription} - docs: https://nango.dev/docs/integrations/all/squarespace - connection_config: - customappDescription: - type: string - title: User Agent - description: The user agent of your custom app - -squareup: - display_name: Squareup - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://connect.squareup.com/oauth2/authorize - token_url: https://connect.squareup.com/oauth2/token - disable_pkce: true - decode_url: true - authorization_params: - response_type: code - session: false - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://connect.squareup.com - docs: https://nango.dev/docs/api-integrations/squareup - setup_guide_url: https://nango.dev/docs/api-integrations/squareup/how-to-register-your-own-squareup-oauth-app - -squareup-sandbox: - display_name: Squareup (Sandbox) - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://connect.squareupsandbox.com/oauth2/authorize - token_url: https://connect.squareupsandbox.com/oauth2/token - disable_pkce: true - authorization_params: - response_type: code - session: false - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://connect.squareupsandbox.com - docs: https://nango.dev/docs/api-integrations/squareup-sandbox - setup_guide_url: https://nango.dev/docs/api-integrations/squareup-sandbox/how-to-register-your-own-squareup-sandbox-oauth-app - -stackexchange: - display_name: Stack Exchange - categories: - - knowledge-base - - support - auth_mode: OAUTH2 - authorization_url: https://stackoverflow.com/oauth - token_url: https://stackoverflow.com/oauth/access_token/json - default_scopes: - - no_expiry - proxy: - base_url: https://api.stackexchange.com - docs: https://nango.dev/docs/integrations/all/stackexchange - -statamic: - display_name: Statamic - categories: - - cms - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.baseUrl} - headers: - authorization: Bearer ${apiKey} - docs: https://nango.dev/docs/api-integrations/statamic - docs_connect: https://nango.dev/docs/api-integrations/statamic/connect - credentials: - apiKey: - type: string - title: API token - description: The value of STATAMIC_API_AUTH_TOKEN in your Statamic .env file. - doc_section: '#step-1-enable-the-rest-api' - connection_config: - baseUrl: - type: string - title: Base URL - description: The hostname of your Statamic site. - example: mysite.example.com - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-2-find-your-base-url' - -statista: - display_name: Statista - categories: - - analytics - auth_mode: API_KEY - proxy: - base_url: https://api.statista.ai - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v1/statistics?q=* - docs: https://nango.dev/docs/integrations/all/statista - docs_connect: https://nango.dev/docs/integrations/all/statista/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Statista account - example: c5c28261f9ade4e34891ccf761491b94 - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-1-finding-your-api-key' - -stay-ai: - display_name: Stay AI - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://api.retextion.com/api - headers: - x-retextion-access-token: ${apiKey} - docs: https://nango.dev/docs/api-integrations/stay-ai - docs_connect: https://nango.dev/docs/api-integrations/stay-ai/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Stay AI API key. - example: 7k9***f-***da3e-***hjtb-***22cy - pattern: '^[a-z0-9]{7}-[a-z0-9]{7}-[a-z0-9]{7}-[a-z0-9]{7}$' - doc_section: '#step-1-create-a-new-api-key' - -stitch-mcp: - display_name: Stitch (MCP) - categories: - - design - - mcp - alias: google - default_scopes: - - https://www.googleapis.com/auth/cloud-platform - proxy: - base_url: https://stitch.googleapis.com - headers: - x-goog-user-project: ${connectionConfig.project_id} - connection_config: - project_id: - type: string - title: '' - description: '' - hidden: true - docs: https://nango.dev/docs/api-integrations/stitch-mcp - setup_guide_url: https://nango.dev/docs/api-integrations/stitch-mcp/how-to-register-your-own-stitch-mcp-api-oauth-app - -store-census: - display_name: StoreCensus - categories: - - e-commerce - - crm - auth_mode: API_KEY - proxy: - base_url: https://www.storecensus.com - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'retry-after' - verification: - method: GET - endpoints: - - /api/v1/apps?page=1&pageSize=1 - docs: https://nango.dev/docs/api-integrations/store-census - docs_connect: https://nango.dev/docs/api-integrations/store-census/connect - credentials: - apiKey: - type: string - title: API Key - description: Your StoreCensus API key. - doc_section: '#step-1-get-your-api-key' - -store-leads: - display_name: Store Leads - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://storeleads.app/json/api - headers: - authorization: Bearer ${apiKey} - retry: - at: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/store-leads - docs_connect: https://nango.dev/docs/api-integrations/store-leads/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Store Leads API key. - doc_section: '#step-1-generate-your-api-key' - pattern: '^[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{8}$' - example: a174****-****-****-****-****c6ee - -strava: - display_name: Strava (Mobile) - categories: - - social - - sports - auth_mode: OAUTH2 - authorization_url: https://www.strava.com/oauth/mobile/authorize - token_url: https://www.strava.com/api/v3/oauth/token - scope_separator: ',' - authorization_params: - response_type: code - approval_prompt: auto - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://www.strava.com - docs: https://nango.dev/docs/integrations/all/strava - -strava-web: - display_name: Strava (Web) - categories: - - social - - sports - auth_mode: OAUTH2 - authorization_url: https://www.strava.com/oauth/authorize - token_url: https://www.strava.com/api/v3/oauth/token - scope_separator: ',' - authorization_params: - response_type: code - approval_prompt: force - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://www.strava.com - docs: https://nango.dev/docs/integrations/all/strava-web - -streak: - display_name: Streak - categories: - - crm - auth_mode: BASIC - proxy: - base_url: https://api.streak.com/api - verification: - method: GET - endpoints: - - /v1/users/me - headers: - content-type: application/json - accept: application/json - webhook_routing_script: streakWebhookRouting - docs: https://nango.dev/docs/api-integrations/streak - docs_connect: https://nango.dev/docs/api-integrations/streak/connect - credentials: - username: - type: string - title: API Key - description: The API Key for your Streak account - example: 'strk_7SGgswz9ZJrNZp7iJmoAFjwdaym1' - pattern: '^strk_[A-Za-z0-9]+$' - doc_section: '#step-1-generating-your-api-key' - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -stripe: - display_name: Stripe Connect - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://connect.stripe.com/oauth/authorize - token_url: https://connect.stripe.com/oauth/token - proxy: - base_url: https://api.stripe.com - docs: https://nango.dev/docs/api-integrations/stripe - setup_guide_url: https://nango.dev/docs/api-integrations/stripe/how-to-register-your-own-stripe-api-oauth-app - -stripe-express: - display_name: Stripe Express - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://connect.stripe.com/express/oauth/authorize - token_url: https://connect.stripe.com/oauth/token - token_response_metadata: - - stripe_user_id - proxy: - base_url: https://api.stripe.com - docs: https://nango.dev/docs/integrations/all/stripe-express - -stripe-app: - display_name: Stripe App - categories: - - payment - - popular - auth_mode: OAUTH2 - authorization_url: https://marketplace.stripe.com/oauth/v2/authorize - token_url: https://api.stripe.com/v1/oauth/token - disable_pkce: true - proxy: - base_url: https://api.stripe.com - refresh_params: - grant_type: refresh_token - docs: https://nango.dev/docs/integrations/all/stripe-app - -stripe-app-sandbox: - display_name: Stripe App (Sandbox) - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://marketplace.stripe.com/oauth/v2/${connectionConfig.appDomain}/authorize - token_url: https://api.stripe.com/v1/oauth/token - disable_pkce: true - proxy: - base_url: https://api.stripe.com - refresh_params: - grant_type: refresh_token - docs: https://nango.dev/docs/integrations/all/stripe-app-sandbox - docs_connect: https://nango.dev/docs/integrations/all/stripe-app-sandbox/connect - connection_config: - appDomain: - type: string - title: App Domain - description: The unique identifier Stripe assigns to your app instance - doc_section: '#step-1-finding-your-app-domain' - -stripe-api-key: - display_name: Stripe (API Key) - categories: - - payment - auth_mode: BASIC - proxy: - base_url: https://api.stripe.com - headers: - stripe-context: ${connectionConfig.context} - docs: https://nango.dev/docs/api-integrations/stripe-api-key - docs_connect: https://nango.dev/docs/api-integrations/stripe-api-key/connect - credentials: - username: - type: string - title: Restricted API Key - description: Your Stripe restricted API Key - secret: true - example: rk_live_51On1GfAemfaBCd0eHq***************BV5007KeuAVcO - pattern: '^rk_[a-z]+_[A-Za-z0-9]{8}[A-Za-z0-9]+([A-Za-z0-9]{8})$' - doc_section: '#step-1-generating-your-stripe-restricted-api-key' - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - connection_config: - context: - type: string - title: Stripe Context - description: The Stripe account context - optional: true - example: acct_1aTnTtAAB0hHJ26p - pattern: '^acct_[A-Za-z0-9]{16}(\/acct_[A-Za-z0-9]{16})?$' - doc_section: '#step-2-finding-your-stripe-context' - -supabase: - display_name: Supabase - categories: - - dev-tools - - storage - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.projectUrl} - headers: - authorization: Bearer ${apiKey} - apikey: ${apiKey} - docs: https://nango.dev/docs/api-integrations/supabase - docs_connect: https://nango.dev/docs/api-integrations/supabase/connect - connection_config: - projectUrl: - type: string - title: Project URL - description: The Supabase project url you want to connect to. - example: project.supabase.co - format: hostname - prefix: https:// - doc_section: '#step-1-find-your-project-url' - credentials: - apiKey: - type: string - title: Secret Key - description: The secret key from your Supabase project. - example: sb_secret_*******************************hm - pattern: '^sb_secret_[A-Za-z0-9_]+$' - doc_section: '#step-2-finding-your-secret-key' - -supabase-mcp: - display_name: Supabase (MCP) - categories: - - dev-tools - - mcp - auth_mode: API_KEY - proxy: - base_url: https://mcp.supabase.com - headers: - authorization: Bearer ${apiKey} - content-type: application/json - verification: - method: POST - headers: - content-type: application/json - accept: application/json,text/event-stream - endpoints: - - /mcp?project_ref=${connectionConfig.projectRef} - data: - { - 'jsonrpc': '2.0', - 'id': 1, - 'method': 'initialize', - 'params': { 'protocolVersion': '2024-11-05', 'capabilities': {}, 'clientInfo': { 'name': 'nango-client', 'version': '1.0.0' } } - } - docs: https://nango.dev/docs/api-integrations/supabase-mcp - docs_connect: https://nango.dev/docs/api-integrations/supabase-mcp/connect - connection_config: - projectRef: - type: string - title: Project reference - description: Your Supabase project reference ID. - example: bvzzcafzoysezumrdvif - pattern: '^[a-z0-9]{20}$' - doc_section: '#step-1-finding-your-project-reference' - credentials: - apiKey: - type: string - title: Personal Access Token - description: Your Supabase account personal access token. - example: sbp_*******************************23d - pattern: '^sbp_[A-Za-z0-9]{40}$' - doc_section: '#step-2-obtaining-your-personal-access-token' - -supabase-mcp-oauth: - display_name: Supabase (MCP OAuth) - categories: - - dev-tools - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - registration_url: https://api.supabase.com/platform/oauth/apps/register - authorization_url: https://api.supabase.com/v1/oauth/authorize - token_url: https://api.supabase.com/v1/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://mcp.supabase.com - headers: - accept: application/json,text/event-stream - connection_config: - projectRef: ${connectionConfig.projectRef} - docs: https://nango.dev/docs/api-integrations/supabase-mcp-oauth - docs_connect: https://nango.dev/docs/api-integrations/supabase-mcp-oauth/connect - connection_config: - projectRef: - type: string - title: Project Reference - description: Your Supabase project reference ID. - example: bvzzcafzoysezumrdvif - pattern: '^[a-z0-9]{20}$' - doc_section: '#step-1-finding-your-project-reference' - -superhuman-mcp: - display_name: Superhuman (MCP) - categories: - - communication - - productivity - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://mcp.auth.mail.superhuman.com/oauth2/authorize - token_url: https://mcp.auth.mail.superhuman.com/oauth2/token - registration_url: https://mcp.auth.mail.superhuman.com/oauth2/register - default_scopes: - - offline_access - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://mcp.mail.superhuman.com - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/superhuman-mcp - -surecontact: - display_name: SureContact - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.surecontact.com - headers: - x-api-key: ${apiKey} - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/api-integrations/surecontact - docs_connect: https://nango.dev/docs/api-integrations/surecontact/connect - credentials: - apiKey: - type: string - title: API Key - description: Your SureContact API key. - example: jWkZ3QYFe7**********************************************qlp - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-1-create-an-api-key' - -survey-monkey: - display_name: SurveyMonkey - categories: - - surveys - auth_mode: OAUTH2 - authorization_url: https://api.surveymonkey.com/oauth/authorize - token_url: https://api.surveymonkey.com/oauth/token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://api.surveymonkey.com - docs: https://nango.dev/docs/integrations/all/survey-monkey - -swoogo: - display_name: Swoogo - categories: - - marketing - auth_mode: OAUTH2_CC - token_url: https://api.swoogo.com/api/v1/oauth2/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.swoogo.com - docs: https://nango.dev/docs/api-integrations/swoogo - docs_connect: https://nango.dev/docs/api-integrations/swoogo/connect - credentials: - client_id: - type: string - title: API Key - description: Your Swoogo API key. - doc_section: '#step-1-generate-your-api-credentials' - client_secret: - type: string - title: API Secret - description: Your Swoogo API secret. - secret: true - doc_section: '#step-1-generate-your-api-credentials' - -tailscale: - display_name: Tailscale (OAuth) - auth_mode: TWO_STEP - categories: - - dev-tools - - productivity - token_url: https://api.tailscale.com/api/v2/oauth/token - token_params: - client_id: ${credentials.clientId} - client_secret: ${credentials.clientSecret} - body_format: form - proxy: - base_url: https://api.tailscale.com/api - connection_config: - organizationName: ${connectionConfig.organizationName} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - docs: https://nango.dev/docs/integrations/all/tailscale - docs_connect: https://nango.dev/docs/integrations/all/tailscale/connect - connection_config: - organizationName: - type: string - title: Organization Name - description: Your Tailscale organization name - example: example.com - order: 1 - doc_section: '#step-1-finding-your-organization-name' - credentials: - clientId: - type: string - title: Client ID - description: Your OAuth Client ID - example: kcLBRFmtYZ11CNTRL - pattern: '^[A-Za-z0-9]+CNTRL$' - doc_section: '#step-2-generating-your-oauth-client-credentials' - clientSecret: - type: string - title: Client secret - description: Your OAuth Client secret - secret: true - example: 'tskey-client-kdC27MPR3X11CNTRL-tjtxjop8mdawckVitWkNdaBaNRtZ48GN' - pattern: '^tskey-client-[A-Za-z0-9]+CNTRL-[A-Za-z0-9]+$' - doc_section: '#step-2-generating-your-oauth-client-credentials' - -tailscale-api-key: - display_name: Tailscale (API Key) - categories: - - dev-tools - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.tailscale.com/api - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v2/tailnet/${connectionConfig.organizationName}/users - docs: https://nango.dev/docs/integrations/all/tailscale-api-key - docs_connect: https://nango.dev/docs/integrations/all/tailscale-api-key/connect - connection_config: - organizationName: - type: string - title: Organization Name - description: Your Tailscale organization name - example: example.com - order: 1 - doc_section: '#step-1-finding-your-organization-name' - credentials: - apiKey: - type: string - title: API Access Token - description: The API Access Token for your Tailscale account - example: tskey-api-k7Hpb9Lcv611CNTRL-WJ9YG52LqXJXY9oJ7RtmXJdzWkdRMgBG - pattern: '^tskey-api-[A-Za-z0-9]+CNTRL-[A-Za-z0-9]+$' - doc_section: '#step-2-generating-an-api-access-token' - -talentlms: - display_name: TalentLMS - categories: - - other - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.talentlms.com - headers: - x-api-key: ${apiKey} - x-api-version: ${connectionConfig.apiVersion} - verification: - method: GET - endpoints: - - /api/v2/users?page[size]=1 - docs: https://nango.dev/docs/api-integrations/talentlms - docs_connect: https://nango.dev/docs/api-integrations/talentlms/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of your TalentLMS account. - example: mycompany - pattern: '^[a-z0-9-]+$' - suffix: .talentlms.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-subdomain' - apiVersion: - type: string - title: '' - description: '' - default_value: '2025-01-01' - hidden: true - credentials: - apiKey: - type: string - title: API Key - description: Your TalentLMS API key. - doc_section: '#step-2-finding-your-api-key' - -tally: - display_name: Tally - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.tally.so - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /forms?limit=1 - docs: https://nango.dev/docs/api-integrations/tally - docs_connect: https://nango.dev/docs/api-integrations/tally/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Tally API key. - pattern: '^tly-[A-Za-z0-9]{32}$' - example: tly-84m**************************56Y - doc_section: '#step-1-create-an-api-key' - -tapclicks: - display_name: TapClicks - auth_mode: OAUTH2_CC - categories: - - marketing - - analytics - token_url: https://api.tapclicks.com/oauth/accesstoken - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.tapclicks.com/v2 - docs: https://nango.dev/docs/integrations/all/tapclicks - docs_connect: https://nango.dev/docs/integrations/all/tapclicks/connect - -tableau: - display_name: Tableau (PAT) - categories: - - analytics - auth_mode: TWO_STEP - token_url: https://${connectionConfig.hostname}/api/${connectionConfig.version}/auth/signin - proxy: - headers: - accept: application/json - content-type: application/json - x-tableau-auth: ${accessToken} - base_url: https://${connectionConfig.hostname}/api/${connectionConfig.version} - token_params: - credentials: - personalAccessTokenName: ${credentials.pat} - personalAccessTokenSecret: ${credentials.secret} - site: - contentUrl: ${credentials.contentUrl} - token_headers: - content-type: application/json - accept: application/json - token_response: - token: credentials.token - token_expiration: credentials.estimatedTimeToExpiration - token_expiration_strategy: expireAt - docs: https://nango.dev/docs/integrations/all/tableau - docs_connect: https://nango.dev/docs/integrations/all/tableau/connect - credentials: - pat: - type: string - title: Personal Access Token - description: Your Personal Access Token - doc_section: '#step-2-generating-your-personal-access-token' - secret: - type: string - title: Personal Access Token Secret - description: Your Personal Access Token Secret - secret: true - doc_section: '#step-2-generating-your-personal-access-token' - contentUrl: - type: string - title: Content Url - optional: true - example: test-eaec4a3fe2 - doc_section: '#step-5-finding-your-content-url' - description: Your content URL - connection_config: - hostname: - type: string - title: HostName - description: The domain of your Tableau instance - format: hostname - order: 1 - example: dub01.online.tableau.com - doc_section: '#step-3-finding-your-hostname' - prefix: https:// - version: - type: string - title: API Version - order: 2 - example: '3.26' - doc_section: '#step-4-finding-your-api-version' - description: The version of the Tableau API to use - -tanium: - display_name: Tanium - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.hostname}/api - headers: - session: ${apiKey} - content-type: application/json - verification: - method: GET - endpoints: - - /v2/session/current - docs: https://nango.dev/docs/api-integrations/tanium - docs_connect: https://nango.dev/docs/api-integrations/tanium/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Tanium API token. - doc_section: '#step-1-generate-an-api-token' - connection_config: - hostname: - type: string - title: Hostname - description: Your Tanium Cloud API hostname. - example: acme-api.cloud.tanium.com - format: hostname - prefix: https:// - doc_section: '#step-2-find-your-hostname' - order: 1 - -teamtailor: - display_name: Teamtailor - categories: - - ats - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.extension}.teamtailor.com - retry: - after: - - 'x-rate-limit-reset' - headers: - authorization: Token token=${apiKey} - x-api-version: '20210218' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/users - docs: https://nango.dev/docs/integrations/all/teamtailor - connection_config: - extension: - type: string - title: Teamtailor Domain - description: The subdomain of your Teamtailor instance - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .teamtailor.com - prefix: https:// - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Teamtailor account - -teamleader: - display_name: Teamleader Focus - categories: - - invoicing - - crm - auth_mode: OAUTH2 - authorization_url: https://focus.teamleader.eu/oauth2/authorize - token_url: https://focus.teamleader.eu/oauth2/access_token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - retry: - at: - - 'x-ratelimit-reset' - base_url: https://api.focus.teamleader.eu - docs: https://nango.dev/docs/integrations/all/teamleader - -teamwork: - display_name: Teamwork - categories: - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://www.teamwork.com/launchpad/login - token_url: https://www.teamwork.com/launchpad/v1/token.json - token_response_metadata: - - installation.apiEndPoint - proxy: - base_url: ${connectionConfig.installation.apiEndPoint} - docs: https://nango.dev/docs/integrations/all/teamwork - -telegram: - display_name: Telegram - categories: - - communication - auth_mode: API_KEY - proxy: - base_url: https://api.telegram.org/bot${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /getMe - docs: https://nango.dev/docs/api-integrations/telegram - docs_connect: https://nango.dev/docs/api-integrations/telegram/connect - credentials: - apiKey: - type: string - title: Bot Token - description: Your Telegram Bot token from @BotFather. - example: 1234567890:ABCdefGHIjklMNOpqrSTUvwxYZ1234567 - pattern: '^[0-9]+:[a-zA-Z0-9_-]+$' - doc_section: '#step-1-creating-your-telegram-bot' - -tempo: - display_name: Tempo - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://api.tempo.io/oauth/authorize/redirect - token_url: https://api.tempo.io/oauth/token/ - disable_pkce: true - authorization_params: - jira_url: https://${connectionConfig.jiraSubdomain}.atlassian.net - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.tempo.io - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/tempo - setup_guide_url: https://nango.dev/docs/api-integrations/tempo/how-to-register-your-own-tempo-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/tempo/connect - connection_config: - jiraSubdomain: - type: string - title: Jira Cloud Subdomain - description: The subdomain of your Jira Cloud instance. - example: acme - pattern: '^[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?$' - doc_section: '#step-1-find-your-jira-cloud-subdomain' - order: 2 - subdomain: - type: string - title: API Subdomain - description: The subdomain of the Tempo API. - enum: - - api - - api.eu - - api.us - doc_section: '#step-2-find-your-api-subdomain' - order: 1 - -the-swarm: - display_name: The Swarm - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://bee.theswarm.com - headers: - x-api-key: ${apiKey} - verification: - method: POST - endpoints: - - /v2/profiles/search - headers: - content-type: application/json - data: - query: - match_all: {} - limit: 1 - docs: https://nango.dev/docs/api-integrations/the-swarm - docs_connect: https://nango.dev/docs/api-integrations/the-swarm/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Swarm API key from Team Settings. - example: aB3cD9eF************************wX6yZ2 - pattern: '^[a-zA-Z0-9]+$' - doc_section: '#step-1-get-your-api-key' - -theirstack: - display_name: TheirStack - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.theirstack.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v0/billing/credit-balance - docs: https://nango.dev/docs/api-integrations/theirstack - docs_connect: https://nango.dev/docs/api-integrations/theirstack/connect - credentials: - apiKey: - type: string - title: API Key - description: Your TheirStack API key. - example: eyJhbGci*******.eyJ2ZX********.kWB5******** - pattern: '^eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' - doc_section: '#step-1-generate-your-api-key' - -thomson-reuters-legal-tracker: - display_name: Thomson Reuters Legal Tracker - categories: - - legal - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.hostname}/onepass/oauth2/token - token_headers: - content-type: application/x-www-form-urlencoded - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.hostname}/legal-tracker - docs: https://nango.dev/docs/api-integrations/thomson-reuters-legal-tracker - docs_connect: https://nango.dev/docs/api-integrations/thomson-reuters-legal-tracker/connect - connection_config: - hostname: - type: string - title: Hostname - description: The regional API hostname for your Thomson Reuters account. - enum: - - api.thomsonreuters.com - - api.thomsonreuters.co.uk - - api.thomsonreuters.ca - - api.thomsonreuters.au - order: 1 - credentials: - client_id: - type: string - title: Client ID - description: The client ID from the App Management. - doc_section: '#step-1-obtain-your-client-credentials' - client_secret: - type: string - title: Client Secret - description: The client secret from the App Management. - secret: true - doc_section: '#step-1-obtain-your-client-credentials' - -thomson-reuters-legal-tracker-tr-account: - display_name: Thomson Reuters Legal Tracker (TR Account) - alias: thomson-reuters-legal-tracker - categories: - - legal - auth_mode: OAUTH2_CC - token_url: https://auth.thomsonreuters.com/oauth/token - token_request_auth_method: basic - token_headers: - content-type: application/x-www-form-urlencoded - token_params: - grant_type: client_credentials - audience: 506f6a92-4fd1-43c1-bf18-4e3735ea55aa - docs: https://nango.dev/docs/api-integrations/thomson-reuters-legal-tracker-tr-account - docs_connect: https://nango.dev/docs/api-integrations/thomson-reuters-legal-tracker-tr-account/connect - credentials: - client_id: - type: string - title: Client ID - description: Your TR Account client ID. - doc_section: '#step-1-obtain-your-client-credentials' - client_secret: - type: string - title: Client Secret - description: Your TR Account client secret. - secret: true - doc_section: '#step-1-obtain-your-client-credentials' - -terraform: - display_name: Terraform - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://app.terraform.io - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'x-ratelimit-reset' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v2/organizations - docs: https://nango.dev/docs/integrations/all/terraform - docs_connect: https://nango.dev/docs/integrations/all/terraform/connect - credentials: - apiKey: - type: string - title: API Token - description: The API Token for your Terraform account - doc_section: '#step-1-generating-your-api-token' - example: VbQo**************************** - pattern: '^[a-zA-Z0-9.]{50,}$' - -ticktick: - display_name: TickTick - categories: - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://ticktick.com/oauth/authorize - token_url: https://ticktick.com/oauth/token - scope_separator: ' ' - proxy: - base_url: https://api.ticktick.com - docs: https://nango.dev/docs/integrations/all/ticktick - -tiktok-accounts: - display_name: TikTok Accounts - categories: - - social - auth_mode: OAUTH2 - authorization_url: https://www.tiktok.com/v2/auth/authorize/ - token_url: https://business-api.tiktok.com/open_api/v1.3/tt_user/oauth2/token/ - refresh_url: https://business-api.tiktok.com/open_api/v1.3/tt_user/oauth2/refresh_token/ - proxy: - base_url: https://business-api.tiktok.com/open_api/v1.3/ - authorization_params: - response_type: code - authorization_url_replacements: - client_id: client_key - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - scope_separator: ',' - docs: https://nango.dev/docs/integrations/all/tiktok-accounts - -tiktok-ads: - display_name: TikTok Ads - categories: - - social - auth_mode: OAUTH2 - authorization_url: https://business-api.tiktok.com/portal/auth - token_url: https://business-api.tiktok.com/open_api/v1.3/oauth2/access_token/ - proxy: - base_url: https://business-api.tiktok.com/open_api/v1.3/ - headers: - access-token: ${accessToken} - token_params: - grant_type: authorization_code - authorization_url_replacements: - client_id: app_id - docs: https://nango.dev/docs/integrations/all/tiktok-ads - -tiktok-personal: - display_name: TikTok Personal - categories: - - social - auth_mode: OAUTH2 - authorization_url: https://www.tiktok.com/v2/auth/authorize/ - token_url: https://open.tiktokapis.com/v2/oauth/token/ - proxy: - base_url: https://open.tiktokapis.com - retry: - at: - - 'x-ratelimit-reset' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - body_format: form - scope_separator: ',' - authorization_url_replacements: - client_id: client_key - docs: https://nango.dev/docs/integrations/all/tiktok-personal - -timely: - display_name: Timely - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://api.timelyapp.com/1.1/oauth/authorize - token_url: https://api.timelyapp.com/1.1/oauth/token - disable_pkce: true - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://api.timelyapp.com - docs: https://nango.dev/docs/integrations/all/timely - -thrivecart-oauth: - display_name: ThriveCart (OAuth) - categories: - - e-commerce - - payment - auth_mode: OAUTH2 - authorization_url: https://thrivecart.com/authorization/new - token_url: https://thrivecart.com/authorization/token - scope_separator: ' ' - proxy: - base_url: https://thrivecart.com/api/external - docs: https://nango.dev/docs/integrations/all/thrivecart-oauth - -thrivecart-api-key: - display_name: ThriveCart (API Key) - categories: - - e-commerce - - payment - auth_mode: API_KEY - proxy: - base_url: https://thrivecart.com/api/external - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /ping - docs: https://nango.dev/docs/integrations/all/thrivecart-api-key - credentials: - apiKey: - type: string - title: API Key - description: The API key for your ThriveCart account - example: 'ASYDV5S8-0BSO1SH2-4BH5PO7U-YF8SV3CZ' - pattern: '^[A-Z0-9]{8}-[A-Z0-9]{10}-[A-Z0-9]{8}-[A-Z0-9]{8}$' - -trakstar-hire: - display_name: Trakstar Hire - categories: - - ats - auth_mode: BASIC - proxy: - base_url: https://api.recruiterbox.com - verification: - method: GET - endpoints: - - /v2/openings - headers: - content-type: application/json - docs: https://nango.dev/docs/integrations/all/trakstar-hire - docs_connect: https://nango.dev/docs/integrations/all/trakstar-hire/connect - credentials: - username: - type: string - title: API Key - description: Your Trakstar API Key - pattern: '^[a-f0-9]+$' - example: a3f8b92c4d6e715f0a1b3c4d5e6f7890 - doc_section: '#step-1-generating-your-api-key' - password: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -trafft: - display_name: Trafft - categories: - - productivity - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.subdomain}.admin.trafft.com/api/v2/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.subdomain}.admin.trafft.com/api - docs: https://nango.dev/docs/integrations/all/trafft - docs_connect: https://nango.dev/docs/integrations/all/trafft/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of your Trafft instance - example: subdomain - format: hostname - prefix: https:// - suffix: .admin.trafft.com - doc_section: '#step-1-access-api-settings' - credentials: - client_id: - type: string - title: Client ID - description: Your Trafft OAuth2 Client ID. - doc_section: '#step-2-get-your-credentials' - client_secret: - type: string - title: Client Secret - description: Your Trafft OAuth2 Client Secret. - secret: true - doc_section: '#step-2-get-your-credentials' - -tremendous: - display_name: Tremendous - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://api.tremendous.com/oauth/authorize - token_url: https://api.tremendous.com/oauth/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.tremendous.com/api/v2 - docs: https://nango.dev/docs/integrations/all/tremendous - -tremendous-sandbox: - display_name: Tremendous (Sandbox) - categories: - - payment - auth_mode: OAUTH2 - authorization_url: https://testflight.tremendous.com/oauth/authorize - token_url: https://testflight.tremendous.com/oauth/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://testflight.tremendous.com/api/v2 - docs: https://nango.dev/docs/integrations/all/tremendous-sandbox - -perk: - display_name: Perk - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://app.travelperk.com/oauth2/authorize/ - token_url: https://app.travelperk.com/accounts/oauth2/token/ - disable_pkce: true - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.travelperk.com - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/api-integrations/perk - setup_guide_url: https://nango.dev/docs/api-integrations/perk/how-to-register-your-own-perk-api-oauth-app - -trello: - display_name: Trello - categories: - - productivity - - ticketing - auth_mode: OAUTH1 - request_url: https://trello.com/1/OAuthGetRequestToken - authorization_url: https://trello.com/1/OAuthAuthorizeToken - token_url: https://trello.com/1/OAuthGetAccessToken - signature_method: 'HMAC-SHA1' - scope_separator: ',' - authorization_params: - expiration: never - proxy: - base_url: https://api.trello.com - docs: https://nango.dev/docs/integrations/all/trello - -trello-scim: - display_name: Trello (SCIM API) - categories: - - productivity - - ticketing - auth_mode: API_KEY - proxy: - base_url: https://trello.com/scim - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/users?sortBy=displayName&count=10 - docs: https://nango.dev/docs/integrations/all/trello-scim - docs_connect: https://nango.dev/docs/integrations/all/trello-scim/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Trello scim account - doc_section: '#step-1-finding-your-trello-api-key' - -tldv: - display_name: tl;dv - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://pasta.tldv.io - headers: - x-api-key: ${apiKey} - docs: https://nango.dev/docs/integrations/all/tldv - docs_connect: https://nango.dev/docs/integrations/all/tldv/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your tl;dv account - doc_section: '#step-1-finding-your-api-key' - -trigify-io-mcp: - display_name: Trigify IO (MCP) - categories: - - dev-tools - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://clerk.trigify.io/oauth/authorize - token_url: https://clerk.trigify.io/oauth/token - registration_url: https://clerk.trigify.io/oauth/register - default_scopes: - - offline_access - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.trigify.io - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/trigify-io-mcp - -trigger-dev: - display_name: Trigger.dev - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.baseUrl} - headers: - authorization: Bearer ${apiKey} - connection_config: - environment: ${connectionConfig.environment} - projectRef: ${connectionConfig.projectRef} - triggerBranch: ${connectionConfig.triggerBranch} - docs: https://nango.dev/docs/api-integrations/trigger-dev - docs_connect: https://nango.dev/docs/api-integrations/trigger-dev/connect - connection_config: - baseUrl: - type: string - title: Hostname - description: The API hostname. - example: api.trigger.dev - format: hostname - prefix: https:// - order: 1 - doc_section: '#step-4-set-your-base-url' - projectRef: - type: string - title: Project Ref - description: Your Trigger.dev project identifier. - example: proj_1234567890 - optional: true - doc_section: '#step-2-find-your-project-ref' - environment: - type: string - title: Environment - description: The target environment. - example: prod - optional: true - doc_section: '#step-3-find-your-environment' - triggerBranch: - type: string - title: Preview Branch - description: Target a specific preview branch for environment variable operations. - example: feature-xyz - optional: true - doc_section: '#step-5-set-your-preview-branch' - credentials: - apiKey: - type: string - title: Secret Key - description: Your Trigger.dev secret key or personal access token. - pattern: '^tr_(dev|prod|stg|preview|pat)_[a-zA-Z0-9]+$' - example: tr_dev_******************** - doc_section: '#step-1-get-your-secret-key-or-personal-access-token' - -triple-whale: - display_name: Triple Whale - categories: - - analytics - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.triplewhale.com - headers: - x-api-key: ${apiKey} - accept: application/json - verification: - method: GET - headers: - accept: application/json - content-type: application/json - endpoints: - - /api/v2/users/api-keys/me - docs: https://nango.dev/docs/api-integrations/triple-whale - docs_connect: https://nango.dev/docs/api-integrations/triple-whale/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Triple Whale API key. - example: 5ab87915-2deb-429c-a1e2-8b0495900f45 - format: uuid - doc_section: '#step-1-generating-your-api-key' - -tsheetsteam: - display_name: TSheets - categories: - - hr - - productivity - auth_mode: OAUTH2 - authorization_url: https://rest.tsheets.com/api/v1/authorize - token_url: https://rest.tsheets.com/api/v1/grant - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://rest.tsheets.com/api/v1 - docs: https://nango.dev/docs/integrations/all/tsheetsteam - -timify: - display_name: Timify - categories: - - productivity - auth_mode: TWO_STEP - body_format: json - token_url: https://${connectionConfig.subdomain}.timify.com/v1/auth/token - refresh_url: https://${connectionConfig.subdomain}.timify.com/v1/auth/refreshtoken - token_params: - appid: ${credentials.appId} - appsecret: ${credentials.appSecret} - refresh_token_params: - refreshtoken: ${refresh_token} - token_headers: - content-type: application/json - accept: application/json - token_response: - token: accessToken - token_expiration: expires - token_expiration_strategy: expireIn - refresh_token: refreshToken - proxy: - base_url: https://${connectionConfig.subdomain}.timify.com - headers: - authorization: ${accessToken} - docs: https://nango.dev/docs/api-integrations/timify - docs_connect: https://nango.dev/docs/api-integrations/timify/connect - connection_config: - subdomain: - type: string - title: Timify Subdomain - description: The subdomain of your Timify API. - pattern: '^[a-z0-9_-]+$' - example: api - order: 1 - suffix: .timify.com - prefix: https:// - doc_section: '#step-1-finding-your-subdomain' - credentials: - appId: - type: string - title: App ID - description: Your Timify app ID - doc_section: '#step-3-getting-your-credentials' - appSecret: - type: string - title: App Secret - description: Your Timify app secret - secret: true - doc_section: '#step-3-getting-your-credentials' - -toast: - display_name: Toast - categories: - - erp - auth_mode: TWO_STEP - body_format: json - token_url: https://${connectionConfig.subdomain}.toasttab.com/authentication/v1/authentication/login - token_params: - clientId: ${credentials.clientId} - clientSecret: ${credentials.clientSecret} - userAccessType: TOAST_MACHINE_CLIENT - token_headers: - content-type: application/json - token_response: - token: token.accessToken - token_expiration: token.expiresIn - token_expiration_strategy: expireIn - token_expiration_buffer: 60 - proxy: - base_url: https://${connectionConfig.subdomain}.toasttab.com - headers: - toast-restaurant-external-id: ${connectionConfig.restaurantId} - docs: https://nango.dev/docs/api-integrations/toast - docs_connect: https://nango.dev/docs/api-integrations/toast/connect - connection_config: - subdomain: - type: string - title: API Subdomain - description: The Toast API subdomain for your environment. - example: ws-api - pattern: '^[a-z0-9-]+$' - order: 1 - restaurantId: - type: string - title: Restaurant External ID - description: The Toast GUID for the restaurant to connect to. - example: 4721e7a9-b4ae-4fef-9230-b3dae186e0a4 - format: uuid - optional: true - credentials: - clientId: - type: string - title: Client ID - description: Your Toast API client identifier. - clientSecret: - type: string - title: Client Secret - description: Your Toast API client secret. - secret: true - -todoist: - display_name: Todoist - categories: - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://todoist.com/oauth/authorize - token_url: https://todoist.com/oauth/access_token - scope_separator: ',' - proxy: - base_url: https://api.todoist.com - docs: https://nango.dev/docs/integrations/all/todoist - -toggl: - display_name: Toggl Track - categories: - - productivity - auth_mode: BASIC - proxy: - base_url: https://api.track.toggl.com - verification: - method: GET - endpoints: - - /api/v9/me - retry: - after: - - 'x-toggl-quota-resets-in' - docs: https://nango.dev/docs/api-integrations/toggl - docs_connect: https://nango.dev/docs/api-integrations/toggl/connect - credentials: - username: - type: string - title: Email or API token - description: Your Toggl Track account email, or your API token when using token-based Basic Auth. - doc_section: '#step-1-choose-emailpassword-or-api-token' - password: - type: string - title: Password or api_token - description: Your Toggl Track account password, or the literal text api_token when authenticating with an API token. - secret: true - doc_section: '#step-1-choose-emailpassword-or-api-token' - -torii: - display_name: Torii - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.toriihq.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1.0/orgs/my - retry: - at: - - 'x-rate-limit-reset' - docs: https://nango.dev/docs/api-integrations/torii - docs_connect: https://nango.dev/docs/api-integrations/torii/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Torii account - doc_section: '#step-1-generating-your-api-key' - -tumblr: - display_name: Tumblr - categories: - - social - - communication - auth_mode: OAUTH2 - authorization_url: https://www.tumblr.com/oauth2/authorize - token_url: https://api.tumblr.com/v2/oauth2/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.tumblr.com/v2 - docs: https://nango.dev/docs/integrations/all/tumblr - -twitch: - display_name: Twitch - categories: - - gaming - - social - - sports - - video - auth_mode: OAUTH2 - authorization_url: https://id.twitch.tv/oauth2/authorize - token_url: https://id.twitch.tv/oauth2/token - authorization_params: - force_verify: false - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.twitch.tv - docs: https://nango.dev/docs/integrations/all/twitch - -twitter: - display_name: Twitter (v1) - categories: - - marketing - - social - auth_mode: OAUTH1 - request_url: https://api.twitter.com/oauth/request_token - authorization_url: https://api.twitter.com/oauth/authorize - token_url: https://api.twitter.com/oauth/access_token - signature_method: 'HMAC-SHA1' - request_params: - x_auth_access_type: write - proxy: - base_url: https://api.twitter.com - docs: https://nango.dev/docs/integrations/all/twitter -twitter-v2: - display_name: Twitter (v2) - categories: - - marketing - - social - auth_mode: OAUTH2 - authorization_url: https://x.com/i/oauth2/authorize - token_url: https://api.twitter.com/2/oauth2/token - token_request_auth_method: basic - authorization_params: - response_type: code - response_mode: query - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - default_scopes: - - offline.access - proxy: - base_url: https://api.twitter.com - docs: https://nango.dev/docs/api-integrations/twitter-v2 - setup_guide_url: https://nango.dev/docs/api-integrations/twitter-v2/how-to-register-your-own-twitter-v2-api-oauth-app -twitter-oauth2-cc: - display_name: Twitter (Client Credentials) - categories: - - marketing - - social - auth_mode: OAUTH2_CC - token_url: https://api.twitter.com/oauth2/token - token_request_auth_method: basic - scope_separator: ' ' - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.twitter.com - docs: https://nango.dev/docs/integrations/all/twitter-oauth2-cc - -twinfield: - display_name: Twinfield - categories: - - accounting - auth_mode: OAUTH2 - authorization_url: https://login.twinfield.com/auth/authentication/connect/authorize - token_url: https://login.twinfield.com/auth/authentication/connect/token - authorization_params: - response_type: code - nonce: AnotherRandomStringTwinfield - refresh_params: - grant_type: refresh_token - scope_separator: ' ' - default_scopes: - - openid - - twf.user - - twf.organisation - - twf.organisationUser - - offline_access - disable_pkce: true - proxy: - base_url: https://${connectionConfig.cluster}.twinfield.com - docs: https://nango.dev/docs/integrations/all/twinfield - connection_config: - cluster: - type: string - title: Twinfield Cluster - description: The cluster to your Twinfield instance - pattern: '^[a-z0-9_-]+$' - example: accounting - suffix: .twinfield.com - prefix: https:// - -twenty-crm: - display_name: Twenty CRM - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://api.twenty.com/rest - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'retry-after' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /companies - docs: https://nango.dev/docs/integrations/all/twenty-crm - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Twenty CRM account - example: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyMTIxMjEyMS0yNmExLTRkODktYjQ2YS0wNDI0NTViODM3N2YiLCJ0eXBlIjoiQVBJX0tFWSIsIndvcmtzcGFjZUlkIjoiMjEyMTIxMjEtMjZhMS00ZDg5LWI0NmEtMDQyNDU1YjgzNzdmIiwiaWF0IjoxNzMxMzA5MzQwLCJleHAiOjQ4ODQ5MDU3MzksImp0aSI6ImVmZTg4MjcxLTM4OWItNDk5Mi04MjYwLWZjNGIxZmYxYjRiMSJ9.n3tohFIEBBRMsyas_agbh3-KvKXYUnjyhrYzTHYC3vc' - pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' - -twenty-crm-self-hosted: - display_name: Twenty CRM (Self Hosted) - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.domain}/rest - headers: - authorization: Bearer ${apiKey} - retry: - after: - - 'retry-after' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /companies - docs: https://nango.dev/docs/integrations/all/twenty-crm-self-hosted - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Twenty CRM account - example: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyMTIxMjEyMS0yNmExLTRkODktYjQ2YS0wNDI0NTViODM3N2YiLCJ0eXBlIjoiQVBJX0tFWSIsIndvcmtzcGFjZUlkIjoiMjEyMTIxMjEtMjZhMS00ZDg5LWI0NmEtMDQyNDU1YjgzNzdmIiwiaWF0IjoxNzMxMzA5MzQwLCJleHAiOjQ4ODQ5MDU3MzksImp0aSI6ImVmZTg4MjcxLTM4OWItNDk5Mi04MjYwLWZjNGIxZmYxYjRiMSJ9.n3tohFIEBBRMsyas_agbh3-KvKXYUnjyhrYzTHYC3vc' - pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' - connection_config: - domain: - type: string - title: Twenty CRM domain - description: The domain of your Twnety CRM instance - pattern: '^[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' - example: domain - -twilio: - display_name: Twilio - categories: - - dev-tools - - communication - auth_mode: BASIC - proxy: - base_url: https://api.twilio.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /2010-04-01/Accounts/${credentials.username}/Messages.json - docs: https://nango.dev/docs/integrations/all/twilio - docs_connect: https://nango.dev/docs/integrations/all/twilio/connect - credentials: - username: - type: string - title: Account SID - description: Your Twilio Account SID - pattern: '^AC[a-zA-Z0-9]{32}$' - doc_section: '#step-1-finding-your-account-sid' - password: - type: string - title: Auth Token - description: Your Twilio Auth Token - secret: true - doc_section: '#step-2-finding-your-auth-token' - -typeform: - display_name: Typeform - categories: - - surveys - auth_mode: OAUTH2 - authorization_url: https://api.typeform.com/oauth/authorize - token_url: https://api.typeform.com/oauth/token - disable_pkce: true - default_scopes: - - offline - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.typeform.com - docs: https://nango.dev/docs/integrations/all/typeform - -typefully: - display_name: Typefully - categories: - - analytics - - communication - - social - auth_mode: API_KEY - proxy: - base_url: https://api.typefully.com - headers: - x-api-key: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/notifications/ - docs: https://nango.dev/docs/integrations/all/typefully - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Typefully account - -typefully-v2: - display_name: Typefully (API v2) - categories: - - analytics - - communication - - social - auth_mode: API_KEY - proxy: - base_url: https://api.typefully.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v2/me - retry: - at: - - 'x-ratelimit-user-reset' - - 'x-ratelimit-socialset-reset' - docs: https://nango.dev/docs/api-integrations/typefully-v2 - docs_connect: https://nango.dev/docs/api-integrations/typefully-v2/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Typefully v2 API key. - example: 'aNVlyR********************YxeIDz' - pattern: '^[A-Za-z0-9]{32}$' - doc_section: '#step-1-generating-your-api-key' - -uber: - display_name: Uber - categories: - - other - auth_mode: OAUTH2 - authorization_url: https://login.uber.com/oauth/v2/authorize - token_url: https://login.uber.com/oauth/v2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.uber.com - docs: https://nango.dev/docs/integrations/all/uber - -ukg-pro-wfm: - display_name: UKG Pro (Workforce Management) - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://welcome-us.ukg.net/authorize - token_url: https://welcome-us.ukg.net/oauth/token - scope_separator: ' ' - authorization_params: - response_type: code - audience: https://wfm.ukg.net/api - realm: ${connectionConfig.tenantName} - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.hostname}/api - docs: https://nango.dev/docs/integrations/all/ukg-pro-wfm - docs_connect: https://nango.dev/docs/integrations/all/ukg-pro-wfm/connect - connection_config: - hostname: - type: string - title: Tenant URL - description: The tenant URL of your UKG Pro instance - format: hostname - example: wfm.us1.ukg.com - suffix: /api - prefix: https:// - doc_section: '#step-1-finding-your-tenant-url-and-tenant-name' - tenantName: - type: string - title: Tenant Name - description: The tenant name of your UKG Pro instance - example: wfm - doc_section: '#step-1-finding-your-tenant-url-and-tenant-name' - -ukg-pro: - display_name: UKG Pro - categories: - - hr - - popular - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.hostname} - headers: - content-type: application/json - us-customer-api-key: ${connectionConfig.customerApiKey} - docs: https://nango.dev/docs/integrations/all/ukg-pro - docs_connect: https://nango.dev/docs/integrations/all/ukg-pro/connect - credentials: - username: - type: string - title: Service Account Username - description: The username for your UKG Pro service account - doc_section: '#step-2-creating-a-web-service-account' - password: - type: string - title: Service Account Password - description: The password generated for your UKG Pro service account - doc_section: '#step-2-creating-a-web-service-account' - secret: true - connection_config: - customerApiKey: - type: string - order: 2 - title: Customer API Key - description: Your UKG Pro Customer API Key found in Service Account Administration - doc_section: '#step-1-finding-your-customer-api-key' - secret: true - hostname: - type: string - order: 1 - title: Hostname - description: The tenant URL of your UKG Pro instance - format: hostname - example: servicet.ultipro.com - prefix: https:// - doc_section: '#step-3-finding-your-hostname' - -ukg-pro-cc: - display_name: UKG Pro HCM (Client Credentials) - categories: - - hr - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.identityServer}/signin/oauth2/t/${connectionConfig.tenantId}/access_token - body_format: form - token_headers: - content-type: application/x-www-form-urlencoded - accept: application/json - token_params: - grant_type: client_credentials - proxy: - retry: - after: - - 'retry-after' - base_url: https://${connectionConfig.hostname} - docs: https://nango.dev/docs/api-integrations/ukg-pro-cc - docs_connect: https://nango.dev/docs/api-integrations/ukg-pro-cc/connect - credentials: - client_id: - type: string - title: Client ID - description: Unique identifier of the identity client provided by UKG customer support. - doc_section: '#step-1-getting-the-credentials-from-ukg-support' - client_secret: - type: string - title: Client Secret - description: Client secret associated with the client ID provided by UKG customer support. - secret: true - doc_section: '#step-1-getting-the-credentials-from-ukg-support' - connection_config: - identityServer: - type: string - title: Identity Server - description: Identity server for your tenant. - format: hostname - example: signin.ukg.net - order: 1 - doc_section: '#step-1-getting-the-credentials-from-ukg-support' - tenantId: - type: string - title: Tenant - description: Tenant value from your UKG Pro Recruiting URL. - example: UO32145HGOGOG - pattern: '^[a-zA-Z0-9]+$' - order: 3 - doc_section: '#step-2-identify-tenant-and-recruiting-application-domain' - hostname: - type: string - title: Recruiting Application Domain - description: Recruiting application domain from your UKG Pro Recruiting URL. - format: hostname - example: recruiting.example.ultipro.com - prefix: https:// - order: 2 - doc_section: '#step-2-identify-tenant-and-recruiting-application-domain' - -ukg-ready: - display_name: UKG Ready - categories: - - hr - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.hostname}/ta/rest/v2/companies/${connectionConfig.realmId}/oauth2/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.hostname} - docs: https://nango.dev/docs/integrations/all/ukg-ready - docs_connect: https://nango.dev/docs/integrations/all/ukg-ready/connect - connection_config: - realmId: - type: string - title: Company ID - description: A unique identifier for your company. - example: '23444234' - doc_section: '#step-3-finding-your-company-id' - hostname: - type: string - title: Hostname - description: The hostname to your UKG Ready instance - format: hostname - example: secure.us.rdy.ukg - suffix: /ta - prefix: https:// - doc_section: '#step-4-finding-your-hostname' -unanet: - display_name: Unanet - categories: - - crm - - erp - - accounting - auth_mode: BASIC - proxy: - headers: - x-compass-firm-id: ${connectionConfig.firmId} - x-compass-api-key: ${connectionConfig.apiKey} - base_url: https://compass.cosential.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/projects - docs: https://nango.dev/docs/integrations/all/unanet - docs_connect: https://nango.dev/docs/integrations/all/unanet/connect - connection_config: - firmId: - type: string - title: Firm ID - description: The firm ID of your Unanet instance - doc_section: '#step-2-finding-the-firm-id' - apiKey: - type: string - title: API Key - description: The API key of your Unanet instance - secret: true - doc_section: '#step-3-finding-the-api-key' - credentials: - username: - type: string - title: User name - description: Your Unanet username - doc_section: '#step-1-finding-username-and-password' - password: - type: string - title: Password - description: Your Unanet password - default_value: '' - doc_section: '#step-1-finding-username-and-password' - -unauthenticated: - display_name: Unauthenticated - categories: - - other - auth_mode: NONE - webhook_routing_script: unauthenticatedWebhookRouting - docs: https://nango.dev/docs/integrations/all/unauthenticated - -unipile: - display_name: Unipile - categories: - - crm - - marketing - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.subdomain}.unipile.com:${connectionConfig.port} - headers: - x-api-key: ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v1/accounts - docs: https://nango.dev/docs/integrations/all/unipile - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Unipile instance - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of your Unipile instance - pattern: '^[a-z0-9_-]+$' - example: api1 - suffix: .unipile.com - prefix: https:// - port: - type: string - title: Port - description: The port of your Unipile instance - pattern: '^[0-9]+$' - example: '13113' - -upsales: - display_name: Upsales - categories: - - crm - auth_mode: API_KEY - proxy: - base_url: https://integration.upsales.com - query: - token: ${apiKey} - retry: - at: - - 'x-ratelimit-reset' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /api/v2/users - docs: https://nango.dev/docs/api-integrations/upsales - docs_connect: https://nango.dev/docs/api-integrations/upsales/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Upsales API Token - doc_section: '#step-1-finding-your-api-token' - -vercel: - display_name: Vercel - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.vercel.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v2/user - docs: https://nango.dev/docs/api-integrations/vercel - docs_connect: https://nango.dev/docs/api-integrations/vercel/connect - credentials: - apiKey: - type: string - title: Token - description: The Token for your Vercel account. - pattern: '^vcp_[A-Za-z0-9]+$' - example: 'vcp_6ppUxFRd****r1sc53a' - doc_section: '#step-1-finding-your-token' - -vercel-mcp: - display_name: Vercel (MCP) - categories: - - dev-tools - - mcp - auth_mode: MCP_OAUTH2 - client_registration: static - authorization_url: https://vercel.com/oauth/authorize - token_url: https://vercel.com/api/login/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - default_scopes: - - offline_access - proxy: - headers: - accept: application/json,text/event-stream - base_url: https://mcp.vercel.com - docs: https://nango.dev/docs/api-integrations/vercel-mcp - setup_guide_url: https://nango.dev/docs/api-integrations/vercel-mcp/how-to-register-your-own-vercel-mcp-oauth-app - -vimeo: - display_name: Vimeo (OAuth) - categories: - - video - auth_mode: OAUTH2 - authorization_url: https://api.vimeo.com/oauth/authorize - token_url: https://api.vimeo.com/oauth/access_token - token_request_auth_method: basic - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://api.vimeo.com - docs: https://nango.dev/docs/integrations/all/vimeo - -vimeo-basic: - display_name: Vimeo (Basic Auth) - categories: - - video - auth_mode: BASIC - proxy: - base_url: https://api.vimeo.com - verification: - method: GET - headers: - content-type: application/json - endpoints: - - / - docs: https://nango.dev/docs/integrations/all/vimeo-basic - -valley-api-key: - display_name: Valley (API Key) - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.joinvalley.co/api - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v1/auth/verify-api-key - retry: - at: - - 'x-ratelimit-reset' - docs: https://nango.dev/docs/integrations/all/valley-api-key - docs_connect: https://nango.dev/docs/integrations/all/valley-api-key/connect - credentials: - apiKey: - type: string - title: API Key - example: valley_a3f4c8d2e1b9a7**********************************************c5d8e2f1 - pattern: '^valley_[a-f0-9]{64}$' - description: The API key for your Valley account - doc_section: '#step-1-verifying-your-api-key' - -valley: - display_name: Valley (OAuth) - categories: - - marketing - auth_mode: TWO_STEP - body_format: json - token_url: https://api.joinvalley.co/api/v1/auth/get-token - refresh_url: https://api.joinvalley.co/api/v1/auth/refresh-token - token_params: - email: ${credentials.email} - password: ${credentials.password} - refresh_token_params: - refresh_token: ${refresh_token} - token_headers: - content-type: application/json - proxy: - base_url: https://api.joinvalley.co/api/ - headers: - authorization: Bearer ${accessToken} - retry: - at: - - 'x-ratelimit-reset' - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - refresh_token: refresh_token - docs: https://nango.dev/docs/integrations/all/valley - docs_connect: https://nango.dev/docs/integrations/all/valley/connect - credentials: - email: - type: string - title: Email - description: Your Valley email address - format: email - doc_section: '#step-1-getting-your-credentials' - password: - type: string - title: Password - description: Your Valley password - doc_section: '#step-1-getting-your-credentials' - -vanta: - display_name: Vanta - categories: - - dev-tools - auth_mode: OAUTH2_CC - token_url: https://api.vanta.com/oauth/token - token_params: - grant_type: client_credentials - body_format: json - proxy: - base_url: https://api.vanta.com - docs: https://nango.dev/docs/api-integrations/vanta - docs_connect: https://nango.dev/docs/api-integrations/vanta/connect - -veeva-vault: - display_name: Veeva Vault - categories: - - crm - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.subdomain}.veevavault.com/api/${connectionConfig.version}/auth - token_params: - username: ${credentials.username} - password: ${credentials.password} - token_headers: - content-type: application/x-www-form-urlencoded - accept: application/json - token_response: - token: sessionId - proxy: - base_url: https://${connectionConfig.subdomain}.veevavault.com/api/${connectionConfig.version} - headers: - authorization: ${accessToken} - accept: application/json - docs: https://nango.dev/docs/api-integrations/veeva-vault - docs_connect: https://nango.dev/docs/api-integrations/veeva-vault/connect - credentials: - username: - type: string - title: Username - description: Your Vault user name assigned by your administrator - doc_section: '#step-2-obtaining-your-credentials' - password: - type: string - title: Password - description: Your Vault password associated with your assigned Vault user name - secret: true - doc_section: '#step-2-obtaining-your-credentials' - connection_config: - subdomain: - type: string - title: Vault DNS (subdomain) - description: The Vault DNS subdomain of the Veeva Vault you want to connect to - example: myvault - prefix: https:// - suffix: veevavault.com - order: 1 - doc_section: '#step-1-finding-your-vault-dns-subdomain' - version: - type: string - title: '' - description: '' - default_value: '' - hidden: true - -vtex: - display_name: VTEX - categories: - - e-commerce - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.accountName}.vtexcommercestable.com.br - headers: - x-vtex-api-appkey: ${connectionConfig.appKey} - x-vtex-api-apptoken: ${apiKey} - docs: https://nango.dev/docs/api-integrations/vtex - docs_connect: https://nango.dev/docs/api-integrations/vtex/connect - connection_config: - accountName: - type: string - title: Account Name - description: Your VTEX store account name. - example: mystore - pattern: '^[a-zA-Z0-9_-]+$' - suffix: .vtexcommercestable.com.br - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-account-name' - appKey: - type: string - title: App Key - description: Your VTEX application key. - example: vtexappkey-mystore-ABCDEF - secret: true - pattern: '^vtexappkey-[a-zA-Z0-9_-]+-[A-Z0-9]+$' - order: 2 - doc_section: '#step-2-generating-an-api-key' - credentials: - apiKey: - type: string - title: App Token - description: The application token associated with your VTEX App Key. - example: ZNWDC************************************LXPNX - pattern: '^[A-Z]+$' - doc_section: '#step-2-generating-an-api-key' - -videoask: - display_name: VideoAsk - categories: - - video - auth_mode: OAUTH2 - authorization_url: https://auth.videoask.com/authorize - token_url: https://auth.videoask.com/oauth/token - disable_pkce: true - default_scopes: - - openid - - profile - - email - - offline_access - authorization_params: - response_type: code - audience: https://api.videoask.com/ - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.videoask.com - webhook_routing_script: videoaskWebhookRouting - webhook_user_defined_secret: true - docs: https://nango.dev/docs/api-integrations/videoask - setup_guide_url: https://nango.dev/docs/api-integrations/videoask/how-to-register-your-own-videoask-api-oauth-app - -wappalyzer: - display_name: Wappalyzer - categories: - - marketing - - analytics - auth_mode: API_KEY - proxy: - base_url: https://api.wappalyzer.com - headers: - x-api-key: ${apiKey} - verification: - method: GET - endpoints: - - /v2/credits/balance/ - docs: https://nango.dev/docs/api-integrations/wappalyzer - docs_connect: https://nango.dev/docs/api-integrations/wappalyzer/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Wappalyzer API key. - doc_section: '#step-1-get-your-api-key' - -wakatime: - display_name: Wakatime - categories: - - analytics - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://wakatime.com/oauth/authorize - token_url: https://wakatime.com/oauth/token - proxy: - base_url: https://wakatime.com - docs: https://nango.dev/docs/integrations/all/wakatime - -walmart: - display_name: Walmart Marketplace - categories: - - e-commerce - auth_mode: OAUTH2 - authorization_url: https://login.account.wal-mart.com/authorize - authorization_params: - clientType: ${connectionConfig.clientType} - nonce: ${random} - disable_pkce: true - authorization_url_replacements: - response_type=: responseType= - client_id=: clientId= - redirect_uri=: redirectUri= - token_url: https://marketplace.walmartapis.com/v3/token - redirect_uri_metadata: - - sellerId - proxy: - base_url: https://marketplace.walmartapis.com - headers: - wm_qos.correlation_id: ${random} - wm_sec.access_token: ${accessToken} - docs: https://nango.dev/docs/api-integrations/walmart - setup_guide_url: https://nango.dev/docs/api-integrations/walmart/how-to-register-your-own-walmart-marketplace-oauth-app - connection_config: - clientType: - type: string - title: '' - description: '' - default_value: seller - hidden: true - -wave-accounting: - display_name: Wave Accounting - categories: - - accounting - auth_mode: OAUTH2 - authorization_url: https://api.waveapps.com/oauth2/authorize - token_url: https://api.waveapps.com/oauth2/token/ - proxy: - base_url: https://gql.waveapps.com - docs: https://nango.dev/docs/integrations/all/wave-accounting - -wealthbox: - display_name: Wealthbox - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://app.crmworkspace.com/oauth/authorize - token_url: https://app.crmworkspace.com/oauth/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.crmworkspace.com - docs: https://nango.dev/docs/integrations/all/wealthbox - -webflow: - display_name: Webflow - categories: - - dev-tools - - design - - cms - auth_mode: OAUTH2 - authorization_url: https://webflow.com/oauth/authorize - token_url: https://api.webflow.com/oauth/access_token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://api.webflow.com - docs: https://nango.dev/docs/integrations/all/webflow - -webex: - display_name: Webex - categories: - - communication - auth_mode: OAUTH2 - scope_separator: ' ' - authorization_url: https://webexapis.com/v1/authorize - token_url: https://webexapis.com/v1/access_token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://webexapis.com - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/webex - -webinarjam: - display_name: WebinarJam - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://api.webinarjam.com/webinarjam - query: - api_key: ${apiKey} - verification: - method: POST - headers: - content-type: application/x-www-form-urlencoded - endpoints: - - /webinars - docs: https://nango.dev/docs/api-integrations/webinarjam - docs_connect: https://nango.dev/docs/api-integrations/webinarjam/connect - credentials: - apiKey: - type: string - title: API Key - description: Your WebinarJam API key. - example: b7e2d4f1-8a3c-4e6b-9d5f-1a2b3c4d5e6f - format: uuid - doc_section: '#step-1-getting-your-api-key' - -wejam: - display_name: WeJam AI - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://api.wejam.ai - headers: - x-api-key: ${apiKey} - docs: https://nango.dev/docs/api-integrations/wejam - docs_connect: https://nango.dev/docs/api-integrations/wejam/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your WeJam account. - doc_section: '#step-1-getting-your-api-key' - pattern: '^[a-f0-9]+$' - example: c0c1fc3f**************************************************************************************** - -whatsapp-business: - display_name: WhatsApp Business - categories: - - communication - - marketing - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - content-type: application/json - base_url: https://graph.facebook.com - verification: - headers: - content-type: application/json - endpoints: - - /v21.0/me - method: GET - docs: https://nango.dev/docs/api-integrations/whatsapp-business - setup_guide_url: https://nango.dev/docs/api-integrations/whatsapp-business/how-to-register-your-own-whatsapp-business-api-oauth-app - credentials: - apiKey: - type: string - title: API Key - description: The access token to your whatsapp account - pattern: '^[a-zA-Z0-9]+$' - -whoop: - display_name: Whoop - categories: - - sports - auth_mode: OAUTH2 - authorization_url: https://api.prod.whoop.com/oauth/oauth2/auth - token_url: https://api.prod.whoop.com/oauth/oauth2/token - authorization_params: - response_type: code - proxy: - base_url: https://api.prod.whoop.com/ - retry: - after: - - 'x-ratelimit-reset' - paginate: - type: cursor - offset_name_in_request: nextToken - limit_name_in_request: limit - docs: https://nango.dev/docs/integrations/all/whoop - -wildix-pbx: - display_name: Wildix PBX - categories: - - communication - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.wildixin.com/authorization/oauth2 - token_url: https://${connectionConfig.subdomain}.wildixin.com/authorization/oauth2Token - authorization_params: - response_type: code - redirect_uri_metadata: - - subdomain - docs: https://nango.dev/docs/integrations/all/wildix-pbx - proxy: - base_url: https://${connectionConfig.subdomain}.wildixin.com - connection_config: - subdomain: - type: string - title: Wildix Domain - description: The subdomain of your Wildix instance - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .wildixin.com - prefix: https:// - -wiza: - display_name: Wiza - categories: - - crm - - marketing - auth_mode: API_KEY - proxy: - base_url: https://wiza.co/api - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /meta/credits - docs: https://nango.dev/docs/integrations/all/wiza - docs_connect: https://nango.dev/docs/integrations/all/wiza/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Wiza API key - pattern: '^[a-f0-9]{64}$' - example: 6e0f838beb0a09d35f3f56b52b1344b262ecc713aab41456485d12c5f6edaef7 - doc_section: '#step-1-getting-your-api-key' - -wordpress: - display_name: WordPress - categories: - - dev-tools - - design - - cms - auth_mode: OAUTH2 - authorization_url: https://public-api.wordpress.com/oauth2/authorize - token_url: https://public-api.wordpress.com/oauth2/token - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - proxy: - base_url: https://public-api.wordpress.com/rest/v1 - docs: https://nango.dev/docs/integrations/all/wordpress - -wordpress-mcp: - display_name: WordPress.com (MCP) - categories: - - cms - - mcp - auth_mode: MCP_OAUTH2 - client_registration: dynamic - authorization_url: https://public-api.wordpress.com/oauth2-1/authorize - token_url: https://public-api.wordpress.com/oauth2-1/token - registration_url: https://public-api.wordpress.com/oauth2-1/register - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://public-api.wordpress.com/wpcom - headers: - accept: application/json,text/event-stream - docs: https://nango.dev/docs/api-integrations/wordpress-mcp - -wiseagent: - display_name: Wiseagent - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://sync.thewiseagent.com/WiseAuth/auth - token_url: https://sync.thewiseagent.com/WiseAuth/token - body_format: json - disable_pkce: true - scope_separator: ' ' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://sync.thewiseagent.com - docs: https://nango.dev/docs/api-integrations/wiseagent - setup_guide_url: https://nango.dev/docs/api-integrations/wiseagent/how-to-register-your-own-wiseagent-oauth-app - -woocommerce: - display_name: WooCommerce - categories: - - e-commerce - - dev-tools - - design - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.storeURL} - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /wp-json/wc/v3/customers - docs: https://nango.dev/docs/integrations/all/woocommerce - docs_connect: https://nango.dev/docs/integrations/all/woocommerce/connect - connection_config: - storeURL: - type: string - title: Domain - description: The domain of your WooCommerce store - credentials: - username: - type: string - title: User name - description: Your woocommerce Consumer Key - doc_section: '#step-1-finding-your-woocommerce-consumer-key' - password: - type: string - title: Password - description: Your woocommerce Consumer Secret - default_value: '' - doc_section: '#step-2-finding-your-woocommerce-consumer-secret' - -workable: - display_name: Workable (API Key) - categories: - - ats - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://${connectionConfig.subdomain}.workable.com - retry: - at: - - 'x-rate-limit-reset' - post_connection_script: workablePostConnection - docs: https://nango.dev/docs/integrations/all/workable - docs_connect: https://nango.dev/docs/integrations/all/workable/connect - connection_config: - subdomain: - type: string - title: Workable Domain - description: The subdomain of your Workable account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .workable.com - prefix: https:// - optional: true - credentials: - apiKey: - type: string - title: API Key - description: The API key for your Workable account - doc_section: '#step-1-finding-workable-api-key' - -workable-oauth: - display_name: Workable (OAuth) - categories: - - ats - auth_mode: OAUTH2 - authorization_url: https://www.workable.com/oauth/authorize - token_url: https://www.workable.com/oauth/token - scope_separator: '+' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.subdomain}.workable.com - retry: - at: - - 'x-rate-limit-reset' - docs: https://nango.dev/docs/integrations/all/workable-oauth - connection_config: - subdomain: - type: string - title: Workable Domain - description: The subdomain of your Workable account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .workable.com - prefix: https:// - -workday: - display_name: Workday - categories: - - hr - - popular - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.hostname}/ccx/service/${connectionConfig.tenant} - docs: https://nango.dev/docs/integrations/all/workday - docs_connect: https://nango.dev/docs/integrations/all/workday/connect - connection_config: - hostname: - type: string - title: Hostname - description: The hostname of your Workday account - format: hostname - example: wd3-impl-services1.workday.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-hostname' - tenant: - type: string - title: Tenant - description: The tenant of your Workday account - example: acme - order: 2 - doc_section: '#step-2-finding-your-tenant' - credentials: - username: - type: string - example: ISU Nango@acme - title: Username - description: Workday API Username - pattern: '^[^@]+@[^@]+$' - doc_section: '#step-4-generating-your-username' - password: - type: string - title: Password - description: Workday API Password - doc_section: '#step-5-finding-your-password' - -workday-adaptive-planning-basic: - display_name: Workday Adaptive Planning (Basic Auth) - categories: - - accounting - auth_mode: BASIC - proxy: - base_url: https://api.adaptiveplanning.com/api/rest - docs: https://nango.dev/docs/api-integrations/workday-adaptive-planning-basic - docs_connect: https://nango.dev/docs/api-integrations/workday-adaptive-planning-basic/connect - credentials: - username: - type: string - title: Username - description: Your Workday Adaptive Planning username. - doc_section: '#step-1-find-your-username-and-password' - password: - type: string - title: Password - description: Your Workday Adaptive Planning password. - secret: true - doc_section: '#step-1-find-your-username-and-password' - -workday-oauth: - display_name: Workday (OAuth) - categories: - - hr - auth_mode: OAUTH2 - token_request_auth_method: basic - authorization_url: https://${connectionConfig.authorizationDomain}/${connectionConfig.tenant}/authorize - token_url: https://${connectionConfig.tokenDomain}/ccx/oauth2/${connectionConfig.tenant}/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://${connectionConfig.tokenDomain}/ccx/api - docs: https://nango.dev/docs/api-integrations/workday-oauth - docs_connect: https://nango.dev/docs/api-integrations/workday-oauth/connect - connection_config: - authorizationDomain: - type: string - title: Authorization Domain - description: The domain used to authorize your Workday account - format: hostname - example: impl.workday.com - prefix: https:// - order: 1 - suffix: /mytenant - doc_section: '#step-1-finding-your-authorization-domain' - tokenDomain: - type: string - title: Token Domain - description: The domain used to obtain the token for your Workday account - format: hostname - example: wd3-impl-services1.workday.com - prefix: https:// - order: 2 - suffix: /ccx - doc_section: '#step-2-finding-your-token-domain' - tenant: - type: string - title: Tenant - description: The tenant of your Workday account - example: yourtenant - order: 2 - doc_section: '#step-3-finding-your-tenant' - -workos: - display_name: WorkOS - categories: - - productivity - - iam - auth_mode: API_KEY - proxy: - base_url: https://api.workos.com - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /organizations?limit=1 - docs: https://nango.dev/docs/api-integrations/workos - docs_connect: https://nango.dev/docs/api-integrations/workos/connect - credentials: - apiKey: - type: string - title: API Key - description: Your WorkOS API key - pattern: '^sk_[A-Za-z0-9_]+$' - example: sk_test_a2V5XzAxS0cyS********************************************NUSlZ - doc_section: '#step-1-obtaining-your-workos-api-key' -workday-refresh-token: - display_name: Workday (Refresh Token Auth) - categories: - - hr - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.tokenDomain}/ccx/oauth2/${connectionConfig.tenant}/token - token_params: - grant_type: refresh_token - refresh_token: ${credentials.refreshToken} - token_headers: - content-type: application/x-www-form-urlencoded - authorization: Basic ${base64(${credentials.clientId}:${credentials.clientSecret})} - token_response: - token: access_token - token_expires_in_ms: 3600000 - proxy: - base_url: https://${connectionConfig.tokenDomain}/ccx/api - docs: https://nango.dev/docs/api-integrations/workday-refresh-token - docs_connect: https://nango.dev/docs/api-integrations/workday-refresh-token/connect - connection_config: - tokenDomain: - type: string - title: Token Domain - description: The domain used to obtain the token for your Workday account - format: hostname - example: wd3-impl-services1.workday.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-token-domain' - tenant: - type: string - title: Tenant - description: The tenant of your Workday account - example: mytenant - order: 2 - doc_section: '#step-2-finding-your-tenant' - credentials: - clientId: - type: string - title: Client ID - description: Your Workday API Client ID - doc_section: '#step-3-registering-an-api-client' - clientSecret: - type: string - title: Client Secret - description: Your Workday API Client Secret - secret: true - doc_section: '#step-3-registering-an-api-client' - refreshToken: - type: string - title: Refresh Token - description: Your Workday refresh token for the Integration System User - secret: true - doc_section: '#step-4-generating-a-refresh-token' - -workday-cc: - display_name: Workday (Client Credentials) - categories: - - hr - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.tokenDomain}/ccx/oauth2/${connectionConfig.tenant}/token - token_params: - grant_type: client_credentials - tenant_alias: ${connectionConfig.tenant} - token_headers: - content-type: application/x-www-form-urlencoded - authorization: ID ${base64(${credentials.clientId}:${credentials.clientSecret})} - token_response: - token: access_token - token_expiration: expires_in - token_expiration_strategy: expireIn - proxy: - base_url: https://${connectionConfig.tokenDomain}/ccx/api - docs: https://nango.dev/docs/api-integrations/workday-cc - docs_connect: https://nango.dev/docs/api-integrations/workday-cc/connect - connection_config: - tokenDomain: - type: string - title: Token Domain - description: The hostname of your Workday tenant. - format: hostname - example: wd3-impl-services1.workday.com - prefix: https:// - order: 1 - doc_section: '#step-2-finding-your-token-domain' - tenant: - type: string - title: Tenant - description: The tenant name of your Workday account. - example: mytenant - order: 2 - doc_section: '#step-3-finding-your-tenant' - credentials: - clientId: - type: string - title: Client ID - description: Your Workday API Client ID. - doc_section: '#step-5-register-an-api-client' - clientSecret: - type: string - title: Client Secret - description: Your Workday API Client Secret. - secret: true - doc_section: '#step-5-register-an-api-client' - -workday-adaptive-planning: - display_name: Workday Adaptive Planning - categories: - - accounting - auth_mode: TWO_STEP - body_format: form - token_url: https://${connectionConfig.host}/ccx/oauth2/${connectionConfig.tenant}/token - token_params: - grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer - assertion: ${credentials.assertion} - token_headers: - content-type: application/x-www-form-urlencoded - assertion: - type: jwt - key: ${credentials.privateKey} - lifetimeInSeconds: 300 - header: - alg: RS256 - typ: JWT - payload: - iss: ${credentials.clientId} - sub: ${credentials.isu} - aud: wd - additional_steps: - - token_request_method: GET - token_url: https://${connectionConfig.host}/ccx/api/planning/v1/${connectionConfig.tenant}/adaptiveAPIAccessToken - token_headers: - authorization: Bearer ${step1.access_token} - token_response: - token: adaptiveAPIAccessToken - proxy: - base_url: https://api.adaptiveplanning.com - docs: https://nango.dev/docs/api-integrations/workday-adaptive-planning - docs_connect: https://nango.dev/docs/api-integrations/workday-adaptive-planning/connect - connection_config: - host: - type: string - title: Host - description: The hostname of your Workday account. - format: hostname - example: wd3-impl-services1.workday.com - prefix: https:// - order: 1 - tenant: - type: string - title: Tenant - description: The tenant of your Workday account. - example: mytenant - order: 2 - credentials: - clientId: - type: string - title: Client ID - description: The Client ID from the Workday API Client registration. - isu: - type: string - title: ISU Username - description: The Integration System User (ISU) username. - assertion: - type: string - title: '' - description: '' - automated: true - privateKey: - type: string - title: Private Key - description: The RSA private key (PEM format) used to sign the JWT. - secret: true - -workpath: - display_name: Workpath - categories: - - productivity - auth_mode: API_KEY - proxy: - base_url: https://connect.workpath.com/api - headers: - authorization: Bearer ${apiKey} - verification: - method: GET - endpoints: - - /v3/kpis - docs: https://nango.dev/docs/api-integrations/workpath - docs_connect: https://nango.dev/docs/api-integrations/workpath/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Workpath API Token. - doc_section: '#step-1-getting-your-api-token' - -wrike: - display_name: Wrike - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://login.wrike.com/oauth2/authorize/v4 - token_url: https://login.wrike.com/oauth2/token - scope_separator: ',' - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - token_response_metadata: - - host - proxy: - base_url: https://${connectionConfig.host}/api/v4 - docs: https://nango.dev/docs/integrations/all/wrike - connection_config: - host: - type: string - title: Domain - description: The domain of your Wrike account - format: hostname - prefix: https:// - -wise-api-key: - display_name: Wise (API Key) - categories: - - banking - - payment - auth_mode: API_KEY - proxy: - headers: - authorization: Bearer ${apiKey} - base_url: https://api.wise.com - verification: - method: GET - endpoints: - - /v1/profiles - docs: https://nango.dev/docs/api-integrations/wise-api-key - docs_connect: https://nango.dev/docs/api-integrations/wise-api-key/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Wise Personal API Token - example: 12345678-1234-1234-1234-123456789abc - pattern: '^[a-f0-9-]{36}$' - doc_section: '#step-1-generating-your-api-token' -xai: - display_name: xAI - categories: - - productivity - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://api.x.ai - headers: - authorization: Bearer ${apiKey} - content-type: application/json - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /v1/api-key - docs: https://nango.dev/docs/integrations/all/xai - docs_connect: https://nango.dev/docs/integrations/all/xai/connect - credentials: - apiKey: - type: string - title: API Key - description: The API key for your xAI account - example: xai-****************************************************** - pattern: 'xai-[A-Za-z0-9]+$' - doc_section: '#step-1-generating-your-api-key' - -xero: - display_name: Xero - categories: - - accounting - - popular - auth_mode: OAUTH2 - authorization_url: https://login.xero.com/identity/connect/authorize - token_url: https://identity.xero.com/connect/token - authorization_params: - response_type: code - default_scopes: - - offline_access - - openid - proxy: - base_url: https://api.xero.com - retry: - after: - - 'retry-after' - post_connection_script: xeroPostConnection - webhook_routing_script: xeroWebhookRouting - webhook_user_defined_secret: true - docs: https://nango.dev/docs/api-integrations/xero - setup_guide_url: https://nango.dev/docs/api-integrations/xero/how-to-register-your-own-xero-api-oauth-app - -xero-oauth2-cc: - display_name: Xero (Client Credentials) - categories: - - accounting - auth_mode: OAUTH2_CC - token_url: https://identity.xero.com/connect/token - token_request_auth_method: basic - token_params: - grant_type: client_credentials - proxy: - base_url: https://api.xero.com - retry: - after: - - 'retry-after' - docs: https://nango.dev/docs/integrations/all/xero-oauth2-cc - docs_connect: https://nango.dev/docs/integrations/all/xero-oauth2-cc/connect - -yahoo: - display_name: Yahoo - categories: - - social - auth_mode: OAUTH2 - authorization_url: https://api.login.yahoo.com/oauth2/request_auth - token_url: https://api.login.yahoo.com/oauth2/get_token - proxy: - base_url: https://${connectionConfig.apiDomain} - docs: https://nango.dev/docs/integrations/all/yahoo - connection_config: - apiDomain: - type: string - title: API Domain - description: The domain to the API you want to connect to - format: hostname - example: fantasysports.yahooapis.com - prefix: https:// - -yotpo: - display_name: Yotpo - categories: - - e-commerce - auth_mode: TWO_STEP - proxy: - base_url: https://api.yotpo.com - headers: - x-yotpo-token: ${accessToken} - token_url: https://api.yotpo.com/core/v3/stores/${connectionConfig.storeId}/access_tokens - token_params: - secret: ${credentials.apiSecret} - token_headers: - content-type: application/json - token_response: - token: access_token - docs: https://nango.dev/docs/integrations/all/yotpo - docs_connect: https://nango.dev/docs/integrations/all/yotpo/connect - connection_config: - storeId: - type: string - title: App Key - description: Your Yotpo Store Key. - pattern: '^[A-Za-z0-9]{40}$' - doc_section: '#step-1-retrieving-your-app-key' - example: rvR3359XuCuuuEgCgcHNrQ9TE8zwC5dMzWMULHZm - order: 1 - credentials: - apiSecret: - type: string - title: Secret Key - description: Your Yotpo app's secret key. - secret: true - example: tHrwXaIBaWETHLRwxWaNktfYeEteyTcSjiNJY4IH - doc_section: '#step-2-generating-your-secret-key' - pattern: '^[A-Za-z0-9]{40}$' - -youcanbook-me: - display_name: YouCanBookMe - categories: - - productivity - auth_mode: BASIC - proxy: - base_url: https://api.youcanbook.me - connection_config: - subdomain: ${connectionConfig.subdomain} - verification: - method: GET - endpoints: - - /v1/profiles - docs: https://nango.dev/docs/api-integrations/youcanbook-me - docs_connect: https://nango.dev/docs/api-integrations/youcanbook-me/connect - credentials: - username: - type: string - title: Account ID - description: Your YouCanBookMe Account ID. - format: uuid - example: 78c3430e-21f5-483b-8e26-84cd6dabf7a6 - doc_section: '#step-1-finding-your-account-id-and-api-key' - password: - type: string - title: API Key - description: Your YouCanBookMe API key. - pattern: '^ak_[A-Za-z0-9_-]+$' - example: ak_xxxxxxxxxxxxxxxxxxxxx - secret: true - doc_section: '#step-1-finding-your-account-id-and-api-key' - connection_config: - subdomain: - type: string - title: Subdomain - description: The subdomain of your YouCanBookMe booking page. - example: mycompany - doc_section: '#step-2-finding-your-subdomain' - -yandex: - display_name: Yandex - categories: - - social - auth_mode: OAUTH2 - authorization_url: https://oauth.yandex.com/authorize - token_url: https://oauth.yandex.com/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://translate.yandex.net - docs: https://nango.dev/docs/integrations/all/yandex - -youtube: - display_name: YouTube - alias: google - categories: - - video - docs: https://nango.dev/docs/api-integrations/youtube - setup_guide_url: https://nango.dev/docs/api-integrations/youtube/how-to-register-your-own-youtube-api-oauth-app - -zapier: - display_name: Zapier - categories: - - dev-tools - auth_mode: OAUTH2 - authorization_url: https://api.zapier.com/v2/authorize - token_url: https://zapier.com/oauth/token - disable_pkce: true - scope_separator: ' ' - proxy: - base_url: https://api.zapier.com - authorization_params: - response_type: code - response_mode: query - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - docs: https://nango.dev/docs/api-integrations/zapier - setup_guide_url: https://nango.dev/docs/api-integrations/zapier/how-to-register-your-own-zapier-oauth-app - -zapier-nla: - display_name: Zapier NLA - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://nla.zapier.com/oauth/authorize/ - token_url: https://nla.zapier.com/oauth/token/ - proxy: - base_url: https://nla.zapier.com - docs: https://nango.dev/docs/integrations/all/zapier-nla - -zapier-scim: - display_name: Zapier (SCIM API) - categories: - - dev-tools - auth_mode: API_KEY - proxy: - base_url: https://zapier.com/scim/v2 - headers: - authorization: Bearer ${apiKey} - accept: application/json, application/scim+json - content-type: application/json - retry: - after: - - 'retry-after' - verification: - method: GET - headers: - content-type: application/json - endpoints: - - /Users - docs: https://nango.dev/docs/integrations/all/zapier-scim - docs_connect: https://nango.dev/docs/integrations/all/zapier-scim/connect - credentials: - apiKey: - type: string - title: SCIM API Token - description: The SCIM API token generated from the Provision tab in your Zapier account. - doc_section: '#getting-your-scim-api-token' - -zendesk: - display_name: Zendesk - categories: - - popular - - support - - ticketing - auth_mode: OAUTH2 - authorization_url: https://${connectionConfig.subdomain}.zendesk.com/oauth/authorizations/new - token_url: https://${connectionConfig.subdomain}.zendesk.com/oauth/tokens - proxy: - base_url: https://${connectionConfig.subdomain}.zendesk.com - retry: - after: - - 'retry-after' - paginate: - type: link - limit_name_in_request: per_page - link_path_in_response_body: next_page - docs: https://nango.dev/docs/api-integrations/zendesk - setup_guide_url: https://nango.dev/docs/api-integrations/zendesk/how-to-register-your-own-zendesk-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/zendesk/connect - connection_config: - subdomain: - type: string - title: Zendesk Domain - description: The subdomain of your Zendesk account - pattern: '^[a-z0-9_-]+$' - example: domain - suffix: .zendesk.com - prefix: https:// - doc_section: '#step-1-finding-your-subdomain' - -zendesk-api-key: - display_name: Zendesk (API Token) - categories: - - support - - ticketing - auth_mode: BASIC - proxy: - base_url: https://${connectionConfig.subdomain}.zendesk.com - headers: - authorization: 'Basic ${base64(${credentials.username}/token:${credentials.password})}' - retry: - after: - - 'retry-after' - verification: - method: GET - endpoints: - - /api/v2/users.json?per_page=1&page=1 - docs: https://nango.dev/docs/api-integrations/zendesk-api-key - docs_connect: https://nango.dev/docs/api-integrations/zendesk-api-key/connect - connection_config: - subdomain: - type: string - title: Zendesk Domain - description: The subdomain of your Zendesk account. - pattern: '^[a-z0-9_-]+$' - example: acme - suffix: .zendesk.com - prefix: https:// - order: 1 - doc_section: '#step-1-finding-your-subdomain' - credentials: - username: - type: string - title: Email Address - description: Your Zendesk account email address. - format: email - doc_section: '#step-3-generate-an-api-token' - password: - type: string - title: API Token - description: Your Zendesk API token. - example: 'SDMWuOoZ******************************9CMz' - pattern: '^[A-Za-z0-9]+$' - doc_section: '#step-3-generate-an-api-token' - -zendesk-sell: - display_name: Zendesk Sell - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://api.getbase.com/oauth2/authorize - token_url: https://api.getbase.com/oauth2/token - token_request_auth_method: basic - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.getbase.com - docs: https://nango.dev/docs/integrations/all/zendesk-sell - -zenefits: - display_name: Zenefits - categories: - - hr - auth_mode: OAUTH2 - authorization_url: https://secure.zenefits.com/oauth2/platform-authorize - token_url: https://secure.zenefits.com/oauth2/token - authorization_params: - response_type: code - token_params: - grant_type: authorization_code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.zenefits.com - docs: https://nango.dev/docs/integrations/all/zenefits - -zigpoll: - display_name: Zigpoll - categories: - - marketing - auth_mode: API_KEY - proxy: - base_url: https://v1.zigpoll.com - headers: - authorization: ${apiKey} - verification: - method: GET - endpoints: - - /me - docs: https://nango.dev/docs/api-integrations/zigpoll - docs_connect: https://nango.dev/docs/api-integrations/zigpoll/connect - credentials: - apiKey: - type: string - title: API Key - description: Your Zigpoll private API key. - format: uuid - example: 3f7b2d4e-****-****-****-************ - doc_section: '#step-1-get-your-api-token' - -zoho: - display_name: Zoho - categories: - - accounting - auth_mode: OAUTH2 - authorization_url: https://accounts.zoho.${connectionConfig.extension}/oauth/v2/auth || https://accounts.zoho.com/oauth/v2/auth - token_url: https://accounts.zoho.${connectionConfig.extension}/oauth/v2/token || ${connectionConfig.accounts-server}/oauth/v2/token - authorization_params: - prompt: consent - access_type: offline - redirect_uri_metadata: - - accounts-server - token_response_metadata: - - api_domain - proxy: - base_url: https://www.zohoapis.${connectionConfig.extension} || ${connectionConfig.api_domain} - paginate: - type: offset - response_path: data - offset_name_in_request: page - limit_name_in_request: per_page - post_connection_script: zohoPostConnection - docs: https://nango.dev/docs/integrations/all/zoho - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - accounts-server: - type: string - title: '' - description: '' - automated: true - -zoho-books: - display_name: Zoho Books - categories: - - accounting - alias: zoho - docs: https://nango.dev/docs/integrations/all/zoho-books - docs_connect: https://nango.dev/docs/integrations/all/zoho-books/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho Books account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - -zoho-crm: - display_name: Zoho CRM - categories: - - crm - alias: zoho - docs: https://nango.dev/docs/api-integrations/zoho-crm - setup_guide_url: https://nango.dev/docs/api-integrations/zoho-crm/how-to-register-your-own-zoho-crm-api-oauth-app - docs_connect: https://nango.dev/docs/api-integrations/zoho-crm/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho CRM account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - -zoho-calendar: - display_name: Zoho Calendar - categories: - - productivity - alias: zoho - proxy: - base_url: https://calendar.zoho.com/api - docs: https://nango.dev/docs/integrations/all/zoho-calendar - docs_connect: https://nango.dev/docs/integrations/all/zoho-calendar/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho Calendar account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - -zoho-desk: - display_name: Zoho Desk - categories: - - support - - ticketing - alias: zoho - proxy: - base_url: https://desk.zoho.com/api - docs: https://nango.dev/docs/integrations/all/zoho-desk - docs_connect: https://nango.dev/docs/integrations/all/zoho-desk/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho Desk account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - -zoho-inventory: - display_name: Zoho Inventory - categories: - - e-commerce - alias: zoho - docs: https://nango.dev/docs/integrations/all/zoho-inventory - docs_connect: https://nango.dev/docs/integrations/all/zoho-inventory/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho Inventory account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - -zoho-invoice: - display_name: Zoho Invoice - categories: - - invoicing - alias: zoho - docs: https://nango.dev/docs/integrations/all/zoho-invoice - docs_connect: https://nango.dev/docs/integrations/all/zoho-invoice/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho Invoice account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - -zoho-mail: - display_name: Zoho Mail - categories: - - productivity - - communication - alias: zoho - proxy: - base_url: https://mail.zoho.${connectionConfig.extension} - docs: https://nango.dev/docs/integrations/all/zoho-mail - docs_connect: https://nango.dev/docs/integrations/all/zoho-mail/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho Mail account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - -zoho-bigin: - display_name: Zoho Bigin - categories: - - crm - alias: zoho - docs: https://nango.dev/docs/integrations/all/zoho-bigin - docs_connect: https://nango.dev/docs/integrations/all/zoho-bigin/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho Bigin account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - -zoho-people: - display_name: Zoho People - categories: - - hr - alias: zoho - proxy: - base_url: https://people.zoho.com - docs: https://nango.dev/docs/integrations/all/zoho-people - docs_connect: https://nango.dev/docs/integrations/all/zoho-people/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho People account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - optional: true - -zoho-recruit: - display_name: Zoho Recruit - alias: zoho - categories: - - ats - proxy: - base_url: https://recruit.zoho.${connectionConfig.extension}/recruit - docs: https://nango.dev/docs/integrations/all/zoho-recruit - docs_connect: https://nango.dev/docs/integrations/all/zoho-recruit/connect - connection_config: - extension: - type: string - title: Domain Extension - description: The domain extension of your Zoho Recruit account. - enum: - - com - - eu - - in - - com.au - - com.cn - - jp - -zoom: - display_name: Zoom - categories: - - video - auth_mode: OAUTH2 - authorization_url: https://zoom.us/oauth/authorize - token_url: https://zoom.us/oauth/token - scope_separator: ',' - authorization_params: - response_type: code - refresh_params: - grant_type: refresh_token - proxy: - base_url: https://api.zoom.us/v2 - paginate: - type: cursor - cursor_path_in_response: next_page_token - cursor_name_in_request: next_page_token - limit_name_in_request: page_size - docs: https://nango.dev/docs/api-integrations/zoom - setup_guide_url: https://nango.dev/docs/api-integrations/zoom/how-to-register-your-own-zoom-api-oauth-app - -zoominfo: - display_name: ZoomInfo - categories: - - crm - - marketing - auth_mode: OAUTH2_CC - proxy: - retry: - after: - - 'x-ratelimit-reset' - base_url: https://api.zoominfo.com - token_url: https://api.zoominfo.com/authenticate - token_request_auth_method: custom - body_format: json - docs: https://nango.dev/docs/integrations/all/zoominfo - docs_connect: https://nango.dev/docs/integrations/all/zoominfo/connect - -snipe-it: - display_name: Snipe-IT - categories: - - productivity - - other - auth_mode: API_KEY - proxy: - base_url: https://${connectionConfig.hostname}/api/ - headers: - authorization: Bearer ${apiKey} - accept: application/json - content-type: application/json - credentials_verification_script: snipeItCredentialsVerification - docs: https://nango.dev/docs/integrations/all/snipe-it - docs_connect: https://nango.dev/docs/integrations/all/snipe-it/connect - credentials: - apiKey: - type: string - title: API Token - description: Your Snipe-IT API token - doc_section: '#step-1-create-an-api-token' - pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' - connection_config: - hostname: - type: string - title: Domain - format: hostname - description: Your Snipe-IT hostname (e.g., yourcompany) - example: yourcompany - suffix: .snipe-it.io - prefix: https:// - doc_section: '#step-2-finding-your-domain' - order: 1 - -zorus: - display_name: Zorus - categories: - - other - auth_mode: API_KEY - proxy: - base_url: https://developer.zorustech.com - headers: - authorization: Impersonation ${apiKey} - zorus-api-version: '1.0' - verification: - method: POST - headers: - content-type: application/json - endpoints: - - /api/customers/search - data: { 'page': 1, 'pageSize': 1 } - docs: https://nango.dev/docs/api-integrations/zorus - docs_connect: https://nango.dev/docs/api-integrations/zorus/connect - credentials: - apiKey: - type: string - title: API Token - description: The API token generated from the Zorus Portal. - doc_section: '#step-1-generating-your-api-token' - example: 1_a1b2c3d4-e5f6-7890-abcd-1234567890ab - pattern: '^[0-9]+_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$' - -zuora: - display_name: Zuora - categories: - - erp - auth_mode: OAUTH2_CC - token_url: https://${connectionConfig.subdomain}.zuora.com/oauth/token - token_params: - grant_type: client_credentials - proxy: - base_url: https://${connectionConfig.subdomain}.zuora.com - retry: - after: - - 'ratelimit-reset' - docs: https://nango.dev/docs/integrations/all/zuora - docs_connect: https://nango.dev/docs/integrations/all/zuora/connect - connection_config: - subdomain: - type: string - title: Subdomain - description: The Subdomain to your Zuora Base URL - suffix: .zuora.com - prefix: https:// - example: rest.test - doc_section: '#step-1-finding-your-zuora-subdomain' - order: 1 +# yaml-language-server: $schema=./../../scripts/validation/providers/schema.json +1password-events: + display_name: 1Password (Events API) + categories: + - iam + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.domain} + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /api/v2/auth/introspect + docs: https://nango.dev/docs/api-integrations/1password-events + docs_connect: https://nango.dev/docs/api-integrations/1password-events/connect + connection_config: + domain: + type: string + title: Events API Domain + description: The regional Events API domain for your 1Password account. + order: 1 + enum: + - events.1password.com + - events.1password.ca + - events.1password.eu + credentials: + apiKey: + type: string + title: Bearer Token + description: Your 1Password Events Reporting bearer token + pattern: '^eyJ[a-zA-Z0-9_-]+\.ey[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+$' + example: eyJhbGciOiJF*************.*************CJ9.eyJ**************************************************.*********** + doc_section: '#step-2-generate-a-bearer-token' + +1password-scim: + display_name: 1Password (SCIM) + categories: + - iam + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.domain}/scim + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /Users + docs: https://nango.dev/docs/integrations/all/1password-scim + docs_connect: https://nango.dev/docs/integrations/all/1password-scim/connect + connection_config: + domain: + type: string + title: 1Password SCIM Bridge URL + description: The domain for your 1Password SCIM Bridge. Note this URL is a service hosted in your infrastructure so needs to be setup already by your IT team. Please see the instructions for more info. + example: scim.example.com + pattern: '^[a-zA-Z0-9.-]+$' + prefix: https:// + doc_section: '#step-2-get-your-scim-bridge-url' + credentials: + apiKey: + type: string + title: API Key + description: Your 1Password SCIM API Key + secret: true + doc_section: '#step-1-retrieve-your-1password-scim-api-key' + +1password-users: + display_name: 1Password (Users API) + categories: + - iam + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.domain}/v1beta1/users/oauth2/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.domain}/v1beta1/accounts/${connectionConfig.accountId} + docs: https://nango.dev/docs/api-integrations/1password-users + docs_connect: https://nango.dev/docs/api-integrations/1password-users/connect + connection_config: + domain: + type: string + title: API Domain + description: The regional API domain for your 1Password account. + enum: + - api.1password.com + - api.1password.ca + - api.1password.eu + order: 1 + accountId: + type: string + title: Account ID + description: Your 1Password account ID. + example: XLQMR47VZPBKJHSGWNCYFDE3T9 + pattern: '^[A-Z0-9]{26}$' + order: 2 + credentials: + client_id: + type: string + title: Client ID + description: Your 1Password OAuth application Client ID. + format: uuid + example: 5ab87915-2deb-429c-a1e2-8b0495900f45 + doc_section: '#step-3-obtain-your-client-credentials' + client_secret: + type: string + title: Client Secret + description: Your 1Password OAuth application Client Secret. + secret: true + doc_section: '#step-3-obtain-your-client-credentials' + +3cx: + display_name: 3CX + categories: + - communication + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.domain}/connect/token + token_params: + client_id: ${credentials.clientId} + client_secret: ${credentials.clientSecret} + grant_type: client_credentials + token_headers: + content-type: application/x-www-form-urlencoded + accept: application/json + token_response: + token: access_token + token_expires_in_ms: 3600000 + proxy: + base_url: https://${connectionConfig.domain}/xapi + docs: https://nango.dev/docs/api-integrations/3cx + docs_connect: https://nango.dev/docs/api-integrations/3cx/connect + credentials: + clientId: + type: string + title: Client ID + description: The Client ID from your 3CX API integration + doc_section: '#step-2-create-api-integration' + clientSecret: + type: string + title: API Key + description: The API Key generated when creating your 3CX API integration + secret: true + doc_section: '#step-2-create-api-integration' + connection_config: + domain: + type: string + title: 3CX Domain + description: Your 3CX instance domain + example: mycompany.3cx.us + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-1-find-your-3cx-domain' + +8x8: + display_name: 8x8 + categories: + - communication + auth_mode: OAUTH2_CC + token_url: https://api.8x8.com/oauth/v2/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.8x8.com + docs: https://nango.dev/docs/api-integrations/8x8 + docs_connect: https://nango.dev/docs/api-integrations/8x8/connect + credentials: + client_id: + type: string + title: Client ID + description: Your 8x8 API Client ID from the Admin Console + doc_section: '#step-1-obtaining-your-client-credentials' + client_secret: + type: string + title: Client Secret + description: Your 8x8 API Client Secret from the Admin Console + secret: true + doc_section: '#step-1-obtaining-your-client-credentials' + +absorb-lms: + display_name: Absorb LMS + categories: + - other + auth_mode: OAUTH2 + disable_pkce: true + authorization_url: https://${connectionConfig.portalRoute}/oauth/authorize + token_url: https://${connectionConfig.portalRoute}/oauth/token + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + authorization_params: + response_type: code + proxy: + base_url: https://${connectionConfig.portalRoute} + headers: + x-api-version: ${connectionConfig.apiVersion} + x-api-key: ${connectionConfig.restApiKey} + docs: https://nango.dev/docs/api-integrations/absorb-lms + docs_connect: https://nango.dev/docs/api-integrations/absorb-lms/connect + setup_guide_url: https://nango.dev/docs/api-integrations/absorb-lms/how-to-register-your-own-absorb-lms-api-oauth-app + connection_config: + portalRoute: + type: string + title: Hostname + description: The hostname of your Absorb LMS portal. + example: mycompany.myabsorb.com + prefix: https:// + format: hostname + order: 1 + doc_section: '#step-1-finding-your-portal-route' + restApiKey: + type: string + title: REST API Key + description: Your Absorb LMS REST API Private Key. + secret: true + order: 2 + doc_section: '#step-2-finding-your-rest-api-key' + apiVersion: + type: string + title: '' + description: '' + default_value: 'v1' + hidden: true + +accelo: + display_name: Accelo + categories: + - invoicing + - ticketing + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.api.accelo.com/oauth2/v0/authorize + token_url: https://${connectionConfig.subdomain}.api.accelo.com/oauth2/v0/token + scope_separator: ',' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.api.accelo.com + docs: https://nango.dev/docs/api-integrations/accelo + setup_guide_url: https://nango.dev/docs/api-integrations/accelo/how-to-register-your-own-accelo-api-oauth-app + connection_config: + subdomain: + type: string + title: Accelo Domain + description: The subdomain of your Accelo account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .api.accelo.com + prefix: https:// + +active-campaign: + display_name: ActiveCampaign + categories: + - marketing + - communication + auth_mode: API_KEY + proxy: + headers: + api-token: ${apiKey} + base_url: https://${connectionConfig.hostname}/api + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /3/users/me + docs: https://nango.dev/docs/integrations/all/active-campaign + docs_connect: https://nango.dev/docs/integrations/all/active-campaign/connect + connection_config: + hostname: + type: string + title: Hostname + description: The Hostname for your ActiveCampaign account + format: hostname + prefix: https:// + example: company.activehosted.com + doc_section: '#step-1-finding-your-hostname' + order: 1 + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your ActiveCampaign account + pattern: '^[a-f0-9]{72}$' + example: b4f1a7c9d8e56320a9db472fe6c8351f2e0a4d98b7f6c3e5d9a2f4701b3e8d6c3455abbe + doc_section: '#step-2-finding-your-api-key' + +acuity-scheduling: + display_name: Acuity Scheduling + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://acuityscheduling.com/oauth2/authorize + token_url: https://acuityscheduling.com/oauth2/token + default_scopes: + - api-v1 + proxy: + base_url: https://acuityscheduling.com/api/v1 + docs: https://nango.dev/docs/integrations/all/acuity-scheduling + +acumatica: + display_name: Acumatica + categories: + - erp + - accounting + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.instanceUrl}/identity/connect/token + token_params: + grant_type: password + username: ${connectionConfig.username} + password: ${connectionConfig.password} + proxy: + base_url: https://${connectionConfig.instanceUrl} + docs: https://nango.dev/docs/api-integrations/acumatica + docs_connect: https://nango.dev/docs/api-integrations/acumatica/connect + setup_guide_url: https://nango.dev/docs/api-integrations/acumatica/connect + connection_config: + instanceUrl: + type: string + title: Instance URL + description: The hostname of your Acumatica ERP instance. + format: hostname + example: mycompany.acumatica.com + prefix: https:// + doc_section: '#step-6-identify-your-instance-url' + order: 1 + username: + type: string + title: Username + description: The username of an Acumatica ERP user. + doc_section: '#step-7-enter-credentials-in-the-connect-ui' + order: 2 + password: + type: string + title: Password + description: The password for the specified Acumatica ERP username. + secret: true + doc_section: '#step-7-enter-credentials-in-the-connect-ui' + order: 3 + credentials: + client_id: + type: string + title: Client ID + description: The client ID assigned to your application, including the tenant suffix. + example: 88358B02-A48D-A50E-F710-39C1636C30F6@MyTenant + doc_section: '#step-5-save-to-activate' + client_secret: + type: string + title: Client Secret + description: The client secret created for your application in Acumatica ERP. + secret: true + doc_section: '#step-3-add-a-client-secret' + +addepar: + display_name: Addepar (OAuth) + categories: + - analytics + auth_mode: OAUTH2 + authorization_url: https://id.addepar.com/oauth2/authorize + disable_pkce: true + token_url: https://api.addepar.com/public/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + headers: + addepar-firm: ${connectionConfig.firmId} + retry: + after: + - 'x-ratelimit-retry-after' + base_url: https://api.addepar.com + docs: https://nango.dev/docs/integrations/all/addepar + docs_connect: https://nango.dev/docs/integrations/all/addepar/connect + connection_config: + firmId: + type: string + title: Firm ID + description: Your Addepar Firm ID + pattern: '^[0-9]+$' + doc_section: '#step-1-finding-your-firm-id' + +addepar-basic: + display_name: Addepar (Basic Auth) + categories: + - analytics + auth_mode: BASIC + proxy: + headers: + addepar-firm: ${connectionConfig.firmId} + retry: + after: + - 'x-ratelimit-retry-after' + base_url: https://${connectionConfig.subdomain}.addepar.com/api + docs: https://nango.dev/docs/integrations/all/addepar-basic + docs_connect: https://nango.dev/docs/integrations/all/addepar-basic/connect + credentials: + username: + type: string + title: API Key + description: Your Addepar API Key + example: 5ab87915-2deb-429c-a1e2-8b0495900f45 + format: uuid + doc_section: '#step-4-generating-an-api-key-and-secret' + password: + type: string + title: API Secret + description: Your Addepar API Secret + example: zidcISqfSGh05JsWwuY9ZdSCkXrhANHvCX0U0gkE + pattern: '^[A-Za-z0-9]{40}$' + doc_section: '#step-4-generating-an-api-key-and-secret' + connection_config: + subdomain: + type: string + title: Firm Domain + description: Your Addepar Firm domain + pattern: '^[a-z0-9_-]+$' + example: myfirm + order: 1 + doc_section: '#step-1-finding-your-firm-domain' + firmId: + type: string + title: Firm ID + description: Your Addepar Firm ID + pattern: '^[0-9]+$' + order: 2 + doc_section: '#step-2-finding-your-firm-id' + +adobe: + display_name: Adobe + categories: + - design + auth_mode: OAUTH2 + authorization_url: https://ims-na1.adobelogin.com/ims/authorize/v2 + token_url: https://ims-na1.adobelogin.com/ims/token/v3 + default_scopes: + - offline_access + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://ims-na1.adobelogin.com/ims + docs: https://nango.dev/docs/integrations/all/adobe + +adobe-umapi: + display_name: UMAPI (Adobe User Management API) + categories: + - other + auth_mode: OAUTH2_CC + token_url: https://ims-na1.adobelogin.com/ims/token/v2 + scope_separator: ',' + token_params: + grant_type: client_credentials + proxy: + headers: + x-api-key: ${connectionConfig.clientId} + retry: + after: + - 'retry-after' + base_url: https://usermanagement.adobe.io + docs: https://nango.dev/docs/integrations/all/adobe-umapi + post_connection_script: adobeUmapiPostConnection + docs_connect: https://nango.dev/docs/integrations/all/adobe-umapi/connect + connection_config: + clientId: + type: string + title: '' + description: '' + automated: true + +adobe-workfront: + display_name: Adobe Workfront + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.hostname}/integrations/oauth2/authorize + token_url: https://${connectionConfig.hostname}/integrations/oauth2/api/v1/token + authorization_method: header + body_format: json + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.hostname}/attask/api + docs: https://nango.dev/docs/integrations/all/adobe-workfront + docs_connect: https://nango.dev/docs/integrations/all/adobe-workfront/connect + connection_config: + hostname: + type: string + title: Hostname + prefix: https:// + pattern: '^[a-zA-Z0-9-]+\.my\.workfront(\.adobe)?\.com$' + description: The hostname of your Adobe Workfront account + example: acme.my.workfront.com + +adobe-commerce: + display_name: Adobe Commerce + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.storeDomain}/rest/${connectionConfig.storeCode} + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/api-integrations/adobe-commerce + docs_connect: https://nango.dev/docs/api-integrations/adobe-commerce/connect + connection_config: + storeDomain: + type: string + title: Store Domain + description: The domain of your Adobe Commerce store + format: hostname + prefix: https:// + example: yourstore.com + doc_section: '#step-1-finding-your-store-domain' + order: 1 + storeCode: + type: string + title: Store Code + description: The store code for your Adobe Commerce store + example: default + doc_section: '#step-2-finding-your-store-code' + order: 2 + credentials: + apiKey: + type: string + title: Access Token + example: 3pgsytnpxbyz0waujkw9qllcjb79s379 + pattern: '^[a-z0-9]{32}$' + description: Your Adobe Commerce access token + doc_section: '#step-3-obtaining-your-access-token' + +adp: + display_name: ADP + auth_mode: OAUTH2_CC + categories: + - hr + proxy: + base_url: https://api.adp.com + token_url: https://accounts.adp.com/auth/oauth/v2/token + token_params: + grant_type: client_credentials + require_client_certificate: true + docs: https://nango.dev/docs/integrations/all/adp + docs_connect: https://nango.dev/docs/integrations/all/adp/connect + credentials: + client_certificate: + type: string + title: Client Public Certificate + description: The public certificate (in PEM format) used for Mutual TLS (mTLS) authentication. + example: '-----BEGIN CERTIFICATE-----\\nMIIDdzCCAl+gAwIBAgIEUzZrZDANBgkqhkiG9w0BAQsFADBv\\n...\\n-----END CERTIFICATE-----' + pattern: '^-----BEGIN CERTIFICATE-----\s*([A-Za-z0-9+/=\s]+)\s*-----END CERTIFICATE-----$' + secret: true + doc_section: '#step-2-generating-the-private-key-and-certificate-signing-request' + client_private_key: + type: string + title: Client Private Key + description: The private key (in PEM format) associated with the client certificate, + example: '-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASC...\\n-----END PRIVATE KEY-----' + pattern: '^-----BEGIN PRIVATE KEY-----\s*([A-Za-z0-9+/=\s]+)\s*-----END PRIVATE KEY-----$' + secret: true + doc_section: '#step-2-generating-the-private-key-and-certificate-signing-request' + +adp-lyric: + alias: adp + display_name: ADP Lyric + categories: + - hr + docs: https://nango.dev/docs/integrations/all/adp-lyric + docs_connect: https://nango.dev/docs/integrations/all/adp-lyric/connect + +adp-run: + alias: adp + display_name: RUN Powered by ADP + categories: + - hr + docs: https://nango.dev/docs/integrations/all/adp-run + docs_connect: https://nango.dev/docs/integrations/all/adp-run/connect + +adp-workforce-now: + alias: adp + display_name: ADP Workforce Now + categories: + - hr + docs: https://nango.dev/docs/integrations/all/adp-workforce-now + docs_connect: https://nango.dev/docs/integrations/all/adp-workforce-now/connect + +adp-workforce-now-next-gen: + alias: adp + display_name: ADP Workforce Now Next Generation + categories: + - hr + docs: https://nango.dev/docs/integrations/all/adp-workforce-now-next-gen + docs_connect: https://nango.dev/docs/integrations/all/adp-workforce-now-next-gen/connect + +adyen: + display_name: Adyen + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://ca-${connectionConfig.environment}.adyen.com/ca/ca/oauth/connect.shtml + token_url: https://oauth-${connectionConfig.environment}.adyen.com/v1/token + scope_separator: ' ' + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.resource}-${connectionConfig.environment}.adyen.com + docs: https://nango.dev/docs/integrations/all/adyen + connection_config: + environment: + type: string + title: Environment + description: The environment to use. + enum: + - live + - test + resource: + type: string + title: Resource + description: The resource to use for your various requests + pattern: '^[a-z0-9_-]+$' + example: kyc + suffix: -(live|test).adyen.com + prefix: https:// + +adyntel: + display_name: Adyntel + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.adyntel.com + body: + api_key: ${apiKey} + email: ${connectionConfig.email} + verification: + method: POST + endpoints: + - /domain-keywords + headers: + content-type: application/json + data: + company_domain: example.com + docs: https://nango.dev/docs/api-integrations/adyntel + docs_connect: https://nango.dev/docs/api-integrations/adyntel/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key from your Adyntel dashboard. + example: hd-f66446a8**************-6 + pattern: '^hd-[a-f0-9]+-[a-z0-9]+$' + doc_section: '#step-1-obtain-your-api-key' + connection_config: + email: + type: string + title: Email + description: The login email address for your Adyntel account. + format: email + example: you@company.com + doc_section: '#step-2-find-your-email-address' + +ahrefs: + display_name: Ahrefs + categories: + - marketing + - analytics + auth_mode: OAUTH2 + authorization_url: https://app.ahrefs.com/web/oauth/authorize + token_url: https://ahrefs.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + body_format: form + proxy: + base_url: https://api.ahrefs.com + docs: https://nango.dev/docs/api-integrations/ahrefs + setup_guide_url: https://nango.dev/docs/api-integrations/ahrefs/how-to-register-your-own-ahrefs-api-oauth-app + +affinity: + display_name: Affinity (v1) + categories: + - crm + auth_mode: BASIC + proxy: + base_url: https://api.affinity.co + verification: + method: GET + endpoints: + - /auth/whoami + retry: + at: + - 'x-ratelimit-limit-user' + - 'x-ratelimit-limit-org-reset' + webhook_routing_script: affinityWebhookRouting + docs: https://nango.dev/docs/integrations/all/affinity + docs_connect: https://nango.dev/docs/integrations/all/affinity/connect + credentials: + username: + type: string + title: '' + description: '' + default_value: '' + hidden: true + password: + type: string + title: API Key + description: Your Affinity API Key + pattern: '^[A-Za-z0-9_-]+$' + example: 'nrlW2KR5m-qUCA-rTqKb_EUK1swERlenqn70KNMMrTM' + # https://api-docs.affinity.co/#introduction + # Affinity v1 uses basic auth with an api key + doc_section: '#step-1-generating-your-api-key' + +affinity-v2: + display_name: Affinity (v2) + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.affinity.co + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v2/auth/whoami + retry: + at: + - 'x-ratelimit-limit-user' + - 'x-ratelimit-limit-org-reset' + docs: https://nango.dev/docs/integrations/all/affinity-v2 + docs_connect: https://nango.dev/docs/integrations/all/affinity-v2/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Affinity account + pattern: '^[A-Za-z0-9_-]+$' + example: 'nrlW2KR5m-qUCA-rTqKb_EUK1swERlenqn70KNMMrTM' + doc_section: '#step-1-generating-your-api-key' + +agentline: + display_name: AgentLine + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://api.agentline.cloud + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v1/agents + docs: https://nango.dev/docs/api-integrations/agentline + docs_connect: https://nango.dev/docs/api-integrations/agentline/connect + credentials: + apiKey: + type: string + title: API Key + description: Your AgentLine API key. + pattern: '^sk_live_[a-zA-Z0-9_]+$' + doc_section: '#step-1-finding-your-api-key' + +agiloft: + display_name: Agiloft + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.hostname}/ewws/oauth + token_url: https://${connectionConfig.hostname}/ewws/otoken + token_params: + grant_type: authorization_code + proxy: + base_url: https://${connectionConfig.hostname} + docs: https://nango.dev/docs/api-integrations/agiloft + docs_connect: https://nango.dev/docs/api-integrations/agiloft/connect + setup_guide_url: https://nango.dev/docs/api-integrations/agiloft/how-to-register-your-own-agiloft-api-oauth-app + connection_config: + hostname: + type: string + title: Hostname + description: The hostname of your Agiloft instance. + format: hostname + prefix: https:// + example: example.agiloft.com + order: 1 + doc_section: '#step-1-find-your-hostname' + +agiloft-cc: + display_name: Agiloft (Client Credentials) + categories: + - productivity + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.hostname}/ewws/otoken + body_format: form + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.hostname} + docs: https://nango.dev/docs/api-integrations/agiloft-cc + docs_connect: https://nango.dev/docs/api-integrations/agiloft-cc/connect + connection_config: + hostname: + type: string + title: Hostname + description: The hostname of your Agiloft instance. + format: hostname + prefix: https:// + example: example.agiloft.com + order: 1 + doc_section: '#step-2-find-your-hostname' + credentials: + client_id: + type: string + title: Client ID + description: The Client ID from your Agiloft API application settings. + doc_section: '#step-1-create-an-api-application-and-get-your-credentials' + client_secret: + type: string + title: Client Secret + description: The Client Secret from your Agiloft API application settings. + secret: true + doc_section: '#step-1-create-an-api-application-and-get-your-credentials' + +aimfox: + display_name: Aimfox + categories: + - surveys + auth_mode: API_KEY + proxy: + base_url: https://api.aimfox.com/api + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v2/campaigns + docs: https://nango.dev/docs/integrations/all/aimfox + docs_connect: https://nango.dev/docs/integrations/all/aimfox/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Aimfox account + format: uuid + example: 123e4567-e89b-12d3-a456-426614174000 + doc_section: '#step-1-generating-your-api-key' + +aimfox-oauth: + display_name: Aimfox (OAuth) + categories: + - surveys + auth_mode: OAUTH2 + authorization_url: https://id.aimfox.com/realms/aimfox-prod/protocol/openid-connect/auth + token_url: https://id.aimfox.com/realms/aimfox-prod/protocol/openid-connect/token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.aimfox.com/api + docs: https://nango.dev/docs/integrations/all/aimfox-oauth + +aircall: + display_name: Aircall (OAuth) + categories: + - support + auth_mode: OAUTH2 + authorization_url: https://dashboard.aircall.io/oauth/authorize + token_url: https://api.aircall.io/v1/oauth/token + authorization_params: + response_type: code + scope: public_api + token_params: + grant_type: authorization_code + proxy: + base_url: https://api.aircall.io + retry: + at: + - 'x-aircallapi-reset' + paginate: + type: link + link_path_in_response_body: meta.next_page_link + response_path: results + docs: https://nango.dev/docs/integrations/all/aircall + +aircall-basic: + alias: aircall + display_name: Aircall (Basic Auth) + categories: + - support + auth_mode: BASIC + proxy: + base_url: https://api.aircall.io + retry: + at: + - 'x-aircallapi-reset' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/ping + paginate: + type: link + link_path_in_response_body: meta.next_page_link + response_path: results + docs_connect: https://nango.dev/docs/integrations/all/aircall-basic/connect + docs: https://nango.dev/docs/integrations/all/aircall-basic + credentials: + username: + type: string + title: API ID + description: The Application ID (API ID) for your Aircall account + pattern: '^[a-zA-Z0-9_-]+$' + doc_section: '#step-1-finding-your-admin-api-key-api-token-and-application-id-api-id' + password: + type: string + title: API Token + description: The Admin API Key (API Token) for your Aircall account + pattern: '^[a-zA-Z0-9_-]+$' + secret: true + doc_section: '#step-1-finding-your-admin-api-key-api-token-and-application-id-api-id' +airtable: + display_name: Airtable + categories: + - popular + - productivity + auth_mode: OAUTH2 + authorization_url: https://airtable.com/oauth2/v1/authorize + token_url: https://airtable.com/oauth2/v1/token + authorization_method: header + auth: + response_type: code + proxy: + base_url: https://api.airtable.com + webhook_routing_script: airtableWebhookRouting + docs: https://nango.dev/docs/api-integrations/airtable + setup_guide_url: https://nango.dev/docs/api-integrations/airtable/how-to-register-your-own-airtable-api-oauth-app + +airtable-pat: + display_name: Airtable (Personal Access Token) + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.airtable.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/airtable-pat + docs_connect: https://nango.dev/docs/integrations/all/airtable-pat/connect + credentials: + apiKey: + type: string + title: Personal Access Token + description: The Personal Access Token for your Airtable account + example: 'patoXxYzA1B2C3D4Ef.98a7b6c5d4e3f2g1h0i9j8k7l6m5n4o3p2q1r0s9t8u7v6w5x4y3z2a1b0cdef' + pattern: '^[a-zA-Z0-9\.]+$' + doc_section: '#step-1-generating-your-personal-access-token' + +autodesk: + display_name: Autodesk + categories: + - design + auth_mode: OAUTH2 + authorization_url: https://developer.api.autodesk.com/authentication/v2/authorize + token_url: https://developer.api.autodesk.com/authentication/v2/token + scope_separator: ' ' + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://developer.api.autodesk.com + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/autodesk + +autotask: + display_name: AutoTask + categories: + - support + - ticketing + auth_mode: API_KEY + webhook_routing_script: autotaskWebhookRouting + webhook_user_defined_secret: true + proxy: + base_url: https://${connectionConfig.subdomain}.autotask.net/atservicesrest + headers: + apiintegrationcode: ${connectionConfig.apiIntegrationCode} + username: ${connectionConfig.username} + secret: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1.0/Companies/entityinformation + docs: https://nango.dev/docs/integrations/all/autotask + docs_connect: https://nango.dev/docs/integrations/all/autotask/connect + connection_config: + subdomain: + type: string + title: AutoTask API Zone + description: The zone subdomain for your Autotask instance (e.g., webservices3, webservices1, etc.) + example: webservices3 + doc_section: '#step-1-finding-your-autotask-api-zone' + apiIntegrationCode: + type: string + title: API Integration Code + description: The tracking identifier assigned to your API-only user (27-character string) + example: ASHJKLFDKAHKASLFH85LSA905H + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-3-configure-the-api-user' + username: + type: string + title: API Username + description: The email address of your API-only user account + example: apiuser@example.com + format: email + doc_section: '#step-3-configure-the-api-user' + credentials: + apiKey: + type: string + title: API Secret + pattern: '^[A-Za-z0-9@#$~*]+$' + description: The secret for your API-only user account + doc_section: '#step-4-generate-api-secret' + +algolia: + display_name: Algolia + categories: + - search + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.APP_ID}.algolia.net + headers: + x-algolia-application-id: ${connectionConfig.APP_ID} + x-algolia-api-key: ${apiKey} + verification: + headers: + content-type: application/json + endpoints: + - /1/keys/${credentials.apiKey} + docs: https://nango.dev/docs/integrations/all/algolia + docs_connect: https://nango.dev/docs/integrations/all/algolia/connect + connection_config: + APP_ID: + type: string + title: Application ID + description: The application ID for your Algolia account + example: ERBSOWZO32 + pattern: '^[A-Z0-9]{10}$' + order: 1 + doc_section: '#step-1-finding-your-application-id' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Algolia account + example: c5c28261f9ade4e34891ccf761491b94 + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-2-finding-your-admin-api-key' + +altrata: + display_name: Altrata + categories: + - analytics + auth_mode: TWO_STEP + token_url: https://api-auth.altrata.com/oauth2/token?grant_type=client_credentials + body_format: form + token_headers: + authorization: Basic ${base64(${credentials.username}:${credentials.password})} + x-api-key: ${credentials.apiKey} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://${connectionConfig.hostname} + headers: + x-api-key: ${credentials.apiKey} + docs: https://nango.dev/docs/api-integrations/altrata + docs_connect: https://nango.dev/docs/api-integrations/altrata/connect + connection_config: + hostname: + type: string + title: Service Hostname + description: The Altrata service hostname to connect to. + example: events.altrata.com + format: hostname + pattern: '^(matching|profile|events|relationships)\.altrata\.com$' + order: 1 + doc_section: '#step-2-choose-a-service-hostname' + credentials: + apiKey: + type: string + title: API Key + description: Your Altrata API key. + secret: true + example: mN3pQv8wLc2jXs5rKt4bGy6uFd1eAh7Z******* + pattern: '^[A-Za-z0-9]+$' + doc_section: '#step-1-obtain-your-credentials' + username: + type: string + title: Username + description: Your Altrata account username. + example: john_doe + doc_section: '#step-1-obtain-your-credentials' + password: + type: string + title: Password + description: Your Altrata account password. + secret: true + doc_section: '#step-1-obtain-your-credentials' + +amazon: + display_name: Amazon + categories: + - dev-tools + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://www.amazon.com/ap/oa + token_url: https://api.amazon.${connectionConfig.extension}/auth/o2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.amazon.com + docs: https://nango.dev/docs/api-integrations/amazon + setup_guide_url: https://nango.dev/docs/api-integrations/amazon/how-to-register-your-own-amazon-api-oauth-app + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension for your Amazon account + example: com + pattern: '^[a-z.]+$' + +amazon-selling-partner: + display_name: Amazon Selling Partner + categories: + - dev-tools + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.domain}/apps/authorize/consent + token_url: https://api.amazon.com/auth/o2/token + authorization_code_param_in_callback: spapi_oauth_code + disable_pkce: true + authorization_params: + application_id: ${connectionConfig.applicationId} + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + redirect_uri_metadata: + - selling_partner_id + proxy: + base_url: https://${connectionConfig.subdomain}-${connectionConfig.region}.amazon.com || https://sellingpartnerapi-${connectionConfig.region}.amazon.com + headers: + x-amz-access-token: ${accessToken} + docs: https://nango.dev/docs/api-integrations/amazon-selling-partner + docs_connect: https://nango.dev/docs/api-integrations/amazon-selling-partner/connect + setup_guide_url: https://nango.dev/docs/api-integrations/amazon-selling-partner/how-to-register-your-own-amazon-selling-partner-api-oauth-app + connection_config: + applicationId: + type: string + title: Application ID + description: The unique identifier for your Amazon Selling Partner application. + example: 'amzn1.sellerapps.app.0bf296b5-36a6-4942-a13e-EXAMPLEfcd28' + pattern: '^[a-zA-Z0-9.-]+$' + doc_section: '#step-1-finding-your-app-id' + order: 1 + domain: + type: string + title: Authorization Domain + description: The domain representing the Amazon platform you are integrating with. + example: sellercentral.amazon.com + pattern: '^[a-z0-9.-]+\.amazon\.[a-z.]+$' + prefix: https:// + suffix: /apps + doc_section: '#step-2-finding-your-authorization-domain' + order: 2 + subdomain: + type: string + title: Proxy BaseUrl Subdomain + description: The subdomain prefix for the Amazon Selling Partner API endpoint. + doc_section: '#step-3-finding-your-proxy-baseurl-subdomain' + order: 3 + enum: + - sellingpartnerapi + - sandbox.sellingpartnerapi + region: + type: string + title: Proxy BaseUrl Region + description: The geographical region associated with the Amazon marketplace. + enum: + - na + - eu + - fe + doc_section: '#step-4-finding-your-proxy-baseurl-region' + order: 4 + +amazon-selling-partner-beta: + display_name: Amazon Selling Partner (Beta) + categories: + - dev-tools + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.domain}/apps/authorize/consent + token_url: https://api.amazon.com/auth/o2/token + authorization_code_param_in_callback: spapi_oauth_code + disable_pkce: true + authorization_params: + application_id: ${connectionConfig.applicationId} + version: beta + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + redirect_uri_metadata: + - selling_partner_id + proxy: + base_url: https://sandbox.sellingpartnerapi-${connectionConfig.region}.amazon.com + headers: + x-amz-access-token: ${accessToken} + docs: https://nango.dev/docs/api-integrations/amazon-selling-partner-beta + docs_connect: https://nango.dev/docs/api-integrations/amazon-selling-partner-beta/connect + setup_guide_url: https://nango.dev/docs/api-integrations/amazon-selling-partner-beta/how-to-register-your-own-amazon-selling-partner-beta-api-oauth-app + connection_config: + applicationId: + type: string + title: Application ID + description: The unique identifier for your Amazon Selling Partner application. + example: 'amzn1.sellerapps.app.0bf296b5-36a6-4942-a13e-EXAMPLEfcd28' + pattern: '^[a-zA-Z0-9.-]+$' + doc_section: '#step-1-finding-your-app-id' + order: 1 + domain: + type: string + title: Domain + description: The domain representing the Amazon platform you are integrating with. + example: sellercentral.amazon.com + pattern: '^[a-z0-9.-]+\.amazon\.[a-z.]+$' + prefix: https:// + suffix: /apps + doc_section: '#step-2-finding-your-authorization-domain' + order: 2 + region: + type: string + title: Proxy BaseUrl Region + description: The geographical region associated with the Amazon marketplace. + enum: + - na + - eu + - fe + doc_section: '#step-3-finding-your-proxy-baseurl-region' + order: 3 + +a-leads: + display_name: A-Leads + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.a-leads.co/gateway + headers: + x-api-key: ${apiKey} + docs: https://nango.dev/docs/integrations/all/a-leads + docs_connect: https://nango.dev/docs/integrations/all/a-leads/connect + credentials: + apiKey: + type: string + title: API Key + description: Your A-Leads API key + doc_section: '#step-1-obtain-your-api-key' + example: a3f8b2e1********************d9c4 + pattern: '^[a-f0-9]{32}$' + +anrok: + display_name: Anrok + categories: + - legal + auth_mode: API_KEY + proxy: + base_url: https://api.anrok.com + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/anrok + docs_connect: https://nango.dev/docs/integrations/all/anrok/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Anrok account + doc_section: '#step-1-finding-your-api-key' + +amplitude: + display_name: Amplitude (Event Streaming API) + categories: + - analytics + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.hostname} || https://amplitude.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/2/events/list + docs: https://nango.dev/docs/api-integrations/amplitude + docs_connect: https://nango.dev/docs/api-integrations/amplitude/connect + credentials: + username: + type: string + title: API Key + example: 64371a39e74ad915af75674c0696e356 + pattern: '^[a-f0-9]{32}$' + description: Your Amplitude API Key + password: + type: string + title: Secret Key + example: 6GhPfVz47PKJGSLcDDc9jL5E4Mn + description: Your Amplitude secret key + connection_config: + hostname: + type: string + title: Hostname + description: The hostname associated with your server residency. + optional: true + enum: + - amplitude.com + - analytics.eu.amplitude.com + +amplitude-mcp: + display_name: Amplitude (MCP US) + categories: + - analytics + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://mcp.amplitude.com/authorize + token_url: https://mcp.amplitude.com/token + registration_url: https://mcp.amplitude.com/register + default_scopes: + - offline_access + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://mcp.amplitude.com + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/amplitude-mcp + +amplitude-mcp-eu: + display_name: Amplitude (MCP EU) + categories: + - analytics + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://mcp.eu.amplitude.com/authorize + token_url: https://mcp.eu.amplitude.com/token + registration_url: https://mcp.eu.amplitude.com/register + default_scopes: + - offline_access + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://mcp.eu.amplitude.com + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/amplitude-mcp-eu + +anthropic: + display_name: Anthropic + categories: + - productivity + - dev-tools + - popular + auth_mode: API_KEY + proxy: + base_url: https://api.anthropic.com + headers: + x-api-key: ${apiKey} + anthropic-version: ${connectionConfig.version} + content-type: application/json + retry: + after: + - 'retry-after' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - v1/models + docs: https://nango.dev/docs/integrations/all/anthropic + connection_config: + version: + type: string + title: API Version + description: The version of the Anthropic API to use + pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}$' + example: '2023-06-01' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Anthropic account + +anthropic-admin: + display_name: Anthropic Administrator + categories: + - productivity + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.anthropic.com + headers: + x-api-key: ${apiKey} + anthropic-version: ${connectionConfig.version} + content-type: application/json + retry: + after: + - 'retry-after' + verification: + headers: + content-type: application/json + method: GET + endpoints: + - /v1/organizations/users + docs: https://nango.dev/docs/integrations/all/anthropic-admin + connection_config: + version: + type: string + title: API Version + description: The version of the Anthropic API to use + pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}$' + example: '2023-06-01' + credentials: + apiKey: + type: string + title: API Key + description: The Admin API key for your Anthropic account + +anvil: + display_name: Anvil + categories: + - legal + - productivity + auth_mode: BASIC + proxy: + base_url: https://app.useanvil.com + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/anvil + docs_connect: https://nango.dev/docs/api-integrations/anvil/connect + credentials: + username: + type: string + title: API Key + description: Your Anvil API key + pattern: '^[A-Za-z0-9]+$' + example: rj8T3fa************************* + doc_section: '#step-1-finding-your-api-key' + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +apaleo: + display_name: Apaleo + categories: + - erp + auth_mode: OAUTH2 + authorization_url: https://identity.apaleo.com/connect/authorize + token_url: https://identity.apaleo.com/connect/token + scope_separator: ' ' + token_params: + grant_type: authorization_code + authorization_params: + response_type: code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.apaleo.com + headers: + content-type: application/json + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/apaleo + +apify: + display_name: Apify + categories: + - dev-tools + - analytics + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.apify.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/apify + docs_connect: https://nango.dev/docs/integrations/all/apify/connect + credentials: + apiKey: + type: string + title: API Token + description: The API token for your Apify account + example: apify_api_***************************nt4w + pattern: '^apify_api_[A-Za-z0-9]+$' + doc_section: '#step-1-generating-your-api-key' + +apollo: + display_name: Apollo (API Key) + categories: + - marketing + auth_mode: API_KEY + proxy: + headers: + x-api-key: ${apiKey} + base_url: https://app.apollo.io/api + docs: https://nango.dev/docs/api-integrations/apollo + docs_connect: https://nango.dev/docs/api-integrations/apollo/connect + credentials_verification_script: apolloCredentialsVerification + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Apollo account + example: eh_3LUIFtj04rG4KF_FoFw + doc_section: '#step-1-finding-your-api-key' + +apollo-oauth: + display_name: Apollo (OAuth) + categories: + - marketing + auth_mode: OAUTH2 + authorization_url: https://app.apollo.io + token_url: https://app.apollo.io/api/v1/oauth/token + authorization_url_fragment: oauth/authorize + body_format: json + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://app.apollo.io/api + docs: https://nango.dev/docs/integrations/all/apollo-oauth + +apple-app-store: + display_name: Apple App Store + categories: + - e-commerce + auth_mode: APP_STORE + token_url: https://api.appstoreconnect.apple.com/v1/apps + authorization_params: + audience: appstoreconnect-v1 + proxy: + base_url: https://api.appstoreconnect.apple.com + docs: https://nango.dev/docs/integrations/all/apple-app-store + +apple-business-manager: + display_name: Apple Business Manager + categories: + - productivity + auth_mode: TWO_STEP + body_format: form + token_url: https://account.apple.com/auth/oauth2/v2/token + token_params: + grant_type: client_credentials + client_id: ${credentials.clientId} + client_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer + client_assertion: ${credentials.assertion} + scope: business.api + token_headers: + content-type: application/x-www-form-urlencoded + assertion: + type: jwt + key: ${assertionOption.privateKey} + lifetimeInSeconds: 15552000 + header: + alg: ES256 + kid: ${credentials.keyId} + payload: + iss: ${credentials.clientId} + sub: ${credentials.clientId} + aud: https://account.apple.com/auth/oauth2/v2/token + jti: ${random} + proxy: + base_url: https://api-business.apple.com + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/api-integrations/apple-business-manager + docs_connect: https://nango.dev/docs/api-integrations/apple-business-manager/connect + credentials: + clientId: + type: string + title: Client ID + description: The Client ID generated when you create an API account. + doc_section: '#step-2-note-your-credentials' + keyId: + type: string + title: Key ID + description: The Key ID generated when you create an API account. + doc_section: '#step-2-note-your-credentials' + assertion: + type: string + title: '' + description: '' + automated: true + assertion_option: + privateKey: + type: string + title: Private Key + description: The EC private key (PEM format) used to sign the client assertion JWT. + doc_section: '#step-1-create-an-api-account-and-generate-a-private-key' + +appstle-subscriptions: + display_name: Appstle Subscriptions + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://subscription-admin.appstle.com + headers: + x-api-key: ${apiKey} + docs: https://nango.dev/docs/integrations/all/appstle-subscriptions + docs_connect: https://nango.dev/docs/integrations/all/appstle-subscriptions/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Appstle Subscriptions API Key + secret: true + doc_section: '#step-1-finding-your-api-key' + example: lBfFAdbxUxyv6jYRgOmrEVNkijCKD10T + pattern: ^[a-zA-Z0-9]+$ + +asana: + display_name: Asana + categories: + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://app.asana.com/-/oauth_authorize + token_url: https://app.asana.com/-/oauth_token + token_params: + grant_type: authorization_code + auth: + response_type: code + default_scopes: + - default + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://app.asana.com + retry: + after: + - 'retry-after' + paginate: + type: cursor + cursor_path_in_response: next_page.offset + cursor_name_in_request: offset + response_path: data + limit_name_in_request: limit + docs: https://nango.dev/docs/api-integrations/asana + setup_guide_url: https://nango.dev/docs/api-integrations/asana/how-to-register-your-own-asana-api-oauth-app + +asana-mcp: + display_name: Asana (MCP) + categories: + - productivity + - ticketing + - mcp + auth_mode: MCP_OAUTH2 + client_registration: static + authorization_url: https://app.asana.com/-/oauth_authorize + token_url: https://app.asana.com/-/oauth_token + authorization_params: + response_type: code + resource: https://mcp.asana.com/v2 + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + default_scopes: + - default + proxy: + headers: + accept: application/json,text/event-stream + base_url: https://mcp.asana.com/ + docs: https://nango.dev/docs/api-integrations/asana-mcp + setup_guide_url: https://nango.dev/docs/api-integrations/asana-mcp/how-to-register-your-own-asana-mcp-oauth-app + +asana-scim: + display_name: Asana (SCIM API) + categories: + - productivity + - ticketing + auth_mode: API_KEY + proxy: + base_url: https://app.asana.com/api + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /1.0/scim/Users + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/asana-scim + docs_connect: https://nango.dev/docs/integrations/all/asana-scim/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Asana scim account + doc_section: '#step-1-finding-asana-api-key' + +ashby: + display_name: Ashby + categories: + - ats + - popular + auth_mode: BASIC + proxy: + base_url: https://api.ashbyhq.com + verification: + method: POST + headers: + content-type: application/json + endpoints: + - apiKey.info + docs: https://nango.dev/docs/integrations/all/ashby + docs_connect: https://nango.dev/docs/integrations/all/ashby/connect + credentials: + username: + type: string + title: API Key + description: The API Key of your Ashby account + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +atlas-so: + display_name: Atlas.so + categories: + - support + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.atlas.so/v1 + docs: https://nango.dev/docs/integrations/all/atlas-so + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Atlas.so account + +atlassian: + display_name: Atlassian + categories: + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://auth.atlassian.com/authorize + token_url: https://auth.atlassian.com/oauth/token + default_scopes: + - offline_access + authorization_params: + response_type: code + audience: api.atlassian.com + prompt: consent + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.atlassian.com + docs: https://nango.dev/docs/integrations/all/atlassian + +atlassian-admin: + display_name: Atlassian Cloud Admin + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.atlassian.com + retry: + at: + - 'x-ratelimit-reset' + headers: + authorization: Bearer ${apiKey} + connection_config: + organizationId: ${connectionConfig.organizationId} + docs: https://nango.dev/docs/integrations/all/atlassian-admin + docs_connect: https://nango.dev/docs/integrations/all/atlassian-admin/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Atlassian account + example: ATCTT3xFfGN0_a1B2-c3D4_E5F6-G7H8I9JKLMNOPQRSTUVWXYZ1234567890=DEADBEEF + pattern: '^ATCTT3xFfGN0[\w\-]+=[A-Z0-9]{8}$' + doc_section: '#step-1-generating-your-api-key' + connection_config: + organizationId: + type: string + title: Atlassian Organization Id + optional: true + description: The organization ID of your Atlassian account + pattern: '^[a-f0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$' + example: '9fa3d2b7-k9l3-4bq1-z3d8-7x1m0a9e2b76' + doc_section: '#step-1-generating-your-api-key' + +atlassian-government-cloud: + display_name: Atlassian Government Cloud + categories: + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://auth.atlassian-us-gov-mod.com/authorize + token_url: https://auth.atlassian-us-gov-mod.com/oauth/token + default_scopes: + - offline_access + authorization_params: + audience: api.atlassian-us-gov-mod.com + prompt: consent + proxy: + base_url: https://api.atlassian-us-gov-mod.com + connection_config: + subdomain: ${connectionConfig.subdomain} + retry: + at: + - 'x-ratelimit-reset' + post_connection_script: atlassianGovernmentCloudPostConnection + docs: https://nango.dev/docs/integrations/all/atlassian-government-cloud + docs_connect: https://nango.dev/docs/integrations/all/atlassian-government-cloud/connect + connection_config: + subdomain: + type: string + title: Subdomain + optional: true + description: The subdomain of your Atlassian Government Cloud account + pattern: '^[a-zA-Z0-9.-]+$' + example: acme + suffix: .atlassian-us-gov-mod.net + prefix: https:// + +atlassian-service-account-api-token: + display_name: Atlassian Service Account (API Token) + categories: + - dev-tools + auth_mode: BASIC + proxy: + base_url: https://api.atlassian.com + retry: + at: + - 'x-ratelimit-reset' + connection_config: + cloudId: ${connectionConfig.cloudId} + post_connection_script: atlassianServicAccountPostConnection + docs: https://nango.dev/docs/api-integrations/atlassian-service-account-api-token + docs_connect: https://nango.dev/docs/api-integrations/atlassian-service-account-api-token/connect + connection_config: + cloudId: + type: string + title: Cloud ID + description: Your Atlassian Cloud ID + example: '12345678-1234-1234-1234-123456789012' + format: uuid + doc_section: '#step-1-finding-your-cloud-id' + order: 1 + credentials: + username: + type: string + title: Service Account Email + description: The email address of your Atlassian service account + example: bot@serviceaccount.atlassian.com + format: email + doc_section: '#step-2-finding-your-service-account-email' + password: + type: string + title: API Token + description: Your Atlassian service account API token + secret: true + example: ATSTT3xFfGF07SUw*******************************RvxLUHWs8ZV58TfHI=610694C8 + pattern: '^[A-Za-z0-9_-]{40,}=[A-Fa-f0-9]{8}$' + doc_section: '#step-3-creating-an-api-token' + +atlassian-service-account-oauth2: + display_name: Atlassian Service Account (OAuth 2.0) + categories: + - dev-tools + auth_mode: OAUTH2_CC + token_url: https://auth.atlassian.com/oauth/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.atlassian.com + retry: + at: + - 'x-ratelimit-reset' + connection_config: + subdomain: ${connectionConfig.subdomain} + post_connection_script: atlassianServicAccountPostConnection + docs: https://nango.dev/docs/api-integrations/atlassian-service-account-oauth2 + docs_connect: https://nango.dev/docs/api-integrations/atlassian-service-account-oauth2/connect + connection_config: + subdomain: + type: string + title: Subdomain + optional: true + description: The subdomain of your Attlassian account + pattern: '^[a-zA-Z0-9.-]+$' + example: subdomain + suffix: .atlassian.net + prefix: https:// + doc_section: '#step-2-finding-your-subdomain' + credentials: + client_id: + type: string + title: Client ID + description: The OAuth 2.0 client ID from your service account credential + doc_section: '#step-1-creating-oauth-client-credentials' + client_secret: + type: string + title: Client Secret + description: The OAuth 2.0 client secret from your service account credential + secret: true + doc_section: '#step-1-creating-oauth-client-credentials' + +attention: + display_name: Attention + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.attention.tech + headers: + authorization: Bearer ${apiKey} + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/conversations?size=1 + docs: https://nango.dev/docs/api-integrations/attention + docs_connect: https://nango.dev/docs/api-integrations/attention/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Attention API key. + example: eyJhbGciOi***.eyJzdWIiOi***.xxxxxxxxxxxx + pattern: '^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$' + doc_section: '#step-1-obtaining-your-api-key' + +attio: + display_name: Attio + categories: + - crm + - popular + auth_mode: OAUTH2 + authorization_url: https://app.attio.com/authorize + token_url: https://app.attio.com/oauth/token + token_params: + grant_type: authorization_code + auth: + response_type: code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.attio.com + retry: + after: + - 'retry-after' + post_connection_script: attioPostConnection + webhook_routing_script: attioWebhookRouting + webhook_user_defined_secret: true + docs: https://nango.dev/docs/api-integrations/attio + setup_guide_url: https://nango.dev/docs/api-integrations/attio/how-to-register-your-own-attio-api-oauth-app + +attio-mcp: + display_name: Attio (MCP) + categories: + - crm + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://app.attio.com/oidc/authorize + token_url: https://app.attio.com/oidc/token + registration_url: https://app.attio.com/oauth/register + scope_separator: '+' + authorization_url_skip_encode: + - scopes + authorization_params: + response_type: code + resource: https://mcp.attio.com/mcp + registration_params: + response_types: + - code + grant_types: + - authorization_code + - refresh_token + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://mcp.attio.com + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/attio-mcp + +auth0: + display_name: Auth0 + categories: + - iam + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.auth0.com/authorize + token_url: https://${connectionConfig.subdomain}.auth0.com/oauth/token + authorization_params: + response_type: code + response_mode: query + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + docs: https://nango.dev/docs/integrations/all/auth0 + proxy: + base_url: https://${connectionConfig.subdomain}.auth0.com + connection_config: + subdomain: + type: string + title: Auth0 Domain + description: The subdomain of your Auth0 account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .auth0.com + prefix: https:// + +auth0-cc: + display_name: Auth0 (Client Credentials) + categories: + - iam + auth_mode: OAUTH2_CC + body_format: json + token_url: https://${connectionConfig.hostname}/oauth/token + token_params: + grant_type: client_credentials + audience: ${connectionConfig.audience} + organization: ${connectionConfig.organization} + docs: https://nango.dev/docs/integrations/all/auth0-cc + docs_connect: https://nango.dev/docs/integrations/all/auth0-cc/connect + proxy: + base_url: https://${connectionConfig.hostname} + connection_config: + hostname: + type: string + title: HostName + description: Your Auth0 host name + format: hostname + prefix: https:// + doc_section: '#step-2-finding-your-hostname' + audience: + type: string + title: Audience + description: The audience for the token + example: https://api.example.com/foobar + doc_section: '#step-3-finding-your-audience' + organization: + type: string + title: Organization + description: The organization name you want the request to be associated with + example: example + optional: true + doc_section: '#step-4-finding-your-organization' + +auvik: + display_name: Auvik + categories: + - support + auth_mode: BASIC + proxy: + base_url: https://auvikapi.${connectionConfig.region}.my.auvik.com + verification: + method: GET + endpoints: + - /v1/authentication/verify + credentials: + username: + type: string + title: User Name / Account Email + description: Auvik User Name (usually an individual user's email address) + doc_section: '#step-1-generate-an-api-key' + password: + type: string + title: API Key + description: Auvik API Key (separate from the user's password) + secret: true + # API key is a base64 encoded string + pattern: '^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{4}|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}={2})$' + example: 'aJ7EjSEDD+7+JqlQ1NtUXyY/3/05GGWwfF7vBbPd0Iy8HG1s' + doc_section: '#step-1-generate-an-api-key' + connection_config: + region: + type: string + title: Region + description: The region of your Auvik account (visible in your browser address bar when logging into the Auvik web UI). + doc_section: '#step-2-determine-your-region' + enum: + - us1 + - us2 + - eu1 + docs: https://nango.dev/docs/integrations/all/auvik + docs_connect: https://nango.dev/docs/integrations/all/auvik/connect + +avanan: + display_name: Avanan + categories: + - other + auth_mode: TWO_STEP + token_request_method: GET + token_url: https://${connectionConfig.subdomain}.avanan.net/v1.0/auth + token_headers: + x-av-app-id: ${credentials.appId} + x-av-req-id: ${random} + x-av-date: '${now:YYYY-MM-DDTHH:mm:ss}' + x-av-sig: '${sha256Hex(${base64(${random}${credentials.appId}${now:YYYY-MM-DDTHH:mm:ss}${credentials.secretKey})})}' + token_response: + token: '' + token_expires_in_ms: 3_600_000 + proxy: + base_url: https://${connectionConfig.subdomain}.avanan.net + headers: + x-av-app-id: ${credentials.appId} + x-av-token: ${accessToken} + x-av-req-id: ${random} + x-av-date: '${now:YYYY-MM-DDTHH:mm:ss}' + x-av-sig: '${sha256Hex(${base64(${random}${credentials.appId}${now:YYYY-MM-DDTHH:mm:ss}${endpoint}${credentials.secretKey})})}' + docs: https://nango.dev/docs/api-integrations/avanan + docs_connect: https://nango.dev/docs/api-integrations/avanan/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The Avanan API subdomain for your region. + order: 1 + doc_section: '#step-1-finding-your-subdomain' + enum: + - smart-api-production-1-us + - smart-api-production-1-eu + - smart-api-production-1-ca + - smart-api-production-5-ap + - smart-api-production-1-euw2 + - smart-api-production-1-mec1 + - smart-api-production-1-aps1 + credentials: + appId: + type: string + title: Client ID + description: Your Avanan Client ID from Avanan Support. + example: 9k8m****************ht3w + pattern: '^[a-z0-9]+$' + doc_section: '#step-2-getting-your-client-id-and-secret-key' + secretKey: + type: string + title: Secret Key + description: Your Avanan Secret Key from Avanan Support. + example: 3k9t****************************0uj5gtrpqlz8x2nvy + pattern: '^[a-z0-9]+$' + secret: true + doc_section: '#step-2-getting-your-client-id-and-secret-key' + +availity: + display_name: Availity + categories: + - other + auth_mode: OAUTH2_CC + token_url: https://api.availity.com/v1/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.availity.com + docs: https://nango.dev/docs/api-integrations/availity + docs_connect: https://nango.dev/docs/api-integrations/availity/connect + credentials: + client_id: + type: string + title: API Key + description: Your application API Key + doc_section: '#step-1-obtaining-your-client-credentials' + client_secret: + type: string + title: Secret + description: Your application Secret + secret: true + doc_section: '#step-1-obtaining-your-client-credentials' + +avalara: + display_name: Avalara + categories: + - legal + auth_mode: BASIC + proxy: + headers: + x-avalara-client: ${connectionConfig.avalaraClient} + content-type: application/json + base_url: https://rest.avatax.com/api/v2 + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /utilities/subscriptions + docs: https://nango.dev/docs/integrations/all/avalara + docs_connect: https://nango.dev/docs/integrations/all/avalara/connect + credentials: + username: + type: string + title: User Name / Account ID + description: Avalara User Name / Account ID + doc_section: '#step-1-finding-your-pair-keys' + password: + type: string + title: Avalara Password / License Key + description: Your Password / License Key + # https://developer.avalara.com/avatax/authentication-in-rest/ + # Avalara is using basic auth with combination of (username and password) + # or (Account ID and License Key) + doc_section: '#step-1-finding-your-pair-keys' + connection_config: + avalaraClient: + type: string + title: Avalara Client + description: The Avalara client for your Avalara account + doc_section: '#step-2-generating-an-avalara-client' + +avalara-sandbox: + display_name: Avalara (Sandbox) + categories: + - legal + auth_mode: BASIC + proxy: + headers: + x-avalara-client: ${connectionConfig.avalaraClient} + content-type: application/json + base_url: https://sandbox-rest.avatax.com/api/v2 + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /utilities/subscriptions + docs: https://nango.dev/docs/integrations/all/avalara-sandbox + docs_connect: https://nango.dev/docs/integrations/all/avalara-sandbox/connect + credentials: + username: + type: string + title: User Name / Account ID + description: Avalara User Name / Account ID + doc_section: '#step-1-finding-your-pair-keys' + password: + type: string + title: Password / License Key + description: Avalara Password / License Key + # https://developer.avalara.com/avatax/authentication-in-rest/ + # Avalara is using basic auth with combination of (username and password) + # or (Account ID and License Key) + doc_section: '#step-1-finding-your-pair-keys' + connection_config: + avalaraClient: + type: string + title: Avalara Client + description: The Avalara client for your Avalara account + doc_section: '#step-2-generating-an-avalara-client' + +avoma: + display_name: Avoma + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.avoma.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/users + docs: https://nango.dev/docs/integrations/all/avoma + docs_connect: https://nango.dev/docs/integrations/all/avoma/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Avoma account + pattern: '^[a-z0-9]{10,}:[a-z0-9]{10,}$' + example: '1awcbx0njh:02k6er2pld4q5irffn23' + doc_section: '#step-1-generating-your-api-key' + +axiom: + display_name: Axiom + categories: + - dev-tools + - analytics + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.axiom.co + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/api-integrations/axiom + docs_connect: https://nango.dev/docs/api-integrations/axiom/connect + connection_config: + subdomain: + type: string + title: Edge / region subdomain + description: The subdomain of the API you would wish to connect to. + enum: + - api + - us-east-1.aws.edge + - eu-central-1.aws.edge + order: 1 + doc_section: '#step-1-finding-your-subdomain' + credentials: + apiKey: + type: string + title: API Token + description: Your Axiom API token. + example: 'xaat-********-****-****-****-********8ec6' + pattern: '^xaat-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$' + doc_section: '#step-2-generating-your-api-token' + +aws: + display_name: AWS + categories: + - dev-tools + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.auth.${connectionConfig.extension}.amazoncognito.com/oauth2/authorize + token_url: https://${connectionConfig.subdomain}.auth.${connectionConfig.extension}.amazoncognito.com/oauth2/token + token_params: + grant_type: authorization_code + auth: + response_type: code + refresh_params: + grant_type: refresh_token + default_scopes: + - openid + proxy: + base_url: https://cognito-${apiSubdomain}.amazonaws.com + docs: https://nango.dev/docs/integrations/all/aws + connection_config: + subdomain: + type: string + title: Cognito Domain Prefix + description: The prefix of your Cognito User Pool domain. + pattern: '^[a-z0-9_-]+$' + example: my-app-pool + prefix: https:// + suffix: .auth + extension: + type: string + title: Cognito Region + description: The AWS region where your Cognito User Pool is hosted. + example: eu-north-1 + pattern: '^[a-z0-9-]+$' + prefix: auth. + suffix: .amazoncognito.com + apiSubdomain: + type: string + title: Cognito API Subdomain + description: The Cognito API subdomain. + example: idp.eu-north-1 + pattern: '^[a-z0-9.-]+$' + suffix: .amazonaws.com + prefix: https://cognito- + +aws-iam: + display_name: AWS IAM + categories: + - dev-tools + - iam + auth_mode: BASIC + proxy: + base_url: https://iam.amazonaws.com + headers: + authorization: '${awsSigV4(${credentials.username}, ${credentials.password}, us-east-1, iam)}' + x-amz-date: '${now:YYYYMMDDTHHmmss[Z]}' + connection_config: + region: ${connectionConfig.region} + retry: + at: + - 'x-ratelimit-reset' + credentials_verification_script: awsIamCredentialsVerification + docs: https://nango.dev/docs/api-integrations/aws-iam + docs_connect: https://nango.dev/docs/api-integrations/aws-iam/connect + credentials: + username: + type: string + title: AWS Access Key ID + description: Your Access Key ID + doc_section: '#step-1-finding-your-pair-keys' + password: + type: string + title: AWS Secret Access Key + description: Your Secret Access Key + # https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html + # aws-iam is using basic auth with AWS Access Key ID and Secret Access Key + doc_section: '#step-1-finding-your-pair-keys' + connection_config: + region: + type: string + title: Region + description: The region to where your AWS account is hosted + example: us-east-1 + pattern: '^[a-z0-9-]+$' + doc_section: '#step-2-finding-your-region-host' + +aws-inspector2: + display_name: AWS Inspector2 + categories: + - dev-tools + auth_mode: BASIC + proxy: + base_url: https://inspector2.${connectionConfig.region}.amazonaws.com + headers: + authorization: '${awsSigV4(${credentials.username}, ${credentials.password}, ${connectionConfig.region}, inspector2, inspector2.${connectionConfig.region}.amazonaws.com)}' + x-amz-date: '${now:YYYYMMDDTHHmmss[Z]}' + retry: + at: + - 'x-ratelimit-reset' + credentials_verification_script: awsIamCredentialsVerification + docs: https://nango.dev/docs/api-integrations/aws-inspector2 + docs_connect: https://nango.dev/docs/api-integrations/aws-inspector2/connect + credentials: + username: + type: string + title: AWS Access Key ID + description: Your Access Key ID. + password: + type: string + title: AWS Secret Access Key + description: Your Secret Access Key. + connection_config: + region: + type: string + title: Region + description: The AWS region where Inspector2 is enabled. + example: us-east-1 + prefix: https://inspector2. + suffix: .amazonaws.com + pattern: '^[a-z0-9-]+$' + +aws-multi-service: + display_name: AWS Multi-Service + categories: + - dev-tools + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.service}.${connectionConfig.region}.amazonaws.com + headers: + authorization: '${awsSigV4(${credentials.username}, ${credentials.password}, ${connectionConfig.region}, ${connectionConfig.service}, ${connectionConfig.service}.${connectionConfig.region}.amazonaws.com)}' + x-amz-date: '${now:YYYYMMDDTHHmmss[Z]}' + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/api-integrations/aws-multi-service + docs_connect: https://nango.dev/docs/api-integrations/aws-multi-service/connect + credentials: + username: + type: string + title: AWS Access Key ID + description: Your Access Key ID. + example: AKIAI***MPLE + pattern: '^[A-Za-z0-9]+$' + password: + type: string + title: AWS Secret Access Key + description: Your Secret Access Key. + example: wJalr***EKEY + pattern: '^[A-Za-z0-9+/]+$' + connection_config: + service: + type: string + title: AWS Service + description: The AWS service you want to connect to. + example: athena + pattern: '^[a-z0-9-]+$' + order: 2 + region: + type: string + title: Region + description: The AWS region where the service is available. + example: us-east-1 + pattern: '^[a-z0-9-]+$' + order: 1 + +aws-scim: + display_name: AWS (SCIM) + categories: + - dev-tools + - iam + auth_mode: API_KEY + proxy: + base_url: ${connectionConfig.scimEndpoint} + headers: + authorization: Bearer ${apiKey} + accept: application/json + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /Users + docs: https://nango.dev/docs/integrations/all/aws-scim + docs_connect: https://nango.dev/docs/integrations/all/aws-scim/connect + credentials: + apiKey: + type: string + title: SCIM Access Token + description: The SCIM Access Token generated from your AWS IAM Identity Center + example: 878374852-dea1-47d5-9ae0-4d00a0bdbb13:ff7d4f04-7385-4add-befe-a9ed18341d0d:l6uepDQrHfNOiOYXZ7HYZL8hlvsYHSG7Cnx104tkRLmDbO8l/p5GxLv6Id5BCLicmjeKvhrlqrPvL6VMcAnJS6oitQrz3ZiZr18rnybzyISRlyjxktYtIK1R80YJXBH6U7NSvwGsu5gDbUZDGlCDeh+FFhL8tmUuHytvxuhz3jNhsh&8X9xiLBg=:ICn/+PhEST+8/pizxTmoA0DW9JcQTL4EVRh0z6DpJwQ4vFQ+iwAxNjh16SHdUovAJyMjT+TPDwI8gN63DLE+9EV+lcV+i2H/OTDE4x7L18WRz3ndMf/4dY98mJ41qRYBgh63Pi8PdXkAex2l8HJLMkzjjPirN+8DCBfPVKK+z/nCc04RXWIz6XOmqwgB1sV5jwfAxPhuV6vqgVosoSngSw7Y2Zon70PiI5UbTTZffF6QWFU7i9b3dgMMDAH6f9vm11EB6YpJt/XC74L1pDvKXiSzhel7b7dYzGvrXK0rN29cnjn0o58VYCOgk9c05p/nRsEaSs2Y/v7BqgxXUvI+Aw== + pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}:[A-Za-z0-9+/]+=*:[A-Za-z0-9+/]+=*$' + doc_section: '#step-2-setting-up-automatic-provisioning' + connection_config: + scimEndpoint: + type: string + title: SCIM Endpoint + description: The SCIM Endpoint mentioned in the AWS IAM Identity Center + example: 'https://scim.ap-south-1.amazonaws.com/lSweb811432-ac8a-4a86-8332-f29hha4f5650/scim/v2' + format: uri + pattern: '^https://.*\/.*\/scim\/v2$' + order: 1 + doc_section: '#step-2-setting-up-automatic-provisioning' + +aws-sigv4: + display_name: AWS SigV4 Proxy + categories: + - storage + auth_mode: AWS_SIGV4 + proxy: + base_url: https://${connectionConfig.service}.${connectionConfig.region}.amazonaws.com + docs: https://nango.dev/docs/integrations/all/aws-sigv4 + docs_connect: https://nango.dev/docs/integrations/all/aws-sigv4/connect + credentials: + role_arn: + type: string + title: IAM Role ARN + description: The ARN of the IAM role your customer creates via your onboarding template. + example: arn:aws:iam::123456789012:role/NangoAccessRole + doc_section: '#step-1-provide-the-role-arn' + connection_config: + region: + type: string + title: AWS Region (optional) + description: Override the region if it differs from the integration default set by the integration owner. + example: us-east-1 + optional: true + doc_section: '#step-3-enter-connection-details' + service: + type: string + title: '' + description: '' + automated: true + integration_config: + service: + type: string + title: AWS Service + description: The AWS service requests are signed for (e.g. s3, execute-api). + example: s3 + pattern: ^[a-z0-9-]+$ + order: 1 + defaultRegion: + type: string + title: Default AWS Region + description: Region used to sign requests when a connection does not specify one. + example: us-east-1 + optional: true + order: 2 + stsMode: + type: string + title: STS Mode + description: How temporary AWS credentials are issued. + enum: + - builtin + - custom + default_value: builtin + optional: true + order: 3 + awsAccessKeyId: + type: string + title: AWS Access Key ID + description: Access key for the IAM principal Nango uses to call STS AssumeRole. + secret: true + optional: true + visible_when: + field: stsMode + equals: builtin + order: 4 + awsSecretAccessKey: + type: string + title: AWS Secret Access Key + description: Secret access key paired with the access key ID above. + secret: true + optional: true + visible_when: + field: stsMode + equals: builtin + order: 5 + stsEndpointUrl: + type: string + title: STS Endpoint URL + description: HTTPS endpoint that issues temporary AWS credentials. + format: uri + pattern: ^https:// + example: https://sts.example.com/assume + optional: true + visible_when: + field: stsMode + equals: custom + order: 6 + stsAuthType: + type: string + title: STS Auth Type + description: How Nango authenticates to the custom STS endpoint. + enum: + - none + - api_key + - basic + default_value: none + optional: true + visible_when: + field: stsMode + equals: custom + order: 7 + stsAuthHeader: + type: string + title: STS Auth Header + description: Header name used to send the API key to the custom STS endpoint. + default_value: x-api-key + optional: true + visible_when: + field: stsAuthType + equals: api_key + order: 8 + stsApiKey: + type: string + title: STS API Key + description: API key value sent to the custom STS endpoint. + secret: true + visible_when: + field: stsAuthType + equals: api_key + order: 9 + stsAuthUsername: + type: string + title: STS Username + description: Username for basic auth to the custom STS endpoint. + optional: true + visible_when: + field: stsAuthType + equals: basic + order: 10 + stsAuthPassword: + type: string + title: STS Password + description: Password for basic auth to the custom STS endpoint. + secret: true + visible_when: + field: stsAuthType + equals: basic + order: 11 + +azure-blob-storage: + categories: + - storage + display_name: Azure Blob Storage + alias: microsoft + default_scopes: + - offline_access + - https://storage.azure.com/.default + proxy: + base_url: https://${connectionConfig.accountName}.blob.core.windows.net + headers: + x-ms-version: ${connectionConfig.version} || 2025-05-05 + docs: https://nango.dev/docs/integrations/all/azure-blob-storage + docs_connect: https://nango.dev/docs/integrations/all/azure-blob-storage/connect + connection_config: + accountName: + type: string + title: Account Name + description: The name of the Azure Storage account you want to connect to. + example: nangoStorage + doc_section: '#step-1-finding-your-account-name' + version: + type: string + title: '' + description: '' + automated: true + +azure-devops: + display_name: Azure DevOps + categories: + - dev-tools + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.organizationUrl} + docs: https://nango.dev/docs/integrations/all/azure-devops + docs_connect: https://nango.dev/docs/integrations/all/azure-devops/connect + # Azure DevOps returns a 202 when the credentials are invalid, + # so we need to explicitly check for this and return respective error message + credentials_verification_script: azureDevopsCredentialsVerification + connection_config: + organizationUrl: + type: string + title: Organization URL + description: The URL of your Azure DevOps organization + example: dev.azure.com/myorg or myorg.visualstudio.com + doc_section: '#step-1-finding-your-organization-url' + prefix: https:// + credentials: + username: + type: string + title: '' + description: '' + default_value: '' + hidden: true + password: + type: string + title: Personal Access Token + description: The Personal Access Token of your Azure DevOps account + doc_section: '#step-2-creating-a-personal-access-token' + +bamboohr: + display_name: BambooHR (OAuth) + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.bamboohr.com/authorize.php + token_url: https://${connectionConfig.subdomain}.bamboohr.com/token.php + authorization_params: + response_type: code + request: authorize + token_params: + grant_type: authorization_code + request: token + refresh_params: + grant_type: refresh_token + request: token + proxy: + base_url: https://api.bamboohr.com/api/gateway.php/${connectionConfig.subdomain} + docs: https://nango.dev/docs/api-integrations/bamboohr + setup_guide_url: https://nango.dev/docs/api-integrations/bamboohr/how-to-register-your-own-bamboohr-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/bamboohr/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of your BambooHR account + pattern: '^[a-z0-9_-]+$' + example: acme + suffix: .bamboohr.com + prefix: https:// + order: 1 + +bamboohr-basic: + display_name: BambooHR (Basic Auth) + categories: + - hr + auth_mode: BASIC + proxy: + base_url: https://api.bamboohr.com/api/gateway.php/${connectionConfig.subdomain} + verification: + headers: + content-type: application/json + method: GET + endpoints: + - /v1/meta/fields + docs: https://nango.dev/docs/integrations/all/bamboohr-basic + docs_connect: https://nango.dev/docs/integrations/all/bamboohr-basic/connect + connection_config: + subdomain: + type: string + title: BambooHR Domain + description: The subdomain of your BambooHR account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .bamboohr.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-subdomain' + credentials: + username: + type: string + title: API key + description: The API Key of your BambooHR account + pattern: '^[a-f0-9]{40}$' + example: 59d783083fb25565aba21744e6bba90de8634de0 + secret: true + doc_section: '#step-2-finding-your-api-key' + password: + type: string + title: Password + description: Password + # https://documentation.bamboohr.com/docs/getting-started + # Bamboo HR is using basic auth with an api key + default_value: x + hidden: true + +basecamp: + display_name: Basecamp + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://launchpad.37signals.com/authorization/new + token_url: https://launchpad.37signals.com/authorization/token + authorization_params: + type: web_server + token_params: + type: web_server + refresh_params: + type: refresh + proxy: + base_url: https://3.basecampapi.com/${connectionConfig.accountId} + headers: + user-agent: ${connectionConfig.appDetails} || App (support@nango.dev) + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/basecamp + docs_connect: https://nango.dev/docs/integrations/all/basecamp/connect + post_connection_script: basecampPostConnection + connection_config: + appDetails: + type: string + title: App Details + description: The details of your app + automated: true + accountId: + type: string + title: Account ID + description: Your Account ID + optional: true + example: '5899981' + pattern: '^[0-9]+$' + doc_section: '#step-1-finding-your-account-id' + +battlenet: + display_name: Battle.net + categories: + - gaming + auth_mode: OAUTH2 + authorization_url: https://oauth.battle.${connectionConfig.extension}/authorize + token_url: https://oauth.battle.${connectionConfig.extension}/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://${connectionConfig.apiDomain} + docs: https://nango.dev/docs/integrations/all/battlenet + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Battle.net account. + enum: + - com + - cn + - net + order: 1 + apiDomain: + type: string + title: API Domain + description: The domain to where you will access your API. + enum: + - us.api.blizzard.com + - eu.api.blizzard.com + - kr.api.blizzard.com + - tw.api.blizzard.com + - gateway.battlenet.com.cn + +beehiiv: + display_name: Beehiiv + categories: + - communication + - marketing + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.beehiiv.com/v2/publications/${connectionConfig.publicationId} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /posts + docs: https://nango.dev/docs/integrations/all/beehiiv + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Beehiiv account + example: 8ab3sjxqvHzyUnP9JhvlfT6C0wsbgr5XQrpaZZjxJkYBPy6sntvT1M2Lk94VQeRb + pattern: '^[a-zA-Z0-9]{64}$' + connection_config: + publicationId: + type: string + title: Publication Id + description: The prefixed ID of the publication object + example: pub_a3d1b49e-2a5d-4f4b-97c8-8f32e1d2f7b9 + pattern: '^(pub_[0-9a-fA-F\-]+)$' + +bettercontact: + display_name: BetterContact + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://app.bettercontact.rocks + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /api/v2/account + docs: https://nango.dev/docs/api-integrations/bettercontact + docs_connect: https://nango.dev/docs/api-integrations/bettercontact/connect + credentials: + apiKey: + type: string + title: API Key + description: Your BetterContact API key + example: f1a9b2c3d4e5f6g7h8i9j0 + pattern: '^[a-z0-9]+$' + doc_section: '#step-1-generating-your-api-key' + +bliro: + display_name: Bliro + categories: + - communication + auth_mode: OAUTH2_CC + body_format: json + token_url: https://accounts.bliro.io/oauth/token + token_params: + grant_type: client_credentials + audience: https://api.bliro.io + proxy: + base_url: https://api.bliro.io + docs: https://nango.dev/docs/api-integrations/bliro + docs_connect: https://nango.dev/docs/api-integrations/bliro/connect + credentials: + client_id: + type: string + title: Client ID + description: Your Bliro client application Client ID. + doc_section: '#step-1-creating-a-client-application' + client_secret: + type: string + title: Client Secret + description: Your Bliro client application Client Secret. + secret: true + doc_section: '#step-1-creating-a-client-application' + +bigchange: + display_name: BigChange + categories: + - productivity + auth_mode: OAUTH2_CC + token_url: https://api.bigchange.com/auth/tokens + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.bigchange.com + headers: + customer-id: ${connectionConfig.customer_id} + docs: https://nango.dev/docs/api-integrations/bigchange + docs_connect: https://nango.dev/docs/api-integrations/bigchange/connect + connection_config: + customer_id: + type: string + title: BigChange Customer ID + description: Your numeric BigChange Customer ID. + example: '5690' + pattern: '^[0-9]+$' + doc_section: '#step-2-find-your-bigchange-customer-id' + credentials: + client_id: + type: string + title: Client ID + description: Your BigChange Partner API client_id. + client_secret: + type: string + title: Client Secret + description: Your BigChange Partner API client_secret. + secret: true + +bigcommerce: + display_name: BigCommerce + categories: + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://login.bigcommerce.com/oauth2/authorize + token_url: https://login.bigcommerce.com/oauth2/token + scope_separator: ' ' + authorization_params: + response_type: code + context: stores/${connectionConfig.storeHash} + account_uuid: ${connectionConfig.accountUuid} + token_params: + context: stores/${connectionConfig.storeHash} + grant_type: authorization_code + proxy: + base_url: https://api.bigcommerce.com/stores/${connectionConfig.storeHash} + docs: https://nango.dev/docs/integrations/all/bigcommerce + connection_config: + storeHash: + type: string + title: Store Hash + description: The store hash of your BigCommerce account + pattern: '^[a-zA-Z0-9]+$' + accountUuid: + type: string + title: Account UUID + description: The account UUID of your BigCommerce account + format: uuid + example: 123e4567-e89b-12d3-a456-426614174000 + +bill-sandbox: + display_name: Bill (Connect API Sandbox) + categories: + - payment + auth_mode: BILL + token_url: https://gateway.stage.bill.com/connect/v3/login + proxy: + base_url: https://gateway.stage.bill.com/connect + docs: https://nango.dev/docs/integrations/all/bill-sandbox + docs_connect: https://nango.dev/docs/integrations/all/bill-sandbox/connect + +bill: + display_name: Bill (Connect API) + categories: + - payment + auth_mode: BILL + token_url: https://gateway.prod.bill.com/connect/v3/login + proxy: + base_url: https://gateway.prod.bill.com/connect + docs: https://nango.dev/docs/integrations/all/bill + +bing-webmasters: + display_name: Bing Webmasters + categories: + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://www.bing.com/webmasters/oauth/authorize + token_url: https://www.bing.com/webmasters/oauth/token + refresh_url: https://www.bing.com/webmasters/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_token_params: + grant_type: refresh_token + proxy: + base_url: https://www.bing.com/webmaster/api.svc/json + docs: https://nango.dev/docs/api-integrations/bing-webmasters + setup_guide_url: https://nango.dev/docs/api-integrations/bing-webmasters/how-to-register-your-own-bing-webmasters-api-oauth-app + +bitbucket: + display_name: Bitbucket + categories: + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://bitbucket.org/site/oauth2/authorize + token_url: https://bitbucket.org/site/oauth2/access_token + proxy: + base_url: https://api.bitbucket.org + docs: https://nango.dev/docs/integrations/all/bitbucket + +bitdefender: + display_name: Bitdefender + categories: + - other + auth_mode: BASIC + proxy: + base_url: ${connectionConfig.ACCESS_URL} + retry: + after: + - 'retry-after' + credentials_verification_script: bitdefenderCredentialsVerification + docs: https://nango.dev/docs/integrations/all/bitdefender + docs_connect: https://nango.dev/docs/integrations/all/bitdefender/connect + credentials: + username: + type: string + title: API Key + description: The API Key of your Bitdefender account + doc_section: '#step-1-finding-your-api-key' + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + connection_config: + ACCESS_URL: + type: string + title: Access URL + description: The access URL of your Bitdefender account + example: https://api.bitdefender.com + format: uri + pattern: '^https://.*' + doc_section: '#step-1-finding-your-api-key' + +bitly: + display_name: Bitly + categories: + - marketing + - social + auth_mode: OAUTH2 + authorization_url: https://bitly.com/oauth/authorize + token_url: https://api-ssl.bitly.com/oauth/access_token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://api-ssl.bitly.com + docs: https://nango.dev/docs/integrations/all/bitly + +blackbaud: + display_name: Blackbaud + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://app.blackbaud.com/oauth/authorize + token_url: https://oauth2.sky.blackbaud.com/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.sky.blackbaud.com + docs: https://nango.dev/docs/integrations/all/blackbaud + +blackbaud-basic: + display_name: Blackbaud (Basic Auth) + categories: + - crm + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.hostName} + headers: + content-type: application/soap+xml; charset=utf-8 + docs: https://nango.dev/docs/integrations/all/blackbaud-basic + docs_connect: https://nango.dev/docs/integrations/all/blackbaud-basic + connection_config: + hostName: + type: string + title: Host Name + description: Your Blackbaud host name + example: https://altrurig01bo3.blackbaudhosting.com + pattern: '^https?:\/\/[a-z0-9.-]+(:\d+)?(\/.*)?$' + order: 1 + doc_section: '#step-1-finding-your-host-name' + credentials: + username: + type: string + title: Username + description: Your Username + doc_section: '#step-3-finding-your-username' + password: + type: string + title: Password + description: Your Password + doc_section: '#step-2-finding-your-password' + +blandai: + display_name: BlandAI + categories: + - support + auth_mode: API_KEY + proxy: + base_url: https://api.bland.ai + headers: + authorization: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - v1/calls + docs: https://nango.dev/docs/integrations/all/blandai + credentials: + apiKey: + type: string + title: API Key + description: The API key for your BlandAI account + +bird: + display_name: Bird + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.bird.com + headers: + authorization: AccessKey ${apiKey} + connection_config: + workspaceId: ${connectionConfig.workspaceId} + docs: https://nango.dev/docs/api-integrations/bird + docs_connect: https://nango.dev/docs/api-integrations/bird/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of your Bird API instance + example: api + suffix: .bird.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-subdomain' + workspaceId: + type: string + title: Workspaces Id + description: The Workspaces Id of your Bird + format: uuid + order: 2 + example: 332bb273-0caf-4240-a5b6-8046b5d3074f + doc_section: '#step-3-finding-your-workspace-id' + credentials: + apiKey: + type: string + title: Access Key + description: Your Bird access key + example: 6BPC******************Rzh3F4x + pattern: '^[A-Za-z0-9]+$' + doc_section: '#step-2-creating-an-access-key' + +boldsign: + display_name: BoldSign + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://account.boldsign.com/connect/authorize + token_url: https://account.boldsign.com/connect/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.boldsign.com + docs: https://nango.dev/docs/integrations/all/boldsign + +boondmanager: + display_name: BoondManager + categories: + - erp + auth_mode: OAUTH2 + authorization_url: https://ui.boondmanager.com/api/oauth2/authorize + token_url: https://ui.boondmanager.com/api/oauth2/token + proxy: + base_url: https://ui.boondmanager.com/api + docs: https://nango.dev/docs/api-integrations/boondmanager + setup_guide_url: https://nango.dev/docs/api-integrations/boondmanager/how-to-register-your-own-boondmanager-api-oauth-app + +box: + display_name: Box + categories: + - knowledge-base + - storage + auth_mode: OAUTH2 + authorization_url: https://account.box.com/api/oauth2/authorize + token_url: https://api.box.com/oauth2/token + proxy: + base_url: https://api.box.com + docs: https://nango.dev/docs/api-integrations/box + setup_guide_url: https://nango.dev/docs/api-integrations/box/how-to-register-your-own-box-api-oauth-app + +booking-com: + display_name: Booking.com + categories: + - e-commerce + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.environmentType}-xml.booking.com + docs: https://nango.dev/docs/integrations/all/booking-com + connection_config: + environmentType: + type: string + title: Environment Type + description: The environment type for your various requests. + enum: + - secure-supply + - supply + credentials: + username: + type: string + title: Machine Account Username + description: The username for your Booking.com machine account + password: + type: string + title: Machine Account Password + description: The password for your Booking.com machine account + +braintree: + display_name: Braintree + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://api.braintreegateway.com/oauth/connect + token_url: https://api.braintreegateway.com/oauth/access_tokens + scope_separator: ',' + authorization_method: header + body_format: json + token_params: + grant_type: authorization_code + redirect_uri_metadata: + - merchantId + proxy: + base_url: https://api.braintreegateway.com + docs: https://nango.dev/docs/integrations/all/braintree + +braintree-sandbox: + display_name: Braintree (Sandbox) + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://api.sandbox.braintreegateway.com/oauth/connect + token_url: https://api.sandbox.braintreegateway.com/oauth/access_tokens + scope_separator: ',' + authorization_method: header + body_format: json + token_params: + grant_type: authorization_code + redirect_uri_metadata: + - merchantId + proxy: + base_url: https://api.sandbox.braintreegateway.com + docs: https://nango.dev/docs/integrations/all/braintree-sandbox + +braze: + display_name: Braze + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://rest.${connectionConfig.instanceUrl} + headers: + authorization: Bearer ${apiKey} + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/integrations/all/braze + docs_connect: https://nango.dev/docs/integrations/all/braze/connect + connection_config: + instanceUrl: + type: string + title: Instance URL + description: The REST API URL of your Braze instance + example: iad-02.braze.com + format: hostname + prefix: https://rest. + order: 1 + doc_section: '#step-1-finding-your-instance-url' + credentials: + apiKey: + type: string + title: API Key + description: The API key to your Braze account + doc_section: '#step-2-finding-your-api-key' + +brevo-api-key: + display_name: Brevo + categories: + - marketing + auth_mode: API_KEY + proxy: + headers: + api-key: ${apiKey} + base_url: https://api.brevo.com/v3 + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /account + docs: https://nango.dev/docs/integrations/all/brevo-api-key + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Brevo account + +breezy-hr: + display_name: Breezy HR + categories: + - hr + - ats + auth_mode: TWO_STEP + body_format: json + token_url: https://api.breezy.hr/v3/signin + token_params: + email: ${credentials.email} + password: ${credentials.password} + token_headers: + content-type: application/json + token_response: + token: access_token + proxy: + base_url: https://api.breezy.hr + headers: + authorization: ${accessToken} + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/integrations/all/breezy-hr + docs_connect: https://nango.dev/docs/integrations/all/breezy-hr/connect + credentials: + email: + type: string + title: Email + description: The email address associated with your Breezy HR account + format: email + doc_section: '#step-1-finding-your-credentials' + password: + type: string + title: Password + description: The password for your Breezy HR account + secret: true + doc_section: '#step-1-finding-your-credentials' + +brex: + display_name: Brex (OAuth) + categories: + - banking + auth_mode: OAUTH2 + authorization_url: https://accounts-api.brex.com/oauth2/default/v1/authorize + token_url: https://accounts-api.brex.com/oauth2/default/v1/token + default_scopes: + - openid + - offline_access + proxy: + base_url: https://platform.brexapis.com + docs: https://nango.dev/docs/api-integrations/brex + setup_guide_url: https://nango.dev/docs/api-integrations/brex/how-to-register-your-own-brex-oauth-app + +brex-api-key: + display_name: Brex (API Key) + categories: + - banking + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://platform.brexapis.com + docs: https://nango.dev/docs/api-integrations/brex-api-key + docs_connect: https://nango.dev/docs/api-integrations/brex-api-key/connect + credentials: + apiKey: + type: string + title: API Token + description: The API Token to your Brex account + example: bxt_vRUwQT3snBmA1IDVq5iK1kXc4N0bhxr377z4 + pattern: '^bxt_[a-zA-Z0-9]+$' + doc_section: '#step-1-finding-your-api-token' + +brex-staging: + display_name: Brex (Staging OAuth) + categories: + - banking + auth_mode: OAUTH2 + authorization_url: https://accounts-api.staging.brexapps.com/oauth2/default/v1/authorize + token_url: https://accounts-api.staging.brexapps.com/oauth2/default/v1/token + proxy: + base_url: https://platform.staging.brexapps.com + docs: https://nango.dev/docs/api-integrations/brex-staging + setup_guide_url: https://nango.dev/docs/api-integrations/brex-staging/how-to-register-your-own-brex-staging-oauth-app + +brightcrowd: + display_name: BrightCrowd + categories: + - social + auth_mode: OAUTH2_CC + token_url: https://bcb-staging.auth.us-east-1.amazoncognito.com/oauth2/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.brightcrowd.com/partner + paginate: + type: cursor + cursor_path_in_response: nextPageToken + cursor_name_in_request: pageToken + docs: https://nango.dev/docs/integrations/all/brightcrowd + docs_connect: https://nango.dev/docs/integrations/all/brightcrowd/connect + +builder-io-private: + display_name: Builder.io (Private) + categories: + - dev-tools + - design + - cms + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.domain} + headers: + authorization: Bearer ${apiKey} + verification: + method: POST + headers: + content-type: application/json + endpoints: + - /api/v1/write/page + docs: https://nango.dev/docs/api-integrations/builder-io-private + docs_connect: https://nango.dev/docs/api-integrations/builder-io-private/connect + connection_config: + domain: + type: string + title: Domain + description: The domain used to access your Builder.io write API. + example: builder.io + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-api-domain' + credentials: + apiKey: + type: string + title: API Key + description: The private key for your Builder.io account. + pattern: '^bpk-[a-f0-9]+$' + example: bpk-**************************** + doc_section: '#step-2-finding-your-api-key' + +builder-io-public: + display_name: Builder.io (Public) + categories: + - dev-tools + - design + - cms + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.domain} + query: + apiKey: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v1/content/page + docs: https://nango.dev/docs/api-integrations/builder-io-public + docs_connect: https://nango.dev/docs/api-integrations/builder-io-public/connect + connection_config: + domain: + type: string + title: Domain + description: The domain used to access your Builder.io content API. + example: cdn.builder.io + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-api-domain' + credentials: + apiKey: + type: string + title: API Key + description: The public api key for your Builder.io account. + pattern: '^[a-zA-Z0-9]+$' + example: bb209fb71eh2412dbe0114bdae18fd15 + doc_section: '#step-2-finding-your-api-key' + +buildium: + display_name: Buildium + categories: + - accounting + - crm + - payment + auth_mode: API_KEY + proxy: + base_url: https://api.buildium.com + headers: + x-buildium-client-id: ${connectionConfig.clientId} + x-buildium-client-secret: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/rentals + docs: https://nango.dev/docs/integrations/all/buildium + docs_connect: https://nango.dev/docs/integrations/all/buildium/connect + connection_config: + clientId: + type: string + title: Client ID + description: Your API Key Client ID + pattern: '^[a-f0-9-]+$' + example: a228f0e7-b4a3-4150-b9ae-8552fc2880d3 + doc_section: '#step-2-finding-your-client-id-and-secret' + order: 1 + credentials: + apiKey: + type: string + title: Secret + description: The Secret for your Buildium account + pattern: '^[A-Za-z0-9+/]+$' + example: uOq2p+xlgpFdijfV/HqY+EvYpZKHRwlyhGuAVbJIxXs + doc_section: '#step-2-finding-your-client-id-and-secret' + +builtwith: + display_name: BuiltWith + categories: + - dev-tools + - analytics + - crm + - marketing + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://api.builtwith.com + query: + KEY: ${apiKey} + docs: https://nango.dev/docs/integrations/all/builtwith + docs_connect: https://nango.dev/docs/integrations/all/builtwith/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your BuiltWith account + example: 1bc32cba-a5d6-438a-bbcc-af312f560a3c + format: uuid + doc_section: '#step-1-finding-your-api-key' + +buffer: + display_name: Buffer + categories: + - marketing + - social + auth_mode: OAUTH2 + authorization_url: https://auth.buffer.com/auth + token_url: https://auth.buffer.com/token + scope_separator: ' ' + authorization_params: + response_type: code + prompt: consent + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + default_scopes: + - offline_access + proxy: + base_url: https://api.buffer.com + docs: https://nango.dev/docs/api-integrations/buffer + setup_guide_url: https://nango.dev/docs/api-integrations/buffer/how-to-register-your-own-buffer-oauth-app + +bullhorn: + display_name: Bullhorn + categories: + - hr + - ats + auth_mode: OAUTH2 + authorization_url: https://auth-west.bullhornstaffing.com/oauth/authorize + token_url: https://auth-west.bullhornstaffing.com/oauth/token + disable_pkce: true + authorization_params: + response_type: code + username: ${connectionConfig.username} + password: ${connectionConfig.password} + action: Login + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: ${connectionConfig.restUrl} + headers: + bhresttoken: ${accessToken} + post_connection_script: bullhornPostConnection + token_response_metadata: + - restUrl + refresh_token_response_metadata: + - restUrl + docs: https://nango.dev/docs/integrations/all/bullhorn + docs_connect: https://nango.dev/docs/integrations/all/bullhorn/connect + connection_config: + restUrl: + type: string + title: '' + description: '' + automated: true + username: + type: string + title: Username + description: Your API Username + doc_section: '#step-1-obtain-your-api-credentials' + password: + type: string + title: Password + description: Your API Password + secret: true + doc_section: '#step-1-obtain-your-api-credentials' + +cal-com-v1: + display_name: Cal.com (v1) + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.cal.com/v1 + query: + apiKey: ${apiKey} + retry: + at: + - 'x-ratelimit-reset' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /me + docs: https://nango.dev/docs/integrations/all/cal-com-v1 + docs_connect: https://nango.dev/docs/integrations/all/cal-com-v1/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Cal.com account + pattern: '^cal_[a-zA-Z0-9_]+$' + example: cal_xxxxxx + doc_section: '#step-1-finding-your-api-key' +cal-com-v2: + display_name: Cal.com (v2) + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.cal.com/v2 + headers: + authorization: Bearer ${apiKey} + paginate: + type: cursor + cursor_name_in_request: cursor + cursor_path_in_response: data.data.nextCursor + limit_name_in_request: limit + retry: + at: + - 'x-ratelimit-reset' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /me + webhook_routing_script: calComWebhookRouting + webhook_user_defined_secret: true + webhook_allowed_query_params: + - nangoConnectionId + docs: https://nango.dev/docs/api-integrations/cal-com-v2 + docs_connect: https://nango.dev/docs/api-integrations/cal-com-v2/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Cal.com account + pattern: '^cal_[a-zA-Z0-9_]+$' + example: cal_xxxxxx + doc_section: '#step-1-finding-your-api-key' + +cal-com-oauth: + display_name: Cal.com (OAuth) + categories: + - productivity + auth_mode: OAUTH2 + body_format: json + authorization_url: https://app.cal.com/auth/oauth2/authorize + token_url: https://api.cal.com/v2/auth/oauth2/token + disable_pkce: true + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.cal.com + retry: + at: + - 'x-ratelimit-reset' + webhook_routing_script: calComWebhookRouting + webhook_user_defined_secret: true + webhook_allowed_query_params: + - nangoConnectionId + docs: https://nango.dev/docs/api-integrations/cal-com-oauth + setup_guide_url: https://nango.dev/docs/api-integrations/cal-com-oauth/how-to-register-your-own-cal-com-oauth-app + +calendly: + display_name: Calendly + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://auth.calendly.com/oauth/authorize + token_url: https://auth.calendly.com/oauth/token + authorization_params: + response_type: code + proxy: + base_url: https://api.calendly.com + paginate: + type: link + link_path_in_response_body: pagination.next_page + retry: + at: + - 'x-ratelimit-reset' + token_response_metadata: + - owner + post_connection_script: calendlyPostConnection + webhook_routing_script: calendlyWebhookRouting + webhook_user_defined_secret: true + docs: https://nango.dev/docs/api-integrations/calendly + setup_guide_url: https://nango.dev/docs/api-integrations/calendly/how-to-register-your-own-calendly-api-oauth-app + +callrail: + display_name: Callrail + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.callrail.com + headers: + authorization: Token token=${apiKey} + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v3/a.json + docs_connect: https://nango.dev/docs/integrations/all/callrail/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Callrail account + pattern: '^[a-f0-9]{32}$' + example: '4f3c12efb9659a0b5c123b568745dbf9' + doc_section: '#step-1-finding-your-api-key' + docs: https://nango.dev/docs/integrations/all/callrail + +canny: + display_name: Canny + categories: + - support + auth_mode: API_KEY + proxy: + base_url: https://canny.io/api/v1 + query: + apiKey: ${apiKey} + verification: + method: POST + headers: + content-type: application/json + endpoints: + - /boards/list + docs: https://nango.dev/docs/integrations/all/canny + docs_connect: https://nango.dev/docs/integrations/all/canny/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Canny account + example: a1f5937c-82df-bd29-4e3a-7b6fda8c54d1 + pattern: '^[a-zA-Z0-9-]+$' + doc_section: '#step-1-finding-your-api-key' + +candis: + display_name: Candis + categories: + - accounting + auth_mode: OAUTH2 + authorization_url: https://id.my.candis.io/auth/realms/candis/protocol/openid-connect/auth + token_url: https://id.my.candis.io/auth/realms/candis/protocol/openid-connect/token + token_request_auth_method: basic + scope_separator: ' ' + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.candis.io + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/candis + setup_guide_url: https://nango.dev/docs/api-integrations/candis/how-to-register-your-own-candis-oauth-app + post_connection_script: candisPostConnection + +canva: + display_name: Canva + categories: + - design + auth_mode: OAUTH2 + authorization_url: https://www.canva.com/api/oauth/authorize + token_url: https://api.canva.com/rest/v1/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.canva.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /rest/v1/users/me + docs: https://nango.dev/docs/integrations/all/canva + token_request_auth_method: basic + +canva-mcp: + display_name: Canva (MCP) + categories: + - design + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://mcp.canva.com/authorize + token_url: https://mcp.canva.com/token + registration_url: https://mcp.canva.com/register + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://mcp.canva.com + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/canva-mcp + +canvas-lms: + display_name: Canvas LMS + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.hostname}/login/oauth2/auth + token_url: https://${connectionConfig.hostname}/login/oauth2/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.hostname} + docs: https://nango.dev/docs/api-integrations/canvas-lms + setup_guide_url: https://nango.dev/docs/api-integrations/canvas-lms/how-to-register-your-own-canvas-lms-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/canvas-lms/connect + connection_config: + hostname: + type: string + title: Canvas Install URL + description: The base URL of your Canvas instance + example: canvas.instructure.com + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-canvas-install-url' + +canva-scim: + display_name: Canva (SCIM API) + categories: + - design + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://www.canva.com/_scim + headers: + authorization: Bearer ${apiKey} + accept: application/json + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/Users + docs: https://nango.dev/docs/integrations/all/canva-scim + docs_connect: https://nango.dev/docs/integrations/all/canva-scim/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Canva scim account + doc_section: '#step-1-finding-canva-api-key' + +certn: + display_name: Certn + categories: + - legal + auth_mode: API_KEY + proxy: + base_url: https://api.certn.co + headers: + authorization: Bearer ${apiKey} + paginate: + type: link + link_path_in_response_body: next + response_path: results + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v2/teams + docs: https://nango.dev/docs/integrations/all/certn + docs_connect: https://nango.dev/docs/integrations/all/certn + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Certn account + doc_section: '#step-1-creating-an-api-key' + +certn-partner: + display_name: Certn Partner + categories: + - legal + auth_mode: OAUTH2_CC + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.certn.co + paginate: + type: offset + offset_name_in_request: page + response_path: data + limit_name_in_request: limit + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v2/teams + docs: https://nango.dev/docs/integrations/all/certn-partner + +chargebee: + display_name: Chargebee + categories: + - payment + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.chargebee.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v2/business_entities + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/chargebee + docs_connect: https://nango.dev/docs/integrations/all/chargebee/connect + connection_config: + subdomain: + type: string + title: Chargebee Domain + description: The subdomain of your Chargebee account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .chargebee.com + prefix: https:// + doc_section: '#step-1-creating-an-api-key' + credentials: + username: + type: string + title: API Key + description: The API key for your Chargebee account + pattern: '^[a-zA-Z0-9_-]+$' + secret: true + password: + type: string + title: Password + description: Password + # https://apidocs.chargebee.com/docs/api/auth?lang=curl + # Chargebee is using basic auth with an api key + default_value: '' + hidden: true + +chatarmin: + display_name: Chatarmin + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://api.chatarmin.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /api/public/contacts?limit=1 + docs: https://nango.dev/docs/api-integrations/chatarmin + docs_connect: https://nango.dev/docs/api-integrations/chatarmin/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Chatarmin API key. + +chattermill: + display_name: Chattermill + categories: + - support + - analytics + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.chattermill.com + headers: + authorization: Bearer ${apiKey} + accept: application/json + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/projects + docs: https://nango.dev/docs/integrations/all/chattermill + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Chattermill account + connection_config: + subdomain: + type: string + title: Chattermill subdomain + description: The subdomain for your api requests. + enum: + - app + - api + - backend + +checkhq: + display_name: Check + categories: + - accounting + auth_mode: API_KEY + proxy: + base_url: https://api.checkhq.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/checkhq + docs_connect: https://nango.dev/docs/integrations/all/checkhq/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your CheckHQ account + doc_section: '#step-1-finding-check-api-token' + +checkr-partner: + display_name: Checkr Partner + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://partners.checkr.com/authorize/${connectionConfig.client_id} + token_url: https://api.checkr.com/oauth/tokens + disable_pkce: true + token_params: + grant_type: authorization_code + proxy: + retry: + at: + - 'x-ratelimit-reset' + base_url: https://api.checkr.com + token_response_metadata: + - checkr_account_id + webhook_routing_script: checkrPartnerWebhookRouting + post_connection_script: checkrPartnerPostConnection + docs: https://nango.dev/docs/integrations/all/checkr-partner + connection_config: + client_id: + type: string + title: Client ID + description: The client ID of your Checkr Partner account + +checkr-partner-staging: + display_name: Checkr Partner (Staging) + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://partners.checkrhq-staging.net/authorize/${connectionConfig.client_id} + token_url: https://api.checkr-staging.com/oauth/tokens + disable_pkce: true + token_params: + grant_type: authorization_code + proxy: + retry: + at: + - 'x-ratelimit-reset' + base_url: https://api.checkr-staging.com + token_response_metadata: + - checkr_account_id + webhook_routing_script: checkrPartnerWebhookRouting + post_connection_script: checkrPartnerPostConnection + docs: https://nango.dev/docs/integrations/all/checkr-partner-staging + connection_config: + client_id: + type: string + title: Client ID + description: The client ID of your Checkr Partner account + +checkout-com: + display_name: Checkout.com + categories: + - payment + auth_mode: OAUTH2_CC + token_url: https://access.checkout.com/connect/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + headers: + content-type: application/json + accept: application/json + base_url: https://api.checkout.com + docs: https://nango.dev/docs/integrations/all/checkout-com + docs_connect: https://nango.dev/docs/integrations/all/checkout-com/connect + +checkout-com-sandbox: + display_name: Checkout.com (Sandbox) + categories: + - payment + auth_mode: OAUTH2_CC + token_url: https://access.sandbox.checkout.com/connect/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + headers: + content-type: application/json + accept: application/json + base_url: https://api.sandbox.checkout.com + docs: https://nango.dev/docs/integrations/all/checkout-com-sandbox + docs_connect: https://nango.dev/docs/integrations/all/checkout-com-sandbox/connect + +chorus: + display_name: Chorus + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://chorus.ai + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v1/users/me + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/chorus + docs_connect: https://nango.dev/docs/integrations/all/chorus/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Chorus account + doc_section: '#step-1-generating-your-chorus-api-key' + +cin7-core: + display_name: Cin7 Core + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://inventory.dearsystems.com/externalapi + headers: + api-auth-accountid: ${connectionConfig.accountId} + api-auth-applicationkey: ${apiKey} + verification: + method: GET + endpoints: + - /v2/me + docs: https://nango.dev/docs/api-integrations/cin7-core + docs_connect: https://nango.dev/docs/api-integrations/cin7-core/connect + connection_config: + accountId: + type: string + title: Account ID + description: Your Cin7 Core Account ID. + doc_section: '#step-1-find-your-account-id-and-api-application-key' + example: a1b2c3d4-****-****-****-ef1234567890 + format: uuid + credentials: + apiKey: + type: string + title: API Application Key + description: Your Cin7 Core API Application Key. + secret: true + pattern: '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$' + doc_section: '#step-1-find-your-account-id-and-api-application-key' + example: 6d6f4999-****-****-****-4e4ed450df0f + +circle-so: + display_name: Circle.so + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://app.circle.so + headers: + authorization: Token ${apiKey} + docs: https://nango.dev/docs/integrations/all/circle-so + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Circle.so account + +circleback-mcp: + display_name: Circleback (MCP) + categories: + - productivity + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://app.circleback.ai/api/oauth/authorize + token_url: https://app.circleback.ai/api/oauth/access-token + registration_url: https://app.circleback.ai/api/oauth/register + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://app.circleback.ai/api/ + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/circleback-mcp + +clari-copilot: + display_name: Clari Copilot + categories: + - marketing + auth_mode: API_KEY + proxy: + headers: + x-api-key: ${apiKey} + x-api-password: ${connectionConfig.API_PASSWORD} + base_url: https://rest-api.copilot.clari.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /calls + docs: https://nango.dev/docs/integrations/all/clari-copilot + connection_config: + API_PASSWORD: + type: string + title: API Password + description: The API password of your Clari Copilot account + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Clari Copilot account + +clay: + display_name: Clay + categories: + - crm + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.clay.com + headers: + authorization: ${apiKey} + verification: + method: GET + endpoints: + - /v3/my-workspaces + connection_config: + workspaceId: ${connectionConfig.workspaceId} + docs: https://nango.dev/docs/api-integrations/clay + docs_connect: https://nango.dev/docs/api-integrations/clay/connect + connection_config: + workspaceId: + type: string + title: Workspace ID + description: The ID of your Clay workspace. + example: '10608232' + pattern: '^\d+$' + doc_section: '#step-2-finding-your-workspace-id' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Clay account. + example: 7de4ba****e439d39**** + pattern: '^[a-f0-9]+$' + doc_section: '#step-1-finding-your-api-key' + +cleverreach: + display_name: CleverReach + categories: + - marketing + auth_mode: OAUTH2 + authorization_url: https://rest.cleverreach.com/oauth/authorize.php + token_url: https://rest.cleverreach.com/oauth/token.php + authorization_params: + response_type: code + grant: basic + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://rest.cleverreach.com + docs: https://nango.dev/docs/api-integrations/cleverreach + setup_guide_url: https://nango.dev/docs/api-integrations/cleverreach/how-to-register-your-own-cleverreach-api-oauth-app + +clickhouse: + display_name: ClickHouse + categories: + - dev-tools + auth_mode: BASIC + proxy: + base_url: https://api.clickhouse.cloud + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/organizations + docs: https://nango.dev/docs/api-integrations/clickhouse + docs_connect: https://nango.dev/docs/api-integrations/clickhouse/connect + credentials: + username: + type: string + title: Key ID + description: Your ClickHouse Cloud API Key ID. + pattern: '^[a-zA-Z0-9]+$' + example: 'Mlx1****************' + doc_section: '#step-1-create-an-api-key' + password: + type: string + title: Key Secret + description: Your ClickHouse Cloud API Key Secret. + secret: true + pattern: '^[a-zA-Z0-9]+$' + example: '4b1d2i7O**********************************' + doc_section: '#step-1-create-an-api-key' + +clicksend: + display_name: ClickSend + categories: + - communication + auth_mode: BASIC + proxy: + base_url: https://rest.clicksend.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v3/account + docs: https://nango.dev/docs/integrations/all/clicksend + docs_connect: https://nango.dev/docs/integrations/all/clicksend/connect + credentials: + username: + type: string + title: Username + description: Your ClickSend account username + doc_section: '#step-1-finding-your-username-and-api-key' + password: + type: string + title: API Key + description: Your ClickSend API Key + secret: true + doc_section: '#step-1-finding-your-username-and-api-key' + +clickup: + display_name: ClickUp + categories: + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://app.clickup.com/api + token_url: https://api.clickup.com/api/v2/oauth/token + proxy: + base_url: https://api.clickup.com + docs: https://nango.dev/docs/api-integrations/clickup + setup_guide_url: https://nango.dev/docs/api-integrations/clickup/how-to-register-your-own-clickup-api-oauth-app + +clio: + display_name: Clio + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.hostname}/oauth/authorize + token_url: https://${connectionConfig.hostname}/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.hostname} + docs: https://nango.dev/docs/api-integrations/clio + docs_connect: https://nango.dev/docs/api-integrations/clio/connect + setup_guide_url: https://nango.dev/docs/api-integrations/clio/how-to-register-your-own-clio-api-oauth-app + connection_config: + hostname: + type: string + title: Hostname + description: The hostname for your Clio region (e.g. app.clio.com for US, eu.app.clio.com for EU, ca.app.clio.com for CA, au.app.clio.com for AU). + default_value: app.clio.com + format: hostname + enum: + - app.clio.com + - eu.app.clio.com + - ca.app.clio.com + - au.app.clio.com + order: 1 + doc_section: '#step-1-finding-your-hostname' + +cloudbeds: + display_name: Cloudbeds + categories: + - other + auth_mode: OAUTH2 + authorization_url: https://api.cloudbeds.com/api/v1.3/oauth + token_url: https://api.cloudbeds.com/api/v1.3/access_token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.cloudbeds.com + docs: https://nango.dev/docs/api-integrations/cloudbeds + setup_guide_url: https://nango.dev/docs/api-integrations/cloudbeds/how-to-register-your-own-cloudbeds-oauth-app + +cloudtalk: + display_name: CloudTalk + categories: + - communication + auth_mode: BASIC + proxy: + base_url: https://my.cloudtalk.io/api + retry: + at: + - 'x-cloudtalkapi-resettime' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /contacts/index.json?limit=1 + docs: https://nango.dev/docs/api-integrations/cloudtalk + docs_connect: https://nango.dev/docs/api-integrations/cloudtalk/connect + credentials: + username: + type: string + title: ID + description: Your CloudTalk API Access ID. + pattern: '^[A-Za-z0-9.%@?_-]+$' + example: 'E1ZH****************RRM' + doc_section: '#step-1-getting-your-api-credentials' + password: + type: string + title: Key + description: Your CloudTalk API Access Key. + secret: true + pattern: '^[A-Za-z0-9.%@?_-]+$' + example: 'bQI*******************************eZ' + doc_section: '#step-1-getting-your-api-credentials' + +clerk: + display_name: Clerk + categories: + - dev-tools + - iam + auth_mode: API_KEY + proxy: + base_url: https://api.clerk.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/jwks + docs: https://nango.dev/docs/integrations/all/clerk + docs_connect: https://nango.dev/docs/integrations/all/clerk/connect + credentials: + apiKey: + type: string + title: Secret Key + description: Your Clerk Secret Key (starts with sk_test_ or sk_live_) + secret: true + pattern: '^sk_(test|live)_[a-zA-Z0-9]+$' + example: 'sk_test_abcdefghijklmnop123456789' + doc_section: '#step-1-retrieve-your-clerk-secret-key' + +cloudentity: + display_name: Cloudentity + auth_mode: OAUTH2_CC + categories: + - iam + token_url: https://${connectionConfig.tenantID}.${connectionConfig.regionID}.authz.cloudentity.io/${connectionConfig.tenantID}/${connectionConfig.workspaceID}/oauth2/token + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.tenantID}.${connectionConfig.regionID}.authz.cloudentity.io/${connectionConfig.tenantID}/${connectionConfig.workspaceID} + docs: https://nango.dev/docs/integrations/all/cloudentity + docs_connect: https://nango.dev/docs/integrations/all/cloudentity/connect + connection_config: + tenantID: + type: string + title: Tenant ID + description: The tenant ID of your Cloudentity account + doc_section: '#step-2-retrieving-the-tenant-id' + regionID: + type: string + title: Region ID + description: The region ID of your Cloudentity account + doc_section: '#step-3-retrieving-the-region-id' + workspaceID: + type: string + title: Workspace ID + description: The workspace ID of your Cloudentity account + doc_section: '#step-4-retrieving-the-workspace-id' + +cloudflare: + display_name: Cloudflare + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.cloudflare.com/client + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/cloudflare + docs_connect: https://nango.dev/docs/api-integrations/cloudflare/connect + credentials: + apiKey: + type: string + title: API Token + description: The API token for your Cloudflare user or account + example: lGlHlGZN3iPR9z7CupZlMB3nzMpTCdfxeUPNj_pf + pattern: '^[a-zA-Z0-9_-]+$' + +cloudflare-mcp: + display_name: Cloudflare (MCP) + categories: + - dev-tools + - mcp + auth_mode: MCP_OAUTH2_GENERIC + proxy: + base_url: ${connectionConfig.mcp_server_url} + headers: + accept: application/json,text/event-stream + connection_config: + mcp_server_url: + type: string + title: Worker URL + description: The full URL of your Cloudflare Worker MCP server. + example: https://my-mcp.myusername.workers.dev + pattern: '^https://[a-zA-Z0-9.-]+(?:\:[0-9]+)?(?:/.*)?$' + doc_section: '#step-1-finding-your-worker-url' + docs: https://nango.dev/docs/api-integrations/cloudflare-mcp + docs_connect: https://nango.dev/docs/api-integrations/cloudflare-mcp/connect + +clover: + display_name: Clover + categories: + - e-commerce + auth_mode: OAUTH2 + body_format: json + authorization_url: https://${connectionConfig.authorizeHost}/oauth/v2/authorize + token_url: https://${connectionConfig.apiHost}/oauth/v2/token + refresh_url: https://${connectionConfig.apiHost}/oauth/v2/refresh + disable_pkce: true + authorization_params: + response_type: code + refresh_params: + grant_type: refresh_token + redirect_uri_metadata: + - merchant_id + - employee_id + proxy: + base_url: https://${connectionConfig.apiHost} + docs: https://nango.dev/docs/api-integrations/clover + setup_guide_url: https://nango.dev/docs/api-integrations/clover/how-to-register-your-own-clover-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/clover/connect + connection_config: + authorizeHost: + type: string + title: Authorization Host + description: The Clover authorization hostname for your region. + enum: + - www.clover.com + - www.eu.clover.com + - www.la.clover.com + - sandbox.dev.clover.com + apiHost: + type: string + title: API Host + description: The Clover API hostname for your region. + enum: + - api.clover.com + - api.eu.clover.com + - api.la.clover.com + - apisandbox.dev.clover.com + +close: + display_name: Close + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://app.close.com/oauth2/authorize + token_url: https://api.close.com/oauth2/token/ + authorization_params: + response_type: code + default_scopes: + - offline_access + proxy: + base_url: https://api.close.com/api + docs: https://nango.dev/docs/integrations/all/close + +coda: + display_name: Coda + categories: + - knowledge-base + - productivity + auth_mode: API_KEY + proxy: + base_url: https://coda.io/apis/v1 + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /whoami + docs: https://nango.dev/docs/integrations/all/coda + docs_connect: https://nango.dev/docs/integrations/all/coda/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Coda account + doc_section: '#step-1-creating-an-api-key' + +codeclimate: + display_name: Code Climate + categories: + - dev-tools + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.domain} + headers: + accept: application/vnd.api+json + authorization: Token token=${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/user + docs: https://nango.dev/docs/integrations/all/codeclimate + docs_connect: https://nango.dev/docs/integrations/all/codeclimate/connect + connection_config: + domain: + type: string + title: Domain + description: The domain of your Code Climate account + format: hostname + prefix: https:// + doc_section: '#step-1-obtaining-the-domain-url' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Code Climate account + doc_section: '#step-2-creating-an-api-key' +codegen: + display_name: Codegen + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.codegen.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/organizations + docs: https://nango.dev/docs/integrations/all/codegen + docs_connect: https://nango.dev/docs/integrations/all/codegen/connect + credentials: + apiKey: + type: string + title: API Token + description: The API Key for your Codegen account + pattern: '^sk-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$' + example: 'sk-897bd628-de64-4018-8e3b-c6f717ca3e1d' + doc_section: '#step-1-finding-your-api-key' + +commercetools: + display_name: Commercetools + categories: + - e-commerce + auth_mode: OAUTH2_CC + token_url: https://auth.${connectionConfig.region}.${connectionConfig.cloudProvider}.commercetools.com/oauth/token + token_request_auth_method: basic + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.${connectionConfig.region}.${connectionConfig.cloudProvider}.commercetools.com/${connectionConfig.projectKey} + headers: + authorization: Bearer ${accessToken} + docs: https://nango.dev/docs/integrations/all/commercetools + docs_connect: https://nango.dev/docs/integrations/all/commercetools/connect + connection_config: + region: + type: string + title: Region + description: The region of your Commercetools account. Use the full region identifier (e.g., 'us-central1' for GCP or 'us-east-2' for AWS). + example: us-central1 + pattern: '^[a-z]+-[a-z0-9-]+$' + doc_section: '#step-3-identify-your-region-and-cloud-provider' + projectKey: + type: string + title: Project Key + description: The project key of your Commercetools account + example: demo-project-slug + pattern: '^[a-zA-Z0-9-_]+$' + doc_section: '#step-2-save-the-api-environment-variables' + cloudProvider: + type: string + title: Cloud Provider + description: Cloud provider used to host your Commercetools project (e.g., 'gcp' or 'aws'). + enum: + - gcp + - aws + doc_section: '#step-3-identify-your-region-and-cloud-provider' + +crowdstrike: + display_name: CrowdStrike + categories: + - dev-tools + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.baseUrl}/oauth2/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.baseUrl} + retry: + after: + - 'x-ratelimit-retryafter' + docs: https://nango.dev/docs/integrations/all/crowdstrike + docs_connect: https://nango.dev/docs/integrations/all/crowdstrike/connect + connection_config: + baseUrl: + type: string + title: Base URL + description: The CrowdStrike API base URL for your cloud environment + example: api.crowdstrike.com + pattern: '^api(?:\.[a-z0-9-]+)*\.crowdstrike\.(?:com|mil)$' + prefix: https:// + doc_section: '#step-1-creating-an-api-client' + order: 1 + +companycam: + display_name: CompanyCam + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.companycam.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/company + docs: https://nango.dev/docs/integrations/all/companycam + credentials: + apiKey: + type: string + title: Access Token + description: The Access Token for your CompanyCam company + +constant-contact: + display_name: Constant Contact + categories: + - marketing + auth_mode: OAUTH2 + authorization_url: https://authz.constantcontact.com/oauth2/default/v1/authorize + token_url: https://authz.constantcontact.com/oauth2/default/v1/token + disable_pkce: true + scope_separator: ' ' + default_scopes: + - offline_access + proxy: + base_url: https://api.cc.email + docs: https://nango.dev/docs/api-integrations/constant-contact + setup_guide_url: https://nango.dev/docs/api-integrations/constant-contact/how-to-register-your-own-constant-contact-oauth-app + +conductorone: + display_name: ConductorOne + categories: + - productivity + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.hostname}/auth/v1/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.hostname}/api + docs: https://nango.dev/docs/api-integrations/conductorone + docs_connect: https://nango.dev/docs/api-integrations/conductorone/connect + connection_config: + hostname: + type: string + title: Hostname + description: The hostname extracted from your Client ID + example: acme.conductor.one + format: hostname + order: 1 + doc_section: '#step-2-obtaining-your-hostname' + credentials: + client_id: + type: string + title: Client ID + description: Your ConductorOne Client ID + example: strange-hydra-68836@acme.conductor.one/pcc + doc_section: '#step-1-obtaining-your-client-credentials' + client_secret: + type: string + title: Client Secret + description: Your ConductorOne Client Secret + example: 'secret-token:conductorone.com:v1:eyJrdHkiOiJPS1AiLCJjcnYiOiJFZDI1NTE5IiwieCI6IkMySEx5Y0d6eUhfZDQwcjJvejZoNkpqdndvRVFBZ0FTRVc2eDB6emh6Y2MiLCJkIjoiLTgzVkxXUVUtZVhQY0ZCWVhDb2NpU29XVmhrYnRXUm9zdkZUZ3JqcXNVbyJ9' + doc_section: '#step-1-obtaining-your-client-credentials' + +copper: + display_name: Copper (OAuth) + categories: + - crm + auth_mode: OAUTH2 + proxy: + base_url: https://api.copper.com/developer_api + default_scopes: + - developer/v1/all + authorization_url: https://app.copper.com/oauth/authorize + token_url: https://app.copper.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + docs: https://nango.dev/docs/integrations/all/copper + +copper-api-key: + display_name: Copper (API Key) + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.copper.com/developer_api + headers: + x-pw-accesstoken: ${apiKey} + x-pw-application: developer_api + x-pw-useremail: ${connectionConfig.userEmail} + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/account + docs_connect: https://nango.dev/docs/integrations/all/copper-api-key/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Copper account + pattern: '^[a-f0-9]{32}$' + example: '4f3c12efb9659a0b5c123b568745dbf9' + doc_section: '#step-1-finding-copper-api-key' + connection_config: + userEmail: + type: string + title: User Email + description: Email address of the user who generated the token + docs: https://nango.dev/docs/integrations/all/copper-api-key + +connectwise-psa: + display_name: ConnectWise PSA + categories: + - support + - ticketing + auth_mode: BASIC + webhook_routing_script: connectwisePsaWebhookRouting + proxy: + base_url: https://${connectionConfig.hostname}/v4_6_release/apis/3.0 || https://${connectionConfig.subdomain}.myconnectwise.net/v4_6_release/apis/3.0 + headers: + accept: application/vnd.connectwise.com+json; version=${connectionConfig.apiVersion} + clientid: ${connectionConfig.clientId} + docs: https://nango.dev/docs/api-integrations/connectwise-psa + docs_connect: https://nango.dev/docs/api-integrations/connectwise-psa/connect + connection_config: + hostname: + type: string + title: Hostname + description: The full ConnectWise PSA hostname. + example: api-na.myconnectwise.net + format: hostname + prefix: https:// + suffix: /v4_6_release/apis/3.0 + subdomain: + type: string + title: '' + description: '' + default_value: '' + hidden: true # deprecating this in favor of hostname + apiVersion: + type: string + title: Api version + description: The API version to connect to ConnectWise PSA + clientId: + type: string + title: Client ID + description: The Client ID assigned to your integration + credentials: + username: + type: string + title: Username + description: The ConnectWise PSA CompanyId followed by either the Public Key, Integrator Username, or MemberId + password: + type: string + title: Password + description: Your ConnectWise PSA private key, integrator password, or member hash + +connectwise-psa-staging: + display_name: ConnectWise PSA (Staging) + categories: + - support + - ticketing + auth_mode: BASIC + webhook_routing_script: connectwisePsaWebhookRouting + proxy: + base_url: https://api-staging.connectwisedev.com/v4_6_release/apis/3.0 + headers: + accept: application/vnd.connectwise.com+json; version=${connectionConfig.apiVersion} + clientid: ${connectionConfig.clientId} + docs: https://nango.dev/docs/integrations/all/connectwise-psa-staging + connection_config: + apiVersion: + type: string + title: Api version + description: The API version to connect to ConnectWise PSA + clientId: + type: string + title: Client ID + description: The Client ID assigned to your integration + +connectwise-rmm: + display_name: ConnectWise RMM + categories: + - support + auth_mode: OAUTH2_CC + body_format: json + token_url: https://openapi.service.${connectionConfig.subdomain}/v1/token + token_params: + grant_type: client_credentials + scope_separator: ' ' + proxy: + base_url: https://openapi.service.${connectionConfig.subdomain} + docs: https://nango.dev/docs/api-integrations/connectwise-rmm + docs_connect: https://nango.dev/docs/api-integrations/connectwise-rmm/connect + connection_config: + subdomain: + type: string + title: API Subdomain + description: The ConnectWise RMM OpenAPI subdomain for your region. + enum: + - itsupport247.net + - euplatform.connectwise.com + - auplatform.connectwise.com + doc_section: '#step-1-find-your-api-subdomain' + credentials: + client_id: + type: string + title: Client ID + description: Your ConnectWise RMM OAuth client ID + example: '6500023' + pattern: '^[A-Za-z0-9._-]+$' + doc_section: '#step-2-create-api-credentials' + client_secret: + type: string + title: Client Secret + description: Your ConnectWise RMM OAuth client secret + secret: true + pattern: '^[A-Za-z0-9._~+/=-]{8,}$' + doc_section: '#step-2-create-api-credentials' + +conta-azul: + display_name: Conta Azul + categories: + - accounting + - erp + auth_mode: OAUTH2 + authorization_url: https://auth.contaazul.com/login + token_url: https://auth.contaazul.com/oauth2/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + scope_separator: ' ' + proxy: + base_url: https://api-v2.contaazul.com + disable_pkce: true + docs: https://nango.dev/docs/api-integrations/conta-azul + setup_guide_url: https://nango.dev/docs/api-integrations/conta-azul/how-to-register-your-own-conta-azul-api-oauth-app + +confluence: + display_name: Confluence + categories: + - knowledge-base + - popular + alias: jira + docs: https://nango.dev/docs/api-integrations/confluence + setup_guide_url: https://nango.dev/docs/api-integrations/confluence/how-to-register-your-own-confluence-api-oauth-app + +confluence-basic: + display_name: Confluence (Basic Auth) + categories: + - knowledge-base + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.atlassian.net + headers: + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /wiki/api/v2/spaces + docs: https://nango.dev/docs/integrations/all/confluence-basic + docs_connect: https://nango.dev/docs/integrations/all/confluence-basic/connect + connection_config: + subdomain: + type: string + title: Confluence Subdomain + description: The subdomain of your Confluence account + pattern: '^[a-z0-9_-]+$' + example: subdomain + suffix: .atlassian.net + prefix: https:// + order: 1 + doc_section: '#step-2-finding-your-atlassian-domain' + credentials: + username: + type: string + title: Email Address + format: email + description: The email address for your Confluence account + doc_section: '#step-1-getting-your-api-token' + password: + type: string + title: API token + description: The API token for your Confluence account + secret: true + doc_section: '#step-1-getting-your-api-token' + +confluence-data-center: + display_name: Confluence Data Center + categories: + - productivity + - ticketing + alias: jira-data-center + proxy: + retry: + after: + - 'retry-after' + base_url: https://${connectionConfig.endpointURL} + docs: https://nango.dev/docs/integrations/all/confluence-data-center + docs_connect: https://nango.dev/docs/integrations/all/confluence-data-center/connect + connection_config: + endpointURL: + type: string + title: Domain + description: The domain of your Confluence Data Center instance + prefix: https:// + pattern: '^[a-zA-Z0-9.-]+(:\d+(/[a-zA-Z0-9.-]*)?)?$' + example: confluence.company.com + doc_section: '#step-1-finding-your-domain' + +contentful: + display_name: Contentful + categories: + - dev-tools + - design + - cms + auth_mode: OAUTH2 + authorization_url: https://be.contentful.com/oauth/authorize + token_url: https://be.contentful.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.contentful.com + retry: + after: + - x-contentful-ratelimit-reset + docs: https://nango.dev/docs/integrations/all/contentful + connection_config: + subdomain: + type: string + title: Contentful Domain + description: The subdomain of your Contentful account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .contentful.com + prefix: https:// + +contentstack: + display_name: Contentstack + categories: + - cms + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.contentstack.com/apps/${connectionConfig.appId}/authorize + token_url: https://${connectionConfig.subdomain}.contentstack.com/apps-api/apps/token + docs: https://nango.dev/docs/integrations/all/contentstack + proxy: + base_url: https://${connectionConfig.apiDomain} + connection_config: + subdomain: + type: string + title: Contentstack Domain + description: The subdomain of your Contentstack account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .contentstack.com + prefix: https:// + order: 2 + appId: + type: string + title: App ID + description: The app ID of your Contentstack account + order: 1 + apiDomain: + type: string + title: API Domain + description: The domain to where you will access your API + pattern: '^[a-z0-9_-]+$' + example: eu-api.contentstack.com + prefix: https:// + order: 3 + +coros: + display_name: Coros + categories: + - sports + auth_mode: OAUTH2 + authorization_url: https://open.coros.com/oauth2/authorize + token_url: https://open.coros.com/oauth2/accesstoken + refresh_url: https://open.coros.com/oauth2/refresh-token + authorization_params: + response_type: code + token_response_metadata: + - openId + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://open.coros.com + docs: https://nango.dev/docs/integrations/all/coros + +coros-sandbox: + display_name: Coros (Sandbox) + categories: + - sports + auth_mode: OAUTH2 + authorization_url: https://opentest.coros.com/oauth2/authorize + token_url: https://opentest.coros.com/oauth2/accesstoken + refresh_url: https://opentest.coros.com/oauth2/refresh-token + authorization_params: + response_type: code + token_response_metadata: + - openId + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://opentest.coros.com + docs: https://nango.dev/docs/integrations/all/coros-sandbox + +coupa-compass: + display_name: Coupa Compass + categories: + - payment + - invoicing + auth_mode: OAUTH2_CC + scope_separator: ' ' + token_url: https://${connectionConfig.instanceDomain}/oauth2/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.instanceDomain} + docs: https://nango.dev/docs/integrations/all/coupa-compass + connection_config: + instanceDomain: + type: string + title: Instance Domain + description: The domain of your Coupa Compass account + format: hostname + prefix: https:// + +cyberimpact: + display_name: Cyberimpact + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.cyberimpact.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /ping + docs: https://nango.dev/docs/integrations/all/cyberimpact + docs_connect: https://nango.dev/docs/integrations/all/cyberimpact/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Cyberimpact account + pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' + example: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...' + doc_section: '#step-1-creating-a-cyberimpact-api-key' + +customer-io: + display_name: Customer.io + categories: + - marketing + - analytics + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.customer.io + docs: https://nango.dev/docs/api-integrations/customer-io + docs_connect: https://nango.dev/docs/api-integrations/customer-io/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The region where your Customer.io instance is hosted. + enum: + - cdp + - cdp-eu + order: 1 + doc_section: '#step-2-choose-your-subdomain' + credentials: + username: + type: string + title: API Key + description: Your Customer.io Pipelines API key. + pattern: '^[a-f0-9]{20}$' + example: 36c7a4***********ab022a3 + doc_section: '#step-1-getting-authentication-credentials' + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +cursor: + display_name: Cursor + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.cursor.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v0/me + docs: https://nango.dev/docs/integrations/all/cursor + docs_connect: https://nango.dev/docs/integrations/all/cursor/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Cursor account + doc_section: '#step-1-finding-api-key' + example: key_9164000970ca2f15c999047a0e2b7e03127885be41198616a6975af08b28239b + pattern: '^(key_[a-f0-9]{64}|crsr_[a-f0-9]{64})$' + +cursor-admin: + display_name: Cursor Admin + categories: + - dev-tools + auth_mode: BASIC + proxy: + base_url: https://api.cursor.com + verification: + method: GET + endpoints: + - /teams/members + docs: https://nango.dev/docs/integrations/all/cursor-admin + docs_connect: https://nango.dev/docs/integrations/all/cursor-admin/connect + credentials: + username: + type: string + title: API key + description: The API Key of your Greenhouse account + example: key_9164000970ca2f15c999047a0e2b7e03127885be41198616a6975af08b28239b + pattern: '^(key_[a-f0-9]{64}|crsr_[a-f0-9]{64})$' + secret: true + doc_section: '#step-1-finding-api-key' + password: + type: string + title: Password + description: Password + default_value: '' + hidden: true + +databricks-account: + display_name: Databricks (Account Level) + categories: + - analytics + auth_mode: OAUTH2_CC + token_url: https://accounts.cloud.databricks.com/oidc/accounts/${connectionConfig.accountId}/v1/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://accounts.cloud.databricks.com/api/2.0/accounts/${connectionConfig.accountId} + docs: https://nango.dev/docs/integrations/all/databricks-account + connection_config: + accountId: + type: string + title: Account ID + description: The ID to your account + format: uuid + example: 123e4567-e89b-12d3-a456-426614174000 + +databricks-workspace: + display_name: Databricks (Workspace Level) + categories: + - analytics + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.databricksInstance}/oidc/v1/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.databricksInstance}/api/2.0/ + docs: https://nango.dev/docs/integrations/all/databricks-workspace + connection_config: + databricksInstance: + type: string + title: Databricks Instance + description: The instance to your databricks deployment + pattern: '^[a-z0-9_-]+(\.[a-z0-9_-]+)*$' + example: dbc-a1b2345c-d6e7.cloud.databricks.com + +# Untested configuration. Please reach out if you have a test account that we can use to test it. +datev: + display_name: Datev + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://login.datev.de/openid/authorize + token_url: https://api.datev.de/token + token_request_auth_method: basic + scope_separator: ' ' + default_scopes: + - openid + authorization_params: + response_type: code id_token + response_mode: query + nonce: AnotherRandomStringDatev + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.datev.de + docs: https://nango.dev/docs/integrations/all/datev + +datacandy: + display_name: DataCandy + categories: + - payment + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.application_url}/api2 + query: + application_key: ${connectionConfig.application_key} + accesskey: ${connectionConfig.access_key} + verification: + method: GET + endpoints: + - /merchant?application_key=${connectionConfig.application_key}&accesskey=${connectionConfig.access_key}&limit=1 + connection_config: + application_url: + type: string + title: Application URL + description: The application URL for DataCandy + example: app.datacandy.com + format: hostname + application_key: + type: string + title: Application Key + description: The application key required for read data access + example: c4f9375f9834b4e7f0a528cc65c055702bf5f24a + access_key: + type: string + title: Access Key + description: The access key required for read data access + example: '3CLJII' + credentials: + username: + type: string + title: Username + description: DataCandy username + password: + type: string + title: Password + description: DataCandy password + secret: true + docs: https://nango.dev/docs/integrations/all/datacandy + +datadog: + display_name: Datadog + categories: + - analytics + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.${connectionConfig.siteParameter}/api + headers: + dd-api-key: ${apiKey} + dd-application-key: ${connectionConfig.applicationKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/validate + retry: + after: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/api-integrations/datadog + docs_connect: https://nango.dev/docs/api-integrations/datadog/connect + connection_config: + siteParameter: + type: string + title: Site Parameter + description: The Datadog site for your account. + enum: + - datadoghq.com + - us3.datadoghq.com + - us5.datadoghq.com + - datadoghq.eu + - ddog-gov.com + - ap1.datadoghq.com + order: 1 + doc_section: '#step-1-finding-your-datadog-domain' + applicationKey: + type: string + title: Application Key + description: The application key required for read data access. + pattern: '^[A-Za-z0-9_]+$' + example: '5d8a7b3f2dc8bce1b234e7f1a1ac54728dbf9e4a7' + doc_section: '#step-3-datadog-application-key' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Datadog account. + pattern: '^[a-f0-9]{32}$' + example: '4f3c12efb9659a0b5c123b568745dbf9' + doc_section: '#step-2-datadog-api-key' + +dayforce: + display_name: Dayforce + categories: + - hr + auth_mode: TWO_STEP + body_format: form + proxy: + base_url: https://${connectionConfig.clientHostname}/api || https://www.dayforcehcm.com/api + forward_headers_on_redirect: true + token_url: https://${connectionConfig.identityHostname}/connect/token || https://dfid.dayforcehcm.com/connect/token + token_params: + grant_type: password + companyId: ${connectionConfig.companyId} + username: ${credentials.username} + password: ${credentials.password} + client_id: Dayforce.HCMAnywhere.Client + token_headers: + content-type: application/x-www-form-urlencoded + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/api-integrations/dayforce + docs_connect: https://nango.dev/docs/api-integrations/dayforce/connect + credentials: + username: + type: string + title: Username + description: Your Dayforce account username. + doc_section: '#step-2-configure-your-dayforce-user' + password: + type: string + title: Password + description: Your Dayforce account password. + doc_section: '#step-2-configure-your-dayforce-user' + connection_config: + companyId: + type: string + title: Company ID + description: The company ID for your Dayforce account. + doc_section: '#step-1-finding-your-company-id' + clientHostname: + type: string + title: API hostname + description: Hostname for the Dayforce API, leave empty for production. + format: hostname + prefix: https:// + suffix: /api + optional: true + example: test.dayforcehcm.com + doc_section: '#step-4-identifying-your-client-host' + identityHostname: + type: string + title: Identity hostname + description: Hostname for the Dayforce Identity token endpoint, leave empty for production. + format: hostname + optional: true + prefix: https:// + suffix: /connect/token + example: dfid.dayforcehcm.com + doc_section: '#step-3-identifying-your-identity-host' + +datto-rmm: + display_name: Datto RMM + categories: + - support + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.platform}-api.centrastage.net/auth/oauth/authorize + token_url: https://${connectionConfig.platform}-api.centrastage.net/auth/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + token_request_auth_method: basic + disable_pkce: true + proxy: + base_url: https://${connectionConfig.platform}-api.centrastage.net/api + docs: https://nango.dev/docs/integrations/all/datto-rmm + docs_connect: https://nango.dev/docs/integrations/all/datto-rmm/connect + connection_config: + platform: + type: string + title: Platform + description: The Datto RMM platform (region) for your account. + enum: + - pinotage + - merlot + - concord + - vidal + - zinfandel + - syrah + order: 1 + doc_section: '#step-2-select-your-platform' + +datto-rmm-password-grant: + display_name: Datto RMM (Password Grant) + categories: + - support + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.platform}-api.centrastage.net/auth/oauth/token + token_params: + grant_type: password + username: ${credentials.username} + password: ${credentials.password} + token_headers: + authorization: Basic ${base64(${credentials.default_username}:${credentials.default_password})} + proxy: + base_url: https://${connectionConfig.platform}-api.centrastage.net/api + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/integrations/all/datto-rmm-password-grant + docs_connect: https://nango.dev/docs/integrations/all/datto-rmm-password-grant/connect + connection_config: + platform: + type: string + title: Platform + description: The Datto RMM platform (region) for your account. + enum: + - pinotage + - merlot + - concord + - vidal + - zinfandel + - syrah + order: 1 + doc_section: '#step-2-select-your-platform' + credentials: + default_username: + type: string + title: '' + description: '' + default_value: 'public-client' + hidden: true + default_password: + type: string + title: '' + description: '' + default_value: 'public' + hidden: true + username: + type: string + title: API Key + pattern: '^[A-Z0-9]{32}$' + example: 'AB7KLM90PQW4XJ8H2TUVN1YZ3R5C6FDG' + doc_section: '#step-1-enable-api-access-and-generate-api-keys' + description: Your Datto RMM API Key + password: + type: string + title: API Secret Key + pattern: '^[A-Z0-9]{32}$' + example: '9XQ7MZB4H1L2WKC0RDFTPY5J8VUNSG3E' + doc_section: '#step-1-enable-api-access-and-generate-api-keys' + description: Your Datto RMM Secret Key + +deel: + display_name: Deel + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://app.deel.com/oauth2/authorize + token_url: https://app.deel.com/oauth2/tokens + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.letsdeel.com + docs: https://nango.dev/docs/integrations/all/deel + +deel-sandbox: + display_name: Deel (Sandbox) + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://demo.deel.com/oauth2/authorize + token_url: https://demo.deel.com/oauth2/tokens + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api-sandbox.demo.deel.com + docs: https://nango.dev/docs/integrations/all/deel-sandbox + +devin: + display_name: Devin + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.devin.ai + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/sessions + docs: https://nango.dev/docs/integrations/all/devin + docs_connect: https://nango.dev/docs/integrations/all/devin/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Devin account + pattern: '^apk_user_[A-Za-z0-9+/=]+$' + example: 'apk_user_dGVzdF9vcmdfeDY1NzRBUElLRVl8Njc1OTdjNDQzMjFhOTZlODhlMmE4MTI0X29yZ194NnB5QlVJa042anVKWWtMOjQ3NzQxYTVmYWE5MTRiNjQ5' + doc_section: '#step-1-finding-your-api-key' + +demodesk: + display_name: DemoDesk + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://demodesk.com + headers: + api-key: ${apiKey} + docs: https://nango.dev/docs/api-integrations/demodesk + docs_connect: https://nango.dev/docs/api-integrations/demodesk/connect + credentials: + apiKey: + type: string + title: API Key + description: Your DemoDesk API key + doc_section: '#step-1-obtaining-your-api-key' + +dialpad: + display_name: Dialpad + categories: + - communication + auth_mode: OAUTH2 + authorization_url: https://dialpad.com/oauth2/authorize + token_url: https://dialpad.com/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://dialpad.com + docs: https://nango.dev/docs/integrations/all/dialpad + +dialpad-sandbox: + display_name: Dialpad (Sandbox) + categories: + - communication + auth_mode: OAUTH2 + authorization_url: https://sandbox.dialpad.com/oauth2/authorize + token_url: https://sandbox.dialpad.com/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://sandbox.dialpad.com + docs: https://nango.dev/docs/integrations/all/dialpad-sandbox + +dialpad-wfm: + display_name: Dialpad WFM + categories: + - hr + auth_mode: API_KEY + proxy: + base_url: https://api.teamsurfboard.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/api-integrations/dialpad-wfm + docs_connect: https://nango.dev/docs/api-integrations/dialpad-wfm/connect + credentials: + apiKey: + type: string + title: Access Token + description: The access token for your account. + secret: true + doc_section: '#step-1-obtain-your-access-token' + +diffbot: + display_name: Diffbot + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://api.diffbot.com + query: + token: ${apiKey} + verification: + method: GET + endpoints: + - /v4/account + docs: https://nango.dev/docs/api-integrations/diffbot + docs_connect: https://nango.dev/docs/api-integrations/diffbot/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Diffbot API token. + example: c4f82a1b********************e7d3 + pattern: '^[a-f0-9]{32}$' + doc_section: '#step-1-obtain-your-api-token' + +digitalocean: + display_name: DigitalOcean + categories: + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://cloud.digitalocean.com/v1/oauth/authorize + token_url: https://cloud.digitalocean.com/v1/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.digitalocean.com + docs: https://nango.dev/docs/integrations/all/digitalocean + +digits: + display_name: Digits + categories: + - accounting + auth_mode: OAUTH2 + authorization_url: https://connect.digits.com/v1/oauth/authorize + token_url: https://connect.digits.com/v1/oauth/token + body_format: json + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://connect.digits.com + docs: https://nango.dev/docs/api-integrations/digits + setup_guide_url: https://nango.dev/docs/api-integrations/digits/how-to-register-your-own-digits-api-oauth-app + +digits-mcp: + display_name: Digits (MCP) + categories: + - accounting + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://api.digits.com/oauth/authorize + token_url: https://api.digits.com/oauth/token + registration_url: https://api.digits.com/oauth/register + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.digits.com + docs: https://nango.dev/docs/api-integrations/digits-mcp + +discolike: + display_name: DiscoLike + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.discolike.com + headers: + x-discolike-key: ${apiKey} + verification: + method: GET + endpoints: + - /v1/count + docs: https://nango.dev/docs/api-integrations/discolike + docs_connect: https://nango.dev/docs/api-integrations/discolike/connect + credentials: + apiKey: + type: string + title: API Key + description: Your DiscoLike API key. + doc_section: '#step-1-obtain-your-api-key' + example: 123e4567-e89b-12d3-a456-426614174000 + format: uuid + +discord: + display_name: Discord + categories: + - gaming + - social + auth_mode: OAUTH2 + authorization_url: https://discord.com/api/oauth2/authorize + token_url: https://discord.com/api/oauth2/token + authorization_params: + response_type: code + proxy: + base_url: https://discord.com + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/discord + setup_guide_url: https://nango.dev/docs/api-integrations/discord/how-to-register-your-own-discord-api-oauth-app + +discourse: + display_name: Discourse + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.defaultHost} + retry: + after: + - 'retry-after' + headers: + api-username: ${connectionConfig.apiUsername} + api-key: ${apiKey} + accept: application/json + docs: https://nango.dev/docs/integrations/all/discourse + connection_config: + defaultHost: + type: string + title: Domain + description: The domain of your Discourse account + format: hostname + prefix: https:// + apiUsername: + type: string + title: API Username + description: The API username of your Discourse account + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Discourse account + +crisp: + display_name: Crisp + categories: + - communication + - support + auth_mode: BASIC + proxy: + base_url: https://api.crisp.chat + headers: + x-crisp-tier: plugin + verification: + method: GET + endpoints: + - /v1/plugin/connect/account + docs: https://nango.dev/docs/integrations/all/crisp + docs_connect: https://nango.dev/docs/integrations/all/crisp/connect + credentials: + username: + type: string + title: Token Identifier + description: The identifier part of your Crisp token keypair + example: 123e4567-e89b-12d3-a456-426614174000 + format: uuid + doc_section: '#step-1-generating-your-token-keypair' + password: + type: string + title: Token Key + pattern: '^[a-f0-9]{64}$' + example: a3f5c8d2b9e4713f2c0a7b4d5e6f8c9b1a2d3e4f5b6c7d8e9f0a1b2c3d4e5f6a7 + description: The key part of your Crisp token keypair + doc_section: '#step-1-generating-your-token-keypair' + +crisp-plugin-install: + display_name: Crisp (Plugin Install) + categories: + - communication + - support + auth_mode: INSTALL_PLUGIN + auth_type: BASIC + redirect_uri_metadata: + - website_id + proxy: + base_url: https://api.crisp.chat + headers: + x-crisp-tier: plugin + verification: + method: GET + endpoints: + - /v1/plugin/connect/account + docs: https://nango.dev/docs/api-integrations/crisp-plugin-install + setup_guide_url: https://nango.dev/docs/api-integrations/crisp-plugin-install/how-to-register-your-own-crisp-plugin + +crunchbase: + display_name: Crunchbase + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.crunchbase.com/ + headers: + x-cb-user-key: ${apiKey} + verification: + method: GET + endpoints: + - /v4/data/autocompletes?query=instantly&limit=1 + docs: https://nango.dev/docs/api-integrations/crunchbase + docs_connect: https://nango.dev/docs/api-integrations/crunchbase/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Crunchbase API key. + doc_section: '#step-1-get-your-api-key' + pattern: '^[a-zA-Z0-9]{32}$' + example: 0f9c************************5336 + +dixa: + display_name: Dixa + categories: + - support + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.apiType}.dixa.io + headers: + authorization: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/agents + base_url_override: https://dev.dixa.io + docs: https://nango.dev/docs/integrations/all/dixa + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Dixa account + connection_config: + apiType: + type: string + title: API Type + description: The Dixa API type to use for requests. + enum: + - dev + - exports + +document360: + display_name: Document360 + categories: + - knowledge-base + auth_mode: API_KEY + proxy: + headers: + api_token: ${apiKey} + base_url: https://api.document360.com + docs: https://nango.dev/docs/integrations/all/document360 + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Document360 account + +docusign: + display_name: DocuSign + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://account.docusign.com/oauth/auth + token_url: https://account.docusign.com/oauth/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://www.docusign.net + post_connection_script: docusignPostConnection + docs: https://nango.dev/docs/integrations/all/docusign + +docusign-sandbox: + display_name: DocuSign (Sandbox) + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://account-d.docusign.com/oauth/auth + token_url: https://account-d.docusign.com/oauth/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://demo.docusign.net + post_connection_script: docusignPostConnection + docs: https://nango.dev/docs/integrations/all/docusign-sandbox + +docuware: + display_name: DocuWare + categories: + - productivity + auth_mode: TWO_STEP + token_url: https://${connectionConfig.domain}/DocuWare/Platform/Home/IdentityServiceInfo + body_format: form + token_request_method: GET + token_headers: + content-type: application/x-www-form-urlencoded + additional_steps: + - body_format: form + token_url: ${step1.IdentityServiceUrl}/.well-known/openid-configuration + token_request_method: GET + - body_format: form + token_url: ${step2.token_endpoint} + token_headers: + content-type: application/x-www-form-urlencoded + token_params: + grant_type: password + scope: docuware.platform + client_id: docuware.platform.net.client + username: ${credentials.username} + password: ${credentials.password} + proxy: + base_url: https://${connectionConfig.domain}/DocuWare/Platform + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/integrations/all/docuware + docs_connect: https://nango.dev/docs/integrations/all/docuware/connect + connection_config: + domain: + type: string + title: Domain + description: The domain to your DocuWare account + format: hostname + prefix: https:// + example: example.docuware.cloud + order: 1 + doc_section: '#step-1-finding-your-domain' + credentials: + username: + type: string + title: Username + description: The Username to your DocuWare account + doc_section: '#step-2-finding-your-credentials' + password: + type: string + title: Password + secret: true + description: The Password to your DocuWare account + doc_section: '#step-2-finding-your-credentials' + +domo: + display_name: Domo + categories: + - productivity + - other + auth_mode: OAUTH2_CC + token_url: https://api.domo.com/oauth/token + scope_separator: ',' + token_params: + grant_type: client_credentials + token_request_auth_method: basic + proxy: + base_url: https://api.domo.com + docs: https://nango.dev/docs/api-integrations/domo + docs_connect: https://nango.dev/docs/api-integrations/domo/connect + credentials: + client_id: + type: string + title: Your Client ID + description: The Client ID of your API client + format: uuid + example: 123e4567-e89b-12d3-a456-426614174000 + doc_section: '#step-1-creating-your-api-client' + client_secret: + type: string + title: Your Client Secret + secret: true + example: a14e6b49******************************768ece + pattern: '^[a-fA-F0-9]{64}$' + description: The Client secret of your API client + doc_section: '#step-1-creating-your-api-client' + +dropbox: + display_name: Dropbox + categories: + - knowledge-base + - storage + auth_mode: OAUTH2 + authorization_url: https://www.dropbox.com/oauth2/authorize + token_url: https://api.dropboxapi.com/oauth2/token + authorization_params: + token_access_type: offline + proxy: + base_url: https://api.dropboxapi.com + docs: https://nango.dev/docs/api-integrations/dropbox + setup_guide_url: https://nango.dev/docs/api-integrations/dropbox/how-to-register-your-own-dropbox-api-oauth-app + +dropbox-sign: + display_name: Dropbox Sign + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://app.hellosign.com/oauth/authorize + token_url: https://app.hellosign.com/oauth/token + authorization_url_skip_empty: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + refresh_url: https://app.hellosign.com/oauth/token?refresh + proxy: + retry: + at: + - 'x-ratelimit-reset' + base_url: https://api.hellosign.com + docs: https://nango.dev/docs/integrations/all/dropbox-sign + +drchrono: + display_name: DrChrono + categories: + - other + auth_mode: OAUTH2 + authorization_url: https://app.drchrono.com/o/authorize/ + token_url: https://app.drchrono.com/o/token/ + authorization_url_skip_empty: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://app.drchrono.com + docs: https://nango.dev/docs/integrations/all/drchrono + +drata: + display_name: Drata + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://public-api.drata.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/api-integrations/drata + docs_connect: https://nango.dev/docs/api-integrations/drata/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Drata API key + +cisco-duo-admin: + display_name: Cisco Duo Admin API + categories: + - iam + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.hostname} + headers: + date: '${now:ddd, DD MMM YYYY HH:mm:ss ZZ}' + authorization: "Basic ${base64(${credentials.username}:${hmacSha1Hex(${now:ddd, DD MMM YYYY HH:mm:ss ZZ}\n${method}\n${host}\n${path}\n${params}, ${credentials.password})})}" + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/cisco-duo-admin + docs_connect: https://nango.dev/docs/api-integrations/cisco-duo-admin/connect + connection_config: + hostname: + type: string + title: API Hostname + description: Your Duo API hostname. + example: api-xxxxxxxx.duosecurity.com + pattern: 'api-[a-z0-9]+\.duosecurity\.com' + order: 1 + credentials: + username: + type: string + title: Integration Key + description: Your Duo application's integration key. + example: DIWJ8X6**********TQ1 + pattern: 'DI[A-Z0-9]{18}' + password: + type: string + title: Secret Key + description: Your Duo application's secret key. + example: Zh5eGm**************************zLJ4Ep + pattern: '[A-Za-z0-9]{40}' + +contactout: + display_name: ContactOut + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.contactout.com + headers: + authorization: basic + token: ${apiKey} + retry: + after: + - 'retry-after' + verification: + method: GET + endpoints: + - /v1/stats + docs: https://nango.dev/docs/integrations/all/contactout + docs_connect: https://nango.dev/docs/integrations/all/contactout/connect + credentials: + apiKey: + type: string + title: API Key + example: ab7KxYpR1qLmN9Zs3TvUeFgH + description: Your ContactOut API Key + +drupal: + display_name: Drupal + categories: + - dev-tools + - design + - cms + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.baseUrl}/rest_api/access_token + token_params: + client_id: ${credentials.clientId} + client_secret: ${credentials.clientSecret} + username: ${credentials.userName} + grant_type: client_credentials + token_headers: + content-type: application/x-www-form-urlencoded + accept: application/json + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://${connectionConfig.baseUrl} + docs: https://nango.dev/docs/integrations/all/drupal + docs_connect: https://nango.dev/docs/integrations/all/drupal/connect + credentials: + clientId: + type: string + title: Client ID + description: Your Client ID + secret: true + doc_section: '#step-3-generating-your-drupal-client-credentials' + clientSecret: + type: string + title: Client Secret + description: Your Client Secret + secret: true + doc_section: '#step-3-generating-your-drupal-client-credentials' + userName: + type: string + title: User Name + description: Your Drupal User Name + doc_section: '#step-2-finding-your-drupal-user-name' + connection_config: + baseUrl: + type: string + title: Base Url + description: Your Drupal base url + example: example.drupal.com + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-drupal-base-url' + +dualentry-mcp: + display_name: Dualentry (MCP) + categories: + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://api.dualentry.com/mcp/authorize + token_url: https://api.dualentry.com/mcp/token + registration_url: https://api.dualentry.com/mcp/register + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.dualentry.com + docs: https://nango.dev/docs/api-integrations/dualentry-mcp + +dynatrace: + display_name: Dynatrace + categories: + - analytics + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.environmentId}.live.dynatrace.com + headers: + authorization: Api-Token ${apiKey} + docs: https://nango.dev/docs/api-integrations/dynatrace + docs_connect: https://nango.dev/docs/api-integrations/dynatrace/connect + connection_config: + environmentId: + type: string + title: Environment ID + description: Your Dynatrace environment ID. + pattern: '^[a-z0-9]+$' + example: mew08*** + order: 1 + doc_section: '#step-1-find-your-environment-id' + credentials: + apiKey: + type: string + title: API Token + description: Your Dynatrace API token. + pattern: '^dt0[a-z]\d+\.[A-Z0-9]+\.[A-Z0-9]+$' + example: dt0s01.ST2EY72KQINMH5***********.G3DFPBEJYMODIDAEX454M7YWB*************************** + doc_section: '#step-2-generate-an-api-token' + +dynatrace-oauth: + display_name: Dynatrace (OAuth) + categories: + - analytics + - dev-tools + auth_mode: OAUTH2_CC + token_url: https://sso.dynatrace.com/sso/oauth2/token + scope_separator: ' ' + token_params: + grant_type: client_credentials + resource: urn:dtaccount:${connectionConfig.accountUuid} + proxy: + base_url: https://api.dynatrace.com + docs: https://nango.dev/docs/api-integrations/dynatrace-oauth + docs_connect: https://nango.dev/docs/api-integrations/dynatrace-oauth/connect + connection_config: + accountUuid: + type: string + title: Account UUID + description: Your Dynatrace account UUID. + example: 9a8b7c6d-1234-5678-abcd-ef0123456789 + format: uuid + order: 1 + doc_section: '#step-1-find-your-account-uuid' + credentials: + client_id: + type: string + title: Client ID + description: Your Dynatrace OAuth client ID. + example: dt0s03.**************** + doc_section: '#step-2-create-an-oauth-client' + client_secret: + type: string + title: Client Secret + description: Your Dynatrace OAuth client secret. + secret: true + example: dt0s03.5NJ******.GYWJPBF****************** + doc_section: '#step-2-create-an-oauth-client' + +emarsys: + display_name: Emarsys Core API (WSSE) + categories: + - marketing + auth_mode: SIGNATURE + signature: + protocol: WSSE + proxy: + base_url: https://api.emarsys.net + headers: + content-type: application/json + x-wsse: ${accessToken} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v2/settings + retry: + at: + - 'x-ratelimit-reset' + token: + expires_in_ms: 300000 + docs: https://nango.dev/docs/integrations/all/emarsys + credentials: + username: + type: string + title: ID + description: The ID of your Emarsys WSSE API Credentials + pattern: '^[a-zA-Z0-9_-]+$' + password: + type: string + title: Client Secret + description: The Client Secret of your Emarsys WSSE API Credentials + pattern: '^[a-zA-Z0-9-]+$' + +emarsys-oauth: + display_name: Emarsys (OAuth) + categories: + - marketing + auth_mode: OAUTH2_CC + token_url: https://auth.emarsys.net/oauth2/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.emarsys.net + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/integrations/all/emarsys-oauth + docs_connect: https://nango.dev/docs/integrations/all/emarsys-oauth/connect + +employment-hero: + display_name: Employment Hero + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://oauth.employmenthero.com/oauth2/authorize + token_url: https://oauth.employmenthero.com/oauth2/token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.employmenthero.com/api + docs: https://nango.dev/docs/integrations/all/employment-hero + +ebay: + display_name: eBay + categories: + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://auth.ebay.com/oauth2/authorize + token_url: https://api.ebay.com/identity/v1/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + token_request_auth_method: basic + proxy: + base_url: https://api.ebay.com/ + docs: https://nango.dev/docs/integrations/all/ebay + +ebay-sandbox: + display_name: eBay (Sandbox) + categories: + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://auth.sandbox.ebay.com/oauth2/authorize + token_url: https://api.sandbox.ebay.com/identity/v1/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + token_request_auth_method: basic + proxy: + base_url: https://api.sandbox.ebay.com/ + docs: https://nango.dev/docs/integrations/all/ebay-sandbox + +easypost: + display_name: EasyPost + categories: + - e-commerce + auth_mode: BASIC + proxy: + base_url: https://api.easypost.com + docs: https://nango.dev/docs/api-integrations/easypost + docs_connect: https://nango.dev/docs/api-integrations/easypost/connect + credentials: + username: + type: string + title: API Key + description: Your EasyPost API key. + pattern: '^EZ(AK|TK)[a-zA-Z0-9]+$' + example: EZTK****************************PCHxBDQG3lpZjneEFUxKmg + doc_section: '#step-1-get-your-api-key' + password: + type: string + title: '' + description: '' + hidden: true + default_value: '' + +e-conomic: + display_name: e-conomic + categories: + - accounting + auth_mode: BASIC + proxy: + base_url: https://restapi.e-conomic.com + headers: + content-type: application/json + docs: https://nango.dev/docs/integrations/all/e-conomic + credentials: + username: + type: string + title: Private Token + description: The Private Token for your e-conomic account + password: + type: string + title: Agreement Grant Token + description: The Agreement Grant Token for your e-conomic account + +ecu360: + display_name: ECU360 (Test) + categories: + - other + auth_mode: TWO_STEP + body_format: json + token_url: https://apim-test.ecu360.com/auth/v1/authenticate + token_params: + userName: ${credentials.userName} + password: ${credentials.password} + isEncrypted: false + mfaToken: '' + token_headers: + ecu360-api-key: ${credentials.apiKey} + content-type: application/json + token_response: + token: jwtToken + token_expires_in_ms: 900000 + proxy: + base_url: https://apim-test.ecu360.com + docs: https://nango.dev/docs/api-integrations/ecu360 + docs_connect: https://nango.dev/docs/api-integrations/ecu360/connect + credentials: + apiKey: + type: string + title: API Key + description: Your ECU360 API Key + secret: true + doc_section: '#step-2-obtaining-your-api-key' + userName: + type: string + title: Username + description: Your ECU360 username + doc_section: '#step-1-finding-your-credentials' + password: + type: string + title: Password + description: Your ECU360 password + secret: true + doc_section: '#step-1-finding-your-credentials' + +ecu360-production: + display_name: ECU360 (Production) + categories: + - other + alias: ecu360 + token_url: https://apim.ecu360.com/auth/v1/authenticate + proxy: + base_url: https://apim.ecu360.com + docs: https://nango.dev/docs/api-integrations/ecu360-production + docs_connect: https://nango.dev/docs/api-integrations/ecu360-production/connect + +egnyte: + display_name: Egnyte + categories: + - storage + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.egnyte.com/puboauth/token + token_url: https://${connectionConfig.subdomain}.egnyte.com/puboauth/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.egnyte.com/pubapi + docs: https://nango.dev/docs/integrations/all/egnyte + connection_config: + subdomain: + type: string + title: Egnyte Domain + description: The subdomain of your Egnyte account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .egnyte.com + prefix: https:// + +elevenlabs: + display_name: Eleven Labs + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.elevenlabs.io + headers: + xi-api-key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/user + docs: https://nango.dev/docs/integrations/all/elevenlabs + credentials: + apiKey: + type: string + title: API Key + description: The API key for your ElevenLabs account + +elevio: + display_name: Elevio + categories: + - knowledge-base + - support + auth_mode: API_KEY + proxy: + base_url: https://api.elev.io + headers: + x-api-key: ${apiKey} + authorization: Bearer ${connectionConfig.jwt} + docs: https://nango.dev/docs/integrations/all/elevio + credentials: + apiKey: + type: string + title: API Key + description: The API key to your Elevio account + pattern: '\b[a-f0-9]{40}\b' + example: 'x12z67890dd34t8gq5j01ycc75912348' + connection_config: + jwt: + type: string + title: JWT + description: The JWT to your Elevio account + pattern: '^[A-Za-z0-9-_]+\.([A-Za-z0-9-_]+\.[A-Za-z0-9-_]+)$' + +entrata: + display_name: Entrata + categories: + - other + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.entrata.com + docs: https://nango.dev/docs/integrations/all/entrata + connection_config: + subdomain: + type: string + title: Entrata Domain + description: The subdomain of your Entrata account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .entrata.com + prefix: https:// + +envoy: + display_name: Envoy + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://app.envoy.com/a/auth/v0/authorize + token_url: https://app.envoy.com/a/auth/v0/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.envoy.com + docs: https://nango.dev/docs/integrations/all/envoy + +epc-gov-uk: + display_name: Energy Performance Certificates (Gov.UK) + categories: + - other + auth_mode: API_KEY + proxy: + base_url: https://api.get-energy-performance-data.communities.gov.uk + headers: + authorization: Bearer ${apiKey} + accept: application/json + verification: + method: GET + endpoints: + - /api/codes + docs: https://nango.dev/docs/api-integrations/epc-gov-uk + docs_connect: https://nango.dev/docs/api-integrations/epc-gov-uk/connect + credentials: + apiKey: + type: string + title: API Key + description: The API bearer token of your account. + pattern: '^[A-Za-z0-9]{64}$' + example: 'a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2' + doc_section: '#step-2-finding-your-api-key' + +epic-games: + display_name: Epic Games + categories: + - gaming + auth_mode: OAUTH2 + authorization_url: https://www.epicgames.com/id/authorize + token_url: https://api.epicgames.dev/epic/oauth/v1/token + authorization_method: header + proxy: + base_url: https://api.epicgames.dev + docs: https://nango.dev/docs/integrations/all/epic-games + +evaluagent: + display_name: EvaluAgent + categories: + - support + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.region}.evaluagent.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/ping + docs: https://nango.dev/docs/integrations/all/evaluagent + connection_config: + region: + type: string + title: Region + description: The region of your EvaluAgent account. + enum: + - api + - api.us-east + - api.aus + credentials: + username: + type: string + title: Access Key Id + description: The Access Key ID for your EvaluAgent account + pattern: '^[a-zA-Z0-9-]+$' + password: + type: string + title: Secret Key + description: The Secret Key for your EvaluAgent account + pattern: '^[a-zA-Z0-9-]+$' + +eventbrite: + display_name: Eventbrite + categories: + - marketing + auth_mode: OAUTH2 + authorization_url: https://www.eventbrite.com/oauth/authorize + token_url: https://www.eventbrite.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://www.eventbriteapi.com + docs: https://nango.dev/docs/integrations/all/eventbrite + +everflow: + display_name: Everflow + categories: + - marketing + - analytics + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.eflow.team + headers: + x-eflow-api-key: ${apiKey} + docs: https://nango.dev/docs/api-integrations/everflow + docs_connect: https://nango.dev/docs/api-integrations/everflow/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: Your Everflow API subdomain. + enum: + - api + - api-eu + order: 1 + doc_section: '#step-2-find-your-subdomain' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Everflow account. + doc_section: '#step-1-generate-your-api-key' + +etsy: + display_name: Etsy + categories: + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://www.etsy.com/oauth/connect + token_url: https://api.etsy.com/v3/public/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.etsy.com + headers: + x-api-key: ${clientId}:${clientSecret} + docs: https://nango.dev/docs/api-integrations/etsy + setup_guide_url: https://nango.dev/docs/api-integrations/etsy/how-to-register-your-own-etsy-api-oauth-app + +exa: + display_name: Exa + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://api.exa.ai + headers: + x-api-key: ${apiKey} + docs: https://nango.dev/docs/integrations/all/exa + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Exa account + +exact-online: + display_name: Exact Online + categories: + - accounting + - erp + auth_mode: OAUTH2 + authorization_url: https://start.exactonline.${connectionConfig.extension}/api/oauth2/auth + token_url: https://start.exactonline.${connectionConfig.extension}/api/oauth2/token + authorization_method: header + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + token_expiration_buffer: 30 + proxy: + base_url: https://start.exactonline.${connectionConfig.extension}/ + headers: + accept: application/json + retry: + at: + - 'x-ratelimit-minutely-reset' + - 'x-ratelimit-reset' + error_code: + - '429' + - '503' + paginate: + type: link + link_path_in_response_body: d.__next + docs: https://nango.dev/docs/integrations/all/exact-online + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Exact Online account. + enum: + - nl + - be + - de + - fr + - es + - co.uk + - com + +exist: + display_name: Exist + categories: + - other + auth_mode: OAUTH2 + authorization_url: https://exist.io/oauth2/authorize + token_url: https://exist.io/oauth2/access_token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://exist.io/ + paginate: + type: link + link_path_in_response_body: next + docs: https://nango.dev/docs/integrations/all/exist + +expensify: + display_name: Expensify + categories: + - productivity + auth_mode: BASIC + proxy: + base_url: https://integrations.expensify.com/Integration-Server/ + headers: + content-type: application/x-www-form-urlencoded + credentials: + username: + type: string + title: Partner User ID + description: Your unique account identifier of Expensify + doc_section: '#step-1-finding-your-partneruserid-and-partnerusersecret' + password: + type: string + title: Partner User Secret + description: Unique secret for your account + doc_section: '#step-1-finding-your-partneruserid-and-partnerusersecret' + credentials_verification_script: expensifyCredentialsVerification + docs: https://nango.dev/docs/integrations/all/expensify + docs_connect: https://nango.dev/docs/integrations/all/expensify/connect + +factorial: + display_name: Factorial + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://api.factorialhr.com/oauth/authorize + token_url: https://api.factorialhr.com/oauth/token + disable_pkce: true + proxy: + base_url: https://api.factorialhr.com/api + docs: https://nango.dev/docs/integrations/all/factorial + +fairing: + display_name: Fairing + categories: + - marketing + - analytics + auth_mode: API_KEY + proxy: + base_url: https://app.fairing.co/api + headers: + authorization: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /questions + docs: https://nango.dev/docs/integrations/all/fairing + docs_connect: https://nango.dev/docs/integrations/all/fairing/connect + credentials: + apiKey: + type: string + title: Secret Token + description: The Secret Token for your Fairing account + pattern: '^[A-Za-z0-9_-]{64}$' + example: '3UjYpDjuk70Lt7AxC4M1x_7XvxoxkeX-OV7uTahJowilqLb2eLLvrtlvCGZgku1q' + doc_section: '#step-1-finding-your-secret-token' + +facebook: + display_name: Facebook + categories: + - marketing + - social + auth_mode: OAUTH2 + authorization_url: https://www.facebook.com/v22.0/dialog/oauth + token_url: https://graph.facebook.com/v22.0/oauth/access_token + proxy: + base_url: https://graph.facebook.com + docs: https://nango.dev/docs/api-integrations/facebook + setup_guide_url: https://nango.dev/docs/api-integrations/facebook/how-to-register-your-own-facebook-api-oauth-app + +fanvue: + display_name: Fanvue + categories: + - other + auth_mode: OAUTH2 + authorization_url: https://auth.fanvue.com/oauth2/auth + token_url: https://auth.fanvue.com/oauth2/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + default_scopes: + - offline_access + - offline + scope_separator: ' ' + proxy: + base_url: https://api.fanvue.com + headers: + x-fanvue-api-version: ${connectionConfig.version} || 2025-06-26 + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/fanvue + connection_config: + version: + type: string + title: '' + description: '' + automated: true + +fiber-ai: + display_name: Fiber AI + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://api.fiber.ai + query: + apiKey: ${apiKey} + verification: + method: GET + endpoints: + - /v1/get-org-credits + docs: https://nango.dev/docs/api-integrations/fiber-ai + docs_connect: https://nango.dev/docs/api-integrations/fiber-ai/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Fiber AI API key. + doc_section: '#step-1-getting-your-api-key' + +fathom: + display_name: Fathom + categories: + - communication + - video + auth_mode: API_KEY + proxy: + base_url: https://api.fathom.ai + headers: + x-api-key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /external/v1/teams + webhook_routing_script: fathomWebhookRouting + webhook_user_defined_secret: true + docs: https://nango.dev/docs/integrations/all/fathom + docs_connect: https://nango.dev/docs/integrations/all/fathom/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Fathom account + +fathom-oauth: + display_name: Fathom (OAuth) + categories: + - communication + - video + auth_mode: OAUTH2 + authorization_url: https://fathom.video/external/v1/oauth2/authorize + token_url: https://fathom.video/external/v1/oauth2/token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + webhook_routing_script: fathomWebhookRouting + webhook_user_defined_secret: true + proxy: + base_url: https://api.fathom.ai + retry: + at: + - 'ratelimit-reset' + docs: https://nango.dev/docs/api-integrations/fathom-oauth + setup_guide_url: https://nango.dev/docs/api-integrations/fathom-oauth/how-to-register-your-own-fathom-oauth-app + +fellow: + display_name: Fellow + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.fellow.app/api + headers: + x-api-key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/me + docs: https://nango.dev/docs/api-integrations/fellow + docs_connect: https://nango.dev/docs/api-integrations/fellow/connect + connection_config: + subdomain: + type: string + title: Workspace Subdomain + description: The subdomain of your Fellow workspace + pattern: '^[a-z0-9_-]+$' + example: myworkspace + order: 1 + doc_section: '#step-1-finding-your-workspace-subdomain' + credentials: + apiKey: + type: string + title: API Key + description: Your Fellow API Key + example: ab84bc2056614635866e4a98c153d7a1ab30541032fd433793d402f2a5db2404 + pattern: '^[a-f0-9]{64}$' + doc_section: '#step-2-generating-your-api-key' + +fern: + display_name: Fern (Public API) + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.baseUrl} + headers: + fern_api_key: ${apiKey} + docs: https://nango.dev/docs/api-integrations/fern + docs_connect: https://nango.dev/docs/api-integrations/fern/connect + credentials: + apiKey: + type: string + title: Fern API key + description: Your Fern API key. + doc_section: '#step-1-generate-your-fern-api-key' + connection_config: + baseUrl: + type: string + title: Docs URL + description: The domain of your Fern docs site. + example: docs.example.com + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-2-find-your-docs-url' + +freeagent: + display_name: FreeAgent + categories: + - accounting + - invoicing + auth_mode: OAUTH2 + authorization_url: https://api.freeagent.com/v2/approve_app + token_url: https://api.freeagent.com/v2/token_endpoint + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.freeagent.com + docs: https://nango.dev/docs/api-integrations/freeagent + setup_guide_url: https://nango.dev/docs/api-integrations/freeagent/how-to-register-your-own-freeagent-oauth-app + +freeagent-sandbox: + display_name: FreeAgent (Sandbox) + categories: + - accounting + - invoicing + auth_mode: OAUTH2 + authorization_url: https://api.sandbox.freeagent.com/v2/approve_app + token_url: https://api.sandbox.freeagent.com/v2/token_endpoint + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.sandbox.freeagent.com + docs: https://nango.dev/docs/api-integrations/freeagent-sandbox + setup_guide_url: https://nango.dev/docs/api-integrations/freeagent-sandbox/how-to-register-your-own-freeagent-oauth-app + +freepik: + display_name: Freepik + categories: + - other + auth_mode: API_KEY + proxy: + base_url: https://api.freepik.com + headers: + x-freepik-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v1/resources + docs: https://nango.dev/docs/api-integrations/freepik + docs_connect: https://nango.dev/docs/api-integrations/freepik/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Freepik account. + doc_section: '#step-1-obtain-your-freepik-api-key' + example: FPSXc7b3**********************5b2a + pattern: 'FPSX[0-9a-f]{32}' + +figjam: + display_name: FigJam + categories: + - design + - productivity + alias: figma + docs: https://nango.dev/docs/integrations/all/figjam + +figma: + display_name: Figma + categories: + - design + - productivity + auth_mode: OAUTH2 + authorization_url: https://www.figma.com/oauth + token_url: https://api.figma.com/v1/oauth/token + refresh_url: https://api.figma.com/v1/oauth/refresh + token_request_auth_method: basic + scope_separator: ',' + disable_pkce: true + proxy: + base_url: https://api.figma.com + docs: https://nango.dev/docs/integrations/all/figma + +figma-scim: + display_name: Figma (SCIM) + categories: + - design + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.host}/scim/v2/${connectionConfig.tenantId} + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /Users + docs: https://nango.dev/docs/integrations/all/figma-scim + docs_connect: https://nango.dev/docs/integrations/all/figma-scim/connect + credentials: + apiKey: + type: string + title: API Token + description: The API token for your Figma account + doc_section: '#step-3-generating-your-api-token' + connection_config: + host: + type: string + title: Host + description: The Figma host for your account. + format: hostname + enum: + - www.figma.com + - figma-gov.com + order: 1 + doc_section: '#step-1-finding-your-host' + tenantId: + type: string + title: Tenant ID + description: The tenant ID of your Figma account + order: 2 + doc_section: '#step-2-finding-your-tenant-id' + +falai: + display_name: fal.ai + categories: + - productivity + - dev-tools + auth_mode: API_KEY + proxy: + headers: + authorization: Key ${apiKey} + base_url: https://queue.fal.run + verification: + method: POST + headers: + content-type: application/json + endpoints: + - /fal-ai/fast-sdxl + docs: https://nango.dev/docs/integrations/all/falai + credentials: + apiKey: + type: string + title: API Key + description: The API key for your fal.ai account + +findymail: + display_name: FindyMail + categories: + - marketing + - crm + auth_mode: API_KEY + proxy: + base_url: https://app.findymail.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/findymail + docs_connect: https://nango.dev/docs/integrations/all/findymail/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your FindyMail account + +firefish: + display_name: Firefish + scope_separator: ' ' + categories: + - crm + auth_mode: OAUTH2_CC + token_url: https://api.firefishsoftware.com/authorization/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.firefishsoftware.com + docs: https://nango.dev/docs/integrations/all/firefish + +fireflies: + display_name: Fireflies + categories: + - analytics + - communication + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.fireflies.ai + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /graphql?query=%7B__schema%7Btypes%7Bname%7D%7D%7D + docs: https://nango.dev/docs/integrations/all/fireflies + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Fireflies account + +firstbase: + display_name: Firstbase + categories: + - hr + auth_mode: API_KEY + proxy: + base_url: https://apipub.firstbasehq.com + headers: + authorization: ApiKey ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/orders?size=1 + docs: https://nango.dev/docs/api-integrations/firstbase + docs_connect: https://nango.dev/docs/api-integrations/firstbase/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Firstbase account + doc_section: '#step-1-generating-your-api-key' + +fiserv: + display_name: Fiserv (OAuth) + categories: + - banking + - payment + auth_mode: OAUTH2_CC + token_url: https://cert.api.fiservapps.com/fts-apim/oauth2/v2 + token_request_auth_method: basic + expires_in_unit: milliseconds + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.hostUrl} + docs: https://nango.dev/docs/integrations/all/fiserv + connection_config: + hostUrl: + type: string + title: Domain + description: The domain of your Fiserv account + format: hostname + prefix: https:// + +fiserv-api-key: + display_name: Fiserv (API Key) + categories: + - banking + - payment + auth_mode: API_KEY + proxy: + base_url: https://prod.emea.api.fiservapps.com + headers: + api-key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /sandbox/exp/v1/authorisations + docs: https://nango.dev/docs/integrations/all/fiserv-api-key + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Fiserv account + +fitbit: + display_name: Fitbit + categories: + - sports + auth_mode: OAUTH2 + authorization_url: https://www.fitbit.com/oauth2/authorize + token_url: https://api.fitbit.com/oauth2/token + authorization_method: header + proxy: + base_url: https://api.fitbit.com + docs: https://nango.dev/docs/integrations/all/fitbit + +fillout-api-key: + display_name: Fillout (API Key) + categories: + - surveys + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.hostname} + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v1/api/forms + webhook_routing_script: filloutWebhookRouting + docs: https://nango.dev/docs/integrations/all/fillout-api-key + docs_connect: https://nango.dev/docs/integrations/all/fillout-api-key/connect + connection_config: + hostname: + type: string + title: Hostname + description: The hostname of your Fillout account + example: api.fillout.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-hostname-and-api-key' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Fillout account + example: sk_prod_n5ZEod5AwJQCtG3ncuzgXvpSWx19joz4KMSJlC2nVul9B48zhkCLuPc9Kq97tK7smlOcMChnk1uyaUeZ5Gm4GVrUUnDMxHI7TZH_31032 + pattern: '^sk_prod_[A-Za-z0-9]+_[0-9]+$' + doc_section: '#step-1-finding-your-hostname-and-api-key' + +fillout: + display_name: Fillout (Oauth) + categories: + - surveys + auth_mode: OAUTH2 + authorization_url: https://build.fillout.com/authorize/oauth + token_url: https://server.fillout.com/public/oauth/accessToken + proxy: + base_url: ${connectionConfig.base_url} + token_response_metadata: + - base_url + webhook_routing_script: filloutWebhookRouting + docs: https://nango.dev/docs/integrations/all/fillout + connection_config: + base_url: + type: string + title: '' + description: '' + automated: true + +float: + display_name: Float + categories: + - productivity + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + user-agent: ${connectionConfig.appDetails} || App (support@nango.dev) + base_url: https://api.float.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v3/tasks + docs: https://nango.dev/docs/integrations/all/float + docs_connect: https://nango.dev/docs/integrations/all/float/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Float account + pattern: '^[a-f0-9]{16}[a-zA-Z0-9+/]+=$' + example: c9b38e5af69912d0rq9tE/fbT5/RPLk8Ua7tfHo9s6xMiCKvmCOvenR/Krc= + doc_section: '#step-1-finding-your-api-key' + + connection_config: + appDetails: + type: string + title: App Details + description: The details of your app + automated: true + +folk: + display_name: Folk + categories: + - crm + auth_mode: API_KEY + webhook_routing_script: folkWebhookRouting + webhook_user_defined_secret: true + proxy: + base_url: https://api.folk.app + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'retry-after' + verification: + method: GET + endpoints: + - /v1/users/me + webhook_allowed_query_params: + - nangoConnectionId + docs: https://nango.dev/docs/api-integrations/folk + docs_connect: https://nango.dev/docs/api-integrations/folk/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Folk account + example: 'FOLKLrHVSoYB6TaAF39aNGtEpEi3oxuo' + pattern: '^FOLK[a-zA-Z0-9]+$' + doc_section: '#step-1-generating-your-api-key' + +followupboss: + display_name: Follow Up Boss + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://app.followupboss.com/oauth/authorize + token_url: https://app.followupboss.com/oauth/token + disable_pkce: true + authorization_params: + response_type: auth_code + proxy: + base_url: https://api.followupboss.com + docs: https://nango.dev/docs/api-integrations/followupboss + setup_guide_url: https://nango.dev/docs/api-integrations/followupboss/how-to-register-your-own-followupboss-oauth-app + +fortnox: + display_name: Fortnox + categories: + - accounting + - invoicing + auth_mode: OAUTH2 + authorization_url: https://apps.fortnox.se/oauth-v1/auth + token_url: https://apps.fortnox.se/oauth-v1/token + token_request_auth_method: basic + scope_separator: ' ' + authorization_params: + response_type: code + access_type: offline + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.fortnox.se/3 + docs: https://nango.dev/docs/integrations/all/fortnox + +freshbooks: + display_name: FreshBooks + categories: + - accounting + auth_mode: OAUTH2 + authorization_url: https://auth.freshbooks.com/oauth/authorize + token_url: https://api.freshbooks.com/auth/oauth/token + authorization_params: + response_type: code + proxy: + base_url: https://api.freshbooks.com + docs: https://nango.dev/docs/integrations/all/freshbooks + +freshdesk: + display_name: FreshDesk + categories: + - support + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.freshdesk.com + verification: + headers: + content-type: application/json + endpoints: + - /api/v2/settings/helpdesk + docs: https://nango.dev/docs/api-integrations/freshdesk + docs_connect: https://nango.dev/docs/api-integrations/freshdesk/connect + credentials: + username: + type: string + title: FreshDesk API Key + description: The API Key of your FreshDesk account + doc_section: '#step-1-finding-your-freshdesk-api-key' + secret: true + password: + type: string + title: '' + description: '' + default_value: X + hidden: true + connection_config: + subdomain: + type: string + title: FreshDesk Domain + description: The subdomain of your FreshDesk account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .freshdesk.com + prefix: https:// + doc_section: '#step-2-finding-your-freshdesk-domain' + +freshsales: + display_name: Freshsales + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.bundleAlias} || https://${connectionConfig.subdomain}.freshsales.io + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/settings/leads/fields + headers: + authorization: Token token=${apiKey} + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/freshsales + docs_connect: https://nango.dev/docs/api-integrations/freshsales/connect + connection_config: + bundleAlias: + type: string + title: Bundle Alias + description: The bundle alias for your Freshsales account + prefix: https:// + example: acme.myfreshworks.com/crm/sales + doc_section: '#step-2-finding-your-bundle-alias' + subdomain: + type: string + title: '' + description: '' + default_value: '' + hidden: true # deprecating this in favor of bundleAlias + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Freshsales account + example: 4oBqA_AzM_G3xbW3TJGvrA + pattern: '[A-Za-z0-9_-]+' + doc_section: '#step-1-finding-your-freshsales-api-key' + +freshservice: + display_name: Freshservice + categories: + - support + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.freshservice.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v2/tickets + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/freshservice + docs_connect: https://nango.dev/docs/integrations/all/freshservice/connect + connection_config: + subdomain: + type: string + title: Freshservice subdomain + description: The subdomain of your Freshservice account + pattern: '^[a-z0-9_-]+$' + example: subdomain + suffix: .freshservice.com + prefix: https:// + doc_section: '#step-2-finding-your-freshservice-subdomain' + credentials: + username: + type: string + title: API key + description: The API Key of your Freshservice account + secret: true + doc_section: '#step-1-finding-your-freshservice-api-key' + password: + type: string + title: '' + description: '' + # https://api.freshservice.com/#authentication + # FreshService is using basic auth with an api key, the basic username/password was deprecated + default_value: 'X' + hidden: true + +freshteam: + display_name: Freshteam + categories: + - hr + - ats + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.accountName}.freshteam.com + headers: + authorization: Bearer ${apiKey} + accept: application/json + docs: https://nango.dev/docs/integrations/all/freshteam + docs_connect: https://nango.dev/docs/integrations/all/freshteam/connect + connection_config: + accountName: + type: string + title: Account Name + description: The account name of your Freshteam account + example: nango + format: hostname + suffix: .freshteam.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-account-name' + credentials: + apiKey: + type: string + title: API Key + description: The API key to your Freshteam account + doc_section: '#step-2-finding-your-api-key' + example: 'XtoF94LMNyKPbd5AvR1QJh' + pattern: '^[a-zA-Z0-9_!@#$%^&*()\\-+=]+$' + +freshworks: + display_name: Freshworks + categories: + - crm + - support + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.hostname}/org/oauth/v2/authorize + token_url: https://${connectionConfig.hostname}/org/oauth/v2/token + disable_pkce: true + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.bundleAlias} + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/freshworks + docs_connect: https://nango.dev/docs/api-integrations/freshworks/connect + connection_config: + hostname: + type: string + title: Freshworks Hostname + description: The hostname of your Freshworks account. + format: hostname + example: acme.myfreshworks.com + prefix: https:// + doc_section: '#step-1-finding-your-freshworks-hostname' + bundleAlias: + type: string + title: API Hostname + description: The hostname of your Freshworks product used for API calls. + format: hostname + example: acme.freshservice.com + prefix: https:// + doc_section: '#step-2-finding-your-api-hostname' + +front: + display_name: Front + categories: + - support + - ticketing + auth_mode: OAUTH2 + authorization_url: https://app.frontapp.com/oauth/authorize + token_url: https://app.frontapp.com/oauth/token + proxy: + base_url: https://api2.frontapp.com + retry: + after: + - 'retry-after' + paginate: + type: link + response_path: _results + link_path_in_response_body: _pagination.next + docs: https://nango.dev/docs/integrations/all/front + +front-api-key: + display_name: Front (API Key) + categories: + - support + - ticketing + auth_mode: API_KEY + proxy: + base_url: https://api2.frontapp.com + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'retry-after' + verification: + method: GET + endpoints: + - /me + docs: https://nango.dev/docs/api-integrations/front-api-key + docs_connect: https://nango.dev/docs/api-integrations/front-api-key/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Front API token. + example: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.**** + doc_section: '#step-1-finding-your-api-token' + +fullenrich: + display_name: FullEnrich + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://app.fullenrich.com/api + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v2/account/credits + docs: https://nango.dev/docs/api-integrations/fullenrich + docs_connect: https://nango.dev/docs/api-integrations/fullenrich/connect + credentials: + apiKey: + type: string + title: API Key + description: Your FullEnrich API key. + example: 123e4567-e89b-12d3-a456-426614174000 + format: uuid + doc_section: '#step-1-getting-your-api-key' + +gainsight-cc: + display_name: Gainsight CC + categories: + - support + - crm + auth_mode: OAUTH2_CC + token_url: https://api2-${connectionConfig.region}.insided.com/oauth2/token + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://api2-${connectionConfig.region}.insided.com + docs: https://nango.dev/docs/integrations/all/gainsight-cc + docs_connect: https://nango.dev/docs/integrations/all/gainsight-cc/connect + connection_config: + region: + type: string + title: Region + description: The region of your Gainsight account + example: eu-west-1 + pattern: '^[a-z]{2}-[a-z]+-[1-9]$' + doc_section: '#step-2-finding-your-region' + +garmin: + display_name: Garmin + categories: + - sports + auth_mode: OAUTH1 + request_url: https://connectapi.garmin.com/oauth-service/oauth/request_token + authorization_url: https://connect.garmin.com/oauthConfirm + token_url: https://connectapi.garmin.com/oauth-service/oauth/access_token + signature_method: 'HMAC-SHA1' + proxy: + base_url: https://apis.garmin.com + docs: https://nango.dev/docs/integrations/all/garmin + +gebruder-weiss: + display_name: GebrΓΌder Weiss + categories: + - erp + auth_mode: OAUTH2_CC + authorization_url: https://my.api.gw-world.com/authorize + token_url: https://my.api.gw-world.com/token + token_request_auth_method: basic + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + headers: + accept-language: en-US + base_url: https://my.api.gw-world.com + docs: https://nango.dev/docs/integrations/all/gebruder-weiss + +google-gemini: + display_name: Google Gemini + categories: + - productivity + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://generativelanguage.googleapis.com + query: + key: ${apiKey} + headers: + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/models + docs: https://nango.dev/docs/api-integrations/google-gemini + docs_connect: https://nango.dev/docs/api-integrations/google-gemini/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Gemini account + doc_section: '#step-1-generating-your-api-key' + example: 'AQ.Ab8RN6I5RF**********-0Fe3mTuqX3**' + pattern: '^[0-9A-Za-z_.\-]+$' + +gem: + display_name: Gem + categories: + - ats + auth_mode: API_KEY + proxy: + base_url: https://api.gem.com + headers: + x-api-key: ${apiKey} + x-application-secret: ${connectionConfig.appSecret} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v0/users + docs: https://nango.dev/docs/integrations/all/gem + docs_connect: https://nango.dev/docs/integrations/all/gem/connect + credentials: + apiKey: + type: string + title: Shareable Access Key + description: The Shareable Access Key for your Integration + example: Xk9t3HZbWqLp7AeGvM4sUdYjBnR2TfQxCVi81oNz + pattern: '^[a-zA-Z0-9]{40}$' + doc_section: '#step-1-finding-your-shareable-access-key' + connection_config: + appSecret: + type: string + title: '' + description: '' + hidden: true + +gerrit: + display_name: Gerrit + categories: + - dev-tools + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.host} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /config/server/version + docs: https://nango.dev/docs/integrations/all/gerrit + docs_connect: https://nango.dev/docs/integrations/all/gerrit/connect + connection_config: + host: + type: string + title: Gerrit Host + description: The host to where you Gerrit instance is hosted + pattern: '^https?:\/\/[a-z0-9.-]+(:\d+)?(\/.*)?$' + example: http://localhost:8080 + doc_section: '#step-1-finding-your-host' + order: 1 + +getty-images: + display_name: Getty Images + categories: + - design + auth_mode: OAUTH2 + authorization_url: https://authentication.gettyimages.com/oauth2/auth + token_url: https://authentication.gettyimages.com/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.gettyimages.com + headers: + api-key: ${clientId} + docs: https://nango.dev/docs/api-integrations/getty-images + setup_guide_url: https://nango.dev/docs/api-integrations/getty-images/how-to-register-your-own-getty-images-oauth-app + +grammarly: + display_name: Grammarly + categories: + - productivity + auth_mode: OAUTH2_CC + token_url: https://auth.grammarly.com/v4/api/oauth2/token + scope_separator: ',' + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.grammarly.com/ecosystem/api + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/analytics/users + docs: https://nango.dev/docs/integrations/all/grammarly + +grammarly-scim: + display_name: Grammarly SCIM + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://sso.grammarly.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/scim/Users + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/grammarly-scim + docs_connect: https://nango.dev/docs/integrations/all/grammarly-scim/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Grammarly account + doc_section: '#step-1-finding-grammarly-scim-credentials' + example: 'Xk9t3HZbWqLp7AeGvM4sUdYjBnR2TfQxCVi81oNz' + +granola: + display_name: Granola + categories: + - productivity + - knowledge-base + auth_mode: API_KEY + proxy: + base_url: https://public-api.granola.ai + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v1/notes?page_size=1 + docs: https://nango.dev/docs/api-integrations/granola + docs_connect: https://nango.dev/docs/api-integrations/granola/connect + credentials: + apiKey: + type: string + title: API Token + description: The API key for your Granola account + example: grn_2isA***************_7HRD*********************** + pattern: '^grn_[A-Za-z0-9]+_[A-Za-z0-9]+$' + doc_section: '#step-1-generating-your-granola-api-token' + +granola-mcp: + display_name: Granola (MCP) + categories: + - productivity + - knowledge-base + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://mcp-auth.granola.ai/oauth2/authorize + token_url: https://mcp-auth.granola.ai/oauth2/token + registration_url: https://mcp-auth.granola.ai/oauth2/register + default_scopes: + - offline_access + authorization_params: + response_type: code + resource: https://mcp.granola.ai/ + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + headers: + accept: application/json,text/event-stream + base_url: https://mcp.granola.ai + docs: https://nango.dev/docs/api-integrations/granola-mcp + +guru: + display_name: Guru + categories: + - knowledge-base + auth_mode: BASIC + proxy: + base_url: https://api.getguru.com/api/v1 + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /whoami + docs: https://nango.dev/docs/integrations/all/guru + docs_connect: https://nango.dev/docs/integrations/all/guru/connect + credentials: + username: + type: string + title: User/Collection ID + description: The user or collection ID of your Guru account + doc_section: '#step-1-finding-your-user-collection-id' + password: + type: string + title: User/Collection Token + description: The user or collection token of your Guru account + secret: true + format: uuid + example: 123e4567-e89b-12d3-a456-426614174000 + doc_section: '#step-2-generating-your-user-collection-token' + +guru-scim: + display_name: Guru (SCIM) + categories: + - knowledge-base + auth_mode: BASIC + proxy: + base_url: https://api.getguru.com/api/scim + headers: + content-type: application/scim+json + verification: + method: GET + endpoints: + - /v2/Users + headers: + content-type: application/scim+json + docs: https://nango.dev/docs/integrations/all/guru-scim + docs_connect: https://nango.dev/docs/integrations/all/guru-scim/connect + credentials: + username: + type: string + title: SCIM Username + description: The SCIM username for your Guru account + doc_section: '#step-1-finding-guru-scim-credentials' + password: + type: string + title: SCIM Token + description: The SCIM token for your Guru account + doc_section: '#step-1-finding-guru-scim-credentials' + +github: + display_name: GitHub (User OAuth) + categories: + - dev-tools + - support + - ticketing + auth_mode: OAUTH2 + authorization_url: https://github.com/login/oauth/authorize + token_url: https://github.com/login/oauth/access_token + proxy: + base_url: https://api.github.com + retry: + at: + - 'x-ratelimit-reset' + remaining: 'x-ratelimit-remaining' + error_code: + - '403' + - '5xx' + - '401' + - '429' + paginate: + type: link + limit_name_in_request: per_page + link_rel_in_response_header: next + docs: https://nango.dev/docs/api-integrations/github + setup_guide_url: https://nango.dev/docs/api-integrations/github/how-to-register-your-own-github-api-oauth-app + +github-app: + display_name: GitHub (App) + categories: + - dev-tools + - popular + - ticketing + alias: github + auth_mode: APP + authorization_url: ${connectionConfig.appPublicLink}/installations/new + token_url: https://api.github.com/app/installations/${connectionConfig.installation_id}/access_tokens + webhook_routing_script: githubAppWebhookRouting + docs: https://nango.dev/docs/api-integrations/github-app + setup_guide_url: https://nango.dev/docs/api-integrations/github-app/how-to-register-your-own-github-app-api-app + connection_config: + appPublicLink: + type: string + title: App Public Link + description: The public link of your GitHub App + format: uri + pattern: '^https?://.*$' + automated: true + installation_id: + type: string + title: Installation ID + description: The installation ID of your GitHub App + example: '38631545' + automated: true + +github-app-oauth: + display_name: GitHub (App OAuth) + categories: + - dev-tools + - ticketing + alias: github + auth_mode: CUSTOM + authorization_url: ${connectionConfig.appPublicLink}/installations/new + authorization_url_skip_encode: + - base_url + token_url: + OAUTH2: https://github.com/login/oauth/access_token + APP: https://api.github.com/app/installations/${connectionConfig.installation_id}/access_tokens + webhook_routing_script: githubAppOauthWebhookRouting + post_connection_script: githubAppOauthPostConnection + docs: https://nango.dev/docs/api-integrations/github-app-oauth + setup_guide_url: https://nango.dev/docs/api-integrations/github-app-oauth/how-to-register-your-own-github-app-api-oauth-app + connection_config: + appPublicLink: + type: string + title: App Public Link + description: The public link of your GitHub App + format: uri + pattern: '^https?://.*$' + automated: true + installation_id: + type: string + title: Installation ID + description: The installation ID of your GitHub App + example: '38631545' + automated: true + +github-pat: + display_name: Github (Personal Access Token) + categories: + - dev-tools + - ticketing + auth_mode: API_KEY + proxy: + base_url: https://api.github.com + retry: + at: + - 'x-ratelimit-reset' + remaining: 'x-ratelimit-remaining' + error_code: + - '403' + - '5xx' + - '401' + - '429' + headers: + authorization: Bearer ${apiKey} + x-github-api-version: ${connectionConfig.version} || 2022-11-28 + accept: application/vnd.github+json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /user + docs: https://nango.dev/docs/integrations/all/github-pat + docs_connect: https://nango.dev/docs/integrations/all/github-pat/connect + connection_config: + version: + type: string + title: '' + description: '' + automated: true + credentials: + apiKey: + type: string + title: Personal Access Token + description: The Personal Access Token to your Github account + pattern: '^(?:github_pat|ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{36,255}$' + example: 'github_pat_***********************xRIoxmseCYRHDDIOFfTOyKex' + doc_section: '#step-1-finding-your-personal-access-token' + +gitlab: + display_name: GitLab + categories: + - dev-tools + - ticketing + auth_mode: OAUTH2 + authorization_url: https://gitlab.com/oauth/authorize + token_url: https://gitlab.com/oauth/token + authorization_params: + response_type: code + proxy: + base_url: https://gitlab.com + docs: https://nango.dev/docs/integrations/all/gitlab + +gitlab-pat: + display_name: GitLab (Personal Access Token) + categories: + - dev-tools + - ticketing + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.hostname} + headers: + private-token: ${apiKey} + retry: + at: + - 'x-ratelimit-reset' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v4/users + docs: https://nango.dev/docs/integrations/all/gitlab-pat + docs_connect: https://nango.dev/docs/integrations/all/gitlab-pat/connect + credentials: + apiKey: + type: string + title: Personal Access Token + example: glpat-PMJoma_*******.***.***xwve + pattern: '^glpat-[A-Za-z0-9._-]+$' + description: The Personal Access Token for your GitLab account + doc_section: '#step-2-creating-your-personal-access-token' + connection_config: + hostname: + type: string + title: Hostname + description: The hostname of your Gitlab instance + format: hostname + example: gitlab.com + doc_section: '#step-1-finding-your-hostname' + order: 1 + +ghost-admin: + display_name: Ghost (Admin API) + categories: + - dev-tools + - design + - cms + auth_mode: JWT + signature: + protocol: HMAC + token: + signing_key: ${credentials.privateKey.secret} + expires_in_ms: 300000 + header: + alg: HS256 + kid: ${credentials.privateKey.id} + payload: + aud: /admin/ + proxy: + headers: + accept: application/json + accept-version: ${connectionConfig.version} + authorization: Ghost ${accessToken} + base_url: https://${connectionConfig.adminDomain}/ghost/api/admin/ + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /users + docs: https://nango.dev/docs/integrations/all/ghost-admin + connection_config: + adminDomain: + type: string + title: Ghost Admin Domain + description: The domain of your Ghost Admin which can be different from your main domain + example: 'mock.ghost.io' + pattern: '^([a-z0-9_-]+\.|)(ghost\.io|[a-z0-9_-]+\.[a-z]{2,})$' + order: 1 + version: + type: string + title: API Version + description: The version of the Ghost Admin API to use + example: 'v3.0' + pattern: '^v\d+\.\d+$' + order: 2 + credentials: + privateKey: + type: string + title: API Key + description: The private key for your Ghost account + pattern: '^[a-fA-F0-9]{24}:[a-fA-F0-9]{64}$' + example: 1234567890abcdef12345678:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890 + +ghost-content: + display_name: Ghost (Content API) + categories: + - dev-tools + - design + - cms + auth_mode: API_KEY + proxy: + headers: + accept-version: ${connectionConfig.version} + base_url: https://${connectionConfig.adminDomain}/ghost/api/content/ + query: + key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /tags + docs: https://nango.dev/docs/integrations/all/ghost-content + connection_config: + version: + type: string + title: API Version + description: The version of the Ghost Admin API to use + example: 'v3.0' + pattern: '^v\d+\.\d+$' + adminDomain: + type: string + title: Ghost Admin Domain + description: The domain of your Ghost Admin which can be different from your main domain + example: 'mock.ghost.io' + pattern: '^([a-z0-9_-]+\.|)(ghost\.io|[a-z0-9_-]+\.[a-z]{2,})$' + credentials: + apiKey: + type: string + title: API Key + description: The content API key for your Ghost account + pattern: '^[a-zA-Z0-9]{26}$' + example: a1b2c3d4e5f6g7h8i9j0k1l2m3 + +gong: + display_name: Gong (Basic Auth) + categories: + - communication + - marketing + - productivity + - video + auth_mode: BASIC + proxy: + base_url: https://api.gong.io + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/gong + docs_connect: https://nango.dev/docs/integrations/all/gong/connect + credentials: + username: + type: string + title: Access Key + description: Your Gong Access Key + pattern: '^[a-zA-Z0-9-]+$' + doc_section: '#step-1-finding-gong-api-key-and-api-key-secret' + password: + type: string + title: Access Key Secret + description: Your Gong Access Key Secret + default_value: '' + doc_section: '#step-1-finding-gong-api-key-and-api-key-secret' + +gong-oauth: + display_name: Gong (Oauth) + auth_mode: OAUTH2 + categories: + - communication + - marketing + - productivity + - video + - popular + authorization_url: https://app.gong.io/oauth2/authorize + token_url: https://app.gong.io/oauth2/generate-customer-token + token_response_metadata: + - api_base_url_for_customer + authorization_params: + response_type: code + access_type: offline + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + disable_pkce: true + token_request_auth_method: basic + proxy: + base_url: ${connectionConfig.api_base_url_for_customer} || https://api.gong.io + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/gong-oauth + connection_config: + api_base_url_for_customer: + type: string + title: API Base URL + description: The base URL of your Gong account + format: uri + automated: true + pattern: '^https?://.*$' + +glyphic: + display_name: Glyphic + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://api.glyphic.ai + headers: + x-api-key: ${apiKey} + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/test/ping + docs: https://nango.dev/docs/api-integrations/glyphic + docs_connect: https://nango.dev/docs/api-integrations/glyphic/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Glyphic API key + doc_section: '#step-1-getting-your-api-key' + +gamma: + display_name: Gamma + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://public-api.gamma.app + headers: + x-api-key: ${apiKey} + content-type: application/json + verification: + method: GET + headers: + accept: application/json + endpoints: + - /v1.0/folders + docs: https://nango.dev/docs/api-integrations/gamma + docs_connect: https://nango.dev/docs/api-integrations/gamma/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Gamma API key. + example: 'sk-gamma-xxxxxxxx' + pattern: '^sk-gamma-' + doc_section: '#step-1-getting-your-gamma-api-key' + +google: + display_name: Google + categories: + - communication + - dev-tools + - productivity + - social + auth_mode: OAUTH2 + authorization_url: https://accounts.google.com/o/oauth2/v2/auth + token_url: https://oauth2.googleapis.com/token + authorization_params: + response_type: code + access_type: offline + prompt: consent + proxy: + retry: + in_body: + path: error.message + value: /User-rate limit exceeded\. +Retry after (.+)/ + strategy: at + base_url: https://www.googleapis.com + paginate: + type: cursor + cursor_path_in_response: nextPageToken + limit_name_in_request: maxSize + cursor_name_in_request: pageToken + response_path: items + docs: https://nango.dev/docs/api-integrations/google + setup_guide_url: https://nango.dev/docs/api-integrations/google/how-to-register-your-own-google-api-oauth-app + webhook_routing_script: googleWebhookRouting + +google-analytics: + display_name: Google Analytics + alias: google + categories: + - analytics + docs: https://nango.dev/docs/api-integrations/google-analytics + setup_guide_url: https://nango.dev/docs/api-integrations/google-analytics/how-to-register-your-own-google-analytics-api-oauth-app + +google-bigquery: + display_name: Google BigQuery + categories: + - productivity + alias: google + proxy: + base_url: https://bigquery.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-bigquery + setup_guide_url: https://nango.dev/docs/api-integrations/google-bigquery/how-to-register-your-own-google-bigquery-api-oauth-app + +google-calendar: + display_name: Google Calendar + categories: + - popular + - productivity + alias: google + proxy: + base_url: https://www.googleapis.com + paginate: + type: cursor + cursor_path_in_response: nextPageToken + limit_name_in_request: maxSize + cursor_name_in_request: pageToken + response_path: items + retry: + error_code: + - '403' + - '5xx' + - '401' + - '429' + webhook_routing_script: googleCalendarWebhookRouting + post_connection_script: googleCalendarPostConnection + docs: https://nango.dev/docs/api-integrations/google-calendar + setup_guide_url: https://nango.dev/docs/api-integrations/google-calendar/how-to-register-your-own-google-calendar-api-oauth-app + +google-contacts: + display_name: Google Contacts + categories: + - productivity + alias: google + proxy: + base_url: https://people.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-contacts + setup_guide_url: https://nango.dev/docs/api-integrations/google-contacts/how-to-register-your-own-google-contacts-api-oauth-app + +google-chat: + display_name: Google Chat + alias: google + categories: + - productivity + proxy: + base_url: https://chat.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-chat + setup_guide_url: https://nango.dev/docs/api-integrations/google-chat/how-to-register-your-own-google-chat-api-oauth-app + +google-docs: + display_name: Google Docs + categories: + - productivity + alias: google + proxy: + base_url: https://docs.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-docs + setup_guide_url: https://nango.dev/docs/api-integrations/google-docs/how-to-register-your-own-google-docs-api-oauth-app + +google-mail: + display_name: Gmail + categories: + - popular + - productivity + alias: google + proxy: + base_url: https://gmail.googleapis.com + webhook_routing_script: gmailWebhookRouting + post_connection_script: googleMailPostConnection + docs: https://nango.dev/docs/api-integrations/google-mail + setup_guide_url: https://nango.dev/docs/api-integrations/google-mail/how-to-register-your-own-gmail-api-oauth-app + +google-maps: + display_name: Google Maps + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://maps.googleapis.com + query: + key: ${apiKey} + docs: https://nango.dev/docs/api-integrations/google-maps + docs_connect: https://nango.dev/docs/api-integrations/google-maps/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Google Maps API Key. + example: AIzaSyAY4P9A***************1YMSYBI + pattern: ^AIza[0-9A-Za-z\-_]+$ + doc_section: '#step-3-obtain-your-google-maps-api-key' + +google-search-console: + display_name: Google Search Console + alias: google + categories: + - productivity + proxy: + base_url: https://www.googleapis.com/webmasters + docs: https://nango.dev/docs/api-integrations/google-search-console + setup_guide_url: https://nango.dev/docs/api-integrations/google-search-console/how-to-register-your-own-google-search-console-oauth-app + +google-sheet: + display_name: Google Sheet + categories: + - productivity + alias: google + proxy: + base_url: https://sheets.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-sheet + setup_guide_url: https://nango.dev/docs/api-integrations/google-sheet/how-to-register-your-own-google-sheet-api-oauth-app + +google-slides: + display_name: Google Slides + categories: + - productivity + alias: google + proxy: + base_url: https://slides.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-slides + setup_guide_url: https://nango.dev/docs/api-integrations/google-slides/how-to-register-your-own-google-slides-api-oauth-app + +google-drive: + display_name: Google Drive + categories: + - knowledge-base + - popular + - storage + alias: google + docs: https://nango.dev/docs/api-integrations/google-drive + setup_guide_url: https://nango.dev/docs/api-integrations/google-drive/how-to-register-your-own-google-drive-api-oauth-app + +google-forms: + display_name: Google Forms + categories: + - productivity + alias: google + proxy: + base_url: https://forms.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-forms + setup_guide_url: https://nango.dev/docs/api-integrations/google-forms/how-to-register-your-own-google-forms-api-oauth-app + +google-tasks: + display_name: Google Tasks + categories: + - productivity + alias: google + proxy: + base_url: https://tasks.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-tasks + setup_guide_url: https://nango.dev/docs/api-integrations/google-tasks/how-to-register-your-own-google-tasks-api-oauth-app + +google-meet: + display_name: Google Meet + categories: + - communication + - productivity + alias: google + proxy: + base_url: https://meet.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-meet + setup_guide_url: https://nango.dev/docs/api-integrations/google-meet/how-to-register-your-own-google-meet-api-oauth-app + +google-ads: + display_name: Google Ads + categories: + - marketing + alias: google + token_url: https://www.googleapis.com/oauth2/v3/token + proxy: + base_url: https://googleads.googleapis.com + paginate: + type: cursor + cursor_path_in_response: nextPageToken + limit_name_in_request: pageSize + cursor_name_in_request: pageToken + response_path: results + docs: https://nango.dev/docs/api-integrations/google-ads + setup_guide_url: https://nango.dev/docs/api-integrations/google-ads/how-to-register-your-own-google-ads-api-oauth-app + +google-play: + display_name: Google Play + categories: + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://accounts.google.com/o/oauth2/auth + token_url: https://accounts.google.com/o/oauth2/token + authorization_params: + response_type: code + access_type: offline + prompt: consent + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://play.googleapis.com + docs: https://nango.dev/docs/integrations/all/google-play + +google-cloud-storage: + display_name: Google Cloud Storage + alias: google + categories: + - storage + docs: https://nango.dev/docs/api-integrations/google-cloud-storage + setup_guide_url: https://nango.dev/docs/api-integrations/google-cloud-storage/how-to-register-your-own-google-cloud-storage-api-oauth-app + +google-workspace-admin: + display_name: Google Workspace Admin + alias: google + categories: + - productivity + proxy: + base_url: https://admin.googleapis.com + docs: https://nango.dev/docs/api-integrations/google-workspace-admin + setup_guide_url: https://nango.dev/docs/api-integrations/google-workspace-admin/how-to-register-your-own-google-workspace-admin-api-oauth-app + +google-service-account: + display_name: Google Service Account + categories: + - dev-tools + auth_mode: TWO_STEP + signature: + protocol: RSA + body_format: form + token: + signing_key: ${credentials.privateKey} + expires_in_ms: 3600000 + header: + alg: RS256 + typ: JWT + payload: + iss: ${credentials.serviceAccountEmailAddress} + scope: ${credentials.scopes} + aud: https://oauth2.googleapis.com/token + sub: ${credentials.delegatedAccessEmailAddress} + token_url: https://oauth2.googleapis.com/token + token_params: + grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer + assertion: ${token} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://www.googleapis.com + docs: https://nango.dev/docs/integrations/all/google-service-account + docs_connect: https://nango.dev/docs/integrations/all/google-service-account/connect + credentials: + serviceAccountEmailAddress: + type: string + title: Service Account Email Address + description: The email address of the service account + pattern: '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.iam\.gserviceaccount\.com$' + example: 'test@project.iam.gserviceaccount.com' + doc_section: '#step-1-create-a-service-account' + scopes: + type: string + title: Scopes + description: Scopes that your application should be granted access to + pattern: '^https://[^\s]+( https://[^\s]+)*$' + example: 'https://www.googleapis.com/auth/drive' + doc_section: '#step-4-finding-your-applications-scopes' + privateKey: + type: string + title: Private Key + description: The private key associated with your Google service account + example: '-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n-----END PRIVATE KEY-----' + pattern: '^-----BEGIN PRIVATE KEY-----\\n([A-Za-z0-9+/=\\n]+)\\n-----END PRIVATE KEY-----\\n?$' + doc_section: '#step-3-delegate-domain-wide-authority-optional-for-google-workspace' + delegatedAccessEmailAddress: + type: string + title: Delegated Access Email Address + description: The email address of the user for which the application is requesting delegated access + format: email + example: 'some.user@example.com' + optional: true + doc_section: '#step-2-generate-a-service-account-key' + +gorgias: + display_name: Gorgias + categories: + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.gorgias.com/oauth/authorize + token_url: https://${connectionConfig.subdomain}.gorgias.com/oauth/token + token_request_auth_method: basic + default_scopes: + - offline + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.gorgias.com + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/gorgias + connection_config: + subdomain: + type: string + title: Gorgias Domain + description: The subdomain of your Gorgias account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .gorgias.com + prefix: https:// + +gorgias-basic: + display_name: Gorgias (Basic Auth) + auth_mode: BASIC + categories: + - e-commerce + proxy: + base_url: https://${connectionConfig.subdomain}.gorgias.com + docs: https://nango.dev/docs/integrations/all/gorgias-basic + docs_connect: https://nango.dev/docs/integrations/all/gorgias-basic/connect + credentials: + username: + type: string + title: Username + description: Your Gorgias account Username + password: + type: string + title: API Key + description: Your Gorgias API Key + default_value: '' + doc_section: '#step-1-finding-gorgias-api-key-secret' + connection_config: + subdomain: + type: string + title: Gorgias Domain + description: The subdomain of your Gorgias account + pattern: '^[a-z0-9_-]+$' + prefix: https:// + order: 1 + +grafana: + display_name: Grafana + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.domain} + verification: + headers: + content-type: application/json + endpoints: + - /api/access-control/user/permissions + method: GET + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/grafana + docs_connect: https://nango.dev/docs/integrations/all/grafana/connect + connection_config: + domain: + type: string + title: Domain + description: Your Grafana domain + example: example.grafana.net + prefix: https:// + format: hostname + order: 1 + doc_section: '#step-1-finding-your-domain' + credentials: + apiKey: + type: string + title: Token + description: The Token for your Grafana service account + example: glsa_***************************************** + pattern: '^[A-Za-z0-9_-]+$' + doc_section: '#step-2-generating-your-service-account-token' + +grain: + display_name: Grain (OAuth) + categories: + - video + - communication + - productivity + auth_mode: OAUTH2 + authorization_url: https://grain.com/_/public-api/oauth2/authorize + token_url: https://api.grain.com/_/public-api/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://api.grain.com + docs: https://nango.dev/docs/integrations/all/grain + +grain-api-key: + display_name: Grain (API Key) + categories: + - video + - communication + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.grain.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /_/public-api/me + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/grain-api-key + credentials: + apiKey: + type: string + title: API Key + description: The personal access token to your Grain account + +greenhouse: + display_name: Greenhouse (OAuth) + categories: + - ats + auth_mode: OAUTH2 + authorization_url: https://api.greenhouse.io/oauth/authorize + token_url: https://api.greenhouse.io/oauth/token + proxy: + base_url: https://${connectionConfig.resource}.greenhouse.io + retry: + after: + - 'retry-after' + paginate: + type: link + limit_name_in_request: per_page + link_rel_in_response_header: next + docs: https://nango.dev/docs/integrations/all/greenhouse + docs_connect: https://nango.dev/docs/integrations/all/greenhouse/connect + connection_config: + resource: + type: string + title: Greenhouse API Domain + description: The Greenhouse API product domain you want to connect to + pattern: '^[a-z0-9_-]+$' + example: api + suffix: .greenhouse.io + prefix: https:// + doc_section: '#step-1-finding-your-greenhouse-api-domain' + +greenhouse-basic: + display_name: Greenhouse (Basic Auth) + categories: + - ats + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.resource}.greenhouse.io + retry: + after: + - 'retry-after' + paginate: + type: link + limit_name_in_request: per_page + link_rel_in_response_header: next + verification: + headers: + content-type: application/json + endpoints: + - /v1/candidates/ + docs: https://nango.dev/docs/integrations/all/greenhouse-basic + docs_connect: https://nango.dev/docs/integrations/all/greenhouse-basic/connect + connection_config: + resource: + type: string + title: Greenhouse API Domain + description: The Greenhouse API product domain you want to connect to + pattern: '^[a-z0-9_-]+$' + example: harvest + suffix: .greenhouse.io + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-greenhouse-api-domain' + credentials: + username: + type: string + title: API key + description: The API Key of your Greenhouse account + pattern: '^[a-zA-Z0-9-]+$' + secret: true + doc_section: '#step-2-generating-your-greenhouse-api-key' + password: + type: string + title: Password + description: Password + # https://developers.greenhouse.io/harvest.html#authentication + # Greenhouse is using basic auth with an api key + default_value: '' + hidden: true + +greenhouse-harvest: + display_name: Greenhouse (Harvest API) + auth_mode: BASIC + categories: + - ats + proxy: + base_url: https://harvest.greenhouse.io + retry: + after: + - 'retry-after' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/candidates + docs: https://nango.dev/docs/integrations/all/greenhouse-harvest + docs_connect: https://nango.dev/docs/integrations/all/greenhouse-harvest/connect + credentials: + username: + type: string + title: API key + description: The API Key of your Greenhouse account + pattern: '^[a-zA-Z0-9-]+$' + secret: true + doc_section: '#step-1-generating-your-greenhouse-api-key' + password: + type: string + title: Password + description: Password + # https://developers.greenhouse.io/harvest.html#authentication + # Greenhouse is using basic auth with an api key + default_value: '' + hidden: true + +greenhouse-harvest-partner: + display_name: Greenhouse Harvest Partner (V3) + categories: + - ats + auth_mode: OAUTH2 + authorization_url: https://auth.greenhouse.io/authorize + token_url: https://auth.greenhouse.io/token + token_request_auth_method: basic + disable_pkce: true + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://harvest.greenhouse.io + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/api-integrations/greenhouse-harvest-partner + setup_guide_url: https://nango.dev/docs/api-integrations/greenhouse-harvest-partner/how-to-register-your-own-greenhouse-harvest-partner-oauth-app + +greenhouse-harvest-oauth2-cc: + display_name: Greenhouse Harvest (Client Credentials V3) + categories: + - ats + auth_mode: OAUTH2_CC + token_url: https://auth.greenhouse.io/token?grant_type=client_credentials + token_request_auth_method: basic + body_format: json + token_params: + sub: ${connectionConfig.sub} + proxy: + base_url: https://harvest.greenhouse.io + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/api-integrations/greenhouse-harvest-oauth2-cc + docs_connect: https://nango.dev/docs/api-integrations/greenhouse-harvest-oauth2-cc/connect + connection_config: + sub: + type: string + title: User ID + description: The optional ID of the user to act on-behalf-of. + optional: true + example: '4212952002' + pattern: '^[0-9]+$' + doc_section: '#step-2-finding-your-user-id' + credentials: + client_id: + type: string + title: Client ID + description: Your Greenhouse client ID for authentication + doc_section: '#step-1-generating-your-client-credentials' + client_secret: + type: string + title: Client Secret + description: Your Greenhouse client secret for authentication + doc_section: '#step-1-generating-your-client-credentials' + +greenhouse-job-board: + display_name: Greenhouse (Job Board API) + auth_mode: BASIC + categories: + - ats + proxy: + base_url: https://boards-api.greenhouse.io + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/boards/${connectionConfig.boardToken} + docs: https://nango.dev/docs/integrations/all/greenhouse-job-board + docs_connect: https://nango.dev/docs/integrations/all/greenhouse-job-board/connect + credentials: + username: + type: string + title: API key + description: The API Key of your Greenhouse account + pattern: '^[a-zA-Z0-9-]+$' + secret: true + doc_section: '#step-2-generating-your-greenhouse-api-key' + password: + type: string + title: Password + description: Password + # https://developers.greenhouse.io/harvest.html#authentication + # Greenhouse is using basic auth with an api key + default_value: '' + hidden: true + connection_config: + boardToken: + type: string + title: Board Token + description: The Job Board URL token to your Greenhouse account + order: 1 + doc_section: '#step-1-finding-your-board-token' + +greenhouse-assessment: + display_name: Greenhouse (Assessment API) + auth_mode: BASIC + categories: + - ats + proxy: + base_url: https://${connectionConfig.baseUrl} + verification: + headers: + content-type: application/json + endpoints: + - /list_tests + docs: https://nango.dev/docs/integrations/all/greenhouse-assessment + docs_connect: https://nango.dev/docs/integrations/all/greenhouse-assessment/connect + connection_config: + baseUrl: + type: string + title: Assessment Base Url + description: The Assessment API Base Url you want to connect to + pattern: '^[a-z0-9_-]+$' + example: www.testing-partner.com + prefix: https:// + format: hostname + order: 1 + doc_section: '#step-1-obtaining-your-assessment-base-url' + credentials: + username: + type: string + title: API key + description: The API Key of your Greenhouse account + pattern: '^[a-zA-Z0-9-]+$' + secret: true + doc_section: '#step-2-obtaining-your-api-key' + password: + type: string + title: Password + description: Password + # https://developers.greenhouse.io/harvest.html#authentication + # Greenhouse is using basic auth with an api key + default_value: '' + hidden: true + +greenhouse-ingestion: + display_name: Greenhouse (Ingestion API) + auth_mode: OAUTH2 + authorization_url: https://api.greenhouse.io/oauth/authorize + token_url: https://api.greenhouse.io/oauth/token + categories: + - ats + proxy: + base_url: https://api.greenhouse.io + docs: https://nango.dev/docs/integrations/all/greenhouse-ingestion + +greenhouse-onboarding: + display_name: Greenhouse (Onboarding API) + auth_mode: BASIC + categories: + - ats + proxy: + base_url: https://onboarding-api.greenhouse.io + verification: + headers: + content-type: application/json + endpoints: + - /graphql?query=%7B__schema%7Btypes%7Bname,kind,fields%7Bname%7D%7D%7D%7D + credentials: + username: + type: string + title: Access Key + description: The Access Key to your Greenhouse Onboarding account + pattern: '^[a-zA-Z0-9-]+$' + doc_section: '#step-1-generating-your-access-and-secret-keys' + password: + type: string + title: Secret Key + description: The Secret Key to your Greenhouse Onboarding account + pattern: '^[a-zA-Z0-9-]+$' + doc_section: '#step-1-generating-your-access-and-secret-keys' + docs: https://nango.dev/docs/integrations/all/greenhouse-onboarding + docs_connect: https://nango.dev/docs/integrations/all/greenhouse-onboarding/connect + +grist: + display_name: Grist + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.environment}.getgrist.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /api/orgs + docs: https://nango.dev/docs/api-integrations/grist + docs_connect: https://nango.dev/docs/api-integrations/grist/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Grist API key + pattern: '^[a-f0-9]{40}$' + example: 980cb267c8fa52ae5b6a0a5b4977ec915add8c07 + connection_config: + environment: + type: string + title: Environment + description: The environment you want to connect to. + enum: + - team + - docs + order: 1 + doc_section: '#step-1-selecting-your-environment' + +gumroad: + display_name: Gumroad + categories: + - design + - e-commerce + - payment + auth_mode: OAUTH2 + authorization_url: https://gumroad.com/oauth/authorize + token_url: https://api.gumroad.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.gumroad.com + docs: https://nango.dev/docs/integrations/all/gumroad + +gusto: + display_name: Gusto + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://api.gusto.com/oauth/authorize + token_url: https://api.gusto.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.gusto.com + post_connection_script: gustoPostConnection + docs: https://nango.dev/docs/integrations/all/gusto + +gusto-demo: + display_name: Gusto (Demo) + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://api.gusto-demo.com/oauth/authorize + token_url: https://api.gusto-demo.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.gusto-demo.com + post_connection_script: gustoPostConnection + docs: https://nango.dev/docs/integrations/all/gusto-demo + +hackerrank-work: + display_name: HackerRank Work + categories: + - ats + auth_mode: BASIC + proxy: + base_url: https://www.hackerrank.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /x/api/v3/users?limit=10&offset=10 + docs: https://nango.dev/docs/integrations/all/hackerrank-work + docs_connect: https://nango.dev/docs/integrations/all/hackerrank-work/connect + credentials: + username: + type: string + title: API Key + description: Your HackerRank Work API Key + doc_section: '#step-1-finding-hackerrank-api-key' + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +halo-psa: + display_name: Halo PSA + categories: + - support + - ticketing + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.hostname}/auth/token + token_request_auth_method: basic + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.hostname}/api + docs: https://nango.dev/docs/api-integrations/halo-psa + docs_connect: https://nango.dev/docs/api-integrations/halo-psa/connect + connection_config: + hostname: + type: string + title: Hostname + description: Your Halo PSA hostname. + example: example.halopsa.com + format: hostname + prefix: https:// + doc_section: '#step-1-find-your-halo-api-details' + order: 1 + credentials: + client_id: + type: string + title: Client ID + description: Your Halo PSA API application Client ID + doc_section: '#step-3-create-an-api-application' + client_secret: + type: string + title: Client Secret + description: Your Halo PSA API application Client Secret + secret: true + doc_section: '#step-3-create-an-api-application' + +harvest: + display_name: Harvest + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://id.getharvest.com/oauth2/authorize + token_url: https://id.getharvest.com/api/v2/oauth2/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + headers: + user-agent: ${connectionConfig.appDetails} || App (support@nango.dev) + retry: + after: + - 'retry-after' + base_url: https://api.harvestapp.com + docs: https://nango.dev/docs/integrations/all/harvest + connection_config: + appDetails: + type: string + title: App Details + description: The details of your app + automated: true + +health-gorilla: + display_name: Health Gorilla + categories: + - other + auth_mode: OAUTH2 + authorization_url: https://api.healthgorilla.com/oauth/authorize + token_url: https://api.healthgorilla.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://healthgorilla.com + docs: https://nango.dev/docs/integrations/all/health-gorilla + +heap: + display_name: Heap + categories: + - other + auth_mode: TWO_STEP + proxy: + base_url: https://heapanalytics.com/api + token_url: https://heapanalytics.com/api/public/v0/auth_token + token_headers: + authorization: Basic ${base64(${credentials.appId}:${credentials.apiKey})} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/integrations/all/heap + docs_connect: https://nango.dev/docs/integrations/all/heap/connect + credentials: + appId: + type: string + title: App ID + description: Your Heap application ID + example: '3207896401' + pattern: '^\d+$' + doc_section: '#step-1-generating-your-api-key-and-app-id' + apiKey: + type: string + title: API Key + description: Your Heap API Key + secret: true + example: 1bc32cba-a5d6-438a-bbcc-af312f560a3c + format: uuid + doc_section: '#step-1-generating-your-api-key-and-app-id' + +hex: + display_name: Hex + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.hex.tech/api + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/hex + docs_connect: https://nango.dev/docs/api-integrations/hex/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Hex API Token. + example: hxtp_a1b2c3d4e5f6*** + pattern: '^hxt[pw]_[a-f0-9]+$' + doc_section: '#step-1-creating-your-api-token' + connection_config: + subdomain: + type: string + title: Subdomain + description: Your Hex subdomain. + pattern: '^[a-z0-9]([a-z0-9-]*[a-z0-9])?$' + example: app + doc_section: '#step-2-finding-your-subdomain' + +heyreach: + display_name: HeyReach + categories: + - social + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.heyreach.io/api + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /public/auth/CheckApiKey + docs: https://nango.dev/docs/integrations/all/heyreach + docs_connect: https://nango.dev/docs/integrations/all/heyreach/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your HeyReach account + pattern: '^[A-Za-z0-9+/]+={0,2}$' + example: 'FoVLZoM+nVyMELhqr7vH120O2FS1gZcAG5d2qs1bndg=' + doc_section: '#step-1-generating-an-api-key' + +hibob-service-user: + display_name: Hibob Service User + categories: + - hr + - popular + auth_mode: BASIC + proxy: + base_url: https://api.hibob.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/company/named-lists + retry: + at: + - 'x-ratelimit-reset' + credentials: + username: + type: string + title: Hibob ID + description: Your Hibob ID + doc_section: '#step-1-finding-your-hibob-service-user-id' + password: + type: string + title: Hibob Token + description: Your Hibob Token + default_value: '' + secret: true + doc_section: '#step-2-finding-your-hibob-token' + docs: https://nango.dev/docs/integrations/all/hibob-service-user + docs_connect: https://nango.dev/docs/integrations/all/hibob-service-user/connect + +heygen: + display_name: HeyGen + categories: + - video + auth_mode: OAUTH2 + authorization_url: https://app.heygen.com/oauth/authorize + token_url: https://api2.heygen.com/v1/oauth/token + refresh_url: https://api2.heygen.com/v1/oauth/refresh_token + proxy: + base_url: https://api2.heygen.com + docs: https://nango.dev/docs/api-integrations/heygen + setup_guide_url: https://nango.dev/docs/api-integrations/heygen/how-to-register-your-own-heygen-oauth-app + +heymarket: + display_name: Heymarket + categories: + - communication + - marketing + auth_mode: JWT + signature: + protocol: HMAC + hmac_secret_encoding: utf8 + token: + signing_key: ${credentials.apiSecretId}||${credentials.apiSecretKey} + expires_in_ms: 300000 + header: + alg: HS256 + typ: JWT + payload: + iss: ${credentials.apiSecretId} + proxy: + base_url: https://api.heymarket.com + headers: + accept: application/json + authorization: Bearer ${accessToken} + verification: + method: GET + headers: + accept: application/json + endpoints: + - /v1/team + docs: https://nango.dev/docs/api-integrations/heymarket + docs_connect: https://nango.dev/docs/api-integrations/heymarket/connect + credentials: + apiSecretId: + type: string + title: API Secret ID + description: Your Heymarket API Secret ID. + example: a0ee0000-0000-4000-8000-00000000abcd + format: uuid + doc_section: '#step-1-finding-your-api-secret-id-and-secret-key' + apiSecretKey: + type: string + title: API Secret Key + description: Your Heymarket API Secret Key. + secret: true + example: Aa0***Cc2***Ee4***Gg6***Ii8***Kk0 + pattern: ^[A-Za-z0-9]+$ + doc_section: '#step-1-finding-your-api-secret-id-and-secret-key' + +highlevel: + display_name: HighLevel + categories: + - marketing + auth_mode: OAUTH2 + authorization_url: https://marketplace.gohighlevel.com/oauth/chooselocation + token_url: https://services.leadconnectorhq.com/oauth/token + scope_separator: ' ' + proxy: + base_url: https://services.leadconnectorhq.com + disable_pkce: true + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + post_connection_script: highlevelPostConnection + webhook_routing_script: highlevelWebhookRouting + webhook_user_defined_secret: true + docs: https://nango.dev/docs/api-integrations/highlevel + setup_guide_url: https://nango.dev/docs/api-integrations/highlevel/how-to-register-your-own-highlevel-api-oauth-app + +highlevel-white-label: + display_name: HighLevel (LeadConnector) + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://marketplace.leadconnectorhq.com/oauth/chooselocation + token_url: https://services.leadconnectorhq.com/oauth/token + scope_separator: ' ' + proxy: + base_url: https://services.leadconnectorhq.com + disable_pkce: true + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + post_connection_script: highlevelPostConnection + webhook_routing_script: highlevelWebhookRouting + webhook_user_defined_secret: true + docs: https://nango.dev/docs/api-integrations/highlevel-white-label + setup_guide_url: https://nango.dev/docs/api-integrations/highlevel-white-label/how-to-register-your-own-highlevel-white-label-api-oauth-app + +holded: + display_name: Holded + categories: + - accounting + - crm + - invoicing + auth_mode: API_KEY + proxy: + base_url: https://api.holded.com/api + headers: + key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /invoicing/v1/contacts + docs: https://nango.dev/docs/integrations/all/holded + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Holded account + +hover: + display_name: Hover + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://hover.to/oauth/authorize + token_url: https://hover.to/oauth/token + disable_pkce: true + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.hover.to + docs: https://nango.dev/docs/integrations/all/hover + +huntress: + display_name: Huntress + categories: + - other + auth_mode: BASIC + proxy: + base_url: https://api.huntress.io + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/organizations + docs: https://nango.dev/docs/api-integrations/huntress + docs_connect: https://nango.dev/docs/api-integrations/huntress/connect + credentials: + username: + type: string + title: API Key + description: Your Huntress API key. + pattern: '^hk_[A-Za-z0-9]+$' + example: hk_XXXXXXXXXXXXXXXX + doc_section: '#step-1-generate-api-keys' + password: + type: string + title: API Secret + description: Your Huntress API secret. + secret: true + pattern: '^hs_[A-Za-z0-9]+$' + example: hs_XXXXXXXXXXXXXXXX + doc_section: '#step-1-generate-api-keys' + +hubspot: + display_name: HubSpot + categories: + - marketing + - support + - crm + - popular + auth_mode: OAUTH2 + authorization_url: https://app.hubspot.com/oauth/authorize + token_url: https://api.hubapi.com/oauth/v1/token + connection_configuration: + - portalId + post_connection_script: hubspotPostConnection + pre_connection_deletion_script: hubspotPreConnectionDeletion + webhook_routing_script: hubspotWebhookRouting + proxy: + retry: + remaining: 'x-hubspot-ratelimit-remaining' + base_url: https://api.hubapi.com + decompress: true + paginate: + type: cursor + cursor_path_in_response: paging.next.after + limit_name_in_request: limit + cursor_name_in_request: after + response_path: results + docs: https://nango.dev/docs/api-integrations/hubspot + setup_guide_url: https://nango.dev/docs/api-integrations/hubspot/how-to-register-your-own-hubspot-api-oauth-app + +hubspot-mcp: + display_name: HubSpot (MCP) + categories: + - marketing + - support + - crm + - mcp + auth_mode: MCP_OAUTH2 + client_registration: static + authorization_url: https://mcp.hubspot.com/oauth/authorize/user + token_url: https://mcp.hubspot.com/oauth/v3/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://mcp.hubspot.com + docs: https://nango.dev/docs/api-integrations/hubspot-mcp + setup_guide_url: https://nango.dev/docs/api-integrations/hubspot-mcp/how-to-register-your-own-hubspot-mcp-api-oauth-app + +incident-io: + display_name: Incident.io + categories: + - ticketing + auth_mode: API_KEY + proxy: + base_url: https://api.incident.io + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/identity + docs: https://nango.dev/docs/integrations/all/incident-io + docs_connect: https://nango.dev/docs/integrations/all/incident-io/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Incident.io account + example: 'inc_************************************f2c5e6a7b3d4**********' + pattern: 'inc_[a-f0-9]{64}$' + doc_section: '#step-1-generating-your-api-key' + +insightly: + display_name: Insightly + categories: + - crm + auth_mode: BASIC + proxy: + base_url: https://api.${connectionConfig.pod}.insightly.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v3.1/Contacts + docs: https://nango.dev/docs/integrations/all/insightly + connection_config: + pod: + type: string + title: Insightly Domain + description: The subdomain of your Insightly account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .insightly.com + prefix: https:// + credentials: + username: + type: string + title: API Key + description: Your Insightly API key + password: + type: string + title: '' + description: '' + hidden: true + default_value: '' + +instantly: + display_name: Instantly + categories: + - marketing + - communication + auth_mode: API_KEY + proxy: + base_url: https://api.instantly.ai/api + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/instantly + docs_connect: https://nango.dev/docs/integrations/all/instantly/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Instantly account + pattern: '^[A-Za-z0-9._=-]+$' + example: ZTQ****************************************QQ== + doc_section: '#step-1-generate-an-api-key' + +instagram: + display_name: Instagram + categories: + - marketing + - social + auth_mode: OAUTH2 + scope_separator: ',' + authorization_url: https://api.instagram.com/oauth/authorize + token_url: https://api.instagram.com/oauth/access_token + refresh_url: https://graph.instagram.com/refresh_access_token + proxy: + base_url: https://graph.instagram.com + docs: https://nango.dev/docs/api-integrations/instagram + setup_guide_url: https://nango.dev/docs/api-integrations/instagram/how-to-register-your-own-instagram-api-oauth-app + +icypeas: + display_name: Icypeas + categories: + - marketing + - crm + auth_mode: API_KEY + proxy: + base_url: https://app.icypeas.com/api + headers: + authorization: ${apiKey} + verification: + method: POST + endpoints: + - /email-search + docs: https://nango.dev/docs/integrations/all/icypeas + docs_connect: https://nango.dev/docs/integrations/all/icypeas/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Icypeas account + example: ab84bc2056614635866e4a98c153d7a1ab30541032fd433793d402f2a5db2404 + pattern: '^[a-f0-9]{64}$' + doc_section: '#step-1-finding-your-api-key' + +itglue: + display_name: IT Glue + categories: + - productivity + - other + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.itglue.com + headers: + x-api-key: ${apiKey} + content-type: application/vnd.api+json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /organizations + docs: https://nango.dev/docs/integrations/all/itglue + docs_connect: https://nango.dev/docs/integrations/all/itglue/connect + credentials: + apiKey: + type: string + title: API Key + description: Your IT Glue API key + doc_section: '#step-2-generating-your-api-key' + pattern: '^ITG\.[a-zA-Z0-9._-]+$' + example: ITG.12cca334567890_123456vasfagas7890 + connection_config: + subdomain: + type: string + title: Subdomain + description: Your IT Glue subdomain. + enum: + - api + - api.eu + - api.au + doc_section: '#step-1-finding-your-subdomain' + order: 1 + +immybot: + display_name: ImmyBot + categories: + - dev-tools + - support + auth_mode: OAUTH2_CC + body_format: form + token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token + token_params: + grant_type: client_credentials + scope: https://${connectionConfig.instanceSubdomain}.immy.bot/.default + proxy: + base_url: https://${connectionConfig.instanceSubdomain}.immy.bot + headers: + accept: application/json + docs: https://nango.dev/docs/api-integrations/immybot + docs_connect: https://nango.dev/docs/api-integrations/immybot/connect + connection_config: + tenantId: + type: string + title: Microsoft Entra Tenant ID + description: The Azure tenant ID that owns the ImmyBot app registration. + format: uuid + example: 00000000-0000-0000-0000-000000000000 + order: 1 + doc_section: '#step-1-create-or-find-your-microsoft-entra-app-registration' + instanceSubdomain: + type: string + title: ImmyBot Instance Subdomain + description: The first segment of your ImmyBot instance URL. + pattern: '^[a-z0-9][a-z0-9-]*[a-z0-9]$' + example: acme + prefix: https:// + suffix: .immy.bot + order: 2 + doc_section: '#step-6-find-your-immybot-instance-subdomain' + credentials: + client_id: + type: string + title: Client ID + description: The Application client ID from the Microsoft Entra app registration. + format: uuid + example: 00000000-0000-0000-0000-000000000000 + doc_section: '#step-1-create-or-find-your-microsoft-entra-app-registration' + client_secret: + type: string + title: Client Secret + description: The client secret value from the Microsoft Entra app registration. + secret: true + doc_section: '#step-2-create-a-client-secret' + +intercom: + display_name: Intercom + categories: + - marketing + - popular + - support + - surveys + - ticketing + auth_mode: OAUTH2 + authorization_url: https://app.${connectionConfig.region}.intercom.com/oauth || https://app.intercom.com/oauth + token_url: https://api.${connectionConfig.region}.intercom.io/auth/eagle/token || https://api.intercom.io/auth/eagle/token + proxy: + base_url: https://api.${connectionConfig.region}.intercom.io || https://api.intercom.io + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/api-integrations/intercom + setup_guide_url: https://nango.dev/docs/api-integrations/intercom/how-to-register-your-own-intercom-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/intercom/connect + pre_connection_deletion_script: intercomPreConnectionDeletion + connection_config: + region: + type: string + title: Region + description: The API region for your Intercom workspace. + enum: + - eu + - au + optional: true + doc_section: '#step-1-finding-your-region' + +intuit: + display_name: Intuit + categories: + - accounting + auth_mode: OAUTH2 + authorization_url: https://appcenter.intuit.com/connect/oauth2 + token_url: https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer + proxy: + base_url: https://quickbooks.api.intuit.com + docs: https://nango.dev/docs/integrations/all/intuit + +ironclad: + display_name: Ironclad + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://ironcladapp.com/oauth/authorize + token_url: https://${connectionConfig.subdomain}.ironcladapp.com/oauth/token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.ironcladapp.com + docs: https://nango.dev/docs/integrations/all/ironclad + docs_connect: https://nango.dev/docs/integrations/all/ironclad/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: Your Ironclad Environment Subdomain. + enum: + - na1 + - demo + - eu1 + doc_section: '#step-1-finding-your-subdomain' + +ironclad-cc: + display_name: Ironclad (Client Credentials) + categories: + - legal + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.subdomain}.ironcladapp.com/oauth/token + token_params: + grant_type: client_credentials + scope_separator: ' ' + proxy: + base_url: https://${connectionConfig.subdomain}.ironcladapp.com + headers: + x-as-user-email: ${connectionConfig.userEmail} + docs: https://nango.dev/docs/api-integrations/ironclad-cc + docs_connect: https://nango.dev/docs/api-integrations/ironclad-cc/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: Your Ironclad environment subdomain. + enum: + - na1 + - demo + - eu1 + order: 1 + userEmail: + type: string + title: User Email + description: The email of the Ironclad user on whose behalf API requests are made. + example: user@yourcompany.com + format: email + order: 2 + +jamf: + display_name: Jamf Pro (Client Credentials) + categories: + - other + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.instance}.jamfcloud.com/api/v1/oauth/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.instance}.jamfcloud.com + scope_separator: ' ' + docs: https://nango.dev/docs/integrations/all/jamf + connection_config: + instance: + type: string + title: Jamf Pro Instance + description: Your Jamf Pro instance + example: example + prefix: https:// + suffix: .jamfcloud.com + order: 1 + +jamf-basic: + display_name: Jamf Pro (Basic Auth) + categories: + - other + auth_mode: TWO_STEP + proxy: + base_url: https://${connectionConfig.instance}.jamfcloud.com + headers: + authorization: Bearer ${accessToken} + token_url: https://${connectionConfig.instance}.jamfcloud.com/api/v1/auth/token + token_headers: + authorization: Basic ${base64(${credentials.username}:${credentials.password})} + token_response: + token: token + token_expiration: expires + token_expiration_strategy: expireAt + docs: https://nango.dev/docs/integrations/all/jamf-basic + connection_config: + instance: + type: string + title: Jamf Pro Instance + description: Your Jamf Pro instance + example: example + prefix: https:// + suffix: .jamfcloud.com + order: 1 + credentials: + username: + type: string + title: Username + description: Your Jamf Pro username + password: + type: string + title: Password + description: Your Jamf Pro password + secret: true + +jamie: + display_name: Jamie + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://beta-api.meetjamie.ai + headers: + x-api-key: ${apiKey} + docs: https://nango.dev/docs/api-integrations/jamie + docs_connect: https://nango.dev/docs/api-integrations/jamie/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Jamie workspace or personal API key. + example: jk_your_api_key + pattern: '^jk_[a-zA-Z0-9_-]+$' + doc_section: '#step-1-create-an-api-key' + +jazzhr: + display_name: JazzHR + categories: + - hr + - ats + auth_mode: API_KEY + proxy: + base_url: https://api.resumatorapi.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/users?apikey=${credentials.apiKey} + query: + apikey: ${apiKey} + docs: https://nango.dev/docs/integrations/all/jazzhr + docs_connect: https://nango.dev/docs/integrations/all/jazzhr/connect + credentials: + apiKey: + type: string + title: API Key + description: Your JazzHR API Key + doc_section: '#step-1-finding-your-api-key' + +jiminny: + display_name: Jiminny + categories: + - productivity + - communication + auth_mode: API_KEY + proxy: + base_url: https://app.jiminny.${connectionConfig.region}/customer/api + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v1/me + docs: https://nango.dev/docs/api-integrations/jiminny + docs_connect: https://nango.dev/docs/api-integrations/jiminny/connect + connection_config: + region: + type: string + title: Region + description: The region your Jiminny account is hosted in. + enum: + - eu + - com + doc_section: '#step-1-find-your-region' + credentials: + apiKey: + type: string + title: API Key + description: Your Jiminny API key. + example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c + pattern: '^eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' + doc_section: '#step-2-generate-an-api-key' + +jira: + display_name: Jira (OAuth) + categories: + - popular + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://auth.atlassian.com/authorize + token_url: https://auth.atlassian.com/oauth/token + default_scopes: + - offline_access + authorization_params: + audience: api.atlassian.com + prompt: consent + connection_configuration: + - cloudId + - accountId + proxy: + base_url: https://api.atlassian.com + connection_config: + subdomain: ${connectionConfig.subdomain} + paginate: + type: link + link_rel_in_response_header: next + limit_name_in_request: limit + response_path: results + link_path_in_response_body: _links.next + post_connection_script: jiraPostConnection + webhook_routing_script: jiraWebhookRouting + docs: https://nango.dev/docs/api-integrations/jira + setup_guide_url: https://nango.dev/docs/api-integrations/jira/how-to-register-your-own-jira-api-oauth-app + connection_config: + subdomain: + type: string + title: Subdomain + optional: true + description: The subdomain of your Attlassian account + pattern: '^[a-zA-Z0-9.-]+$' + example: subdomain + suffix: .atlassian.net + prefix: https:// + +justworks: + display_name: Justworks + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://payroll.justworks.com/oauth/authorize + token_url: https://public-api.justworks.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + scope_separator: ' ' + proxy: + base_url: https://public-api.justworks.com + docs: https://nango.dev/docs/api-integrations/justworks + setup_guide_url: https://nango.dev/docs/api-integrations/justworks/how-to-register-your-own-justworks-oauth-app + +jira-basic: + display_name: Jira (Basic Auth) + categories: + - productivity + - ticketing + auth_mode: BASIC + proxy: + retry: + after: + - 'retry-after' + base_url: https://${connectionConfig.subdomain}.atlassian.net + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /rest/api/3/myself + docs: https://nango.dev/docs/integrations/all/jira-basic + connection_config: + subdomain: + type: string + title: Jira Domain + description: The subdomain of your Jira account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .atlassian.net + prefix: https:// + order: 1 + doc_section: '#step-2-finding-your-atlassian-domain' + credentials: + username: + type: string + title: Email Address + description: The Email Address of your Jira account + format: email + doc_section: '#step-3-finding-your-user-name' + password: + type: string + title: API Key + description: The API Key of your Jira account + doc_section: '#step-1-finding-atlassian-api-key' + docs_connect: https://nango.dev/docs/integrations/all/jira-basic/connect + +jira-data-center: + display_name: Jira Data Center + categories: + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.endpointURL}/rest/oauth2/latest/authorize + authorization_params: + grant_type: authorization_code + token_url: https://${connectionConfig.endpointURL}/rest/oauth2/latest/token + docs: https://nango.dev/docs/integrations/all/jira-data-center + proxy: + base_url: https://${connectionConfig.endpointURL}/rest/api/latest + connection_config: + endpointURL: + type: string + title: Domain + description: The domain of your Jira Data Center account + pattern: '^[a-zA-Z0-9.-]+(:\d+)?(/[a-zA-Z0-9._~-]+)*/?$' + prefix: https:// + example: foobar.atlassian.net + +jira-data-center-api-key: + display_name: Jira Data Center (API Key) + categories: + - productivity + - ticketing + auth_mode: API_KEY + proxy: + base_url: ${connectionConfig.baseUrl} + retry: + after: + - 'retry-after' + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/jira-data-center-api-key + docs_connect: https://nango.dev/docs/integrations/all/jira-data-center-api-key/connect + connection_config: + baseUrl: + type: string + title: Instance Base Url + description: The base Url for your Jira Data Center instance + pattern: '^(https?:\/\/)?[A-Za-z0-9.-]+(:\d+)?(\/[A-Za-z0-9._-]*)?$' + example: https://foobar.atlassian.net + doc_section: '#step-1-finding-your-instance-base-url' + order: 1 + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Jira Data Center + doc_section: '#step-2-generating-your-api-key' + +jira-data-center-basic: + display_name: Jira Data Center (Basic Auth) + categories: + - productivity + - ticketing + auth_mode: BASIC + proxy: + base_url: ${connectionConfig.baseUrl} + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/jira-data-center-basic + docs_connect: https://nango.dev/docs/integrations/all/jira-data-center-basic/connect + connection_config: + baseUrl: + type: string + title: Instance Base Url + description: The base Url for your Jira Data Center instance + pattern: '^(https?:\/\/)?[A-Za-z0-9.-]+(:\d+)?(\/[A-Za-z0-9._-]*)?$' + example: https://foobar.atlassian.net + doc_section: '#step-1-finding-your-instance-base-url' + order: 1 + credentials: + username: + type: string + title: Username + description: The username for your Jira Data Center + doc_section: '#step-2-finding-your-credentials' + password: + type: string + title: Password + description: The password for your Jira Data Center + doc_section: '#step-2-finding-your-credentials' + +jobadder: + display_name: Jobadder + categories: + - hr + - ats + auth_mode: OAUTH2 + disable_pkce: true + authorization_url: https://id.jobadder.com/connect/authorize + token_url: https://id.jobadder.com/connect/token + default_scopes: + - offline_access + authorization_params: + response_type: code + proxy: + base_url: https://api.jobadder.com + docs: https://nango.dev/docs/integrations/all/jobadder + +jobdiva: + display_name: JobDiva + categories: + - hr + - ats + auth_mode: TWO_STEP + token_url: https://api.jobdiva.com/apiv2/authenticate?clientid=${credentials.clientId}&username=${credentials.username}&password=${credentials.password} + token_request_method: GET + proxy: + base_url: https://api.jobdiva.com + token_response: + token: '' + webhook_routing_script: jobdivaWebhookRouting + webhook_user_defined_secret: true + docs: https://nango.dev/docs/integrations/all/jobdiva + docs_connect: https://nango.dev/docs/integrations/all/jobdiva/connect + credentials: + clientId: + type: string + title: Client ID + description: Your JobDiva Client ID + example: '3050' + doc_section: '#step-1-obtaining-your-client-id' + pattern: '^[0-9]{4}$' + username: + type: string + title: Username + description: Your JobDiva API username + example: username + doc_section: '#step-2-creating-an-api-user' + password: + type: string + title: Password + description: Your JobDiva API password + secret: true + example: password + doc_section: '#step-2-creating-an-api-user' + +jobber: + display_name: Jobber + categories: + - crm + - invoicing + auth_mode: OAUTH2 + authorization_url: https://api.getjobber.com/api/oauth/authorize + token_url: https://api.getjobber.com/api/oauth/token + authorization_params: + response_type: code + proxy: + headers: + x-jobber-graphql-version: ${connectionConfig.version} || 2025-01-20 + base_url: https://api.getjobber.com/api + docs: https://nango.dev/docs/integrations/all/jobber + connection_config: + version: + type: string + title: '' + description: '' + automated: true + +jobvite: + display_name: Jobvite + categories: + - ats + auth_mode: API_KEY + proxy: + base_url: https://api.jobvite.com/api + headers: + x-jvi-api: ${apiKey} + x-jvi-sc: ${connectionConfig.secretKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/candidate + docs: https://nango.dev/docs/integrations/all/jobvite + docs_connect: https://nango.dev/docs/integrations/all/jobvite/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Jobvite account + doc_section: '#step-1-getting-your-api-key-and-secret-key' + connection_config: + secretKey: + type: string + title: Secret Key + description: The secret key for your Jobvite account + secret: true + doc_section: '#step-1-getting-your-api-key-and-secret-key' + +jotform: + display_name: Jotform + categories: + - surveys + auth_mode: API_KEY + proxy: + base_url: https://api.jotform.com + headers: + apikey: ${apiKey} + docs: https://nango.dev/docs/integrations/all/jotform + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Jotform account + +jumpcloud: + display_name: JumpCloud + categories: + - iam + auth_mode: API_KEY + proxy: + base_url: https://console.jumpcloud.com/api + headers: + x-api-key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /organizations + docs: https://nango.dev/docs/integrations/all/jumpcloud + docs_connect: https://nango.dev/docs/integrations/all/jumpcloud/connect + credentials: + apiKey: + type: string + title: API Key + description: Your JumpCloud API Key. + example: jca_9mK4pL2xR8vN6qW1sT7uY3eA5bC9dF0hG2jM + pattern: '^[A-Za-z0-9_-]+$' + doc_section: '#step-1-generate-your-jumpcloud-api-key' + +helpscout-docs: + display_name: Help Scout Docs + categories: + - knowledge-base + - support + auth_mode: BASIC + proxy: + retry: + after: + - 'x-ratelimit-reset' + base_url: https://docsapi.helpscout.net + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/sites + docs: https://nango.dev/docs/integrations/all/helpscout-docs + docs_connect: https://nango.dev/docs/integrations/all/helpscout-docs/connect + credentials: + username: + type: string + title: API Key + description: Your Help Scout Docs API Key + secret: true + doc_section: '#step-1-finding-help-scout-api-key' + password: + type: string + title: '' + description: '' + default_value: 'X' + hidden: true + +helpscout-mailbox: + display_name: Help Scout Mailbox + categories: + - support + auth_mode: OAUTH2 + authorization_url: https://secure.helpscout.net/authentication/authorizeClientApplication + token_url: https://api.helpscout.net/v2/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + retry: + after: + - 'x-ratelimit-retry-after' + base_url: https://api.helpscout.net + docs: https://nango.dev/docs/integrations/all/helpscout-mailbox + +kandji: + display_name: Kandji + categories: + - support + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.kandji.io + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/kandji + docs_connect: https://nango.dev/docs/integrations/all/kandji/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain to your kandji account + doc_section: '#step-1-finding-your-subdomain' + order: 1 + credentials: + apiKey: + type: string + title: API Token + description: The API Token for your Kandji account + example: 1bc32cba-a5d6-438a-bbcc-af312f560a3c + format: uuid + doc_section: '#step-2-generating-your-api-token' + +keap: + display_name: Keap + categories: + - marketing + auth_mode: OAUTH2 + authorization_url: https://accounts.infusionsoft.com/app/oauth/authorize + token_url: https://api.infusionsoft.com/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.infusionsoft.com + docs: https://nango.dev/docs/integrations/all/keap + +keeper-scim: + display_name: Keeper (SCIM) + categories: + - productivity + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://keepersecurity.com/api/rest/scim/v2/${connectionConfig.node} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /Users + docs: https://nango.dev/docs/integrations/all/keeper-scim + docs_connect: https://nango.dev/docs/integrations/all/keeper-scim/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your node keeper account + pattern: '^[A-Za-z0-9+/=]+$' + example: 'J9b7kgdL2gf14d5F9p67zYXVrTZPTMEnl3/EmwwI9K2=' + doc_section: '#step-2-finding-your-api-key-api-token' + connection_config: + node: + type: string + title: Node + description: The node id to your Keeper account + pattern: '^\d{15}$' + example: '123435384338765' + doc_section: '#step-1-finding-your-node-id' + +kintone: + display_name: Kintone + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.kintone.com/oauth2/authorization + token_url: https://${connectionConfig.subdomain}.kintone.com/oauth2/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.kintone.com + docs: https://nango.dev/docs/integrations/all/kintone + docs_connect: https://nango.dev/docs/integrations/all/kintone/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain for your Kintone account + doc_section: '#step-1-finding-your-subdomain' + example: urdzw8p24agp + pattern: '^[a-z0-9_-]+$' + +kintone-user-api: + display_name: Kintone User API + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.kintone.com + verification: + method: GET + endpoints: + - /v1/users.json + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/kintone-user-api + docs_connect: https://nango.dev/docs/integrations/all/kintone-user-api/connect + credentials: + apiKey: + type: string + title: API Token + description: The API Token for your Kintone account + example: cy.s.api1.eyJraWQiOiJ2MSIsInR5cCI6IkpXVCIsImFsZyI6IkhTMjU2In0.eyJyYW5kIjoiNWQ4ZmNiOGYtMDk3ZC00MWNhLWJkZjAtYTAxN2ZiMDZkYjNlIiwiaXNzIjoieTkwNzgyIiwiZXhwIjoxNzU4MTg1Mzg5fQ.GUoYL6hBFGOywcfjxQB3Y3vSwEq67evDGcmVQvzPY94 + pattern: '^cy\.s\.api1\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' + doc_section: '#step-2-generating-your-api-token' + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain for your Kintone account + doc_section: '#step-1-finding-your-subdomain' + example: urdzw8p24agp + order: 1 + pattern: '^[a-z0-9_-]+$' + +konnektive: + display_name: Konnektive + categories: + - crm + - e-commerce + auth_mode: BASIC + proxy: + base_url: https://api.konnektive.com + query: + loginId: ${credentials.username} + password: ${credentials.password} + docs: https://nango.dev/docs/api-integrations/konnektive + docs_connect: https://nango.dev/docs/api-integrations/konnektive/connect + credentials: + username: + type: string + title: API Login ID + description: Your Konnektive API Login ID. + doc_section: '#step-1-find-your-api-credentials' + password: + type: string + title: API Password + description: Your Konnektive API password. + secret: true + doc_section: '#step-1-find-your-api-credentials' + +knowbe4: + display_name: KnowBe4 + categories: + - support + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.knowbe4.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/api-integrations/knowbe4 + docs_connect: https://nango.dev/docs/api-integrations/knowbe4/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your KnowBe4 account + doc_section: '#step-2-generating-your-knowbe4-api-key' + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain to your API base URL. + doc_section: '#step-1-finding-your-subdomain' + enum: + - us.api + - eu.api + - ca.api + - uk.api + - de.api + order: 1 + +klipfolio: + display_name: Klipfolio + categories: + - productivity + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://app.klipfolio.com + headers: + kf-api-key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/1.0/profile + docs: https://nango.dev/docs/integrations/all/klipfolio + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Klipfolio account + +klaviyo: + display_name: Klaviyo (API Key) + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://a.klaviyo.com + headers: + authorization: Klaviyo-API-Key ${apiKey} + revision: '2024-07-15' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/accounts + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/klaviyo + docs_connect: https://nango.dev/docs/integrations/all/klaviyo/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Klaviyo account + doc_section: '#step-1-finding-klaviyo-api-key' + +klaviyo-oauth: + display_name: Klaviyo (OAuth) + categories: + - marketing + auth_mode: OAUTH2 + authorization_url: https://www.klaviyo.com/oauth/authorize + token_url: https://a.klaviyo.com/oauth/token + token_request_auth_method: basic + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://a.klaviyo.com + headers: + revision: '2024-07-15' + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/klaviyo-oauth + +klicktipp: + display_name: KlickTipp + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.klicktipp.com + credentials: + apiKey: + type: string + title: API Key + description: Your KlickTipp API key. + example: a1b2c3d4e5f6g7h8 + pattern: '^[a-z0-9]{16}$' + secret: true + doc_section: '#step-1-getting-your-api-key' + docs: https://nango.dev/docs/api-integrations/klicktipp + docs_connect: https://nango.dev/docs/api-integrations/klicktipp/connect + +kno-commerce: + display_name: Kno Commerce + categories: + - e-commerce + auth_mode: OAUTH2_CC + token_url: https://app-api.knocommerce.com/api/oauth2/token + token_request_auth_method: basic + body_format: query + token_params: + grant_type: client_credentials + proxy: + base_url: https://app-api.knocommerce.com + docs: https://nango.dev/docs/api-integrations/kno-commerce + docs_connect: https://nango.dev/docs/api-integrations/kno-commerce/connect + credentials: + client_id: + type: string + title: Client ID + description: Your Kno Commerce API client ID + doc_section: '#step-1-creating-an-api-client' + client_secret: + type: string + title: Client Secret + description: Your Kno Commerce API client secret + secret: true + doc_section: '#step-1-creating-an-api-client' + +kustomer: + display_name: Kustomer + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.extension}.kustomerapp.com + retry: + after: + - 'x-ratelimit-reset' + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/kustomer + connection_config: + extension: + type: string + title: Kustomer Domain + description: The subdomain of your Kustomer account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .kustomerapp.com + prefix: https:// + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Kustomer account + +lagrowthmachine: + display_name: La Growth Machine + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://apiv2.lagrowthmachine.com + query: + KEY: ${apiKey} + docs: https://nango.dev/docs/integrations/all/lagrowthmachine + docs_connect: https://nango.dev/docs/integrations/all/lagrowthmachine/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your La Growth Machine account + example: 1bc32cba-a5d6-438a-bbcc-af312f560a3c + format: uuid + doc_section: '#step-1-finding-your-api-key' + +lastpass: + display_name: LastPass + categories: + - productivity + auth_mode: BASIC + proxy: + base_url: https://lastpass.com + docs: https://nango.dev/docs/integrations/all/lastpass + docs_connect: https://nango.dev/docs/integrations/all/lastpass/connect + credentials_verification_script: lastpassCredentialsVerification + credentials: + username: + type: string + title: CID + description: Your LastPass Account number + doc_section: '#step-1-finding-your-cid' + password: + type: string + title: Provhash + description: 'Your LastPass API key' + secret: true + doc_section: '#step-2-generating-your-provhash' + +lattice: + display_name: Lattice + categories: + - hr + auth_mode: API_KEY + proxy: + base_url: https://api.latticehq.com/ + headers: + authorization: Bearer ${apiKey} + accept: application/json + content-type: application/json + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/lattice + docs_connect: https://nango.dev/docs/integrations/all/lattice/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Lattice account + doc_section: '#step-1-finding-lattice-api-key' + +leadmagic: + display_name: LeadMagic + categories: + - marketing + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.leadmagic.io + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v1/credits + docs: https://nango.dev/docs/integrations/all/leadmagic + docs_connect: https://nango.dev/docs/integrations/all/leadmagic/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your LeadMagic account + example: 1e30029c105a89d36b76b879f01208d8 + pattern: '^[a-f0-9]{32}$' + doc_section: '#step-1-finding-your-api-key' + +leadfeeder: + display_name: Leadfeeder + categories: + - marketing + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.leadfeeder.com + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v1/accounts + docs: https://nango.dev/docs/api-integrations/leadfeeder + docs_connect: https://nango.dev/docs/api-integrations/leadfeeder/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key from your Leadfeeder account. + example: a3f8c2b1****************************8805 + pattern: '^[a-f0-9]{40}$' + doc_section: '#step-1-obtain-your-api-key' + +lessonly: + display_name: Lessonly + categories: + - productivity + auth_mode: BASIC + proxy: + base_url: https://api.lessonly.com/api + docs: https://nango.dev/docs/integrations/all/lessonly + credentials: + username: + type: string + title: Subdomain + description: Your Lessonly Subdomain + password: + type: string + title: API Key + description: Your Lessonly API key + secret: true + +lemlist: + display_name: lemlist + categories: + - marketing + - communication + auth_mode: BASIC + proxy: + base_url: https://api.lemlist.com + verification: + headers: + content-type: application/json + endpoints: + - /api/team + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/lemlist + docs_connect: https://nango.dev/docs/integrations/all/lemlist/connect + credentials: + username: + type: string + title: '' + description: '' + default_value: '' + hidden: true + password: + type: string + title: API Key + description: The API key for your Lemlist account + secret: true + example: a1b2c3d4e5f67890abcdefabcdefabcd + pattern: '[a-f0-9]$' + doc_section: '#step-1-generating-your-api-key' + +lever: + display_name: Lever (OAuth) + categories: + - ats + auth_mode: OAUTH2 + authorization_url: https://auth.lever.co/authorize + token_url: https://auth.lever.co/oauth/token + authorization_params: + response_type: code + audience: https://api.lever.co/v1/ + proxy: + base_url: https://api.lever.co + docs: https://nango.dev/docs/integrations/all/lever + +lever-basic: + display_name: Lever (Basic Auth) + auth_mode: BASIC + categories: + - ats + proxy: + base_url: https://api.lever.co + docs: https://nango.dev/docs/integrations/all/lever-basic + docs_connect: https://nango.dev/docs/integrations/all/lever-basic/connect + credentials: + username: + type: string + title: User name + description: The API Key of your lever account + doc_section: '#step-1-finding-lever-api-key' + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +lever-sandbox: + display_name: Lever (OAuth Sandbox) + categories: + - ats + auth_mode: OAUTH2 + authorization_url: https://sandbox-lever.auth0.com/authorize + token_url: https://sandbox-lever.auth0.com/oauth/token + authorization_params: + response_type: code + prompt: consent + audience: https://api.sandbox.lever.co/v1/ + proxy: + base_url: https://api.sandbox.lever.co + docs: https://nango.dev/docs/integrations/all/lever-sandbox + +lever-basic-sandbox: + display_name: Lever (Basic Auth Sandbox)) + categories: + - ats + auth_mode: BASIC + proxy: + base_url: https://api.sandbox.lever.co + docs: https://nango.dev/docs/integrations/all/lever-basic-sandbox + credentials: + username: + type: string + title: User name + description: The API Key of your Lever sandbox account + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +lightfield: + display_name: Lightfield + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.lightfield.app + headers: + authorization: Bearer ${apiKey} + lightfield-version: '2026-03-01' + verification: + method: GET + endpoints: + - /v1/auth/validate + docs: https://nango.dev/docs/api-integrations/lightfield + docs_connect: https://nango.dev/docs/api-integrations/lightfield/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Lightfield API key + example: sk_lf_0_... + pattern: '^sk_lf_0_[A-Za-z0-9_-]+$' + doc_section: '#step-1-create-an-api-key' + +lightspeed-retail: + display_name: Lightspeed Retail (X-Series) + categories: + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://secure.retail.lightspeed.app/connect + token_url: https://${connectionConfig.domain_prefix}.retail.lightspeed.app/api/1.0/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + redirect_uri_metadata: + - domain_prefix + disable_pkce: true + proxy: + base_url: https://${connectionConfig.domain_prefix}.retail.lightspeed.app + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/api-integrations/lightspeed-retail + setup_guide_url: https://nango.dev/docs/api-integrations/lightspeed-retail/how-to-register-your-own-lightspeed-retail-api-oauth-app + connection_config: + domain_prefix: + type: string + title: '' + description: '' + automated: true + +linear: + display_name: Linear + categories: + - popular + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://linear.app/oauth/authorize + token_url: https://api.linear.app/oauth/token + scope_separator: ',' + authorization_params: + prompt: consent + proxy: + base_url: https://api.linear.app + retry: + at: + - 'x-ratelimit-requests-reset' + remaining: 'x-ratelimit-requests-remaining' + error_code: + - '400' + - '5xx' + - '401' + - '429' + disable_pkce: true + webhook_routing_script: linearWebhookRouting + post_connection_script: linearPostConnection + pre_connection_deletion_script: linearPreConnectionDeletion + webhook_user_defined_secret: true + docs: https://nango.dev/docs/api-integrations/linear + setup_guide_url: https://nango.dev/docs/api-integrations/linear/how-to-register-your-own-linear-api-oauth-app + +linear-mcp: + display_name: Linear (MCP) + categories: + - popular + - productivity + - ticketing + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://mcp.linear.app/authorize + token_url: https://mcp.linear.app/token + registration_url: https://mcp.linear.app/register + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + docs: https://nango.dev/docs/api-integrations/linear-mcp + +linkedin: + display_name: LinkedIn + categories: + - ats + - social + auth_mode: OAUTH2 + authorization_url: https://www.linkedin.com/oauth/v2/authorization + token_url: https://www.linkedin.com/oauth/v2/accessToken + disable_pkce: true + proxy: + base_url: https://api.linkedin.com + docs: https://nango.dev/docs/api-integrations/linkedin + setup_guide_url: https://nango.dev/docs/api-integrations/linkedin/how-to-register-your-own-linkedin-api-oauth-app + +linkhut: + display_name: LinkHut + categories: + - social + auth_mode: OAUTH2 + authorization_url: https://ln.ht/_/oauth/authorize + token_url: https://api.ln.ht/v1/oauth/token + proxy: + base_url: https://api.ln.ht + docs: https://nango.dev/docs/integrations/all/linkhut + +lokalise: + display_name: Lokalise + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://app.lokalise.com/oauth2/auth + token_url: https://app.lokalise.com/oauth2/token + body_format: json + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + disable_pkce: true + proxy: + base_url: https://api.lokalise.com/api2 + docs: https://nango.dev/docs/api-integrations/lokalise + setup_guide_url: https://nango.dev/docs/api-integrations/lokalise/how-to-register-your-own-lokalise-oauth-app + +loom-scim: + display_name: Loom (SCIM) + categories: + - other + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.domain}/scim + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /Users + docs: https://nango.dev/docs/integrations/all/loom-scim + docs_connect: https://nango.dev/docs/integrations/all/loom-scim/connect + connection_config: + domain: + type: string + title: Loom SCIM Bridge URL + description: The domain for your Loom SCIM Bridge + example: scim.example.com + pattern: '^[a-zA-Z0-9.-]+$' + prefix: https:// + doc_section: '#step-4-get-your-scim-bridge-url' + credentials: + apiKey: + type: string + title: SCIM API Key + description: Your Loom SCIM API Key + secret: true + doc_section: '#step-3-retrieve-your-loom-scim-api-key' + +loops-so: + display_name: Loops.so + categories: + - marketing + - communication + auth_mode: API_KEY + proxy: + base_url: https://app.loops.so/api + headers: + accept: application/json + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/api-key + docs: https://nango.dev/docs/integrations/all/loops-so + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Loops.so account + pattern: '^[a-f0-9]{32}$' + example: d2d561f5ff80136f69b4b5a31b9fb3c9 + +loop-returns: + display_name: Loop Returns + categories: + - e-commerce + auth_mode: API_KEY + proxy: + headers: + x-authorization: ${apiKey} + base_url: https://api.loopreturns.com/api + docs: https://nango.dev/docs/integrations/all/loop-returns + docs_connect: https://nango.dev/docs/integrations/all/loop-returns/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Loop Returns account + doc_section: '#step-1-generating-your-api-key' + +looker: + display_name: Looker + categories: + - analytics + auth_mode: TWO_STEP + token_url: https://${connectionConfig.hostname}/api/4.0/login + body_format: form + token_params: + client_id: ${credentials.clientId} + client_secret: ${credentials.clientSecret} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://${connectionConfig.hostname}/api + docs: https://nango.dev/docs/api-integrations/looker + docs_connect: https://nango.dev/docs/api-integrations/looker/connect + connection_config: + hostname: + type: string + title: Looker Instance Hostname + description: Your Looker instance hostname + prefix: https:// + example: mycompany.looker.com + order: 1 + pattern: '^[a-zA-Z0-9.-]+(:[0-9]+)?$' + doc_section: '#step-1-finding-your-looker-hostname' + credentials: + clientId: + type: string + title: Client ID + description: Your Looker Client ID + doc_section: '#step-2-obtaining-your-client-credentials' + clientSecret: + type: string + title: Client Secret + description: Your Looker Client Secret + secret: true + doc_section: '#step-2-obtaining-your-client-credentials' + +looker-oauth: + display_name: Looker (OAuth) + categories: + - analytics + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.hostname}/auth + token_url: https://${connectionConfig.apiHostname}/api/token + authorization_params: + response_type: code + default_scopes: + - cors_api + body_format: json + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.apiHostname}/api + docs: https://nango.dev/docs/api-integrations/looker-oauth + setup_guide_url: https://nango.dev/docs/api-integrations/looker-oauth/how-to-register-your-own-looker-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/looker-oauth/connect + connection_config: + hostname: + type: string + title: Looker UI Hostname + description: Your Looker instance UI hostname. + format: hostname + prefix: https:// + example: mycompany.looker.com + order: 1 + doc_section: '#step-1-finding-your-looker-ui-hostname' + apiHostname: + type: string + title: Looker API Hostname + description: Your Looker API hostname including port. + pattern: '^[a-zA-Z0-9.-]+(:[0-9]+)?$' + prefix: https:// + example: mycompany.looker.com:19999 + order: 2 + doc_section: '#step-2-finding-your-looker-api-hostname' + +lucid-scim: + display_name: Lucid (SCIM) + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://users.lucid.app/scim + headers: + authorization: Bearer ${apiKey} + accept: application/json + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/Users + docs: https://nango.dev/docs/integrations/all/lucid-scim + docs_connect: https://nango.dev/docs/integrations/all/lucid-scim/connect + credentials: + apiKey: + type: string + title: API Key + description: The SCIM API key generated from the Lucid admin panel + doc_section: '#step-1-generate-the-bearer-token' + +luma: + display_name: Luma + categories: + - productivity + - ticketing + auth_mode: API_KEY + proxy: + headers: + x-luma-api-key: ${apiKey} + base_url: https://api.lu.ma + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /public/v1/user/get-self + docs: https://nango.dev/docs/integrations/all/luma + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Luma account + +lumos: + display_name: Lumos + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.lumos.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/api-integrations/lumos + docs_connect: https://nango.dev/docs/api-integrations/lumos/connect + credentials: + apiKey: + type: string + title: API Token + description: The API token to your Lumos account + example: 'lsk_example_1234' + doc_section: '#step-1-creating-your-api-token' + +listmonk: + display_name: Listmonk + categories: + - marketing + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.domain}/api + headers: + content-type: application/json + retry: + after: + - 'retry-after' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /lists + docs: https://nango.dev/docs/integrations/all/listmonk + connection_config: + domain: + type: string + title: Domain + description: The domain of your Listmonk account + format: hostname + prefix: https:// + credentials: + username: + type: string + title: API User + description: The API user to your Listmonk account + password: + type: string + title: Token + description: The token to your Listmonk account + secret: true + +listrak: + display_name: Listrak + categories: + - marketing + auth_mode: OAUTH2_CC + token_url: https://auth.listrak.com/oauth2/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.listrak.com/email + docs: https://nango.dev/docs/api-integrations/listrak + docs_connect: https://nango.dev/docs/api-integrations/listrak/connect + credentials: + client_id: + type: string + title: Client ID + description: Your Listrak API Client ID + doc_section: '#step-1-create-api-credentials' + client_secret: + type: string + title: Client Secret + description: Your Listrak API Client Secret + secret: true + doc_section: '#step-1-create-api-credentials' + +lob: + display_name: Lob + categories: + - marketing + auth_mode: BASIC + proxy: + base_url: https://api.lob.com + verification: + method: GET + endpoints: + - /v1/addresses + docs: https://nango.dev/docs/api-integrations/lob + docs_connect: https://nango.dev/docs/api-integrations/lob/connect + credentials: + username: + type: string + title: Secret API Key + description: Your Lob Secret API Key. + secret: true + example: 'live_0dc8d***************************5b0cc' + pattern: '^(test|live)_[a-f0-9]{35}$' + doc_section: '#step-1-getting-your-secret-api-key' + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +make: + display_name: Make + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.environmentUrl}/api/v2 + headers: + authorization: Token ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /users/me + docs: https://nango.dev/docs/integrations/all/make + docs_connect: https://nango.dev/docs/integrations/all/make/connect + connection_config: + environmentUrl: + type: string + title: Domain + description: The domain of your Make account + format: hostname + prefix: https:// + doc_section: '#step-2-finding-your-domain' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Make account + doc_section: '#step-1-generating-an-api-key' + +mailgun: + display_name: Mailgun + categories: + - marketing + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.region}.mailgun.net + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v4/domains + docs: https://nango.dev/docs/integrations/all/mailgun + docs_connect: https://nango.dev/docs/integrations/all/mailgun/connect + connection_config: + region: + type: string + title: Region + description: The region of your Mailgun account. + enum: + - api + - api.eu + doc_section: '#step-1-finding-your-mailgun-region' + +mailchimp: + display_name: Mailchimp + categories: + - marketing + - surveys + auth_mode: OAUTH2 + authorization_url: https://login.mailchimp.com/oauth2/authorize + token_url: https://login.mailchimp.com/oauth2/token + authorization_params: + response_type: code + proxy: + base_url: https://${connectionConfig.dc}.api.mailchimp.com + docs: https://nango.dev/docs/integrations/all/mailchimp + post_connection_script: mailchimpPostConnection + connection_config: + dc: + type: string + title: Data Center + description: The data center for your account + pattern: '^[a-z]+\d*$' + example: us6 + automated: true + +mailjet: + display_name: Mailjet + categories: + - marketing + auth_mode: BASIC + proxy: + base_url: https://api.mailjet.com + verification: + method: GET + endpoints: + - /v3/REST/myprofile + docs: https://nango.dev/docs/api-integrations/mailjet + docs_connect: https://nango.dev/docs/api-integrations/mailjet/connect + credentials: + username: + type: string + title: API Key + description: Your Mailjet API Key. + secret: true + pattern: '^[a-f0-9]{32}$' + example: 'a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6' + doc_section: '#step-1-getting-your-credentials' + password: + type: string + title: Secret Key + description: Your Mailjet Secret Key. + secret: true + pattern: '^[a-f0-9]{32}$' + example: 'f6e5d4c3b2a1f0e9d8c7b6a5f4e3d2c1' + doc_section: '#step-1-getting-your-credentials' + +mcp-generic: + display_name: MCP Server OAuth2 (Generic) + categories: + - mcp + auth_mode: MCP_OAUTH2_GENERIC + connection_config: + mcp_server_url: + type: string + title: MCP Server URL + description: The base URL of your MCP server + example: https://mcp.notion.com/mcp + pattern: '^https://[a-zA-Z0-9.-]+(?:\:[0-9]+)?(?:/.*)?$' + docs: https://nango.dev/docs/integrations/all/mcp-generic + +# Untested configuration. Please reach out if you have a test account that we can use to test it. +manatal: + display_name: Manatal + auth_mode: API_KEY + categories: + - crm + - hr + - ats + proxy: + base_url: https://api.manatal.com/open/v3 + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /users + headers: + authorization: Token ${apiKey} + paginate: + type: link + limit_name_in_request: page_size + link_path_in_response_body: next + response_path: results + docs: https://nango.dev/docs/integrations/all/manatal + docs_connect: https://nango.dev/docs/integrations/all/manatal/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Manatal account + doc_section: '#step-2-generate-an-api-key' + +marketo: + display_name: Marketo + categories: + - marketing + auth_mode: OAUTH2_CC + proxy: + base_url: https://${connectionConfig.endpointURL} + token_url: https://${connectionConfig.identityURL}/identity/oauth/token + token_params: + grant_type: client_credentials + docs: https://nango.dev/docs/integrations/all/marketo + docs_connect: https://nango.dev/docs/integrations/all/marketo/connect + connection_config: + endpointURL: + type: string + title: Domain + description: The domain of your Marketo account + format: hostname + example: xxx.mktorest.com + prefix: https:// + suffix: / + order: 1 + doc_section: '#step-3-find-your-domain-and-identity-url' + identityURL: + type: string + title: Identity URL + description: The identity URL of your Marketo account + format: hostname + prefix: https:// + example: xxx.mktorest.com + suffix: /identity/oauth/token + order: 2 + doc_section: '#step-3-find-your-domain-and-identity-url' + +mattermost: + display_name: Mattermost + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.hostname}/api + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'x-ratelimit-reset' + verification: + method: GET + endpoints: + - /v4/users/me + docs: https://nango.dev/docs/api-integrations/mattermost + docs_connect: https://nango.dev/docs/api-integrations/mattermost/connect + connection_config: + hostname: + type: string + title: Server URL + description: The hostname of your Mattermost server. + example: mattermost.example.com + pattern: '^[a-zA-Z0-9.-]+(?::[0-9]+)?$' + prefix: https:// + order: 1 + doc_section: '#step-1-find-your-mattermost-server-url' + credentials: + apiKey: + type: string + title: Personal Access Token + description: Your Mattermost personal access token. + example: 'hx3mq8n0vy6***************' + pattern: '^[a-z0-9]+$' + doc_section: '#step-2-generate-a-personal-access-token' + +malwarebytes: + display_name: Malwarebytes + categories: + - other + auth_mode: OAUTH2_CC + token_url: https://api.malwarebytes.com/oauth2/token + token_request_auth_method: basic + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.malwarebytes.com + headers: + accountid: ${connectionConfig.accountId} + connection_config: + accountId: + type: string + title: Account Id + description: Your Nebula account id + pattern: '[\da-fA-F]{8}-?[\da-fA-F]{4}-?[\da-fA-F]{4}-?[\da-fA-F]{4}-?[\da-fA-F]{12}$' + example: 9256034b-7967-4253-a5d9-260663e4fa4f + order: 1 + doc_section: '#step-1-finding-your-account-id' + + docs: https://nango.dev/docs/integrations/all/malwarebytes + docs_connect: https://nango.dev/docs/integrations/all/malwarebytes/connect + +medallia: + display_name: Medallia + categories: + - crm + - support + - surveys + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.reportingInstance}/oauth/${connectionConfig.tenantName}/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + retry: + after: + - 'x-ratelimit-reset' + base_url: https://${connectionConfig.apiHostUrl} || https://${connectionConfig.gatewayUrl}.apis.medallia.com + docs: https://nango.dev/docs/integrations/all/medallia + docs_connect: https://nango.dev/docs/integrations/all/medallia/connect + connection_config: + reportingInstance: + type: string + title: Domain + description: The base domain for your Medallia instance + format: hostname + prefix: https:// + suffix: /oauth + example: instance.medallia.com + order: 1 + doc_section: '#step-2-identifying-your-domain' + tenantName: + type: string + title: Tenant Name + description: The tenant name of your Medallia account + order: 2 + example: acme + doc_section: '#step-3-identifying-your-tenant-name' + apiHostUrl: + type: string + title: API Host URL + description: The base API endpoint (gateway URL) for your Medallia account + format: hostname + prefix: https:// + order: 3 + example: fo-acme.apis.medallia.eu + doc_section: '#step-4-identifying-your-api-host-url' + gatewayUrl: + type: string + title: '' + description: '' + default_value: '' + hidden: true # deprecating this in favor of apiHostUrl + +metabase: + display_name: Metabase + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.hostname} || https://${connectionConfig.domain}.com + headers: + x-api-key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/database + docs: https://nango.dev/docs/api-integrations/metabase + docs_connect: https://nango.dev/docs/api-integrations/metabase/connect + connection_config: + hostname: + type: string + title: Hostname + description: The Metabase hostname + example: acme.metabaseapp.com + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-metabase-hostname' + domain: + type: string + title: '' + description: '' + default_value: '' + hidden: true # deprecating this in favor of hostname + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Metabase account + example: mb_**************************kR9mZw= + pattern: '^mb_[A-Za-z0-9+/]+=*$' + doc_section: '#step-2-generating-an-api-key' + +mercury: + display_name: Mercury + categories: + - accounting + auth_mode: OAUTH2 + scope_separator: ' ' + authorization_method: header + authorization_url: https://${connectionConfig.oauth_hostname}/oauth2/auth || https://oauth2.mercury.com/oauth2/auth + token_url: https://${connectionConfig.oauth_hostname}/oauth2/token || https://oauth2.mercury.com/oauth2/token + default_scopes: + - offline_access + proxy: + base_url: https://${connectionConfig.hostname} || https://api.mercury.com + docs: https://nango.dev/docs/api-integrations/mercury + docs_connect: https://nango.dev/docs/api-integrations/mercury/connect + setup_guide_url: https://nango.dev/docs/api-integrations/mercury/how-to-register-your-own-mercury-oauth-app + connection_config: + oauth_hostname: + type: string + title: OAuth Hostname + description: Your Mercury OAuth hostname. + optional: true + enum: + - oauth2.mercury.com + - oauth2-sandbox.mercury.com + hostname: + type: string + title: API Hostname + description: Your Mercury API hostname. + optional: true + enum: + - api.mercury.com + - api-sandbox.mercury.com + +meta-marketing-api: + display_name: Meta Marketing API + categories: + - marketing + alias: facebook + docs: https://nango.dev/docs/api-integrations/meta-marketing-api + setup_guide_url: https://nango.dev/docs/api-integrations/meta-marketing-api/how-to-register-your-own-meta-marketing-api-oauth-app + +microsoft: + display_name: Microsoft + auth_mode: OAUTH2 + categories: + - communication + - dev-tools + - productivity + authorization_url: https://login.microsoftonline.com/common/oauth2/v2.0/authorize + token_url: https://login.microsoftonline.com/common/oauth2/v2.0/token + disable_pkce: true + default_scopes: + - offline_access + - .default + authorization_params: + response_type: code + response_mode: query + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://graph.microsoft.com + retry: + after: + - 'retry-after' + decompress: true + docs: https://nango.dev/docs/api-integrations/microsoft + setup_guide_url: https://nango.dev/docs/api-integrations/microsoft/how-to-register-your-own-microsoft-api-oauth-app + +microsoft-admin: + display_name: Microsoft (Admin) + auth_mode: OAUTH2 + categories: + - communication + - dev-tools + - productivity + - iam + authorization_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/adminconsent + token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token + authorization_code_param_in_callback: tenant + proxy: + base_url: https://graph.microsoft.com + retry: + after: + - 'retry-after' + decompress: true + docs: https://nango.dev/docs/integrations/all/microsoft-admin + docs_connect: https://nango.dev/docs/integrations/all/microsoft-admin/connect + connection_config: + tenantId: + type: string + title: Tenant ID + description: The unique identifier for your organization that uses Microsoft services + format: uuid + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-1-finding-your-tenant-id' + order: 1 + +microsoft-teams-bot: + display_name: Microsoft Teams Bot + auth_mode: OAUTH2 + categories: + - communication + authorization_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/authorize + token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token + disable_pkce: true + default_scopes: + - offline_access + - .default + authorization_params: + response_type: code + response_mode: query + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://smba.trafficmanager.net/teams + connection_config: + botHostTenantId: ${connectionConfig.botHostTenantId} + webhook_routing_script: microsoftTeamsWebhookRouting + post_connection_script: microsoftTeamsBotPostConnection + docs: https://nango.dev/docs/api-integrations/microsoft-teams-bot + docs_connect: https://nango.dev/docs/api-integrations/microsoft-teams-bot/connect + connection_config: + tenantId: + type: string + title: Tenant ID + description: The unique identifier for your Microsoft Entra ID tenant. + format: uuid + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-1-finding-your-tenant-id' + order: 1 + botHostTenantId: + type: string + title: '' + description: '' + automated: true + +microsoft-excel: + display_name: Microsoft Excel + categories: + - productivity + - analytics + alias: microsoft + docs: https://nango.dev/docs/integrations/all/microsoft-excel + +microsoft-oauth2-cc: + display_name: Microsoft (Client Credentials) + auth_mode: OAUTH2_CC + categories: + - communication + - dev-tools + - productivity + token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://graph.microsoft.com + webhook_routing_script: microsoftClientCredentialsWebhookRouting + webhook_user_defined_secret: true + webhook_allowed_query_params: + - validationToken + docs: https://nango.dev/docs/api-integrations/microsoft-oauth2-cc + docs_connect: https://nango.dev/docs/api-integrations/microsoft-oauth2-cc/connect + connection_config: + tenantId: + type: string + title: Tenant ID + description: The unique identifier for your organization that uses Microsoft services + format: uuid + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-1-finding-your-tenant-id' + order: 1 + +microsoft-oauth2-cc-cert: + display_name: Microsoft (Client Credentials - Certificate) + auth_mode: TWO_STEP + categories: + - communication + - dev-tools + - productivity + body_format: form + token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token + token_params: + grant_type: client_credentials + client_id: ${credentials.clientId} + scope: ${connectionConfig.oauth_scopes} + client_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer + client_assertion: ${credentials.assertion} + token_headers: + content-type: application/x-www-form-urlencoded + assertion: + type: jwt + key: ${credentials.privateKey} + lifetimeInSeconds: 3600 + header: + alg: PS256 + x5t#S256: ${credentials.certificateThumbprint} + payload: + iss: ${credentials.clientId} + sub: ${credentials.clientId} + aud: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token + jti: ${random} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://graph.microsoft.com + docs: https://nango.dev/docs/api-integrations/microsoft-oauth2-cc-cert + docs_connect: https://nango.dev/docs/api-integrations/microsoft-oauth2-cc-cert/connect + connection_config: + tenantId: + type: string + title: Tenant ID + description: The unique identifier for your organization that uses Microsoft services. + format: uuid + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-1-finding-your-tenant-id' + order: 1 + oauth_scopes: + type: string + title: Scope + description: The resource scope to request access for. + example: https://graph.microsoft.com/.default + doc_section: '#step-5-granting-api-permissions' + order: 2 + credentials: + clientId: + type: string + title: Client ID + description: The application (client) ID assigned to your app in Azure. + format: uuid + example: 11112222-bbbb-3333-cccc-4444dddd5555 + doc_section: '#step-2-registering-your-application-and-finding-your-client-id' + privateKey: + type: string + title: Private Key + description: The RSA private key (PEM format) matching the certificate uploaded to your Azure app registration. + example: "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n-----END PRIVATE KEY-----" + secret: true + doc_section: '#step-3-generating-a-certificate-and-uploading-it-to-azure' + certificateThumbprint: + type: string + title: Certificate Thumbprint (x5t#S256) + description: The base64url-encoded SHA-256 thumbprint of your certificate. + example: rCnkMH5GKJI03tRpdjBh8OG2U8I + doc_section: '#step-4-computing-the-certificate-thumbprint-x5t' + assertion: + type: string + title: '' + description: '' + automated: true + +microsoft-intune: + display_name: Microsoft Intune + categories: + - dev-tools + alias: microsoft-oauth2-cc + docs: https://nango.dev/docs/api-integrations/microsoft-intune + docs_connect: https://nango.dev/docs/api-integrations/microsoft-intune/connect + +microsoft-planner: + display_name: Microsoft Planner + categories: + - productivity + - analytics + alias: microsoft + docs: https://nango.dev/docs/api-integrations/microsoft-planner + setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-planner/how-to-register-your-own-microsoft-planner-api-oauth-app + +microsoft-powerpoint: + display_name: Microsoft PowerPoint + categories: + - productivity + alias: microsoft + docs: https://nango.dev/docs/api-integrations/microsoft-powerpoint + setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-powerpoint/how-to-register-your-own-microsoft-powerpoint-api-oauth-app + +microsoft-teams: + display_name: Microsoft Teams + categories: + - productivity + - video + - popular + alias: microsoft + webhook_routing_script: microsoftTeamsWebhookRouting + post_connection_script: microsoftTeamsPostConnection + docs: https://nango.dev/docs/api-integrations/microsoft-teams + setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-teams/how-to-register-your-own-microsoft-teams-api-oauth-app + +microsoft-people: + display_name: Microsoft People + categories: + - productivity + alias: microsoft + docs: https://nango.dev/docs/api-integrations/microsoft-people + setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-people/how-to-register-your-own-microsoft-people-api-oauth-app + +microsoft-word: + display_name: Microsoft Word + categories: + - productivity + alias: microsoft + docs: https://nango.dev/docs/api-integrations/microsoft-word + setup_guide_url: https://nango.dev/docs/api-integrations/microsoft-word/how-to-register-your-own-microsoft-word-api-oauth-app + +microsoft-tenant-specific: + display_name: Microsoft (Tenant) + categories: + - erp + auth_mode: OAUTH2 + authorization_url: https://login.microsoftonline.com/${connectionConfig.tenant}/oauth2/v2.0/authorize + token_url: https://login.microsoftonline.com/${connectionConfig.tenant}/oauth2/v2.0/token + disable_pkce: true + default_scopes: + - offline_access + authorization_params: + response_type: code + response_mode: query + prompt: consent + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://graph.microsoft.com + docs: https://nango.dev/docs/integrations/all/microsoft-tenant-specific + connection_config: + tenant: + type: string + title: Tenant + description: The tenant of your Microsoft account + +microsoft-business-central: + display_name: Microsoft Business Central + categories: + - erp + auth_mode: OAUTH2_CC + token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.businesscentral.dynamics.com/v2.0/${connectionConfig.tenantId}/${connectionConfig.environmentName} + docs: https://nango.dev/docs/integrations/all/microsoft-business-central + docs_connect: https://nango.dev/docs/integrations/all/microsoft-business-central/connect + connection_config: + tenantId: + type: string + title: Tenant ID + description: The unique identifier for your organization that uses Microsoft services + format: uuid + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-1-finding-your-tenant-id' + order: 1 + environmentName: + type: string + title: Enrivonment Name + description: The environment name to your organization + example: production + pattern: '^[a-zA-Z0-9-_]+$' + doc_section: '#step-2-finding-your-enrivonment-name' + order: 2 + +microsoft-ads: + display_name: Microsoft Ads + alias: microsoft + categories: + - marketing + default_scopes: + - https://ads.microsoft.com/msads.manage + - offline_access + proxy: + base_url: https://clientcenter.api.bingads.microsoft.com/Api + refresh_params: + grant_type: refresh_token + scope: https://ads.microsoft.com/msads.manage + docs: https://nango.dev/docs/integrations/all/microsoft-ads + +microsoft-entra-id: + display_name: Microsoft Entra ID + categories: + - iam + alias: microsoft + docs: https://nango.dev/docs/integrations/all/microsoft-entra-id + +microsoft-power-bi: + display_name: Microsoft Power BI + categories: + - productivity + alias: microsoft + proxy: + base_url: https://api.powerbi.com + docs: https://nango.dev/docs/integrations/all/microsoft-power-bi + +maximizer: + display_name: Maximizer (Cloud) + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.region}.maximizercrmlive.com/oauth2/${connectionConfig.company_alias}/authorize + token_url: https://${connectionConfig.region}.maximizercrmlive.com/oauth2/${connectionConfig.company_alias}/token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.region}.maximizercrmlive.com + docs: https://nango.dev/docs/api-integrations/maximizer + setup_guide_url: https://nango.dev/docs/api-integrations/maximizer/how-to-register-your-own-maximizer-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/maximizer/connect + connection_config: + region: + type: string + title: Region + description: Region-specific subdomain. + enum: + - caw + - ukw + company_alias: + type: string + title: Company Alias + description: The company alias of your Maximizer cloud account. + example: acme + +maximizer-on-premise: + display_name: Maximizer (On-Premise) + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.hostname}/MaximizerWebAuthentication/OAuth2/Authorize + token_url: https://${connectionConfig.hostname}/MaximizerWebAuthentication/OAuth2/Token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.hostname} + docs: https://nango.dev/docs/api-integrations/maximizer-on-premise + setup_guide_url: https://nango.dev/docs/api-integrations/maximizer-on-premise/how-to-register-your-own-maximizer-on-premise-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/maximizer-on-premise/connect + connection_config: + hostname: + type: string + title: Hostname + description: The hostname of your Maximizer on premise instance. + example: maximizer.mycompany.com + format: hostname + +maxio: + display_name: Maxio + categories: + - payment + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.hostname} + verification: + method: GET + endpoints: + - /subscriptions.json + docs: https://nango.dev/docs/api-integrations/maxio + docs_connect: https://nango.dev/docs/api-integrations/maxio/connect + credentials: + username: + type: string + title: API Key + description: Your Maxio API Key. + doc_section: '#step-2-retrieving-your-api-key' + password: + type: string + title: '' + description: '' + default_value: 'X' + hidden: true + connection_config: + hostname: + type: string + title: Hostname + description: Your Maxio site hostname. + pattern: '^[a-zA-Z0-9-]+\.(chargify\.com|ebilling\.maxio\.com)$' + example: acme.chargify.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-hostname' + +mindbody: + display_name: Mindbody + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.mindbodyonline.com + headers: + api-key: ${apiKey} + siteid: ${connectionConfig.siteId} + authorization: ${connectionConfig.staffUserToken} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /public/v6/site/locations + docs: https://nango.dev/docs/integrations/all/mindbody + docs_connect: https://nango.dev/docs/integrations/all/mindbody/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Mindbody account + pattern: '^[a-f0-9]{32}$' + example: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4 + doc_section: '#step-2-generate-api-key' + connection_config: + siteId: + type: string + title: Site ID + description: The site ID for your Mindbody account + pattern: '^\d+$' + example: '-99' + doc_section: '#step-3-obtain-site-id-and-staff-user-token' + staffUserToken: + type: string + title: Staff User Token + description: The staff user token for your Mindbody account + pattern: '^[a-f0-9]{32}$' + example: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4 + doc_section: '#step-3-obtain-site-id-and-staff-user-token' + +minimax: + display_name: MiniMax + categories: + - productivity + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.minimaxi.chat + headers: + authorization: Bearer ${apiKey} + group-id: ${connectionConfig.groupId} + query: + GroupId: ${connectionConfig.groupId} + docs: https://nango.dev/docs/integrations/all/minimax + docs_connect: https://nango.dev/docs/integrations/all/minimax/connect + connection_config: + groupId: + type: string + title: Group ID + description: The unique identifier for your MiniMax account, linked to your account's privileges. + example: '1234567890123456789' + pattern: '^\d{19}$' + doc_section: '#step-1-retrieve-your-group-id' + credentials: + apiKey: + type: string + title: API Key + description: The API key for securely accessing the MiniMax API. + doc_section: '#step-2-generate-an-api-key' + +mip-cloud: + display_name: MIP Cloud + categories: + - accounting + auth_mode: TWO_STEP + proxy: + base_url: https://api.mip.com + headers: + authorization-token: ${accessToken} + token_url: https://${connectionConfig.domain}/api/v1/sso/mipadv/login + token_params: + username: ${credentials.username} + password: ${credentials.password} + org: ${credentials.org} + token_headers: + content-type: application/json + token_response: + token: AccessToken + docs: https://nango.dev/docs/integrations/all/mip-cloud + docs_connect: https://nango.dev/docs/integrations/all/mip-cloud/connect + credentials: + username: + type: string + title: ID + description: Your Login ID for MIP Fund Accounting + password: + type: string + title: Password + description: Your Password for MIP Fund Accounting. + secret: true + org: + type: string + title: ORG + description: The MIP Fund Accounting database you will be using. + optional: true + example: ZQXP_98421_NTO + connection_config: + domain: + type: string + title: HOST REST Service URL + description: The rest service URL for the cloud-based API service + prefix: https:// + suffix: /api/v1/sso/mipadv/login + format: hostname + +mip-on-premise: + display_name: MIP On Premise + categories: + - accounting + auth_mode: TWO_STEP + proxy: + base_url: https://api.mip.com + headers: + authorization-token: ${accessToken} + token_url: https://${connectionConfig.domain}/api/security/login + token_params: + login: ${credentials.login} + password: ${credentials.password} + org: ${credentials.org} + token_headers: + content-type: application/json + token_response: + token: AccessToken + docs: https://nango.dev/docs/integrations/all/mip-on-premise + docs_connect: https://nango.dev/docs/integrations/all/mip-on-premise/connect + credentials: + login: + type: string + title: ID + description: Your Login ID for MIP Fund Accounting + password: + type: string + title: Password + description: Your Password for MIP Fund Accounting. + secret: true + org: + type: string + title: ORG + description: The MIP Fund Accounting database you will be using. + connection_config: + domain: + type: string + title: HOST REST Service URL + description: The URL of your locally installed REST API server. + prefix: https:// + suffix: /api/security/login + format: hostname + +mixpanel: + display_name: Mixpanel + categories: + - analytics + auth_mode: BASIC + proxy: + base_url: https://mixpanel.com + credentials: + # https://developer.mixpanel.com/reference/service-accounts + username: + type: string + title: Service Account Username + description: Mixpanel Service Account Username + doc_section: '#step-1-finding-mixpanel-api-key' + password: + type: string + title: Service Account Secret + description: Mixpanel Service Account Secret + doc_section: '#step-1-finding-mixpanel-api-key' + docs: https://nango.dev/docs/integrations/all/mixpanel + docs_connect: https://nango.dev/docs/integrations/all/mixpanel/connect + +mimecast: + display_name: Mimecast + categories: + - communication + auth_mode: OAUTH2_CC + token_url: https://api.services.mimecast.com/oauth/token + body_format: form + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.services.mimecast.com + docs: https://nango.dev/docs/integrations/all/mimecast + docs_connect: https://nango.dev/docs/integrations/all/mimecast/connect + +miro: + display_name: Miro + categories: + - design + - productivity + auth_mode: OAUTH2 + authorization_url: https://miro.com/oauth/authorize + token_url: https://api.miro.com/v1/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.miro.com + docs: https://nango.dev/docs/integrations/all/miro + +miro-scim: + display_name: Miro (SCIM API) + categories: + - design + - productivity + auth_mode: API_KEY + proxy: + base_url: https://miro.com/api + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/scim/Users + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/miro-scim + docs_connect: https://nango.dev/docs/integrations/all/miro-scim/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Miro scim account + doc_section: '#step-1-finding-miro-api-key' +missive: + display_name: Missive + categories: + - productivity + auth_mode: API_KEY + proxy: + headers: + api_token: ${apiKey} + base_url: https://missiveapp.com + docs: https://nango.dev/docs/integrations/all/missive + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Missive account + +juniper-mist: + display_name: Juniper Mist + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.mist.com + headers: + authorization: Token ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v1/self + docs: https://nango.dev/docs/api-integrations/juniper-mist + docs_connect: https://nango.dev/docs/api-integrations/juniper-mist/connect + connection_config: + subdomain: + type: string + title: API Subdomain + description: The API subdomain for your Juniper Mist region + example: api + pattern: '^api(\.[a-z0-9]+)*$' + doc_section: '#step-1-finding-your-api-subdomain' + credentials: + apiKey: + type: string + title: API Token + description: Your Juniper Mist API token + doc_section: '#step-2-generating-your-api-token' + example: 3n69xDYMlT36fulLwIq7PDaDopc5W0b***************************************************************** + pattern: '^[A-Za-z0-9]{96}$' + +monday: + display_name: Monday + categories: + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://auth.monday.com/oauth2/authorize + token_url: https://auth.monday.com/oauth2/token + disable_pkce: true + authorization_params: + force_install_if_needed: true + authorization_url_replacements: + response_type: '' + proxy: + base_url: https://api.monday.com + docs: https://nango.dev/docs/api-integrations/monday + setup_guide_url: https://nango.dev/docs/api-integrations/monday/how-to-register-your-own-monday-oauth-app + +momentum-io: + display_name: Momentum.io + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.momentum.io + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v1/meetings?from=1970-01-01T00:00:00.000Z&pageSize=1 + docs: https://nango.dev/docs/integrations/all/momentum-io + docs_connect: https://nango.dev/docs/integrations/all/momentum-io/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Make account + doc_section: '#step-1-generating-an-api-key' + +modjo-ai: + display_name: Modjo AI + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.modjo.ai + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v1/users?page=1&perPage=1 + docs: https://nango.dev/docs/api-integrations/modjo-ai + docs_connect: https://nango.dev/docs/api-integrations/modjo-ai/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Modjo AI API key. + doc_section: '#step-1-generate-your-api-key' + +mollie: + display_name: Mollie + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://my.mollie.com/oauth2/authorize + token_url: https://api.mollie.com/oauth2/tokens + scope_separator: ' ' + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.mollie.com + docs: https://nango.dev/docs/api-integrations/mollie + setup_guide_url: https://nango.dev/docs/api-integrations/mollie/how-to-register-your-own-mollie-oauth-app +modmed: + display_name: ModMed + categories: + - other + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.environment}/firm/${connectionConfig.firmUrlPrefix}/ema/ws/oauth2/grant + token_params: + grant_type: password + username: ${credentials.username} + password: ${credentials.password} + token_headers: + x-api-key: ${credentials.apiKey} + accept: application/json + content-type: application/x-www-form-urlencoded + proxy: + base_url: https://${connectionConfig.environment}/firm/${connectionConfig.firmUrlPrefix} + headers: + accept: application/fhir+json + x-api-key: ${credentials.apiKey} + token_response: + token: access_token + docs: https://nango.dev/docs/api-integrations/modmed + docs_connect: https://nango.dev/docs/api-integrations/modmed/connect + connection_config: + environment: + type: string + title: Environment + description: The ModMed API environment. + enum: + - stage.ema-api.com/ema-dev + - stage.ema-api.com/ema-training + - stage.ema-api.com/ema-prod + - mmapi.ema-api.com/ema-dev + - mmapi.ema-api.com/ema-training + - mmapi.ema-api.com/ema-prod + doc_section: '#step-3-selecting-your-environment' + order: 1 + firmUrlPrefix: + type: string + title: Firm URL Prefix + description: The firm URL prefix for your practice + example: emapmsandbox01 + doc_section: '#step-2-finding-your-firm-url-prefix' + order: 2 + credentials: + username: + type: string + title: Username + description: Your API username + example: fhir_QfLlo + doc_section: '#step-1-request-access-to-modmed-sandbox' + password: + type: string + title: Password + description: Your API password + secret: true + doc_section: '#step-1-request-access-to-modmed-sandbox' + apiKey: + type: string + title: API Key + description: Your API key (x-api-key) + secret: true + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-1-request-access-to-modmed-sandbox' + +mural: + display_name: Mural + categories: + - design + auth_mode: OAUTH2 + authorization_url: https://app.mural.co/api/public/v1/authorization/oauth2 + token_url: https://app.mural.co/api/public/v1/authorization/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://app.mural.co + docs: https://nango.dev/docs/integrations/all/mural + +nable-ncentral: + display_name: N-able N-central + categories: + - support + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.serverUrl}/api/auth/authenticate + token_headers: + authorization: Bearer ${credentials.userApiToken} + accept: application/json + token_response: + token: tokens.access.token + token_expiration: tokens.access.expirySeconds + token_expiration_strategy: expireIn + proxy: + base_url: https://${connectionConfig.serverUrl}/api + verification: + method: GET + endpoints: + - /auth/validate + docs: https://nango.dev/docs/api-integrations/nable-ncentral + docs_connect: https://nango.dev/docs/api-integrations/nable-ncentral/connect + connection_config: + serverUrl: + type: string + title: N-central server URL + description: Your N-central server hostname. + example: ncentral.example.com + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-1-find-your-n-central-server-url' + credentials: + userApiToken: + type: string + title: User-API token + description: Your N-central User-API token (JWT) + pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' + example: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJOX2NlbnRyYWwifQ.c2lnbmF0dXJl + secret: true + doc_section: '#step-2-generate-a-user-api-token' + +nationbuilder: + display_name: NationBuilder + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.accountId}.nationbuilder.com/oauth/authorize + token_url: https://${connectionConfig.accountId}.nationbuilder.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + default_scopes: + - default + docs: https://nango.dev/docs/integrations/all/nationbuilder + proxy: + base_url: https://${connectionConfig.accountId}.nationbuilder.com/api + connection_config: + accountId: + type: string + title: Account ID + description: The account ID of your NationBuilder account + +namely: + display_name: Namely + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.company}.namely.com/api/v1/oauth2/authorize + token_url: https://${connectionConfig.company}.namely.com/api/v1/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.company}.namely.com/api + docs: https://nango.dev/docs/integrations/all/namely + docs_connect: https://nango.dev/docs/integrations/all/namely/connect + connection_config: + company: + type: string + title: Company + description: The name of your Namely company + example: example + doc_section: '#step-1-finding-your-company-name' + +namely-pat: + display_name: Namely (PAT) + categories: + - hr + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://${connectionConfig.company}.namely.com/api + docs: https://nango.dev/docs/integrations/all/namely-pat + docs_connect: https://nango.dev/docs/integrations/all/namely-pat/connect + connection_config: + company: + type: string + title: Company Name + description: The name of your Namely company + example: example + order: 1 + doc_section: '#step-1-finding-your-company-name' + credentials: + apiKey: + type: string + title: Personal Access Token + description: The Personal Access Token for your Namely account + doc_section: '#step-2-generating-your-personal-access-token' + +nerdio: + display_name: Nerdio + categories: + - other + auth_mode: OAUTH2_CC + token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token + token_params: + grant_type: client_credentials + scope: ${connectionConfig.scope} + proxy: + base_url: https://${connectionConfig.hostname}/rest-api + docs: https://nango.dev/docs/api-integrations/nerdio + docs_connect: https://nango.dev/docs/api-integrations/nerdio/connect + connection_config: + hostname: + type: string + title: Nerdio Instance URL + description: The hostname of your Nerdio Manager instance + format: hostname + example: web-admin-portal-3e3a4zfp4peo4.azurewebsites.net + doc_section: '#step-1-finding-your-nerdio-instance-url' + order: 1 + tenantId: + type: string + title: Azure Tenant ID + description: Your Azure Active Directory Tenant ID + format: uuid + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-2-getting-your-azure-credentials' + order: 2 + scope: + type: string + title: API Scope + description: The Application ID URI scope + example: api://g0cb288e-ff16-1861-9393-50219a19453c/.default + doc_section: '#step-3-configuring-the-api-scope' + order: 3 + credentials: + client_id: + type: string + title: Client ID + description: The Application (client) ID from your Azure App Registration + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + format: uuid + doc_section: '#step-2-getting-your-azure-credentials' + client_secret: + type: string + title: Client Secret + description: The client secret from your Azure App Registration + secret: true + doc_section: '#step-2-getting-your-azure-credentials' + +netsuite: + display_name: NetSuite (OAuth) + categories: + - accounting + - erp + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.accountId}.app.netsuite.com/app/login/oauth2/authorize.nl + authorization_params: + prompt: consent + token_url: https://${connectionConfig.accountId}.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token + default_scopes: + - rest_webservices + proxy: + base_url: https://${connectionConfig.accountId}.suitetalk.api.netsuite.com/services/rest/record/v1 + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/netsuite + connection_config: + accountId: + type: string + title: Account ID + description: The account ID of your NetSuite account + pattern: '^[a-zA-Z0-9-_]+$' + example: tstdrv231585 + +netsuite-tba: + alias: netsuite + display_name: NetSuite (TBA) + auth_mode: TBA + categories: + - accounting + - erp + - popular + docs: https://nango.dev/docs/api-integrations/netsuite-tba + setup_guide_url: https://nango.dev/docs/api-integrations/netsuite-tba/how-to-set-up-netsuite-tba-with-nango + +netsuite-client-credentials: + alias: netsuite + display_name: NetSuite (Client Credentials) + categories: + - accounting + - erp + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.accountId}.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token + token_params: + grant_type: client_credentials + client_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer + client_assertion: ${credentials.assertion} + token_headers: + content-type: application/x-www-form-urlencoded + assertion: + type: jwt + key: ${assertionOption.privateKey} + lifetimeInSeconds: 3600 + header: + alg: RS256 + kid: ${credentials.certificateId} + payload: + iss: ${credentials.clientId} + aud: https://${connectionConfig.accountId}.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token + jti: ${random} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/api-integrations/netsuite-client-credentials + docs_connect: https://nango.dev/docs/api-integrations/netsuite-client-credentials/connect + credentials: + clientId: + type: string + title: Client ID + description: The Client ID from your NetSuite integration record. + example: 1c343a716c1d****************************976dde7d8e3e2 + certificateId: + type: string + title: Certificate ID + description: The ID of the certificate registered in your NetSuite integration. + example: HRril7Vwkk********************eWT2Fgks + assertion: + type: string + title: '' + description: '' + automated: true + connection_config: + accountId: + type: string + title: Account ID + description: Your NetSuite Account ID (e.g. 1234567 or 1234567_SB1 for sandbox). + example: '1234567' + assertion_option: + privateKey: + type: string + title: Private Key + description: The RSA private key (PEM format) used to sign the JWT assertion. + example: "-----BEGIN RSA PRIVATE KEY-----\nMIIEow...\n-----END RSA PRIVATE KEY-----" + +next-cloud-ocs: + display_name: Next Cloud OCS + categories: + - storage + - productivity + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.domain}/ocs/v1.php + headers: + 'ocs-apirequest': 'true' + docs: http://nango.dev/docs/integrations/all/next-cloud-ocs + docs_connect: https://nango.dev/docs/integrations/all/next-cloud-ocs/connect + connection_config: + domain: + type: string + title: Domain + description: The domain of your Next Cloud account + format: hostname + prefix: https:// + doc_section: '#step-1-locate-your-next-cloud-domain' + +nexthink: + display_name: Nexthink + categories: + - analytics + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.instance}-login.${connectionConfig.region}.nexthink.cloud/oauth2/default/v1/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + default_scopes: + - service:integration + proxy: + base_url: https://${connectionConfig.instance}.api.${connectionConfig.region}.nexthink.cloud + docs: https://nango.dev/docs/api-integrations/nexthink + docs_connect: https://nango.dev/docs/api-integrations/nexthink/connect + credentials: + client_id: + type: string + title: Client ID + description: Your Nexthink API Client ID. + doc_section: '#step-2-create-api-credentials' + client_secret: + type: string + title: Client Secret + description: Your Nexthink API Client Secret. + secret: true + doc_section: '#step-2-create-api-credentials' + connection_config: + instance: + type: string + title: Instance Name + description: The name of your Nexthink instance. + example: acme + order: 1 + doc_section: '#step-1-locate-your-instance-name-and-region' + region: + type: string + title: Region + description: 'Your Nexthink region' + example: eu + pattern: '^(us|eu|pac|meta)$' + order: 2 + doc_section: '#step-1-locate-your-instance-name-and-region' + +ninjaone-rmm: + display_name: NinjaOne RMM + categories: + - support + auth_mode: OAUTH2_CC + token_url: https://app.ninjarmm.com/ws/oauth/token + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://app.ninjarmm.com + credentials: + client_id: + type: string + title: Client ID + description: Your NinjaOne RMM OAuth Client ID + example: KTmhkNf1_dZZVPmIQTK_lH2DCNJ + pattern: '^[A-Za-z0-9_/+-]{10,}$' + doc_section: '#step-1-create-an-oauth-client-application' + client_secret: + type: string + title: Client Secret + description: Your NinjaOne RMM OAuth Client Secret + example: 'Ilfs4crKIU1t-5bde-2OMBsB9v3LGmfg82XJO7_q9TtgTnfNRmK' + pattern: '^[A-Za-z0-9_/+-]{10,}$' + secret: true + doc_section: '#step-2-copy-your-credentials' + docs: https://nango.dev/docs/integrations/all/ninjaone-rmm + docs_connect: https://nango.dev/docs/integrations/all/ninjaone-rmm/connect + +ninjaone-rmm-oauth2: + display_name: NinjaOne RMM (OAuth2) + categories: + - support + auth_mode: OAUTH2 + authorization_url: https://app.ninjarmm.com/ws/oauth/authorize + token_url: https://app.ninjarmm.com/ws/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + scope_separator: ' ' + default_scopes: + - offline_access + proxy: + base_url: https://app.ninjarmm.com + docs: https://nango.dev/docs/api-integrations/ninjaone-rmm-oauth2 + setup_guide_url: https://nango.dev/docs/api-integrations/ninjaone-rmm-oauth2/how-to-register-your-own-ninjaone-rmm-api-oauth-app + +ninjaone-saas-backup: + display_name: NinjaOne SaaS Backup + categories: + - storage + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.apiHost}/api + headers: + x-reseller-token: ${connectionConfig.resellerToken} + x-access-token: ${apiKey} + verification: + method: GET + endpoints: + - /accounts + docs: https://nango.dev/docs/api-integrations/ninjaone-saas-backup + docs_connect: https://nango.dev/docs/api-integrations/ninjaone-saas-backup/connect + connection_config: + apiHost: + type: string + title: API Host + description: The host from your NinjaOne SaaS Backup API URL. + example: dropsuite.us + pattern: '^(dropsuite\.com|dropsuite\.(us|uk|ca)|dropsuite-au\.com|[a-z0-9.-]+\.dropsuite\.com)$' + prefix: https:// + suffix: /api + order: 1 + doc_section: '#step-1-find-your-api-credentials' + resellerToken: + type: string + title: Reseller Token + description: The Reseller Token from NinjaOne SaaS Backup API Settings. + format: uuid + order: 2 + doc_section: '#step-1-find-your-api-credentials' + credentials: + apiKey: + type: string + title: Authentication Token + description: The Authentication Token from NinjaOne SaaS Backup API Settings. + format: uuid + secret: true + doc_section: '#step-1-find-your-api-credentials' + +nocrm: + display_name: nocrm.io + categories: + - crm + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.nocrm.io + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /api/v2/ping + docs: https://nango.dev/docs/api-integrations/nocrm + docs_connect: https://nango.dev/docs/api-integrations/nocrm/connect + credentials: + apiKey: + type: string + title: API Key + description: Your nocrm.io API key + pattern: ^[a-f0-9]{48}$ + example: 4b945b************************************4991 + doc_section: '#step-2-obtaining-your-api-key' + connection_config: + subdomain: + type: string + title: Account subdomain + description: Your nocrm.io account subdomain + example: acme + prefix: https:// + pattern: '^[a-z0-9-]+$' + suffix: .nocrm.io + order: 1 + doc_section: '#step-1-finding-your-subdomain' + +northbeam: + display_name: Northbeam + categories: + - analytics + - marketing + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.northbeam.io + headers: + authorization: ${apiKey} + data-client-id: ${connectionConfig.dataClientId} + verification: + method: GET + endpoints: + - /v1/exports/attribution-models + docs: https://nango.dev/docs/api-integrations/northbeam + docs_connect: https://nango.dev/docs/api-integrations/northbeam/connect + connection_config: + subdomain: + type: string + title: API Subdomain + description: Use api for production or api-uat for testing/development. + enum: + - api + - api-uat + order: 1 + doc_section: '#step-1-getting-authentication-credentials' + dataClientId: + type: string + title: Data Client ID + description: Your Northbeam Data Client ID (UUID). + format: uuid + example: '123e4567-e89b-12d3-a456-426614174000' + doc_section: '#step-1-getting-authentication-credentials' + credentials: + apiKey: + type: string + title: API Key + description: Your Northbeam API Key. + format: uuid + example: f1c2d3a4-5b67-4c89-ae01-123456789abc + doc_section: '#step-1-getting-authentication-credentials' + +notion: + display_name: Notion + categories: + - knowledge-base + - popular + - productivity + auth_mode: OAUTH2 + authorization_url: https://api.notion.com/v1/oauth/authorize + token_url: https://api.notion.com/v1/oauth/token + authorization_params: + response_type: code + owner: user + authorization_method: header + body_format: json + webhook_routing_script: notionWebhookRouting + webhook_user_defined_secret: true + token_response_metadata: + - workspace_id + proxy: + retry: + after: + - 'retry-after' + base_url: https://api.notion.com + headers: + 'notion-version': '2022-06-28' + paginate: + type: cursor + cursor_path_in_response: next_cursor + cursor_name_in_request: start_cursor + limit_name_in_request: page_size + response_path: results + docs: https://nango.dev/docs/api-integrations/notion + setup_guide_url: https://nango.dev/docs/api-integrations/notion/how-to-register-your-own-notion-api-oauth-app + +notion-mcp: + display_name: Notion (MCP) + categories: + - knowledge-base + - productivity + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://mcp.notion.com/authorize + token_url: https://mcp.notion.com/token + registration_url: https://mcp.notion.com/register + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + docs: https://nango.dev/docs/api-integrations/notion-mcp + +notion-scim: + display_name: Notion (SCIM API) + categories: + - knowledge-base + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.notion.com/scim + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/Users + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/notion-scim + docs_connect: https://nango.dev/docs/integrations/all/notion-scim/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Notion scim account + doc_section: '#step-1-finding-your-scim-api-key-token' + +nyne-ai: + display_name: Nyne AI + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://api.nyne.ai + headers: + x-api-key: ${connectionConfig.apiKey} + x-api-secret: ${apiKey} + content-type: application/json + verification: + method: POST + headers: + content-type: application/json + endpoints: + - /person/events + data: + event: 'test' + docs: https://nango.dev/docs/api-integrations/nyne-ai + docs_connect: https://nango.dev/docs/api-integrations/nyne-ai/connect + connection_config: + apiKey: + type: string + title: API Key + description: Your Nyne AI API key. + pattern: '^[a-fA-F0-9]{32}$' + example: '48f0****************************892' + order: 1 + doc_section: '#step-1-getting-your-api-credentials' + credentials: + apiKey: + type: string + title: API Secret + description: Your Nyne AI API secret. + pattern: '^[a-fA-F0-9]{16}$' + example: '97e7********0463' + doc_section: '#step-1-getting-your-api-credentials' + +ocean-io: + display_name: Ocean.io + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.ocean.io + headers: + x-api-token: ${apiKey} + retry: + after: + - 'retry-after' + verification: + method: GET + endpoints: + - /v2/credits/balance + docs: https://nango.dev/docs/api-integrations/ocean-io + docs_connect: https://nango.dev/docs/api-integrations/ocean-io/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Ocean.io API token. + example: api_7Zs******_************************mhS + pattern: '^api_[A-Za-z0-9]+_[A-Za-z0-9]+' + doc_section: '#step-1-generate-your-api-token' + +odoo: + display_name: Odoo (OAuth) + categories: + - erp + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.serverUrl}/restapi/1.0/common/oauth2/authorize + token_url: https://${connectionConfig.serverUrl}/restapi/1.0/common/oauth2/access_token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.serverUrl} + docs: https://nango.dev/docs/integrations/all/odoo + connection_config: + serverUrl: + type: string + title: Domain + description: The domain of your Odoo account + format: hostname + prefix: https:// + +odoo-cc: + display_name: Odoo (Client Credentials) + categories: + - erp + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.serverUrl}/restapi/1.0/common/oauth2/access_token + token_params: + client_id: ${credentials.consumerId} + client_secret: ${credentials.consumerSecret} + grant_type: client_credentials + token_headers: + content-type: application/x-www-form-urlencoded + token_response: + token: access_token + token_expiration: access_token_validity + token_expiration_strategy: expireIn + proxy: + base_url: https://${connectionConfig.serverUrl}/restapi + docs: https://nango.dev/docs/integrations/all/odoo-cc + docs_connect: https://nango.dev/docs/integrations/all/odoo-cc/connect + credentials: + consumerId: + type: string + title: Consumer ID + description: Your App Consumer ID + secret: true + doc_section: '#step-2-generating-your-odoo-client-credentials' + consumerSecret: + type: string + title: Consumer Secret + description: Your App Consumer Secret + secret: true + doc_section: '#step-2-generating-your-odoo-client-credentials' + connection_config: + serverUrl: + type: string + title: Domain + description: The domain to your Odoo account + format: hostname + example: example.odoo.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-odoo-domain' + +okta: + display_name: Okta + auth_mode: OAUTH2 + categories: + - dev-tools + - iam + authorization_url: https://${connectionConfig.subdomain}.okta.com/oauth2/v1/authorize + token_url: https://${connectionConfig.subdomain}.okta.com/oauth2/v1/token + authorization_params: + response_type: code + response_mode: query + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.okta.com + retry: + at: + - 'x-rate-limit-reset' + paginate: + type: 'link' + limit_name_in_request: 'limit' + link_rel_in_response_header: 'next' + docs: https://nango.dev/docs/integrations/all/okta + connection_config: + subdomain: + type: string + title: Okta Domain + description: The subdomain of your Okta account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .okta.com + prefix: https:// + +okta-cc: + display_name: Okta (Client Credentials) + categories: + - dev-tools + - iam + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.hostname}/oauth2/v1/token || https://${connectionConfig.subdomain}.okta.com/oauth2/v1/token + token_request_auth_method: private_key_jwt + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.hostname} || https://${connectionConfig.subdomain}.okta.com + retry: + at: + - 'x-rate-limit-reset' + paginate: + type: 'link' + limit_name_in_request: 'limit' + link_rel_in_response_header: 'next' + docs: https://nango.dev/docs/api-integrations/okta-cc + docs_connect: https://nango.dev/docs/api-integrations/okta-cc/connect + credentials: + client_id: + type: string + title: Client ID + description: The Client ID of your Okta API Services application + doc_section: '#step-1-creating-your-okta-api-services-application' + client_private_key: + type: string + title: Private Key (JWK) + description: The private JWK JSON (including kid, kty, n, e, d, p, q, dp, dq, qi) whose public key is registered in your Okta API Services application + secret: true + doc_section: '#step-2-generating-and-registering-your-rsa-key-pair' + connection_config: + hostname: + type: string + title: Okta Domain + description: The full hostname of your Okta account + format: hostname + prefix: https:// + example: dev-12345678.okta.com + doc_section: '#step-3-finding-your-okta-domain' + subdomain: + type: string + title: '' + description: '' + hidden: true # deprecating this in favor of hostname + oauth_scopes: + type: string + title: Scopes + description: Space-separated list of Okta Management API scopes (e.g. okta.users.read okta.users.manage). Must be granted under Okta API Scopes on your application. + example: okta.users.read okta.users.manage okta.groups.read + doc_section: '#step-4-grant-api-scopes-to-your-application' + +okta-preview: + alias: okta + display_name: Okta (Preview) + categories: + - dev-tools + - iam + authorization_url: https://${connectionConfig.subdomain}.oktapreview.com/oauth2/v1/authorize + token_url: https://${connectionConfig.subdomain}.oktapreview.com/oauth2/v1/token + proxy: + base_url: https://${connectionConfig.subdomain}.oktapreview.com + docs: https://nango.dev/docs/integrations/all/okta-preview + connection_config: + subdomain: + type: string + title: Okta Preview Domain + description: The subdomain of your Okta Preview account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .oktapreview.com + prefix: https:// + +onlogist: + display_name: Onlogist + categories: + - other + auth_mode: API_KEY + proxy: + base_url: https://dev.portal.onlogist.com/api + headers: + authorization: ${apiKey} + docs: https://nango.dev/docs/api-integrations/onlogist + docs_connect: https://nango.dev/docs/api-integrations/onlogist/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your OnLogist account + doc_section: '#step-1-finding-your-api-key' + +one-drive: + display_name: OneDrive for Business + categories: + - knowledge-base + - storage + alias: microsoft + post_connection_script: onedrivePostConnection + docs: https://nango.dev/docs/api-integrations/one-drive + setup_guide_url: https://nango.dev/docs/api-integrations/one-drive/how-to-register-your-own-onedrive-for-business-api-oauth-app + +one-drive-personal: + display_name: OneDrive Personal + categories: + - knowledge-base + - storage + auth_mode: OAUTH2 + authorization_url: https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize + token_url: https://login.microsoftonline.com/consumers/oauth2/v2.0/token + disable_pkce: true + default_scopes: + - offline_access + authorization_params: + response_type: code + response_mode: query + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.onedrive.com + retry: + after: + - 'retry-after' + decompress: true + docs: https://nango.dev/docs/integrations/all/one-drive-personal + +one-note: + display_name: One Note + categories: + - productivity + alias: microsoft + docs: https://nango.dev/docs/integrations/all/one-note + +onelogin: + display_name: OneLogin + categories: + - dev-tools + - iam + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.subdomain}.onelogin.com/auth/oauth2/v2/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.subdomain}.onelogin.com + pre_connection_deletion_script: oneloginPreConnectionDeletion + docs: https://nango.dev/docs/integrations/all/onelogin + docs_connect: https://nango.dev/docs/integrations/all/onelogin/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: Your OneLogin subdomain + example: acme + order: 1 + prefix: https:// + suffix: .onelogin.com + doc_section: '#step-1-finding-your-subdomain' + +oomnitza: + display_name: Oomnitza + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.oomnitza.com + headers: + authorization2: ${apiKey} + content-type: application/json + verification: + method: GET + endpoints: + - /api/v3/assets/meta + docs: https://nango.dev/docs/api-integrations/oomnitza + docs_connect: https://nango.dev/docs/api-integrations/oomnitza/connect + connection_config: + subdomain: + type: string + title: Oomnitza Subdomain + description: The subdomain of your Oomnitza instance + example: mycompany + prefix: https:// + suffix: .oomnitza.com + order: 1 + doc_section: '#step-1-finding-your-subdomain' + credentials: + apiKey: + type: string + title: API Token + description: Your Oomnitza API token + doc_section: '#step-2-generating-your-api-token' + +orange-logic: + display_name: Orange Logic + categories: + - storage + auth_mode: TWO_STEP + body_format: json + token_url: https://${connectionConfig.serverUrl}/webapi/security/clientcredentialsauthentication/authenticate_46H_v1 + token_params: + client_id: ${credentials.clientId} + client_secret: ${credentials.clientSecret} + token_headers: + content-type: application/json + accept: application/json + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://${connectionConfig.serverUrl} + docs: https://nango.dev/docs/api-integrations/orange-logic + docs_connect: https://nango.dev/docs/api-integrations/orange-logic/connect + credentials: + clientId: + type: string + title: Client ID + description: The Client ID from your Orange Logic OAuth 2.0 Client Credentials. + doc_section: '#step-2-obtain-client-credentials' + clientSecret: + type: string + title: Client Secret + description: The Client Secret from your Orange Logic OAuth 2.0 Client Credentials. + secret: true + doc_section: '#step-2-obtain-client-credentials' + connection_config: + serverUrl: + type: string + title: Orange Logic Server URL + description: The base URL of your Orange Logic instance + example: mycompany.orangelogic.com + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-1-find-your-orange-logic-url' + +openai: + display_name: OpenAI + categories: + - productivity + - dev-tools + - popular + auth_mode: API_KEY + proxy: + base_url: https://api.openai.com + headers: + authorization: Bearer ${apiKey} + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/models + retry: + after: + - 'x-ratelimit-reset-requests' + docs: https://nango.dev/docs/integrations/all/openai + docs_connect: https://nango.dev/docs/integrations/all/openai/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your OpenAI account + doc_section: '#step-1-retrieve-your-openai-api-key' +openai-admin: + display_name: OpenAI (Admin) + categories: + - productivity + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.openai.com + headers: + authorization: Bearer ${apiKey} + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/organization/users + retry: + after: + - 'x-ratelimit-reset-requests' + docs: https://nango.dev/docs/integrations/all/openai-admin + docs_connect: https://nango.dev/docs/integrations/all/openai-admin/connect + credentials: + apiKey: + type: string + title: Admin Key + description: The Admin API key for your OpenAI account + doc_section: '#step-1-retrieve-your-openai-admin-key' +open-hands: + display_name: Open Hands + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://app.all-hands.dev + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/conversations + docs: https://nango.dev/docs/integrations/all/open-hands + docs_connect: https://nango.dev/docs/integrations/all/open-hands/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Open Hands account + pattern: '^[A-Za-z0-9]{32}$' + example: 'aNVlyRBLGWJgnVp1vwXN7TkO1MCYxeIDz' + doc_section: '#step-1-finding-your-api-key' + +oracle-hcm: + display_name: Oracle Fusion Cloud (HCM) + categories: + - hr + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.restServerUrl} + headers: + content-type: application/vnd.oracle.adf.resourceitem+json + docs: https://nango.dev/docs/integrations/all/oracle-hcm + docs_connect: https://nango.dev/docs/integrations/all/oracle-hcm/connect + credentials: + username: + type: string + title: Username + description: Your Oracle Cloud service username. + doc_section: '#step-2-finding-your-credentials' + password: + type: string + title: Password + description: Your Oracle Cloud service password. + doc_section: '#step-2-finding-your-credentials' + connection_config: + restServerUrl: + type: string + title: REST Server URL + description: The REST server URL for your Oracle Fusion Cloud + format: hostname + prefix: https:// + example: servername.fa.us2.oraclecloud.com + order: 1 + doc_section: '#step-1-finding-your-rest-server-url' + +oracle-cloud-identity: + display_name: Oracle Cloud Identity + categories: + - dev-tools + - iam + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.serviceInstance}.identity.oraclecloud.com/oauth2/v1/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + scope_separator: ' ' + proxy: + base_url: https://${connectionConfig.serviceInstance}.identity.oraclecloud.com + docs: https://nango.dev/docs/api-integrations/oracle-cloud-identity + docs_connect: https://nango.dev/docs/api-integrations/oracle-cloud-identity/connect + connection_config: + serviceInstance: + type: string + title: IDCS Service Instance + description: Your Oracle Identity Cloud Service instance identifier + pattern: '^idcs-[a-f0-9]{32}$' + example: idcs-1234567890abcdef1234567890abcdef + prefix: https:// + suffix: .identity.oraclecloud.com + order: 1 + doc_section: '#step-1-finding-your-service-instance' + +ordinal: + display_name: Ordinal + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://app.tryordinal.com/api + headers: + authorization: Bearer ${apiKey} + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/workspace + docs: https://nango.dev/docs/api-integrations/ordinal + docs_connect: https://nango.dev/docs/api-integrations/ordinal/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Ordinal API key. + example: ord_************* + pattern: '^ord_[A-Za-z0-9-_]+$' + doc_section: '#step-1-generating-your-api-key' + +ory: + display_name: Ory + categories: + - iam + auth_mode: OAUTH2_CC + proxy: + base_url: https://${connectionConfig.projectSlug}.projects.oryapis.com + token_url: https://${connectionConfig.projectSlug}.projects.oryapis.com/oauth2/token + scope_separator: ' ' + token_params: + grant_type: client_credentials + docs: https://nango.dev/docs/integrations/all/ory + connection_config: + projectSlug: + type: string + title: Project Slug + description: The project slug of your Ory project + +osu: + display_name: Osu + categories: + - gaming + auth_mode: OAUTH2 + authorization_url: https://osu.ppy.sh/oauth/authorize + token_url: https://osu.ppy.sh/oauth/token + default_scopes: + - identify + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://osu.ppy.sh + docs: https://nango.dev/docs/integrations/all/osu + +oura: + display_name: Oura + categories: + - sports + auth_mode: OAUTH2 + authorization_url: https://cloud.ouraring.com/oauth/authorize + token_url: https://api.ouraring.com/oauth/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.ouraring.com + docs: https://nango.dev/docs/integrations/all/oura + +outlook: + display_name: Outlook + categories: + - communication + - popular + alias: microsoft + docs: https://nango.dev/docs/api-integrations/outlook + setup_guide_url: https://nango.dev/docs/api-integrations/outlook/how-to-register-your-own-outlook-api-oauth-app + +outreach: + display_name: Outreach + categories: + - marketing + auth_mode: OAUTH2 + authorization_url: https://api.outreach.io/oauth/authorize + token_url: https://api.outreach.io/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.outreach.io + docs: https://nango.dev/docs/integrations/all/outreach + +pagerduty: + display_name: PagerDuty + categories: + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://app.pagerduty.com/oauth/authorize + token_url: https://app.pagerduty.com/oauth/token + webhook_routing_script: pagerdutyWebhookRouting + proxy: + base_url: https://api.pagerduty.com + retry: + after: + - 'ratelimit-reset' + docs: https://nango.dev/docs/integrations/all/pagerduty + +paligo: + display_name: Paligo + categories: + - cms + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.paligoapp.com + verification: + method: GET + endpoints: + - /api/v2/groups?page=1&per_page=1 + docs: https://nango.dev/docs/api-integrations/paligo + docs_connect: https://nango.dev/docs/api-integrations/paligo/connect + connection_config: + subdomain: + type: string + title: Paligo Instance Name + description: The name of your Paligo instance + example: mycompany + suffix: .paligoapp.com + prefix: https:// + order: 1 + doc_section: '#step-1-find-your-paligo-instance-name' + credentials: + username: + type: string + title: Username + description: Your Paligo account username (email address). + example: name@example.com + format: email + doc_section: '#step-3-enter-credentials-in-the-connect-ui' + password: + type: string + title: API Key + description: The API key token generated. + secret: true + pattern: '^[A-F0-9]+$' + example: 74E12F****************************9C5D6F + doc_section: '#step-2-create-an-api-key' + +pandadoc: + display_name: Pandadoc + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://app.pandadoc.com/oauth2/authorize + token_url: https://api.pandadoc.com/oauth2/access_token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.pandadoc.com + docs: https://nango.dev/docs/integrations/all/pandadoc + +pandadoc-api-key: + display_name: Pandadoc (API Key) + categories: + - legal + auth_mode: API_KEY + proxy: + base_url: https://api.pandadoc.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /public/v1/members/current + headers: + authorization: API-Key ${apiKey} + docs: https://nango.dev/docs/integrations/all/pandadoc-api-key + docs_connect: https://nango.dev/docs/integrations/all/pandadoc-api-key/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Pandadoc account + doc_section: '#step-1-generating-your-api-key' + example: 3039ba033eb1410caa0a2227158d63c9d6502cd8 + pattern: '^[a-fA-F0-9]+$' + +paddle: + display_name: Paddle + categories: + - payment + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.paddle.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/api-integrations/paddle + docs_connect: https://nango.dev/docs/api-integrations/paddle/connect + setup_guide_url: https://nango.dev/docs/api-integrations/paddle/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Paddle API key. + example: pdl_live_apikey_01kpb*********************_xRs9*********************_A40 + doc_section: '#step-1-generating-your-api-key' + connection_config: + subdomain: + type: string + title: Environment + description: Use 'api' for live or 'sandbox-api' for sandbox. + enum: + - api + - sandbox-api + doc_section: '#step-2-choose-your-environment' + order: 1 + +passportal: + display_name: Passportal + categories: + - support + auth_mode: TWO_STEP + token_url: https://${connectionConfig.base_url}/api/v2/auth/client_token + token_headers: + x-key: ${credentials.apiKey} + x-hash: ${credentials.hmacToken} + content-type: application/json + token_params: + scope: docs_api + content: ${credentials.content} + token_response: + token: access_token + token_expiration: expiry_time + token_expiration_strategy: expireAt + proxy: + base_url: https://${connectionConfig.base_url} + headers: + x-access-token: ${accessToken} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v2/documents?resultsPerPage=1 + connection_config: + base_url: + type: string + title: Passportal Base URL + description: Your Passportal base URL + example: mycompany.mypasswordapp.com + format: hostname + prefix: https:// + doc_section: '#step-1-find-your-passportal-base-url' + credentials: + apiKey: + type: string + title: API Access Key ID + description: Your Passportal API Access Key ID + example: a14e6b4923ba5027189baded6ba7b68e6fcda742008c5d57b867f43a09768ece + pattern: '^[a-fA-F0-9]{64}$' + doc_section: '#step-2-generate-api-access-key-id-and-secret-access-key' + hmacToken: + type: string + title: HMAC Token + description: Your pre-generated HMAC token, hex encoded + example: 23ec313efecb560a7f44239f6dd439ea56d18911c18b59e1150a3c7299da8202 + pattern: '^[a-fA-F0-9]{64}$' + secret: true + doc_section: '#step-3-generate-hmac-token' + content: + type: string + title: Content String + description: Plain text message used to compute the HMAC token + example: api-content-hash + doc_section: '#step-3-generate-hmac-token' + docs: https://nango.dev/docs/integrations/all/passportal + docs_connect: https://nango.dev/docs/integrations/all/passportal/connect + +paychex: + display_name: Paychex + categories: + - hr + auth_mode: OAUTH2_CC + token_url: https://api.paychex.com/auth/oauth/v2/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.paychex.com + docs: https://nango.dev/docs/integrations/all/paychex + docs_connect: https://nango.dev/docs/integrations/all/paychex/connect + credentials: + client_id: + type: string + title: API Key + description: A unique identifier for your application on Paychex + doc_section: '#step-1-generating-your-client-credentials' + client_secret: + type: string + title: Client Secret + description: A confidential key used to authenticate the identity of application (client) + doc_section: '#step-1-generating-your-client-credentials' + +paycor: + display_name: Paycor + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://hcm.paycor.com/AppActivation/Authorize + token_url: https://apis.paycor.com/sts/v1/common/token?subscription-key=${connectionConfig.subscriptionKey} + authorization_params: + response_type: code + subscription-key: ${connectionConfig.subscriptionKey} + scope_separator: ' ' + default_scopes: + - offline_access + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://apis.paycor.com + headers: + ocp-apim-subscription-key: ${connectionConfig.subscriptionKey} + docs: https://nango.dev/docs/integrations/all/paycor + docs_connect: https://nango.dev/docs/integrations/all/paycor/connect + connection_config: + subscriptionKey: + type: string + title: Subscription Key + description: The subscription key for your Paycor account + automated: true + tenantId: + type: string + title: Company ID + example: '290180' + pattern: '^\d+$' + description: The company ID for your Paycor account + doc_section: '#step-1-finding-your-company-id' + +paycor-sandbox: + display_name: Paycor (Sandbox) + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://hcm-demo.paycor.com/AppActivation/Authorize + token_url: https://apis-sandbox.paycor.com/sts/v1/common/token?subscription-key=${connectionConfig.subscriptionKey} + authorization_params: + response_type: code + subscription-key: ${connectionConfig.subscriptionKey} + scope_separator: ' ' + default_scopes: + - offline_access + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://apis-sandbox.paycor.com + headers: + ocp-apim-subscription-key: ${connectionConfig.subscriptionKey} + docs: https://nango.dev/docs/integrations/all/paycor-sandbox + docs_connect: https://nango.dev/docs/integrations/all/paycor-sandbox/connect + connection_config: + subscriptionKey: + type: string + title: Subscription Key + description: The subscription key for your Paycor sandbox account + automated: true + tenantId: + type: string + title: Company ID + example: '290180' + pattern: '^\d+$' + description: The company ID for your Paycor sandbox account + doc_section: '#step-1-finding-your-company-id' + +paycom: + display_name: Paycom + categories: + - hr + auth_mode: BASIC + proxy: + base_url: https://api.paycomonline.net + docs: https://nango.dev/docs/integrations/all/paycom + docs_connect: https://nango.dev/docs/integrations/all/paycom/connect + credentials: + username: + type: string + title: SID + description: The SID of your Paycom account + doc_section: '#step-1-finding-your-credentials' + password: + type: string + title: API Token + description: The API token of your Paycom account + doc_section: '#step-1-finding-your-credentials' + +payfit: + display_name: Payfit + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://oauth.payfit.com/authorize + token_url: https://app.pagerduty.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://partner-api.payfit.com + docs: https://nango.dev/docs/integrations/all/payfit + +paylocity-nextgen: + display_name: Paylocity (NextGen) + categories: + - hr + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.environment}.paylocity.com/public/security/v1/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.environment}.paylocity.com + connection_config: + companyId: ${connectionConfig.companyId} + docs: https://nango.dev/docs/api-integrations/paylocity-nextgen + docs_connect: https://nango.dev/docs/api-integrations/paylocity-nextgen/connect + connection_config: + environment: + type: string + title: Environment + description: Your Paylocity NextGen environment. + enum: + - dc1prodgwext + - dc1demogwext + order: 1 + doc_section: '#step-1-select-the-correct-paylocity-environment' + companyId: + type: string + title: Company ID + description: The company ID of your Paylocity account + doc_section: '#step-2-find-your-company-id' + pattern: '^[a-zA-Z0-9]+$' + example: S2222 + order: 2 + +paylocity: + display_name: Paylocity (Weblink) + categories: + - hr + auth_mode: OAUTH2_CC + proxy: + base_url: https://${connectionConfig.environment}.paylocity.com + connection_config: + companyId: ${connectionConfig.companyId} + token_url: https://${connectionConfig.environment}.paylocity.com/IdentityServer/connect/token + token_params: + grant_type: client_credentials + docs: https://nango.dev/docs/api-integrations/paylocity + docs_connect: https://nango.dev/docs/api-integrations/paylocity/connect + connection_config: + environment: + type: string + title: Paylocity Environment + enum: + - dc1demogw + - api + description: Your Paylocity Weblink environment. + order: 1 + doc_section: '#step-1-select-the-correct-paylocity-environment' + companyId: + type: string + title: Company ID + description: The company ID of your Paylocity account + doc_section: '#step-2-find-your-company-id' + pattern: '^[a-zA-Z0-9]+$' + example: S2222 + order: 2 + +paypal: + display_name: Paypal + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://www.paypal.com/signin/authorize + token_url: https://api.paypal.com/v1/oauth2/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api-m.paypal.com + docs: https://nango.dev/docs/integrations/all/paypal + +paypal-sandbox: + display_name: Paypal (Sandbox) + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://www.sandbox.paypal.com/signin/authorize + token_url: https://api-m.sandbox.paypal.com/v1/oauth2/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api-m.sandbox.paypal.com + docs: https://nango.dev/docs/integrations/all/paypal-sandbox + +pax8: + display_name: Pax8 + categories: + - other + auth_mode: OAUTH2_CC + body_format: json + token_url: https://api.pax8.com/v1/token + token_params: + grant_type: client_credentials + audience: ${connectionConfig.audience} || https://api.pax8.com + proxy: + base_url: https://api.pax8.com + docs: https://nango.dev/docs/integrations/all/pax8 + docs_connect: https://nango.dev/docs/integrations/all/pax8/connect + connection_config: + audience: + type: string + title: '' + description: '' + automated: true + +pendo: + display_name: Pendo + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://app.pendo.io + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v1/page + headers: + x-pendo-integration-key: ${apiKey} + docs: https://nango.dev/docs/integrations/all/pendo + docs_connect: https://nango.dev/docs/integrations/all/pendo/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Pendo account + doc_section: '#step-1-finding-pendo-api-key' + +pendo-oauth: + display_name: Pendo (OAuth) + categories: + - analytics + auth_mode: OAUTH2_CC + token_url: https://app.pendo.io/oauth/v1/token + token_params: + grant_type: client_credentials + default_scopes: + - read:me + body_format: form + proxy: + base_url: https://app.pendo.io + docs: https://nango.dev/docs/api-integrations/pendo-oauth + docs_connect: https://nango.dev/docs/api-integrations/pendo-oauth/connect + credentials: + client_id: + type: string + title: Client ID + description: Your Pendo OAuth client ID + doc_section: '#step-1-finding-your-pendo-oauth-credentials' + client_secret: + type: string + title: Client Secret + description: Your Pendo OAuth client secret + secret: true + doc_section: '#step-1-finding-your-pendo-oauth-credentials' + +pennylane: + display_name: Pennylane + categories: + - accounting + - banking + - invoicing + - payment + auth_mode: OAUTH2 + authorization_url: https://app.pennylane.com/oauth/authorize + token_url: https://app.pennylane.com/oauth/token + proxy: + base_url: https://app.pennylane.com + retry: + at: + - 'ratelimit-reset' + scope_separator: '+' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + authorization_url_skip_encode: + - scopes + docs: https://nango.dev/docs/integrations/all/pennylane + +pennylane-company-api: + display_name: Pennylane (Company API) + categories: + - accounting + - banking + - invoicing + - payment + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://app.pennylane.com + verification: + method: GET + headers: + accept: application/json + endpoints: + - /api/external/v2/me + retry: + at: + - 'ratelimit-reset' + docs: https://nango.dev/docs/integrations/all/pennylane-company-api + docs_connect: https://nango.dev/docs/integrations/all/pennylane-company-api/connect + credentials: + apiKey: + type: string + title: API Token + description: The company API token for your Pennylane account + pattern: '^[A-Za-z0-9_-]{43}$' + example: aZ9b4Lp3QhN7vXyK1sTcO0WfR8jMdEuD5GrIi2-H6PnU + doc_section: '#step-1-generating-your-company-api-token' + +peopledatalabs: + display_name: People Data Labs + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://api.peopledatalabs.com + query: + api_key: ${apiKey} + docs: https://nango.dev/docs/integrations/all/peopledatalabs + credentials: + apiKey: + type: string + title: API Key + description: The API key for your People Data Labs account + +perdoo: + display_name: Perdoo + categories: + - productivity + - analytics + auth_mode: API_KEY + proxy: + base_url: https://eu.perdoo.com + headers: + authorization: Bearer ${apiKey} + content-type: application/json + verification: + method: GET + endpoints: + - /user + docs: https://nango.dev/docs/api-integrations/perdoo + docs_connect: https://nango.dev/docs/api-integrations/perdoo/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Perdoo API token + example: '5037c64a83d34725a13131b9b28856c0e499887b16c84b6d9bba2756d1e61634' + pattern: '^[a-f0-9]{64}$' + doc_section: '#step-1-generating-your-api-token' + +perplexity: + display_name: Perplexity + categories: + - productivity + - dev-tools + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.perplexity.ai + docs: https://nango.dev/docs/integrations/all/perplexity + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Perplexity account + pattern: '^pplx-[a-zA-Z0-9]+$' + example: pplx-**************************** + +perimeter81: + display_name: Perimeter81 + categories: + - productivity + auth_mode: TWO_STEP + proxy: + base_url: https://api.perimeter81.com/api/rest + token_url: https://api.${connectionConfig.domain}.com/api/v1/auth/authorize + token_params: + apiKey: ${credentials.apiKey} + grantType: api_key + token_headers: + content-type: application/json + token_response: + token: data.accessToken + token_expiration: data.accessTokenExpire + token_expiration_strategy: expireAt + docs: https://nango.dev/docs/integrations/all/perimeter81 + docs_connect: https://nango.dev/docs/integrations/all/perimeter81/connect + connection_config: + domain: + type: string + title: Domain + description: The domain for Perimeter81. + enum: + - perimeter81 + - eu.sase.checkpoint + doc_section: '#step-1-finding-your-perimeter81-domain-and-perimeter81-api-key' + order: 1 + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Perimeter81 account + secret: true + +personio: + display_name: Personio (v1) + categories: + - hr + auth_mode: OAUTH2_CC + proxy: + base_url: https://api.personio.de/v1 + headers: + x-personio-partner-id: ${connectionConfig.partnerId} + x-personio-app-id: ${connectionConfig.appId} + token_url: https://api.personio.de/v1/auth + body_format: json + docs: https://nango.dev/docs/integrations/all/personio + docs_connect: https://nango.dev/docs/integrations/all/personio/connect + connection_config: + partnerId: + type: string + title: Partner ID + description: The partner ID of your Personio account + doc_section: '#step-1-finding-personio-client-id' + appId: + type: string + title: App ID + description: The app ID of your Personio account + doc_section: '#step-2-finding-personio-client-secret' + +personio-v2: + display_name: Personio (v2) + categories: + - hr + auth_mode: OAUTH2_CC + proxy: + base_url: https://api.personio.de/v2 + headers: + content-type: application/x-www-form-urlencoded + token_url: https://api.personio.de/v2/auth/token + scope_separator: ' ' + docs: https://nango.dev/docs/integrations/all/personio-v2 + token_params: + grant_type: client_credentials + +personio-recruiting: + display_name: Personio Recruiting + categories: + - hr + - ats + auth_mode: API_KEY + proxy: + base_url: https://api.personio.de/v1 + headers: + authorization: Bearer ${apiKey} + x-company-id: ${connectionConfig.companyId} + x-personio-partner-id: ${connectionConfig.partnerId} + x-personio-app-id: ${connectionConfig.appId} + verification: + method: GET + endpoints: + - /xml?language=en + base_url_override: https://${connectionConfig.company}.jobs.personio.de + headers: + accept: application/xml + content-type: xml + docs: https://nango.dev/docs/integrations/all/personio-recruiting + connection_config: + companyId: + type: string + title: Company ID + description: The company ID of your Personio account + company: + type: string + title: Company Name + description: The company name of your Personio account + partnerId: + type: string + title: Partner ID + description: The partner ID of your Personio account + appId: + type: string + title: App ID + description: The app ID of your Personio account + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Pingboard account + +pingboard: + display_name: Pingboard + categories: + - productivity + auth_mode: OAUTH2_CC + proxy: + base_url: https://app.pingboard.com/api/v2 + token_url: https://app.pingboard.com/oauth/token + scope_separator: ' ' + token_params: + grant_type: client_credentials + docs: https://nango.dev/docs/integrations/all/pingboard + +pingone: + display_name: PingOne + categories: + - dev-tools + - iam + auth_mode: OAUTH2 + authorization_url: https://auth.pingone.${connectionConfig.tld}/${connectionConfig.environmentId}/as/authorize + token_url: https://auth.pingone.${connectionConfig.tld}/${connectionConfig.environmentId}/as/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.pingone.${connectionConfig.tld} + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/pingone + docs_connect: https://nango.dev/docs/integrations/all/pingone/connect + connection_config: + tld: + type: string + title: Top Level Domain + description: The top level domain for your PingOne account. + enum: + - com + - ca + - eu + - com.au + - sg + - asia + doc_section: '#step-2-finding-your-top-level-domain' + environmentId: + type: string + title: Environment ID + order: 1 + description: The environment ID for your PingOne account + example: f2aba07d-270c-42ba-8811-01af5f63d458 + format: uuid + doc_section: '#step-1-finding-your-environment-id' + +pingone-cc: + display_name: PingOne (Client Credentials) + categories: + - dev-tools + - iam + auth_mode: OAUTH2_CC + token_url: https://auth.pingone.${connectionConfig.tld}/${connectionConfig.environmentId}/as/token + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.pingone.${connectionConfig.tld} + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/pingone-cc + docs_connect: https://nango.dev/docs/integrations/all/pingone-cc/connect + connection_config: + tld: + type: string + title: Top Level Domain + description: The top level domain for your PingOne account. + order: 2 + enum: + - com + - ca + - eu + - com.au + - sg + - asia + doc_section: '#step-3-finding-your-top-level-domain' + environmentId: + type: string + title: Environment ID + order: 1 + description: The environment ID for your PingOne account + example: f2aba07d-270c-42ba-8811-01af5f63d458 + format: uuid + doc_section: '#step-2-finding-your-environment-id' + +pinterest: + display_name: Pinterest + categories: + - design + - marketing + - social + - video + auth_mode: OAUTH2 + authorization_url: https://www.pinterest.com/oauth + token_url: https://api.pinterest.com/v5/oauth/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.pinterest.com + docs: https://nango.dev/docs/integrations/all/pinterest + +rocketlane: + display_name: Rocketlane + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.rocketlane.com/api + headers: + api-key: ${apiKey} + verification: + method: GET + endpoints: + - /1.0/users/?pageSize=1 + docs: https://nango.dev/docs/integrations/all/rocketlane + docs_connect: https://nango.dev/docs/integrations/all/rocketlane/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Rocketlane API key + pattern: ^rl-[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$ + example: rl-3d2d4d87-1801-48ca-8948-8d5ed6f05df7 + doc_section: '#step-1-generating-your-api-key' + +pipedrive: + display_name: Pipedrive + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://oauth.pipedrive.com/oauth/authorize + token_url: https://oauth.pipedrive.com/oauth/token + authorization_url_skip_empty: true + token_request_auth_method: basic + disable_pkce: true + token_response_metadata: + - api_domain + proxy: + base_url: ${connectionConfig.api_domain}/api + decompress: true + paginate: + type: offset + offset_name_in_request: start + response_path: data + limit_name_in_request: limit + docs: https://nango.dev/docs/api-integrations/pipedrive + setup_guide_url: https://nango.dev/docs/api-integrations/pipedrive/how-to-register-your-own-pipedrive-oauth-app + connection_config: + api_domain: + type: string + title: '' + description: '' + automated: true + +pylon: + display_name: Pylon + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.usepylon.com + headers: + authorization: Bearer ${apiKey} + accept: '*/*' + verification: + method: GET + endpoints: + - /me + docs: https://nango.dev/docs/api-integrations/pylon + docs_connect: https://nango.dev/docs/api-integrations/pylon/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Pylon API token + doc_section: '#step-1-generating-your-api-token' + +pipedream: + display_name: Pipedream (API Key) + categories: + - dev-tools + - productivity + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.pipedream.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/users/me + docs: https://nango.dev/docs/integrations/all/pipedream + docs_connect: https://nango.dev/docs/integrations/all/pipedream/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Pipedream account + pattern: '^[a-f0-9]{32}$' + example: 9a1b2c3d4e5f67890abcdeffedcba123 + doc_section: '#step-1-finding-your-api-key' + +pipedream-oauth2-cc: + display_name: Pipedream (Client Credentials) + categories: + - dev-tools + - productivity + auth_mode: OAUTH2_CC + token_url: https://api.pipedream.com/v1/oauth/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.pipedream.com + docs: https://nango.dev/docs/integrations/all/pipedream-oauth2-cc + docs_connect: https://nango.dev/docs/integrations/all/pipedream-oauth2-cc/connect + +pivotaltracker: + display_name: Pivotal Tracker + categories: + - productivity + auth_mode: API_KEY + proxy: + headers: + x-trackertoken: ${apiKey} + base_url: https://www.pivotaltracker.com/services/v5 + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /accounts + docs: https://nango.dev/docs/integrations/all/pivotaltracker + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Pivotal Tracker account + +planning-center-online: + display_name: Planning Center Online (OAuth) + categories: + - crm + - productivity + auth_mode: OAUTH2 + authorization_url: https://api.planningcenteronline.com/oauth/authorize + token_url: https://api.planningcenteronline.com/oauth/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.planningcenteronline.com + headers: + accept: application/json + user-agent: Nango (https://nango.dev) + retry: + after: + - 'retry-after' + paginate: + type: offset + offset_name_in_request: offset + limit_name_in_request: per_page + response_path: data + docs: https://nango.dev/docs/api-integrations/planning-center-online + setup_guide_url: https://nango.dev/docs/api-integrations/planning-center-online/how-to-register-your-own-planning-center-oauth-app + +planning-center-online-pat: + display_name: Planning Center Online (Personal Access Token) + categories: + - crm + - productivity + auth_mode: BASIC + proxy: + base_url: https://api.planningcenteronline.com + headers: + accept: application/json + retry: + after: + - 'retry-after' + paginate: + type: offset + offset_name_in_request: offset + limit_name_in_request: per_page + response_path: data + verification: + method: GET + headers: + accept: application/json + user-agent: Nango (https://nango.dev) + endpoints: + - /current/v2/me + docs: https://nango.dev/docs/api-integrations/planning-center-online-pat + docs_connect: https://nango.dev/docs/api-integrations/planning-center-online-pat/connect + credentials: + username: + type: string + title: Client ID + description: The Client ID for your Planning Center Personal Access Token. + pattern: '^[a-zA-Z0-9_-]{4,128}$' + example: 01h2jk3lm4np5qrst6uvw + doc_section: '#step-2-create-a-personal-access-token' + password: + type: string + title: Secret + description: The Secret for your Planning Center Personal Access Token. + pattern: '^[a-zA-Z0-9+/=_-]{8,512}$' + example: 7f8e9d0c1b2a3847564930210fedcba9876543210fedcba9876543210 + doc_section: '#step-2-create-a-personal-access-token' + +pushpay-chms-v1: + display_name: Pushpay ChMS (v1) + categories: + - crm + - productivity + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.ccbchurch.com + retry: + after: + - 'retry-after' + credentials_verification_script: pushpayChmsV1CredentialsVerification + docs: https://nango.dev/docs/api-integrations/pushpay-chms-v1 + docs_connect: https://nango.dev/docs/api-integrations/pushpay-chms-v1/connect + connection_config: + subdomain: + type: string + title: Church subdomain + description: The subdomain for your Pushpay ChMS site. + example: yourchurch + pattern: '^[a-zA-Z0-9-]+$' + order: 1 + prefix: https:// + suffix: .ccbchurch.com + doc_section: '#step-1-finding-your-church-subdomain' + credentials: + username: + type: string + title: API username + description: The API login created in Pushpay ChMS API Admin. + doc_section: '#step-2-create-an-api-user' + password: + type: string + title: API password + description: The password for your Pushpay ChMS API user. + secret: true + doc_section: '#step-2-create-an-api-user' + +plain: + display_name: Plain + categories: + - support + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://core-api.uk.plain.com/graphql + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1?query=%7B__schema%7Btypes%7Bname,kind,fields%7Bname%7D%7D%7D%7D + docs: https://nango.dev/docs/integrations/all/plain + docs_connect: https://nango.dev/docs/integrations/all/plain/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Plain account + doc_section: '#step-1-generating-your-api-key' + +pleo: + display_name: Pleo + categories: + - payment + - invoicing + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.pleo.io/oauth/authorize + token_url: https://${connectionConfig.subdomain}.pleo.io/oauth/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.apiSubdomain}.pleo.io + docs: https://nango.dev/docs/api-integrations/pleo + docs_connect: https://nango.dev/docs/api-integrations/pleo/connect + setup_guide_url: https://nango.dev/docs/api-integrations/pleo/how-to-register-your-own-pleo-api-oauth-app + connection_config: + subdomain: + type: string + title: OAuth Subdomain + description: The OAuth subdomain for your Pleo environment. + enum: + - auth + - auth.staging + apiSubdomain: + type: string + title: API Subdomain + description: The API subdomain for your Pleo environment. + enum: + - external + - external.staging + +podium: + display_name: Podium + categories: + - communication + - marketing + auth_mode: OAUTH2 + authorization_url: https://api.podium.com/oauth/authorize + token_url: https://api.podium.com/oauth/token + scope_separator: ' ' + body_format: json + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + headers: + podium-version: ${connectionConfig.apiVersion} + content-type: application/json + base_url: https://api.podium.com + retry: + after: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/integrations/all/podium + connection_config: + apiVersion: + type: string + title: API Version + description: The API version of your Podium account + +podscribe: + display_name: Podscribe + categories: + - marketing + - analytics + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://backend.podscribe.ai + docs: https://nango.dev/docs/api-integrations/podscribe + docs_connect: https://nango.dev/docs/api-integrations/podscribe/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Podscribe account + pattern: '^[a-zA-Z0-9]+\.[a-zA-Z0-9]+\.[a-zA-Z0-9_-]+$' + example: xkPqbW**********.*********.*******T8mz + doc_section: '#step-1-generating-your-api-key' + +posthog: + display_name: PostHog + categories: + - dev-tools + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://${connectionConfig.subdomain}.posthog.com + docs: https://nango.dev/docs/api-integrations/posthog + docs_connect: https://nango.dev/docs/api-integrations/posthog/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of your PostHog cloud account. + enum: + - us + - us.i + - eu + - eu.i + order: 1 + doc_section: '#step-1-finding-your-subdomain' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your PostHog account + pattern: '^phx_[A-Za-z0-9]+$' + example: phx_1PPf***************************k3D + doc_section: '#step-2-finding-your-api-key' + +posthog-oauth: + display_name: PostHog (OAuth) + categories: + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://oauth.posthog.com/oauth/authorize/ + token_url: https://oauth.posthog.com/oauth/token/ + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.posthog.com + docs: https://nango.dev/docs/api-integrations/posthog-oauth + setup_guide_url: https://nango.dev/docs/api-integrations/posthog-oauth/how-to-register-your-own-posthog-oauth-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/posthog-oauth/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of your PostHog cloud account. + enum: + - us + - us.i + - eu + - eu.i + order: 1 + doc_section: '#step-1-finding-your-subdomain' + +prive: + display_name: Prive + categories: + - e-commerce + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + content-type: application/json + base_url: https://subs.api.tryprive.com + docs: https://nango.dev/docs/integrations/all/prive + docs_connect: https://nango.dev/docs/integrations/all/prive/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Prive account + doc_section: '#step-1-requesting-your-prive-api-key' + +prospeo: + display_name: Prospeo + categories: + - crm + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.prospeo.io + headers: + x-key: ${apiKey} + verification: + method: POST + headers: + content-type: application/json + endpoints: + - /account-information + docs: https://nango.dev/docs/api-integrations/prospeo + docs_connect: https://nango.dev/docs/api-integrations/prospeo/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Prospeo API Key + example: pk_640edfcc************************304fca5e + pattern: '^(pk_[a-f0-9]{64}|[a-f0-9]{32})$' + doc_section: '#step-1-finding-your-api-key' + +prtg-classic: + display_name: PRTG Classic + categories: + - support + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.host} + query: + apitoken: ${apiKey} + verification: + method: GET + endpoints: + - /api/table.json?content=sensors&count=1 + docs: https://nango.dev/docs/api-integrations/prtg-classic + docs_connect: https://nango.dev/docs/api-integrations/prtg-classic/connect + connection_config: + host: + type: string + title: Instance Host + description: The host of your PRTG instance + pattern: '^[A-Za-z0-9.-]+(:\d+)?$' + example: monitor.example.com + prefix: https:// + doc_section: '#step-1-finding-your-instance-host' + order: 1 + credentials: + apiKey: + type: string + title: API Key + description: The API key for your PRTG account + pattern: '^[A-Z2-7]+=*$' + example: RUTOWB5KVJCMEOWHL5MLUWMA324UGNDLPS6JKLTEDT====== + doc_section: '#step-2-finding-your-api-key' + +private-api-bearer: + display_name: Private API (Bearer Auth) + categories: + - other + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://my-private-api + docs: https://nango.dev/docs/integrations/all/private-api-bearer + docs_connect: https://nango.dev/docs/integrations/all/private-api-bearer/connect + credentials: + apiKey: + type: string + title: API Key + description: Your API Key + +private-api-basic: + display_name: Private API (Basic Auth) + categories: + - other + auth_mode: BASIC + proxy: + base_url: https://my-private-api + docs: https://nango.dev/docs/integrations/all/private-api-basic + docs_connect: https://nango.dev/docs/integrations/all/private-api-basic/connect + credentials: + username: + type: string + title: Username + description: Your username + password: + type: string + title: Password + description: Your password +private-api-generic: + display_name: Private API (Generic) + categories: + - other + auth_mode: API_KEY + proxy: + base_url: https://api.nango.dev/ + integration_config: + keyPlacement: + type: string + title: Key placement + description: Where the API key is sent on proxied requests. + enum: + - header + - query + default_value: header + warnings: + query: Sending the key as a query param can expose it in upstream, proxy, and CDN logs. Prefer a header when the API supports it. + order: 1 + keyName: + type: string + title: Key name + description: Header name or query-param name (e.g. Authorization, x-api-key, api_key). + example: Authorization + order: 2 + valueTemplate: + type: string + title: Value template + description: How the key is presented to the upstream API. Use ${apiKey} as the placeholder for the stored key. + example: Api-Key ${apiKey} + default_value: ${apiKey} + pattern: '\$\{apiKey\}' + order: 3 + baseUrl: + type: string + title: Base URL + description: Base URL of the upstream API the proxy will call. + format: uri + pattern: '^https?://' + example: https://api.example.com + order: 4 + keyLabel: + type: string + title: API key label (shown in Connect UI) + description: The label end users see for the API key field in the Connect UI. + default_value: API Key + optional: true + order: 5 + docs: https://nango.dev/docs/integrations/all/private-api-generic + docs_connect: https://nango.dev/docs/integrations/all/private-api-generic/connect + credentials: + apiKey: + type: string + title: API Key + description: Your API Key +precisefp: + display_name: PreciseFP + categories: + - crm + - productivity + auth_mode: OAUTH2 + authorization_url: https://app.precisefp.com/oauth/authorize + token_url: https://app.precisefp.com/oauth/token + authorization_params: + response_type: code + scope: '*' + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + authorization_method: header + proxy: + base_url: https://app.precisefp.com + docs: https://nango.dev/docs/integrations/all/precisefp + +practicefusion: + display_name: PracticeFusion + categories: + - other + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.baseUrl}/authorize + token_url: https://${connectionConfig.baseUrl}/token + authorization_url_skip_empty: true + authorization_params: + response_type: code + aud: https://${connectionConfig.baseUrl} + launch: ${connectionConfig.launch} + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + token_response_metadata: + - patient + - need_patient_banner + - smart_style_url + proxy: + base_url: https://${connectionConfig.baseUrl} + docs: https://nango.dev/docs/api-integrations/practicefusion + setup_guide_url: https://nango.dev/docs/api-integrations/practicefusion/how-to-register-your-own-practicefusion-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/practicefusion/connect + connection_config: + baseUrl: + type: string + title: Base URL + description: The base URL for your Practice authorization server + pattern: '^[a-zA-Z0-9.-]+\.(practice|patient)fusion\.com/.*$' + prefix: https:// + example: api.patientfusion.com/fhir/r4/v1/118b460b-8390-4754-8e4a-1dd5ee20f599/ + doc_section: '#step-1-find-your-base-url' + order: 1 + launch: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +productboard: + display_name: Productboard + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://app.productboard.com/oauth2/authorize + token_url: https://app.productboard.com/oauth2/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + headers: + x-version: '1' + base_url: https://api.productboard.com + docs: https://nango.dev/docs/integrations/all/productboard + +printful: + display_name: Printful + categories: + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://www.printful.com/oauth/authorize + token_url: https://www.printful.com/oauth/token + disable_pkce: true + authorization_url_replacements: + redirect_uri: redirect_url + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.printful.com + docs: https://nango.dev/docs/api-integrations/printful + setup_guide_url: https://nango.dev/docs/api-integrations/printful/how-to-register-your-own-printful-oauth-app + +procore: + display_name: Procore + categories: + - erp + auth_mode: OAUTH2 + authorization_url: https://login.procore.com/oauth/authorize + token_url: https://login.procore.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + post_connection_script: procorePostConnection + proxy: + headers: + procore-company-id: ${connectionConfig.companyId} + base_url: https://api.procore.com + retry: + at: + - 'x-rate-limit-reset' + docs: https://nango.dev/docs/api-integrations/procore + setup_guide_url: https://nango.dev/docs/api-integrations/procore/how-to-register-your-own-procore-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/procore/connect + connection_config: + companyId: + type: string + title: Company ID + description: Your Procore company ID + optional: true + example: '598134325779301' + pattern: '^[0-9]+$' + +provenexpert: + display_name: ProvenExpert + categories: + - marketing + auth_mode: BASIC + proxy: + base_url: https://www.provenexpert.com/api/ + verification: + method: POST + endpoints: + - v1/rating/summary/get + docs: https://nango.dev/docs/api-integrations/provenexpert + docs_connect: https://nango.dev/docs/api-integrations/provenexpert/connect + credentials: + username: + type: string + title: API ID + description: Your ProvenExpert API ID. + pattern: '^[A-Za-z0-9]{32}$' + example: '3yxp1qwZl5UAmyHZ5qRC2Sbpk5KAlEDZ' + doc_section: '#step-1-getting-your-credentials' + password: + type: string + title: API Key + description: Your ProvenExpert API Key. + secret: true + pattern: '^[A-Za-z0-9]{43}$' + example: 'M3A5NwykMKW1BRy6NRrxAwW2MzI3MxOmNRXzNzByMxW' + doc_section: '#step-1-getting-your-credentials' + +pverify: + display_name: pVerify + categories: + - other + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.apiHost}/Token + token_params: + Client_Id: ${credentials.clientId} + Client_Secret: ${credentials.clientSecret} + grant_type: client_credentials + token_headers: + content-type: application/x-www-form-urlencoded + Client-API-Id: ${credentials.clientId} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://${connectionConfig.apiHost} + headers: + client-api-id: ${credentials.clientId} + docs: https://nango.dev/docs/api-integrations/pverify + docs_connect: https://nango.dev/docs/api-integrations/pverify/connect + credentials: + clientId: + type: string + title: Client ID + description: Your pVerify Client ID. + example: f1c2d3a4-5b67-4c89-ae01-123456789abc + format: uuid + doc_section: '#step-1-getting-your-credentials' + clientSecret: + type: string + title: Client Secret + description: Your pVerify Client Secret. + secret: true + example: aB3mNpQr7sXwYz2t*************** + pattern: '^[A-Za-z0-9]+$' + doc_section: '#step-1-getting-your-credentials' + connection_config: + apiHost: + type: string + title: API Host + description: Your pVerify API hostname. + example: api.pverify.com + pattern: '^(api|testapi)\.pverify\.com$' + doc_section: '#step-1-getting-your-credentials' + +qualtrics: + display_name: Qualtrics + categories: + - surveys + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.qualtrics.com/oauth2/auth + token_url: https://${connectionConfig.subdomain}.qualtrics.com/oauth2/token + proxy: + base_url: https://${connectionConfig.subdomain}.qualtrics.com + docs: https://nango.dev/docs/integrations/all/qualtrics + connection_config: + subdomain: + type: string + title: Qualtrics Domain + description: The subdomain of your Qualtrics account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .qualtrics.com + prefix: https:// + +quentn: + display_name: Quentn + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.quentn.com/public/api + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v1/terms + docs: https://nango.dev/docs/api-integrations/quentn + docs_connect: https://nango.dev/docs/api-integrations/quentn/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Quentn API key. + secret: true + example: a1bcDeFgHi-jkLmNoPqRsTuVwXyZ0123456789AbCdE + pattern: '^[A-Za-z0-9_-]{43}$' + doc_section: '#step-1-getting-your-api-key' + connection_config: + subdomain: + type: string + title: Subdomain + description: Your Quentn account subdomain. + format: hostname + example: xk7mdf.eu-5 + suffix: .quentn.com/public/api + prefix: https:// + order: 1 + doc_section: '#step-2-finding-your-subdomain' + +quickbase: + display_name: Quickbase + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.quickbase.com/v1/ + headers: + qb-realm-hostname: ${connectionConfig.domain} + user-agent: ${connectionConfig.appDetails} || App (support@nango.dev) + authorization: QB-USER-TOKEN ${apiKey} + query: + apiKey: ${apiKey} + docs: https://nango.dev/docs/integrations/all/quickbase + docs_connect: https://nango.dev/docs/integrations/all/quickbase/connect + connection_config: + domain: + type: string + title: Realm Hostname + description: Your Quickbase Realm Hostname + example: demo.quickbase.com + format: hostname + doc_section: '#step-1-finding-your-realm-hostname' + appDetails: + type: string + title: App Details + description: The details of your app + automated: true + credentials: + apiKey: + type: string + title: User Token + description: Your User Token + pattern: '^[a-z0-9_-]+$' + example: bb_aa_xxxxxx_xxxxxxxxxxxxxxxxx + doc_section: '#step-2-finding-your-user-token' + +qualia: + display_name: Qualia + categories: + - legal + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.qualia.io/api + docs: https://nango.dev/docs/api-integrations/qualia + docs_connect: https://nango.dev/docs/api-integrations/qualia/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of the Qualia platform you want to connect to. + pattern: '^[a-z0-9-]+$' + example: connect + order: 1 + doc_section: '#step-1-finding-your-subdomain' + credentials: + username: + type: string + title: Username + description: Your Qualia organization username. + doc_section: '#step-2-finding-your-api-key' + password: + type: string + title: Password + description: Your Qualia API password. + secret: true + doc_section: '#step-2-finding-your-api-key' + +quickbooks: + display_name: Quickbooks + categories: + - accounting + - popular + auth_mode: OAUTH2 + authorization_url: https://appcenter.intuit.com/connect/oauth2 + token_url: https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer + redirect_uri_metadata: + - realmId + proxy: + connection_config: + realmId: ${connectionConfig.realmId} + base_url: https://quickbooks.api.intuit.com + docs: https://nango.dev/docs/api-integrations/quickbooks + setup_guide_url: https://nango.dev/docs/api-integrations/quickbooks/how-to-register-your-own-quickbooks-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/quickbooks/connect + connection_config: + realmId: + type: string + title: Quickbooks Realm ID + optional: true + description: The realmId of your quickbooks company + pattern: '^\d{10,19}$' + example: '9341453474484455' + doc_section: '#step-1-finding-your-realm-id' + +quickbooks-sandbox: + alias: quickbooks + display_name: Quickbooks (Sandbox) + categories: + - accounting + proxy: + connection_config: + realmId: ${connectionConfig.realmId} + base_url: https://sandbox-quickbooks.api.intuit.com + docs: https://nango.dev/docs/api-integrations/quickbooks-sandbox + setup_guide_url: https://nango.dev/docs/api-integrations/quickbooks/how-to-register-your-own-quickbooks-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/quickbooks-sandbox/connect + connection_config: + realmId: + type: string + title: Quickbooks Realm ID + optional: true + description: The realmId of your quickbooks sandbox company + pattern: '^\d{10,19}$' + example: '9341453474484455' + doc_section: '#step-1-finding-your-realm-id' + +quipteams: + display_name: Quipteams + categories: + - other + auth_mode: API_KEY + proxy: + base_url: https://api.quipteams.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /api/v1/quotes + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/api-integrations/quipteams + docs_connect: https://nango.dev/docs/api-integrations/quipteams/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Quipteams API key. + doc_section: '#step-1-finding-your-api-key' + +ragieai: + display_name: Ragie AI + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.ragie.ai + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /documents + docs: https://nango.dev/docs/integrations/all/ragieai + credentials: + apiKey: + type: string + title: API Key + description: The API key for your ragie.ai account + example: tnt_IZ56tqGVgX9_k8CKnxQ9MvQgzDXcDGgtcjXABkwusxSOR8QzwxxeA1B + pattern: '^tnt_[a-zA-Z0-9_]+$' + +ramp: + display_name: Ramp + categories: + - banking + auth_mode: OAUTH2 + authorization_url: https://app.ramp.com/v1/authorize + token_url: https://api.ramp.com/developer/v1/token + authorization_method: header + proxy: + base_url: https://api.ramp.com + docs: https://nango.dev/docs/integrations/all/ramp + +ramp-sandbox: + display_name: Ramp (Sandbox) + categories: + - banking + auth_mode: OAUTH2 + authorization_url: https://demo.ramp.com/v1/authorize + token_url: https://demo-api.ramp.com/developer/v1/token + authorization_method: header + proxy: + base_url: https://demo-api.ramp.com + docs: https://nango.dev/docs/integrations/all/ramp-sandbox + +rapidapi: + display_name: RapidAPI + categories: + - dev-tools + auth_mode: API_KEY + proxy: + headers: + x-rapidapi-key: ${apiKey} + x-rapidapi-host: ${connectionConfig.subdomain}.p.rapidapi.com + base_url: https://${connectionConfig.subdomain}.p.rapidapi.com + docs: https://nango.dev/docs/integrations/all/rapidapi + credentials: + apiKey: + type: string + title: API Key + description: The API key for your RapidAPI account + example: b7c156af2dmgh5c635305f3744bap168553jsp75193c8367ef + pattern: '^[a-zA-Z0-9]+$' + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of the Rapid API. + pattern: '^[a-z0-9_-]+$' + example: api-football-v1 + suffix: .p.rapidapi.com + prefix: https:// + +razorpay: + display_name: Razorpay + categories: + - payment + auth_mode: BASIC + proxy: + base_url: https://api.razorpay.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/orders + docs: https://nango.dev/docs/integrations/all/razorpay + docs_connect: https://nango.dev/docs/integrations/all/razorpay/connect + credentials: + username: + type: string + title: Key ID + description: Your Key ID + pattern: '^rzp_(test|live)_[A-Za-z0-9]+$' + example: 'rzp_test_*************' + doc_section: '#step-1-finding-your-key-id-and-secret' + password: + type: string + title: Key Secret + description: Your Key Secret + secret: true + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-1-finding-your-key-id-and-secret' + +read-ai: + display_name: Read.ai + categories: + - productivity + - video + auth_mode: OAUTH2 + authorization_url: https://authn.read.ai/oauth2/auth + token_url: https://authn.read.ai/oauth2/token + token_request_auth_method: basic + authorization_method: header + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.read.ai + docs: https://nango.dev/docs/api-integrations/read-ai + setup_guide_url: https://nango.dev/docs/api-integrations/read-ai/how-to-register-your-own-read-ai-oauth-app + +readwise: + display_name: Readwise + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://readwise.io/api/v2 + headers: + authorization: Token ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /auth + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/readwise + docs_connect: https://nango.dev/docs/integrations/all/readwise/connect + credentials: + apiKey: + type: string + title: Access Token + description: The Access Token for your Readwise account + example: zCDL1fUOpu4Cg3WMlMl1S7ecKsaBQlfCzw7sbVfc0wBqUJMI56 + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-1-generating-your-access-token' + +readwise-reader: + display_name: Readwise Reader + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://readwise.io/api/v3 + headers: + authorization: Token ${apiKey} + verification: + method: GET + headers: + content-type: application/json + base_url_override: https://readwise.io + endpoints: + - /api/v2/auth + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/readwise-reader + docs_connect: https://nango.dev/docs/integrations/all/readwise-reader/connect + credentials: + apiKey: + type: string + title: Access Token + description: The Access Token for your Readwise account + example: zCDL1fUOpu4Cg3WMlMl1S7ecKsaBQlfCzw7sbVfc0wBqUJMI56 + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-1-generating-your-access-token' + +recharge: + display_name: Recharge + categories: + - e-commerce + auth_mode: API_KEY + proxy: + headers: + x-recharge-access-token: ${apiKey} + base_url: https://api.rechargeapps.com + docs: https://nango.dev/docs/integrations/all/recharge + docs_connect: https://nango.dev/docs/integrations/all/recharge/connect + credentials: + apiKey: + type: string + title: API Token + description: The API Token for your Recharge account + example: sk_test_1p1_************************************************** + pattern: '^[a-zA-Z0-9_]+$' + doc_section: '#step-1-generating-your-api-token' + +recall-ai: + display_name: Recall.ai + categories: + - dev-tools + - productivity + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.region}.recall.ai + headers: + authorization: ${apiKey} + verification: + method: GET + endpoints: + - /api/v2/calendar-events + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/recall-ai + docs_connect: https://nango.dev/docs/api-integrations/recall-ai/connect + connection_config: + region: + type: string + title: Region + description: The region where your Recall.ai account is hosted. + enum: + - us-east-1 + - us-west-2 + - eu-central-1 + - ap-northeast-1 + order: 1 + doc_section: '#step-1-determine-your-region' + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Recall.ai account + example: 2d7843e2351dd4afa67eecfb5c723142fcb401b1 + pattern: '^[a-f0-9]{40}$' + doc_section: '#step-2-generating-your-api-key' + +recruitcrm: + display_name: Recruitcrm + categories: + - hr + - ats + auth_mode: API_KEY + proxy: + base_url: https://api.recruitcrm.io + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/candidates/search + docs: https://nango.dev/docs/integrations/all/recruitcrm + docs_connect: https://nango.dev/docs/integrations/all/recruitcrm/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Recruitcrm account + example: 9SKXL************************************** + doc_section: '#step-1-generating-your-api-key' + +recruitee: + display_name: Recruitee + categories: + - ats + auth_mode: API_KEY + proxy: + base_url: https://api.recruitee.com/c/${connectionConfig.companyId} + headers: + authorization: Bearer ${apiKey} + connection_config: + companyName: ${connectionConfig.companyName} + verification: + method: GET + endpoints: + - /departments + docs: https://nango.dev/docs/integrations/all/recruitee + docs_connect: https://nango.dev/docs/integrations/all/recruitee/connect + connection_config: + companyId: + type: string + title: Company ID + description: The Company ID for your Recruitee account + example: '126786' + pattern: '^[0-9]+$' + order: 1 + doc_section: '#step-1-finding-your-company-id-and-company-name' + companyName: + type: string + title: Company Name + description: The Company name for your Recruitee account + example: acme + optional: true + doc_section: '#step-1-finding-your-company-id-and-company-name' + credentials: + apiKey: + type: string + title: Personal API Token + description: The Personal API Token for your Recruitee account + example: 'OTlHOGlWNUFJRkErekoxd1lXMGd6dz09' + pattern: '^[A-Za-z0-9+/]+={0,2}$' + doc_section: '#step-2-generating-your-personal-api-token' + +recruiterflow: + display_name: Recruiterflow + categories: + - hr + - ats + auth_mode: API_KEY + proxy: + base_url: https://api.recruiterflow.com + headers: + rf-api-key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/external/user/list + docs: https://nango.dev/docs/integrations/all/recruiterflow + docs_connect: https://nango.dev/docs/integrations/all/recruiterflow/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Recruiterflow account + doc_section: '#step-1-generating-your-api-key' + example: 7b0c0d**************************** + pattern: '^[a-zA-Z0-9_]+$' + +render-mcp: + display_name: Render (MCP) + categories: + - dev-tools + - mcp + auth_mode: API_KEY + proxy: + base_url: https://mcp.render.com + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/api-integrations/render-mcp + docs_connect: https://nango.dev/docs/api-integrations/render-mcp/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Render API key from Account Settings. + doc_section: '#step-1-create-a-render-api-key' + example: rnd_**************************** + pattern: '^rnd_[A-Za-z0-9]+$' + +raindrop-mcp: + display_name: Raindrop (MCP) + categories: + - dev-tools + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://auth.raindrop.ai/oauth/2.1/authorize + token_url: https://auth.raindrop.ai/oauth/2.1/token + registration_url: https://auth.raindrop.ai/oauth/2.1/register + authorization_params: + response_type: code + resource: https://mcp.raindrop.ai/mcp + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://mcp.raindrop.ai + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/raindrop-mcp + +reddit: + display_name: Reddit + categories: + - social + auth_mode: OAUTH2 + authorization_url: https://www.reddit.com/api/v1/authorize + token_url: https://www.reddit.com/api/v1/access_token + authorization_method: header + authorization_params: + duration: permanent + proxy: + base_url: https://oauth.reddit.com + docs: https://nango.dev/docs/integrations/all/reddit + +redtail-crm-sandbox: + display_name: Redtail CRM (Sandbox) + categories: + - crm + auth_mode: TWO_STEP + token_url: https://review.crm.redtailtechnology.com/api/public/v1/authentication + token_request_method: GET + token_headers: + authorization: Basic ${base64(${credentials.apiKey}:${credentials.username}:${credentials.password})} + token_response: + token: authenticated_user.user_key + proxy: + headers: + authorization: Userkeyauth ${base64(${credentials.apiKey}:${accessToken})} + base_url: https://review.crm.redtailtechnology.com/api/public + docs: https://nango.dev/docs/integrations/all/redtail-crm-sandbox + docs_connect: https://nango.dev/docs/integrations/all/redtail-crm-sandbox/connect + credentials: + username: + type: string + title: Username + description: The username for your Redtail CRM account + doc_section: '#step-2-finding-your-credentials' + password: + type: string + title: Password + description: The password for your Redtail CRM account + secret: true + doc_section: '#step-2-finding-your-credentials' + apiKey: + type: string + title: API Key + description: The API Key for your Redtail CRM account + example: f1c2d3a4-5b67-4c89-ae01-123456789abc + format: uuid + secret: true + doc_section: '#step-1-finding-your-api-token' +refiner: + display_name: Refiner + categories: + - surveys + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.refiner.io/v1 + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /account + docs: https://nango.dev/docs/integrations/all/refiner + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Refiner account + +replicate: + display_name: Replicate + categories: + - dev-tools + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.replicate.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/account + docs: https://nango.dev/docs/integrations/all/replicate + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Replicate account + +reply-io: + display_name: Reply.io + categories: + - marketing + - communication + auth_mode: API_KEY + proxy: + base_url: https://api.reply.io + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v3/whoami + docs: https://nango.dev/docs/api-integrations/reply-io + docs_connect: https://nango.dev/docs/api-integrations/reply-io/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Reply.io account. + example: AKp2Bbuy**************** + pattern: '^[A-Za-z0-9_-]+$' + doc_section: '#step-1-finding-your-api-key' + +researchdesk: + display_name: ResearchDesk + categories: + - other + auth_mode: TWO_STEP + body_format: json + token_url: https://${connectionConfig.subdomain}.researchdesk.com/tokens + token_params: + email: ${credentials.email} + password: ${credentials.password} + token_headers: + content-type: application/json + token_response: + token: token + token_expiration: expires + token_expiration_strategy: expireAt + proxy: + base_url: https://${connectionConfig.subdomain}.researchdesk.com + headers: + authorization: Bearer ${accessToken} + docs: https://nango.dev/docs/api-integrations/researchdesk + docs_connect: https://nango.dev/docs/api-integrations/researchdesk/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of the environment to which you want to connect to. + enum: + - demand + - stage-demand + order: 1 + doc_section: '#step-1-choosing-your-subdomain' + credentials: + email: + type: string + title: Email + description: Your ResearchDesk account email + format: email + doc_section: '#step-2-finding-your-credentials' + password: + type: string + title: Password + description: Your ResearchDesk account password + secret: true + doc_section: '#step-2-finding-your-credentials' + +resend: + display_name: Resend + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://api.resend.com + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'retry-after' + verification: + method: GET + endpoints: + - /domains?limit=1 + docs: https://nango.dev/docs/api-integrations/resend + docs_connect: https://nango.dev/docs/api-integrations/resend/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Resend API key. + pattern: '^re_[A-Za-z0-9_]+$' + example: 're_HW***************************65L' + doc_section: '#step-1-getting-your-api-key' + +retell-ai: + display_name: Retell AI + categories: + - dev-tools + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.retellai.com + headers: + authorization: Bearer ${apiKey} + content-type: application/json + docs: https://nango.dev/docs/integrations/all/retell-ai + docs_connect: https://nango.dev/docs/integrations/all/retell-ai/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for Retell AI + example: key-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + doc_section: '#step-1-finding-your-retell-ai-api-key' + +revivn: + display_name: Revivn + categories: + - other + auth_mode: OAUTH2_CC + token_url: https://api.revivn.dev/oauth/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.revivn.dev + docs: https://nango.dev/docs/api-integrations/revivn + docs_connect: https://nango.dev/docs/api-integrations/revivn/connect + credentials: + client_id: + type: string + title: Client ID + description: Your Revivn OAuth2 client ID. + doc_section: '#step-1-get-your-oauth2-credentials' + client_secret: + type: string + title: Client Secret + description: Your Revivn OAuth2 client secret. + secret: true + doc_section: '#step-1-get-your-oauth2-credentials' + +ring-central: + display_name: RingCentral + categories: + - support + auth_mode: OAUTH2 + authorization_url: https://platform.ringcentral.com/restapi/oauth/authorize + token_url: https://platform.ringcentral.com/restapi/oauth/token + authorization_method: header + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://platform.ringcentral.com + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/ring-central + +ring-central-sandbox: + display_name: RingCentral (Sandbox) + categories: + - communication + auth_mode: OAUTH2 + authorization_url: https://platform.devtest.ringcentral.com/restapi/oauth/authorize + token_url: https://platform.devtest.ringcentral.com/restapi/oauth/token + authorization_method: header + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://platform.devtest.ringcentral.com + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/ring-central-sandbox + +ringover: + display_name: Ringover + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://public-api.ringover.com + headers: + authorization: ${apiKey} + docs: https://nango.dev/docs/api-integrations/ringover + docs_connect: https://nango.dev/docs/api-integrations/ringover/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Ringover API key. + example: 'a3f9e2***************************d8e9f0' + pattern: '^[a-f0-9]{40}$' + doc_section: '#step-1-generating-your-api-key' + +rippling: + display_name: Rippling + categories: + - hr + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + user-agent: Node.js/20.12.2 (linux; x64) + base_url: https://rest.ripplingapis.com + docs: https://nango.dev/docs/integrations/all/rippling + docs_connect: https://nango.dev/docs/integrations/all/rippling/connect + credentials: + apiKey: + type: string + title: API Token + description: The API Token for your Rippling account + doc_section: '#step-1-generating-your-api-token' + +rippling-shop-app: + display_name: Rippling Shop App + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://app.rippling.com/apps/PLATFORM/${connectionConfig.appName}/authorize + token_url: https://api.rippling.com/api/o/token/ + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.rippling.com + post_connection_script: ripplingShopAppPostConnection + docs: https://nango.dev/docs/integrations/all/rippling-shop-app + connection_config: + appName: + type: string + title: '' + description: '' + automated: true + +roam-scim: + display_name: Roam (SCIM API) + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.ro.am/scim + headers: + authorization: Bearer ${apiKey} + accept: application/json + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/Users + docs: https://nango.dev/docs/integrations/all/roam-scim + docs_connect: https://nango.dev/docs/integrations/all/roam-scim/connect + credentials: + apiKey: + type: string + title: SCIM API Token + description: The SCIM API token generated from your Roam organization settings. + example: rmk-uu9zt58h-EYHyLJ3ay4Mc-wuWQTOk-Y2yY-gZlW7Ys8AdVXBRZks_SGrCyZ09_IDvX9ikahdxushGYKcT77Fjw + pattern: '^rmk-[A-Za-z0-9_-]{86}$' + doc_section: '#step-1-generating-your-scim-api-token' + +robinhood-mcp: + display_name: Robinhood (MCP) + categories: + - payment + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://robinhood.com/oauth + token_url: https://api.robinhood.com/oauth2/token/ + registration_url: https://agent.robinhood.com/oauth/trading/register + authorization_params: + response_type: code + resource: https://agent.robinhood.com/mcp/trading + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://agent.robinhood.com + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/robinhood-mcp + +rock-gym-pro: + display_name: Rock Gym Pro + categories: + - crm + auth_mode: BASIC + proxy: + base_url: https://api.rockgympro.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/ping + paginate: + type: offset + offset_name_in_request: page + limit_name_in_request: limit + docs: https://nango.dev/docs/integrations/all/rock-gym-pro + credentials: + username: + type: string + title: API Username + description: Your Rock Gym Pro API username + password: + type: string + title: API Password + description: Your Rock Gym Pro API password + +roller: + display_name: Roller + categories: + - ticketing + auth_mode: OAUTH2_CC + token_url: https://api.roller.app/token + body_format: json + credentials: + client_id: + type: string + title: Client ID + description: Roller client ID + client_secret: + type: string + title: Client Secret + description: Roller client secret + proxy: + base_url: https://api.roller.app + + docs: https://nango.dev/docs/integrations/all/roller + +rocketreach: + display_name: RocketReach + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.rocketreach.co + headers: + api-key: ${apiKey} + retry: + at: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/rocketreach + docs_connect: https://nango.dev/docs/api-integrations/rocketreach/connect + credentials: + apiKey: + type: string + title: API Key + description: Your RocketReach API key. + example: 1e4dfd5***************************e3ca3a + pattern: '^[a-z0-9]+$' + doc_section: '#step-1-get-your-api-key' + +rootly: + display_name: Rootly + categories: + - dev-tools + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.rootly.com + verification: + method: GET + headers: + content-type: application/vnd.api+json + endpoints: + - /v1/users/me + docs: https://nango.dev/docs/api-integrations/rootly + docs_connect: https://nango.dev/docs/api-integrations/rootly/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Rootly account + example: rootly_db86a6β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’ + pattern: '^rootly_[a-f0-9]{64}$' + doc_section: '#step-1-generating-your-api-key' + +reapit: + display_name: Reapit Connect + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://connect.reapit.cloud/authorize + token_url: https://connect.reapit.cloud/token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://platform.reapit.cloud + headers: + api-version: ${connectionConfig.version} || 2020-01-31 + docs: https://nango.dev/docs/api-integrations/reapit + setup_guide_url: https://nango.dev/docs/api-integrations/reapit/how-to-register-your-own-reapit-oauth-app + connection_config: + version: + type: string + title: '' + description: '' + automated: true +rydoo: + display_name: Rydoo + categories: + - accounting + auth_mode: OAUTH2_CC + token_url: https://accounts.rydoo.com/connect/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.rydoo.com + docs: https://nango.dev/docs/api-integrations/rydoo + docs_connect: https://nango.dev/docs/api-integrations/rydoo/connect + credentials: + client_id: + type: string + title: Client ID + description: Your Rydoo Client ID. + client_secret: + type: string + title: Client Secret + description: Your Rydoo Client Secret. + secret: true + +segment: + display_name: Segment + categories: + - analytics + - marketing + auth_mode: OAUTH2 + authorization_url: https://id.segmentapis.com/oauth2/auth + token_url: https://id.segmentapis.com/oauth2/token + token_request_auth_method: basic + proxy: + base_url: https://api.segment.io + docs: https://nango.dev/docs/integrations/all/segment + +sage: + display_name: Sage + categories: + - accounting + - erp + auth_mode: OAUTH2 + authorization_url: https://www.sageone.com/oauth2/auth/central + token_url: https://oauth.accounting.sage.com/token + authorization_params: + filter: apiv3.1 + proxy: + base_url: https://api.accounting.sage.com + docs: https://nango.dev/docs/integrations/all/sage + +sage-200: + display_name: Sage 200 + categories: + - accounting + - erp + auth_mode: OAUTH2 + authorization_url: https://id.sage.com/authorize + token_url: https://id.sage.com/oauth/token + authorization_params: + audience: s200ukipd/sage200 + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + default_scopes: + - offline_access + scope_separator: ' ' + post_connection_script: sage200PostConnection + proxy: + base_url: https://api.columbus.sage.com/uk/${connectionConfig.edition} + headers: + x-company: ${connectionConfig.company_id} + x-site: ${connectionConfig.site_id} + docs: https://nango.dev/docs/api-integrations/sage-200 + setup_guide_url: https://nango.dev/docs/api-integrations/sage-200/how-to-register-your-own-sage-200-oauth-app + connection_config: + edition: + type: string + title: '' + description: '' + automated: true + company_id: + type: string + title: '' + description: '' + automated: true + site_id: + type: string + title: '' + description: '' + automated: true + +sage-hr: + display_name: Sage HR + categories: + - hr + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.sage.hr + headers: + x-auth-token: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/employees + docs: https://nango.dev/docs/integrations/all/sage-hr + docs_connect: https://nango.dev/docs/integrations/all/sage-hr/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Sage HR account + doc_section: '#step-1-enabling-api-access' + example: apikey**************************** + pattern: '^[a-zA-Z0-9.]+$' + connection_config: + subdomain: + type: string + title: Sage HR Subdomain + description: The subdomain of your Sage HR account + pattern: '^[a-zA-Z0-9-]+$' + example: subdomain + suffix: .sage.hr + prefix: https:// + +sage-intacct-oauth: + display_name: Sage Intacct (OAuth) + categories: + - accounting + - erp + - popular + auth_mode: OAUTH2 + authorization_url: https://api.intacct.com/ia/api/v1/oauth2/authorize + token_url: https://api.intacct.com/ia/api/v1/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.intacct.com/ia/api + docs: https://nango.dev/docs/integrations/all/sage-intacct-oauth + +sage-intacct-cc: + display_name: Sage Intacct (Client Credentials) + categories: + - accounting + - erp + auth_mode: TWO_STEP + body_format: form + token_url: https://api.intacct.com/ia/api/v1/oauth2/token + token_params: + grant_type: client_credentials + client_id: ${credentials.clientId} + client_secret: ${credentials.clientSecret} + username: ${credentials.username} + session_id: ${credentials.sessionId} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://api.intacct.com/ia/api + docs: https://nango.dev/docs/api-integrations/sage-intacct-cc + docs_connect: https://nango.dev/docs/api-integrations/sage-intacct-cc/connect + setup_guide_url: https://nango.dev/docs/api-integrations/sage-intacct-cc/connect + credentials: + clientId: + type: string + title: Client ID + description: Your Sage Intacct application Client ID. + clientSecret: + type: string + title: Client Secret + description: Your Sage Intacct application Client Secret. + secret: true + username: + type: string + title: Username + description: The Web Services user ID in userId@companyId|entityId format. Required if not using Session ID. + example: Admin@MyCompany|Central Region + optional: true + sessionId: + type: string + title: Session ID + description: A valid UI or API session ID. Required if not using Username. + secret: true + optional: true + +sage-intacct: + display_name: Sage Intacct + categories: + - accounting + - erp + auth_mode: TWO_STEP + proxy: + base_url: https://api.intacct.com/ia/xml/xmlgw.phtml + token_url: https://api.intacct.com/ia/xml/xmlgw.phtml + body_format: xml + token_params: + request: + control: + senderid: ${credentials.senderId} + password: ${credentials.senderPassword} + controlid: ${now} + uniqueid: false + dtdversion: '3.0' + includewhitespace: false + operation: + authentication: + login: + userid: ${credentials.userId} + companyid: ${credentials.companyId} + password: ${credentials.userPassword} + content: + function: + $controlid: '{{$guid}}' + getAPISession: '' + token_headers: + content-type: application/xml + token_response: + token: response.operation.result.data.api.sessionid + token_expiration: response.operation.authentication.sessiontimeout + token_expiration_strategy: expireAt + docs: https://nango.dev/docs/integrations/all/sage-intacct + docs_connect: https://nango.dev/docs/integrations/all/sage-intacct/connect + credentials: + senderId: + type: string + title: Sender ID + description: Your Sage Intacct Sender ID + doc_section: '#step-1-how-to-retrieve-the-sender-id' + senderPassword: + type: string + title: Sender Password + description: Your Sage Intacct Sender Password + secret: true + userId: + type: string + title: User ID + description: Your Sage Intacct User ID + doc_section: '#step-2-how-to-retrieve-the-user-id' + companyId: + type: string + title: Company ID + description: Your Sage Intacct Company ID + doc_section: '#step-3-how-to-retrieve-the-company-id' + userPassword: + type: string + title: User Password + description: Your Sage Intacct User Password + secret: true + +sage-people: + display_name: Sage People + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://login.salesforce.com/services/oauth2/authorize + token_url: https://login.salesforce.com/services/oauth2/token + authorization_params: + prompt: consent + default_scopes: + - offline_access + - api + proxy: + base_url: https://${connectionConfig.instance_url}/services/apexrest/spapi + headers: + accept: application/json + token_response_metadata: + - instance_url + docs: https://nango.dev/docs/integrations/all/sage-people + docs_connect: https://nango.dev/docs/integrations/all/sage-people/connect + connection_config: + instance_url: + type: string + title: Instance URL + description: The instance URL of your Salesforce account + format: uri + pattern: '^https?://.*$' + automated: true + +sap-ariba: + display_name: SAP Ariba + categories: + - erp + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.subdomain}.ariba.com/v2/oauth/token + token_params: + grant_type: openapi_2lo + token_request_auth_method: basic + body_format: form + proxy: + base_url: https://open${connectionConfig.subdomain}.ariba.com + headers: + apikey: ${connectionConfig.apiKey} + x-ariba-network-id: ${connectionConfig.anid} + retry: + after: + - retry-after + docs: https://nango.dev/docs/api-integrations/sap-ariba + docs_connect: https://nango.dev/docs/api-integrations/sap-ariba/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: Your SAP Ariba API subdomain. + example: api-eu + default_value: api + enum: + - api + - api-eu + - api.au.cloud + doc_section: '#step-1-select-your-subdomain' + order: 1 + apiKey: + type: string + title: Application Key (API Key) + description: Your SAP Ariba application's API Key. + secret: true + doc_section: '#step-2-get-your-api-key' + order: 2 + anid: + type: string + title: Ariba Network ID (ANID) + description: Your SAP Ariba Network ID. + example: AN01234567890 + pattern: '^AN[0-9]+$' + doc_section: '#step-3-find-your-anid' + order: 3 + +salesforce: + display_name: Salesforce + categories: + - crm + - popular + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.hostname}/services/oauth2/authorize || https://login.salesforce.com/services/oauth2/authorize + token_url: https://${connectionConfig.hostname}/services/oauth2/token || https://login.salesforce.com/services/oauth2/token + authorization_params: + prompt: consent + default_scopes: + - offline_access + token_response_metadata: + - instance_url + proxy: + base_url: ${connectionConfig.instance_url} + webhook_routing_script: salesforceWebhookRouting + post_connection_script: salesforcePostConnection + docs: https://nango.dev/docs/api-integrations/salesforce + setup_guide_url: https://nango.dev/docs/api-integrations/salesforce/salesforce-api-oauth-app-setup + docs_connect: https://nango.dev/docs/api-integrations/salesforce/connect + connection_config: + instance_url: + type: string + title: Instance URL + description: The instance URL of your Salesforce account + format: uri + pattern: '^https?://.*$' + automated: true + hostname: + type: string + title: Hostname + description: The hostname to your Salesforce instance + pattern: '^(?!(?:.*\.)?[Ll][Ii][Gg][Hh][Tt][Nn][Ii][Nn][Gg]\.([Ff][Oo][Rr][Cc][Ee]|[Ss][Aa][Ll][Ee][Ss][Ff][Oo][Rr][Cc][Ee])\.[Cc][Oo][Mm]$)[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$' + example: acme.my.salesforce.com + prefix: https:// + optional: true + doc_section: '#step-1-finding-your-hostname' + +salesforce-cc: + display_name: Salesforce (Client Credentials) + categories: + - crm + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.hostname}/services/oauth2/token + token_params: + grant_type: client_credentials + token_response_metadata: + - instance_url + proxy: + base_url: ${connectionConfig.instance_url} + docs: https://nango.dev/docs/api-integrations/salesforce-cc + docs_connect: https://nango.dev/docs/api-integrations/salesforce-cc/connect + token_expires_in_ms: 0 + connection_config: + instance_url: + type: string + title: '' + description: '' + automated: true + hostname: + type: string + title: Hostname + description: The hostname to your Salesforce instance + pattern: '^(?!(?:.*\.)?[Ll][Ii][Gg][Hh][Tt][Nn][Ii][Nn][Gg]\.([Ff][Oo][Rr][Cc][Ee]|[Ss][Aa][Ll][Ee][Ss][Ff][Oo][Rr][Cc][Ee])\.[Cc][Oo][Mm]$)[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$' + example: acme.my.salesforce.com + prefix: https:// + +salesforce-jwt: + display_name: Salesforce (JWT) + categories: + - crm + auth_mode: TWO_STEP + signature: + protocol: RSA + body_format: form + token: + signing_key: ${credentials.privateKey} + expires_in_ms: 3600000 + header: + alg: RS256 + typ: JWT + payload: + iss: ${credentials.clientId} + aud: https://${connectionConfig.authorizationUrl} + sub: ${credentials.username} + token_url: https://${connectionConfig.authorizationUrl}/services/oauth2/token + token_params: + grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer + assertion: ${token} + token_response: + token: access_token + token_response_metadata: + - instance_url + proxy: + base_url: ${connectionConfig.instance_url} + token_expires_in_ms: 0 + docs: https://nango.dev/docs/api-integrations/salesforce-jwt + docs_connect: https://nango.dev/docs/api-integrations/salesforce-jwt/connect + connection_config: + authorizationUrl: + type: string + title: Authorization Server URL + description: Your Salesforce authorization server URL. + format: hostname + example: 'login.salesforce.com' + doc_section: '#step-5-finding-the-authorization-server-url' + credentials: + clientId: + type: string + title: Consumer Key + example: 3MVG9dAEux2v1sLsg0e52***************CJpGsXgqg8E + description: The Consumer Key from your Salesforce Connected App. + doc_section: '#step-3-get-consumer-key-and-consumer-secret' + clientSecret: + type: string + title: Consumer Secret + example: 954F73F4C234***************9D069B8FCF83B5 + pattern: '^[A-F0-9]{64}$' + description: The Consumer Secret from your Salesforce Connected App. + doc_section: '#step-3-get-consumer-key-and-consumer-secret' + username: + type: string + title: Username + description: The Salesforce username of the user the JWT will act on behalf of. + format: email + example: john@acme.com + doc_section: '#step-6-finding-the-username' + privateKey: + type: string + title: Private Key + description: The private key that matches the certificate you uploaded to the Connected App. + example: '-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n-----END PRIVATE KEY-----' + doc_section: '#step-1-create-a-private-key-and-self-signed-digital-certificate' + +salesforce-sandbox: + display_name: Salesforce (Sandbox) + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://test.salesforce.com/services/oauth2/authorize + token_url: https://test.salesforce.com/services/oauth2/token + default_scopes: + - offline_access + token_response_metadata: + - instance_url + proxy: + base_url: ${connectionConfig.instance_url} + docs: https://nango.dev/docs/api-integrations/salesforce-sandbox + setup_guide_url: https://nango.dev/docs/api-integrations/salesforce-sandbox/how-to-register-your-own-salesforce-sandbox-api-oauth-app + connection_config: + instance_url: + type: string + title: Instance URL + description: The instance URL of your Salesforce account + format: uri + pattern: '^https?://.*$' + automated: true + +salesforce-experience-cloud: + display_name: Salesforce Experience Cloud + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.my.site.com/services/oauth2/authorize + token_url: https://${connectionConfig.subdomain}.my.site.com/services/oauth2/token + default_scopes: + - offline_access + token_response_metadata: + - instance_url + proxy: + base_url: ${connectionConfig.instance_url} + docs: https://nango.dev/docs/integrations/all/salesforce-experience-cloud + connection_config: + subdomain: + type: string + title: Salesforce Domain + description: The subdomain of your Salesforce Experience Cloud account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .my.site.com + prefix: https:// + instance_url: + type: string + title: Instance URL + description: The instance URL of your Salesforce Experience Cloud account + format: uri + pattern: '^https?://.*$' + automated: true +salesforce-cdp: + display_name: Salesforce (Data Cloud) + categories: + - storage + auth_mode: TWO_STEP + token_url: https://login.salesforce.com/services/oauth2/token + body_format: form + token_params: + grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer + assertion: ${credentials.jwt} + token_headers: + content-type: application/x-www-form-urlencoded + additional_steps: + - body_format: form + token_params: + grant_type: urn:salesforce:grant-type:external:cdp + subject_token: ${step1.access_token} + subject_token_type: urn:ietf:params:oauth:token-type:access_token + token_headers: + content-type: application/x-www-form-urlencoded + token_url: ${step1.instance_url}/services/a360/token + token_response_metadata: + - instance_url + proxy: + base_url: ${connectionConfig.instance_url} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/integrations/all/salesforce-cdp + docs_connect: https://nango.dev/docs/integrations/all/salesforce-cdp/connect + credentials: + jwt: + type: string + title: Encoded JWT + description: This is your pre-generated, encoded JSON Web Token (JWT) + secret: true + doc_section: '#step-1-generating-your-encoded-jwt' + +salesmsg: + display_name: Salesmsg (PAT) + categories: + - communication + - marketing + auth_mode: TWO_STEP + body_format: json + token_url: https://api.salesmessage.com/pub/v2.2/oauth/personal-token/refresh + token_headers: + authorization: Bearer ${credentials.apiKey} + content-type: application/json + refresh_token_headers: + authorization: Bearer ${refresh_token} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + refresh_token: access_token + proxy: + base_url: https://api.salesmessage.com/pub/ + headers: + authorization: Bearer ${accessToken} + docs: https://nango.dev/docs/api-integrations/salesmsg + docs_connect: https://nango.dev/docs/api-integrations/salesmsg/connect + credentials: + apiKey: + type: string + title: Personal Access Token + description: Your Salesmsg Personal Access Token (PAT). + example: eyJhbGciOi***.eyJzdWIiOi***.xxxxxxxxxxxx + pattern: '^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$' + doc_section: '#step-1-generating-your-personal-access-token' + +salesmsg-oauth2: + display_name: Salesmsg (OAuth2) + categories: + - communication + - marketing + auth_mode: OAUTH2 + authorization_url: https://app.salesmessage.com/auth/oauth + token_url: https://api.salesmessage.com/pub/v2.2/oauth/token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.salesmessage.com/pub/ + docs: https://nango.dev/docs/api-integrations/salesmsg-oauth2 + setup_guide_url: https://nango.dev/docs/api-integrations/salesmsg-oauth2/how-to-register-your-own-salesmsg-oauth-app + +sap-fieldglass: + display_name: SAP Fieldglass + categories: + - erp + body_format: form + auth_mode: TWO_STEP + token_url: https://${connectionConfig.domain}/api/oauth2/v2.0/token?grant_type=client_credentials&response_type=token + token_headers: + authorization: Basic ${base64(${credentials.clientId}:${credentials.clientSecret})} + X-ApplicationKey: ${credentials.appKey} + proxy: + base_url: https://${connectionConfig.domain}/api + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/integrations/all/sap-fieldglass + docs_connect: https://nango.dev/docs/integrations/all/sap-fieldglass/connect + credentials: + clientId: + type: string + title: Client ID + description: Your SAP Fieldglass application Client ID + doc_section: '#step-1-generating-an-application' + clientSecret: + type: string + title: Client secret + description: Your SAP Fieldglass application Client secret + secret: true + doc_section: '#step-1-generating-an-application' + appKey: + type: string + title: Application Key + description: Your SAP Fieldglass application key + secret: true + optional: true + doc_section: '#step-1-generating-an-application' + connection_config: + domain: + type: string + title: Domain + description: Your SAP Fieldglass environment URL + example: auth.fieldglass.net + prefix: https:// + pattern: '^(?:[a-zA-Z0-9_-]+-(?:auth\.)?fgvms\.com|auth\.fieldglass\.net|sso\.fieldglass\.eu)$' + doc_section: '#step-2-determining-your-domain' + +sap-concur: + display_name: SAP Concur + categories: + - erp + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.region}.api.concursolutions.com/oauth2/v0/token + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.region}.api.concursolutions.com + docs: https://nango.dev/docs/integrations/all/sap-concur + docs_connect: https://nango.dev/docs/integrations/all/sap-concur/connect + connection_config: + companyUUID: + type: string + title: Company UUID + description: The unique identifier for your SAP Concur company + doc_section: '#step-2-generate-company-request-token' + companyRequestToken: + type: string + title: Company Request Token + description: The request token generated for the company + doc_section: '#step-2-generate-company-request-token' + region: + type: string + title: Region + description: The SAP Concur Data Center region (e.g., `us`, `eu`, `cn`) + example: us + doc_section: '#step-3-determine-your-region' + +sap-concur-password: + display_name: SAP Concur (Password Grant) + categories: + - erp + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.region}.api.concursolutions.com/oauth2/v0/token + token_params: + grant_type: password + client_id: ${credentials.clientId} + client_secret: ${credentials.clientSecret} + username: ${credentials.username} + password: ${credentials.password} + token_headers: + content-type: application/x-www-form-urlencoded + token_response: + token: access_token + refresh_token: refresh_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://${connectionConfig.region}.api.concursolutions.com + docs: https://nango.dev/docs/api-integrations/sap-concur-password + docs_connect: https://nango.dev/docs/api-integrations/sap-concur-password/connect + credentials: + username: + type: string + title: Username + description: Your SAP Concur username or userId. + doc_section: '#step-2-get-your-user-credentials' + password: + type: string + title: Password + secret: true + description: Your SAP Concur account password. + doc_section: '#step-2-get-your-user-credentials' + clientId: + type: string + title: Client ID + description: Your OAuth application client_id supplied by App Management. + doc_section: '#step-1-get-your-client-credentials' + clientSecret: + type: string + title: Client Secret + secret: true + description: Your OAuth application client_secret supplied by App Management. + doc_section: '#step-1-get-your-client-credentials' + connection_config: + region: + type: string + title: Region + description: The SAP Concur Data Center region. + example: us + pattern: '^[a-z0-9-]+$' + order: 1 + doc_section: '#step-3-determine-your-region' + +sap-business-one: + display_name: SAP Business One + categories: + - erp + body_format: json + auth_mode: TWO_STEP + token_url: https://${connectionConfig.domain}/Login + token_params: + CompanyDB: ${connectionConfig.companyDb} + UserName: ${credentials.userName} + DBInstance: ${connectionConfig.dbInstance} + Password: ${credentials.password} + token_headers: + content-type: application/json + token_expires_in_ms: 1700000 + proxy: + base_url: https://${connectionConfig.domain} + headers: + cookie: ${credentials._cookies} + token_response: + token: SessionId + token_response_headers: + - set-cookie + docs: https://nango.dev/docs/integrations/all/sap-business-one + docs_connect: https://nango.dev/docs/integrations/all/sap-business-one/connect + connection_config: + domain: + type: string + title: Service Layer URL + prefix: https:// + suffix: /Login + pattern: '^[A-Za-z0-9.-]+(?::\d+(?:/[-A-Za-z0-9.]*)*)?$' + order: 1 + description: The base URL for your SAP Business One Service Layer + doc_section: '#step-3-finding-your-service-layer-url' + companyDb: + type: string + title: Company Database Name + description: The name of your SAP Business One company database + example: 10COR0809H + order: 2 + doc_section: '#step-2-identifying-your-company-database' + dbInstance: + type: string + title: Database Instance + description: The database server instance name + optional: true + order: 3 + example: C200@10.58.114.200:30013 + doc_section: '#step-4-finding-your-database-instance' + credentials: + userName: + type: string + title: Username + description: Your SAP Business One username + doc_section: '#step-1-obtaining-your-credentials' + password: + type: string + title: Password + description: Your SAP Business One password + secret: true + doc_section: '#step-1-obtaining-your-credentials' + +sap-success-factors: + display_name: SAP SuccessFactors + categories: + - hr + body_format: form + auth_mode: TWO_STEP + token_url: https://${connectionConfig.apiServer}/oauth/token + token_params: + company_id: ${connectionConfig.companyId} + client_id: ${credentials.apiKey} + grant_type: urn:ietf:params:oauth:grant-type:saml2-bearer + assertion: ${credentials.assertion} + new_token: true + assertion: + type: saml + key: ${assertionOption.privateKey} + issuer: www.successfactors.com + lifetimeInSeconds: '315360000' + audiences: www.successfactors.com + attributes: + api_key: ${credentials.apiKey} + use_username: true + use_email: false + external_user: false + sessionIndex: ${random} + nameIdentifier: ${assertionOption.userName} + recipient: https://${connectionConfig.apiServer}/oauth/token + token_headers: + content-type: application/x-www-form-urlencoded + proxy: + base_url: https://${connectionConfig.apiServer} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/api-integrations/sap-success-factors + docs_connect: https://nango.dev/docs/api-integrations/sap-success-factors/connect + connection_config: + apiServer: + type: string + title: API Server + description: The API Server to connect to your SAP SuccessFactors account + format: hostname + example: api41preview.sapsf.com + prefix: https:// + doc_section: '#step-1-finding-your-api-server' + order: 1 + companyId: + type: string + title: Company ID + description: The company ID of your SAP SuccessFactors account + example: SFSALES012345 + pattern: '^[A-Za-z0-9]+$' + doc_section: '#step-2-finding-your-company-id' + order: 2 + credentials: + apiKey: + type: string + title: API Key + description: The API key for your SAP SuccessFactors account + secret: true + example: YzA4MTVhMTQzZTUzMjc3NTk0ZDY2Nzc1ZmVkOA + pattern: ^[A-Za-z0-9+/]{32,44}={0,2}$ + doc_section: '#step-3-finding-your-api-key-and-private-key' + assertion: + type: string + title: '' + description: '' + automated: true + assertion_option: + userName: + type: string + title: Username + description: The username of your SAP SuccessFactors account + example: johnDoe + doc_section: '#step-4-finding-your-username' + privateKey: + type: string + title: Private Key + description: The Private Key for your SAP SuccessFactors Oauth Client + doc_section: '#step-3-finding-your-api-key-and-private-key' + +sap-odata-oauth2-cc: + display_name: SAP S/4HANA Cloud (Client Credentials) + categories: + - erp + - popular + token_request_auth_method: basic + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.subdomain}.authentication.${connectionConfig.region}.hana.ondemand.com/oauth/token + token_params: + grant_type: client_credentials + scope_separator: ',' + proxy: + base_url: https://${connectionConfig.apiServer} + docs: https://nango.dev/docs/api-integrations/sap-odata-oauth2-cc + docs_connect: https://nango.dev/docs/api-integrations/sap-odata-oauth2-cc/connect + connection_config: + subdomain: + type: string + title: Subdomain + prefix: https:// + pattern: '^[a-z0-9_-]+$' + example: acme + suffix: /hana.ondemand.com + order: 1 + description: The subdomain where your SAP S/4HANA cloud instance is hosted + doc_section: '#step-2-finding-your-subdomain' + region: + type: string + title: Region + description: The region where your SAP S/4HANA cloud instance is hosted + example: eu10 + order: 2 + doc_section: '#step-3-finding-your-region' + apiServer: + type: string + title: API Server + description: The API base URL of the SAP S/4HANA cloud API service you want to connect to + pattern: '^[A-Za-z0-9.-]+(?::\d+(?:/[-A-Za-z0-9.]*)*)?$' + prefix: https:// + format: hostname + example: eu10.cfapps.eu10.hana.ondemand.com + doc_section: '#step-4-finding-your-api-server' + order: 3 + +sap-odata-basic: + display_name: SAP S/4HANA Cloud (Basic Auth) + categories: + - erp + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.apiServer} + docs: https://nango.dev/docs/api-integrations/sap-odata-basic + docs_connect: https://nango.dev/docs/api-integrations/sap-odata-basic/connect + connection_config: + apiServer: + type: string + title: API Server + description: The API base URL of the SAP S/4HANA cloud API service you want to connect to + pattern: '^[A-Za-z0-9.-]+(?::\d+(?:/[-A-Za-z0-9.]*)*)?$' + prefix: https:// + example: eu10.cfapps.eu10.hana.ondemand.com + doc_section: '#step-2-finding-your-api-server' + order: 1 + +schwab: + display_name: Schwab + categories: + - banking + - accounting + auth_mode: OAUTH2 + authorization_url: https://api.schwabapi.com/v1/oauth/authorize + token_url: https://api.schwabapi.com/v1/oauth/token + token_request_auth_method: basic + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.schwabapi.com + docs: https://nango.dev/docs/api-integrations/schwab + setup_guide_url: https://nango.dev/docs/api-integrations/schwab/how-to-register-your-own-schwab-oauth-app + +scrapedo: + display_name: Scrape.do + categories: + - other + auth_mode: API_KEY + proxy: + base_url: https://api.scrape.do + query: + token: ${apiKey} + docs: https://nango.dev/docs/integrations/all/scrapedo + docs_connect: https://nango.dev/docs/integrations/all/scrapedo/connect + credentials: + apiKey: + type: string + title: API Token + description: The API Token for your Scrape.do account + example: 3c12d71308a346c41d10b19a2b2ac1ea5cacb53588d + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-1-finding-your-api-key' + +salesloft: + display_name: Salesloft + categories: + - marketing + auth_mode: OAUTH2 + authorization_url: https://accounts.salesloft.com/oauth/authorize + token_url: https://accounts.salesloft.com/oauth/token + proxy: + base_url: https://api.salesloft.com + docs: https://nango.dev/docs/integrations/all/salesloft + +sendgrid: + display_name: SendGrid + categories: + - marketing + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.sendgrid.com + docs: https://nango.dev/docs/integrations/all/sendgrid + docs_connect: https://nango.dev/docs/integrations/all/sendgrid/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Sendgrid account + doc_section: '#step-1-generating-your-sendgrid-api-key' + +semrush: + display_name: Semrush (v3) + categories: + - marketing + - analytics + auth_mode: API_KEY + proxy: + base_url: https://api.semrush.com + query: + key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /management/v1/projects + docs: https://nango.dev/docs/integrations/all/semrush + docs_connect: https://nango.dev/docs/integrations/all/semrush/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Semrush API key + doc_section: '#step-1-finding-your-api-key' + +sentinelone: + display_name: SentinelOne + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.hostname} + headers: + authorization: ApiToken ${apiKey} + accept: application/json + content-type: application/json + verification: + method: GET + endpoints: + - /web/api/v2.1/sites?limit=1 + docs: https://nango.dev/docs/api-integrations/sentinelone + docs_connect: https://nango.dev/docs/api-integrations/sentinelone/connect + connection_config: + hostname: + type: string + title: Hostname + description: The hostname of your SentinelOne management console + format: hostname + prefix: https:// + example: your-tenant.sentinelone.net + doc_section: '#step-2-find-your-hostname' + order: 1 + credentials: + apiKey: + type: string + title: API Token + description: The API token for your SentinelOne service user + doc_section: '#step-1-generate-your-api-token' + +sentry: + display_name: Sentry + categories: + - dev-tools + - analytics + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.hostname}/api + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/integrations/all/sentry + docs_connect: https://nango.dev/docs/integrations/all/sentry/connect + connection_config: + hostname: + type: string + title: Hostname + description: The Hostname of your Sentry account. + format: hostname + enum: + - sentry.io + - us.sentry.io + - eu.sentry.io + - de.sentry.io + order: 1 + doc_section: '#step-1-finding-your-hostname' + credentials: + apiKey: + type: string + title: Auth Token + description: The Authentication token for your Sentry account + example: sntryu_795225***************b9864a********************* + pattern: '^sntryu_[a-f0-9]{64}$' + doc_section: '#step-2-generating-your-sentry-auth-token' + +sentry-oauth: + display_name: Sentry (Public Integrations) + installation: outbound + categories: + - dev-tools + - analytics + auth_mode: OAUTH2 + token_url: https://sentry.io/api/0/sentry-app-installations/${connectionConfig.installation.uuid}/authorizations/ + webhook_routing_script: sentryOauthWebhookRouting + post_connection_script: sentryOauthPostConnection + authorization_code_param_in_webhook: data.installation.code + webhook_response_metadata: + - installation.uuid + proxy: + base_url: https://${connectionConfig.hostname}/api + connection_config: + actor: ${connectionConfig.actor} + docs: https://nango.dev/docs/integrations/all/sentry-oauth + docs_connect: https://nango.dev/docs/integrations/all/sentry-oauth/connect + connection_config: + hostname: + type: string + title: Hostname + description: The Hostname of your Sentry account. + format: hostname + enum: + - sentry.io + - us.sentry.io + - eu.sentry.io + - de.sentry.io + order: 1 + doc_section: '#step-1-finding-your-hostname' + actor: + type: string + title: User ID + description: The unique identifier of the user who will accept and install the public integration + doc_section: '#step-2-finding-your-user-id' + installation.uuid: + type: string + title: '' + description: '' + automated: true + +sedna: + display_name: Sedna (OAuth) + auth_mode: OAUTH2_CC + categories: + - communication + proxy: + base_url: https://${connectionConfig.tenant}.sednanetwork.com/platform + token_url: https://${connectionConfig.tenant}.sednanetwork.com/platform/oauth/token + token_params: + grant_type: client_credentials + scope_separator: ',' + docs: https://nango.dev/docs/integrations/all/sedna + connection_config: + tenant: + type: string + title: Tenant + description: The tenant name to your sedna account + +sedna-basic: + display_name: Sedna (Basic Auth) + auth_mode: BASIC + categories: + - communication + proxy: + base_url: https://${connectionConfig.tenant}.sednanetwork.com/platform + docs: https://nango.dev/docs/integrations/all/sedna-basic + connection_config: + tenant: + type: string + title: Tenant + description: The tenant name to your sedna account + +setmore: + display_name: Setmore + categories: + - productivity + auth_mode: TWO_STEP + token_request_method: GET + token_url: https://developer.setmore.com/api/v1/o/oauth2/token?refreshToken=${credentials.refreshToken} + proxy: + base_url: https://developer.setmore.com/api + token_response: + token: data.token.access_token + token_expiration: data.token.expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/integrations/all/setmore + docs_connect: https://nango.dev/docs/integrations/all/setmore/connect + credentials: + refreshToken: + type: string + title: Access Token + pattern: '^r1\/[A-Za-z0-9\-]+$' + example: r1/Ab12Cd34Ef56Gh78Ij90KlMnOpQr-StUvWxYz123456 + description: The access token provided to you by Setmore team + doc_section: '#step-1-requesting-access-to-the-api' + +sellercloud: + display_name: Sellercloud + categories: + - e-commerce + auth_mode: TWO_STEP + proxy: + base_url: ${connectionConfig.restApiEndpoint} + token_request_method: GET + token_url: https://api.sellercloud.com/api/server-by-team/?team=${credentials.teamName} + additional_steps: + - body_format: json + token_params: + Username: ${credentials.username} + Password: ${credentials.password} + token_url: ${step1.restApiEndpoint}/api/token + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + token_response_metadata: + - restApiEndpoint + docs: https://nango.dev/docs/api-integrations/sellercloud + docs_connect: https://nango.dev/docs/api-integrations/sellercloud/connect + connection_config: + restApiEndpoint: + type: string + title: '' + description: '' + automated: true + credentials: + teamName: + type: string + title: Team Name + description: Your Sellercloud team name + example: myteam + doc_section: '#step-1-finding-your-team-name' + username: + type: string + title: Username + description: Your Sellercloud username + doc_section: '#step-2-identifying-your-credentials' + password: + type: string + title: Password + description: Your Sellercloud password + secret: true + doc_section: '#step-2-identifying-your-credentials' + +sellsy: + display_name: Sellsy + auth_mode: OAUTH2 + categories: + - invoicing + - accounting + - crm + authorization_url: https://login.sellsy.com/oauth2/authorization + token_url: https://login.sellsy.com/oauth2/access-tokens + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.sellsy.com + webhook_routing_script: sellsyWebhookRouting + webhook_user_defined_secret: true + post_connection_script: sellsyPostConnection + docs: https://nango.dev/docs/integrations/all/sellsy + +sellsy-oauth2-cc: + display_name: Sellsy (Client Credentials) + auth_mode: OAUTH2_CC + categories: + - invoicing + - accounting + - crm + token_url: https://login.sellsy.com/oauth2/access-tokens + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.sellsy.com + webhook_routing_script: sellsyWebhookRouting + webhook_user_defined_secret: true + post_connection_script: sellsyPostConnection + docs: https://nango.dev/docs/integrations/all/sellsy-oauth2-cc + docs_connect: https://nango.dev/docs/integrations/all/sellsy-oauth2-cc/connect + credentials: + client_id: + type: string + title: Client ID + description: Your Client ID + client_secret: + type: string + title: Secret shopper + description: Your Secret shopper + +servicem8: + display_name: ServiceM8 + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://go.servicem8.com/oauth/authorize + token_url: https://go.servicem8.com/oauth/access_token + proxy: + base_url: https://api.servicem8.com + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + docs: https://nango.dev/docs/integrations/all/servicem8 + +signnow: + display_name: SignNow + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://app.signnow.com/authorize + token_url: https://api.signnow.com/oauth2/token + disable_pkce: true + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.signnow.com + docs: https://nango.dev/docs/integrations/all/signnow + +signnow-sandbox: + display_name: SignNow (Sandbox) + categories: + - legal + auth_mode: OAUTH2 + authorization_url: https://app-eval.signnow.com/authorize + token_url: https://api-eval.signnow.com/oauth2/token + disable_pkce: true + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api-eval.signnow.com + docs: https://nango.dev/docs/integrations/all/signnow-sandbox + +servicenow: + display_name: ServiceNow + categories: + - productivity + - popular + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.service-now.com/oauth_auth.do + token_url: https://${connectionConfig.subdomain}.service-now.com/oauth_token.do + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.service-now.com + docs: https://nango.dev/docs/integrations/all/servicenow + connection_config: + subdomain: + type: string + title: ServiceNow Domain + description: The subdomain of your ServiceNow account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .service-now.com + prefix: https:// + +servicenow-oauth2-cc: + display_name: ServiceNow (Client Credentials) + categories: + - productivity + - ticketing + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.subdomain}.service-now.com/oauth_token.do + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.subdomain}.service-now.com + docs: https://nango.dev/docs/api-integrations/servicenow-oauth2-cc + docs_connect: https://nango.dev/docs/api-integrations/servicenow-oauth2-cc/connect + connection_config: + subdomain: + type: string + title: ServiceNow Domain + description: The subdomain of your ServiceNow account + doc_section: '#step-5-enter-credentials-in-the-connect-ui' + pattern: '^[a-z0-9_-]+$' + example: dev12345 + suffix: .service-now.com + prefix: https:// + credentials: + client_id: + type: string + title: Client ID + description: The Client ID from your ServiceNow OAuth Application + doc_section: '#step-4-create-an-oauth-application' + client_secret: + type: string + title: Client Secret + description: The Client Secret from your ServiceNow OAuth Application + secret: true + doc_section: '#step-4-create-an-oauth-application' + +skio: + display_name: Skio + categories: + - e-commerce + auth_mode: API_KEY + proxy: + headers: + authorization: API ${apiKey} + base_url: https://graphql.skio.com + credentials_verification_script: skioCredentialsVerification + docs: https://nango.dev/docs/integrations/all/skio + docs_connect: https://nango.dev/docs/integrations/all/skio/connect + credentials: + apiKey: + type: string + title: API Token + description: The API Token for your Skio account + format: uuid + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-1-generating-your-api-key' + +sharepoint-online: + display_name: SharePoint Online (v2) + categories: + - storage + - communication + - popular + alias: microsoft + post_connection_script: onedrivePostConnection + docs: https://nango.dev/docs/api-integrations/sharepoint-online + setup_guide_url: https://nango.dev/docs/api-integrations/sharepoint-online/how-to-register-your-own-sharepoint-online-api-oauth-app + +sharepoint-online-oauth2-cc: + display_name: SharePoint Online (Client Credentials V2) + categories: + - storage + - communication + auth_mode: OAUTH2_CC + token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/v2.0/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://graph.microsoft.com + docs: https://nango.dev/docs/integrations/all/sharepoint-online-oauth2-cc + docs_connect: https://nango.dev/docs/integrations/all/sharepoint-online-oauth2-cc/connect + connection_config: + tenantId: + type: string + title: Tenant ID + description: The unique identifier for your organization that uses Microsoft services + format: uuid + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-1-finding-your-tenant-id' + order: 1 + +sharepoint-online-v1: + display_name: SharePoint Online (v1) + categories: + - storage + - communication + auth_mode: TWO_STEP + token_url: https://login.microsoftonline.com/${connectionConfig.tenantId}/oauth2/token + body_format: form + token_params: + client_id: ${credentials.clientId} + grant_type: client_credentials + resource: https://${connectionConfig.tenantId}.sharepoint.com + client_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer + client_assertion: ${credentials.assertion} + token_headers: + content-type: application/x-www-form-urlencoded + proxy: + base_url: https://${connectionConfig.tenantName}.sharepoint.com + headers: + accept: application/json;odata=verbose + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/integrations/all/sharepoint-online-v1 + docs_connect: https://nango.dev/docs/integrations/all/sharepoint-online-v1/connect + connection_config: + tenantId: + type: string + title: Tenant ID + description: The unique identifier for your organization that uses Microsoft services + format: uuid + example: a1b2c3d4-e5f6-47a8-9b0c-d1234567890f + doc_section: '#step-1-finding-your-tenant-id' + order: 1 + tenantName: + type: string + title: Tenant Name + description: The initial domain name for your Microsoft services tenant + example: mycompany + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-2-finding-your-tenant-name' + order: 2 + credentials: + clientId: + type: string + title: Client ID + description: Your application Client ID + secret: true + doc_section: '#step-3-finding-your-client-id' + assertion: + type: string + title: Client Assertion + description: Your generated client assertion + secret: true + doc_section: '#step-4-generating-your-client-assertion' + +shipbob-pat: + display_name: ShipBob (Personal Access Token) + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.apiSubdomain}.shipbob.com + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'x-retry-after' + verification: + method: GET + endpoints: + - /2026-01/channel + docs: https://nango.dev/docs/api-integrations/shipbob-pat + docs_connect: https://nango.dev/docs/api-integrations/shipbob-pat/connect + connection_config: + apiSubdomain: + type: string + title: API Subdomain + description: The ShipBob API subdomain of the environment you want to connect to. + enum: + - api + - sandbox-api + doc_section: '#step-2-identify-your-api-subdomain' + credentials: + apiKey: + type: string + title: Personal Access Token + description: Your ShipBob Personal Access Token + example: 6E4647BB**************************806E464161FBB996DD8E87EEA86DB926-1 + pattern: '^[A-F0-9]{64}-\d+$' + doc_section: '#step-1-generate-your-token' + +shippo: + display_name: Shippo + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://api.goshippo.com + headers: + authorization: ShippoToken ${apiKey} + retry: + at: + - 'x-ratelimit-reset' + verification: + method: GET + endpoints: + - /parcel-templates?page=1&results=1 + docs: https://nango.dev/docs/api-integrations/shippo + docs_connect: https://nango.dev/docs/api-integrations/shippo/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Shippo API token (live or test). + pattern: '^shippo_(live|test)_[a-f0-9]+$' + example: shippo_live_e2848d36**************************** + doc_section: '#step-1-get-your-api-token' + +shipstation: + display_name: Shipstation (v1) + categories: + - e-commerce + auth_mode: BASIC + proxy: + base_url: https://ssapi.shipstation.com + retry: + after: + - 'x-rate-limit-reset' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /users + webhook_routing_script: shipstationWebhookRouting + docs: https://nango.dev/docs/integrations/all/shipstation + docs_connect: https://nango.dev/docs/integrations/all/shipstation/connect + credentials: + username: + type: string + title: API Key + description: Your ShipStation API key + example: '0ff30856c5634da1b5ce1953fdaf3dcd' + pattern: '^[a-f0-9]{32}$' + doc_section: '#step-1-finding-shipstation-api-key-and-api-secret' + password: + type: string + title: API Secret + description: Your Shipstation API secret + example: '17f1c62148b044c687f80e1060224a4e' + pattern: '^[a-f0-9]{32}$' + # https://www.shipstation.com/docs/api/requirements/#authentication + # Shipstation is using basic auth with API key and secret + doc_section: '#step-1-finding-shipstation-api-key-and-api-secret' + +shipstation-v2: + display_name: Shipstation (v2) + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://api.shipstation.com + retry: + after: + - 'retry-after' + headers: + api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v2/users?page_size=1 + webhook_routing_script: shipstationWebhookRouting + docs: https://nango.dev/docs/integrations/all/shipstation-v2 + docs_connect: https://nango.dev/docs/integrations/all/shipstation-v2/connect + credentials: + apiKey: + type: string + title: API Key + description: The API Key for your Shipstation account + example: zEfcI+rouT0q1fjQWHBOYnsGYiax3rGDjtt3O5UhFIw + pattern: '^[A-Za-z0-9+/]+={0,2}$' + doc_section: '#step-1-generating-your-api-key' + +shopify: + display_name: Shopify (OAuth) + categories: + - e-commerce + - popular + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.myshopify.com/admin/oauth/authorize + token_url: https://${connectionConfig.subdomain}.myshopify.com/admin/oauth/access_token + proxy: + base_url: https://${connectionConfig.subdomain}.myshopify.com + headers: + x-shopify-access-token: ${accessToken} + webhook_routing_script: shopifyWebhookRouting + token_params: + expiring: 1 + docs: https://nango.dev/docs/api-integrations/shopify + setup_guide_url: https://nango.dev/docs/api-integrations/shopify/how-to-register-your-own-shopify-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/shopify/connect + connection_config: + subdomain: + type: string + title: Shopify Domain + description: The subdomain of your Shopify account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .myshopify.com + prefix: https:// + doc_section: '#step-1-finding-your-shopify-domain' + +shopify-cc: + display_name: Shopify (Client Credentials) + categories: + - e-commerce + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.subdomain}.myshopify.com/admin/oauth/access_token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.subdomain}.myshopify.com + headers: + x-shopify-access-token: ${accessToken} + docs: https://nango.dev/docs/api-integrations/shopify-cc + docs_connect: https://nango.dev/docs/api-integrations/shopify-cc/connect + connection_config: + subdomain: + type: string + title: Shopify Store Domain + description: The subdomain of the Shopify store the app is installed in. + pattern: '^[a-z0-9_-]+$' + example: my-store + suffix: .myshopify.com + prefix: https:// + order: 1 + doc_section: '#step-2-find-your-shopify-store-domain' + credentials: + client_id: + type: string + title: Client ID + description: The Client ID for your Shopify app. + doc_section: '#step-1-generating-your-client-credentials' + client_secret: + type: string + title: Client Secret + description: The Client Secret for your Shopify app. + secret: true + doc_section: '#step-1-generating-your-client-credentials' + +shopify-api-key: + display_name: Shopify (API Key) + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.myshopify.com + headers: + x-shopify-access-token: ${apiKey} + content-type: application/json + verification: + method: POST + headers: + content-type: application/json + endpoints: + - /admin/api/2024-10/graphql.json?query=%7B__schema%7Btypes%7Bname%2Ckind%2Cfields%7Bname%7D%7D%7D%7D + webhook_routing_script: shopifyWebhookRouting + webhook_user_defined_secret: true + docs: https://nango.dev/docs/integrations/all/shopify-api-key + docs_connect: https://nango.dev/docs/integrations/all/shopify-api-key/connect + connection_config: + subdomain: + type: string + title: Shopify Domain + description: The subdomain of your Shopify account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .myshopify.com + prefix: https:// + doc_section: '#step-1-finding-your-shopify-domain' + order: 1 + credentials: + apiKey: + type: string + title: API Access Token + description: The API access token generated + example: shpat_***************c03266f + pattern: '^(shpat|shpca|shppa)_[a-f0-9]{32}$' + doc_section: '#step-2-generating-your-api-access-token' + +shopify-partner: + display_name: Shopify Partner + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://partners.shopify.com/${connectionConfig.partnerId}/api/ + headers: + x-shopify-access-token: ${apiKey} + content-type: application/json + verification: + method: POST + headers: + content-type: application/json + endpoints: + - 2026-04/graphql.json + docs: https://nango.dev/docs/integrations/all/shopify-partner + docs_connect: https://nango.dev/docs/integrations/all/shopify-partner/connect + credentials: + apiKey: + type: string + title: Partner Access Token + description: The access token for your Shopify Partner account + connection_config: + partnerId: + type: string + title: Partner ID + description: Your Shopify Partner ID + +shopify-scim: + display_name: Shopify (SCIM API) + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://shopifyscim.com/scim + headers: + authorization: Bearer ${apiKey} + accept: application/json + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/Users + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/shopify-scim + docs_connect: https://nango.dev/docs/integrations/all/shopify-scim/connect + credentials: + apiKey: + type: string + title: SCIM API Token + description: The SCIM API token generated from your Shopify organization settings. + doc_section: '#step-1-generating-your-scim-api-token' + +shopvox: + display_name: ShopVox + categories: + - other + auth_mode: TWO_STEP + body_format: json + token_url: https://api.shopvox.com/v1/login + token_params: + user: ${credentials.email} + password: ${credentials.password} + token_headers: + content-type: application/json + token_response: + token: authToken + proxy: + base_url: https://api.shopvox.com/ + query: + authToken: ${accessToken} + account_id: ${credentials.raw.accountID} + docs: https://nango.dev/docs/api-integrations/shopvox + docs_connect: https://nango.dev/docs/api-integrations/shopvox/connect + credentials: + email: + type: string + title: Email + format: email + description: Your ShopVox login email. + doc_section: '#step-1-finding-your-credentials' + password: + type: string + title: Password + description: Your ShopVox login password. + secret: true + doc_section: '#step-1-finding-your-credentials' + +shopware: + display_name: Shopware (Admin API) + categories: + - e-commerce + auth_mode: OAUTH2_CC + body_format: json + token_url: https://${connectionConfig.shopwareUrl}/api/oauth/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.shopwareUrl}/api + docs: https://nango.dev/docs/api-integrations/shopware + docs_connect: https://nango.dev/docs/api-integrations/shopware/connect + credentials: + client_id: + type: string + title: Access key ID + description: The Access key ID of yout integration. + doc_section: '#step-2-create-a-shopware-integration' + client_secret: + type: string + title: Secret access key + description: The Secret access key of your integration. + secret: true + doc_section: '#step-2-create-a-shopware-integration' + connection_config: + shopwareUrl: + type: string + title: Shopware URL + description: The hostname of your Shopware instance. + example: myshop.example.com + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-1-find-your-shopware-url' + +shopworks: + display_name: ShopWorks + categories: + - other + auth_mode: TWO_STEP + body_format: json + token_url: https://${connectionConfig.hostname}/signin + token_params: + username: ${credentials.username} + password: ${credentials.password} + token_headers: + content-type: application/json + token_response: + token: id_token + token_expires_in_ms: 3600000 + proxy: + base_url: https://${connectionConfig.hostname} + headers: + authorization: ${accessToken} + docs: https://nango.dev/docs/api-integrations/shopworks + docs_connect: https://nango.dev/docs/api-integrations/shopworks/connect + connection_config: + hostname: + type: string + title: Hostname + prefix: https:// + suffix: /signin + description: The hostname of the API you want to connect to. + example: manageordersapi.com/onsite + doc_section: '#step-1-find-your-hostname' + credentials: + username: + type: string + title: Username + description: The username for your ShopWorks account. + doc_section: '#step-2-find-your-credentials' + password: + type: string + title: Password + secret: true + description: The password for your ShopWorks account. + doc_section: '#step-2-find-your-credentials' + +slab: + display_name: Slab + categories: + - productivity + - knowledge-base + auth_mode: API_KEY + proxy: + base_url: https://api.slab.com + headers: + authorization: ${apiKey} + content-type: application/json + docs: https://nango.dev/docs/api-integrations/slab + docs_connect: https://nango.dev/docs/api-integrations/slab/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Slab API token + doc_section: '#step-1-generating-your-slab-api-token' + +shortcut: + display_name: Shortcut + categories: + - dev-tools + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.app.shortcut.com + headers: + shortcut-token: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v3/member + docs: https://nango.dev/docs/integrations/all/shortcut + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Shortcut account + +simpro: + display_name: Simpro + categories: + - productivity + - invoicing + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.build}.simprosuite.com/oauth2/login + token_url: https://${connectionConfig.build}.simprosuite.com/oauth2/token + proxy: + base_url: https://${connectionConfig.build}.simprosuite.com + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + docs: https://nango.dev/docs/api-integrations/simpro + docs_connect: https://nango.dev/docs/api-integrations/simpro/connect + connection_config: + build: + type: string + title: Simpro Build Name + description: The subdomain part of your Simpro URL. + pattern: '^[a-z0-9_-]+$' + example: yourcompany + suffix: .simprosuite.com + prefix: https:// + doc_section: '#step-1-find-your-simpro-build-name' + +slack: + display_name: Slack + categories: + - popular + - productivity + auth_mode: OAUTH2 + authorization_url: https://slack.com/oauth/v2/authorize + scope_separator: ',' + alternate_access_token_response_path: authed_user + token_url: https://slack.com/api/oauth.v2.access + disable_pkce: true + token_response_metadata: + - incoming_webhook.url + - incoming_webhook.channel + - incoming_webhook.channel_id + - bot_user_id + - team.id + proxy: + base_url: https://slack.com/api + retry: + after: + - 'retry-after' + paginate: + type: cursor + cursor_path_in_response: response_metadata.next_cursor + cursor_name_in_request: cursor + limit_name_in_request: limit + webhook_routing_script: slackWebhookRouting + docs: https://nango.dev/docs/api-integrations/slack + setup_guide_url: https://nango.dev/docs/api-integrations/slack/how-to-register-your-own-slack-api-oauth-app + +slack-mcp: + display_name: Slack (MCP) + categories: + - popular + - productivity + - communication + - mcp + auth_mode: MCP_OAUTH2 + client_registration: static + authorization_url: https://slack.com/oauth/v2_user/authorize + token_url: https://slack.com/api/oauth.v2.user.access + scope_separator: ',' + alternate_access_token_response_path: authed_user + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://mcp.slack.com + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/slack-mcp + setup_guide_url: https://nango.dev/docs/api-integrations/slack-mcp/how-to-register-your-own-slack-mcp-oauth-app + +smartlead-ai: + display_name: Smartlead.ai + categories: + - communication + - marketing + auth_mode: API_KEY + proxy: + base_url: https://server.smartlead.ai/api + retry: + after: + - x-ratelimit-reset + query: + api_key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/client + docs: https://nango.dev/docs/integrations/all/smartlead-ai + docs_connect: https://nango.dev/docs/integrations/all/smartlead-ai/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Smartlead.ai account + pattern: '^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}_[a-zA-Z0-9]+$' + example: 12345678-1234-1234-1234-123456789012_abcdefg + doc_section: '#step-1-generating-your-api-key' + +sophos-central: + display_name: Sophos Central + categories: + - dev-tools + auth_mode: OAUTH2_CC + token_url: https://id.sophos.com/api/v2/oauth2/token + token_params: + grant_type: client_credentials + scope: token + body_format: form + proxy: + base_url: ${connectionConfig.dataRegion} + headers: + x-tenant-id: ${connectionConfig.tenantId} + post_connection_script: sophosCentralPostConnection + docs: https://nango.dev/docs/api-integrations/sophos-central + docs_connect: https://nango.dev/docs/api-integrations/sophos-central/connect + connection_config: + dataRegion: + type: string + title: '' + description: '' + automated: true + tenantId: + type: string + title: '' + description: '' + automated: true + +smartrecruiters-api-key: + display_name: Smartrecruiters + categories: + - ats + auth_mode: API_KEY + proxy: + base_url: https://api.smartrecruiters.com + headers: + x-smarttoken: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /feed/publications + docs: https://nango.dev/docs/integrations/all/smartrecruiters-api-key + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Smartrecruiters account + +smartsheet: + display_name: Smartsheet + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.app_host}/b/authorize || https://app.smartsheet.com/b/authorize + token_url: https://api.${connectionConfig.domain}/2.0/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.${connectionConfig.domain} + docs: https://nango.dev/docs/api-integrations/smartsheet + docs_connect: https://nango.dev/docs/api-integrations/smartsheet/connect + setup_guide_url: https://nango.dev/docs/api-integrations/smartsheet/how-to-register-your-own-smartsheet-api-oauth-app + connection_config: + app_host: + type: string + title: App Host + description: The app host used for authorization. + example: app.smartsheet.com + optional: true + pattern: '^(app\.smartsheet\.com|app\.test\.smartsheet\.com)$' + domain: + type: string + title: Domain + description: The domain where your account is hosted. + prefix: https://api. + order: 1 + enum: + - smartsheet.com + - smartsheet.eu + - smartsheet.au + - smartsheetgov.com + - test.smartsheet.com + +smugmug: + display_name: Smugmug + categories: + - storage + auth_mode: OAUTH1 + request_url: https://api.smugmug.com/services/oauth/1.0a/getRequestToken + authorization_url: https://api.smugmug.com/services/oauth/1.0a/authorize + token_url: https://api.smugmug.com/services/oauth/1.0a/getAccessToken + scope_separator: ',' + signature_method: 'PLAINTEXT' + proxy: + base_url: https://www.smugmug.com + docs: https://nango.dev/docs/integrations/all/smugmug + +snapchat: + display_name: Snapchat (Ads API) + auth_mode: OAUTH2 + categories: + - video + - social + authorization_url: https://accounts.snapchat.com/login/oauth2/authorize + disable_pkce: true + token_url: https://accounts.snapchat.com/login/oauth2/access_token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://adsapi.snapchat.com + docs: https://nango.dev/docs/integrations/all/snapchat + +snowflake: + display_name: Snowflake + categories: + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.snowflake_account_url}/oauth/authorize + token_url: https://${connectionConfig.snowflake_account_url}/oauth/token-request + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.snowflake_account_url} + post_connection_script: snowflakePostConnection + docs: https://nango.dev/docs/api-integrations/snowflake + docs_connect: https://nango.dev/docs/api-integrations/snowflake/connect + connection_config: + snowflake_account_url: + type: string + title: Domain + description: The domain of your Snowflake account. + format: hostname + example: myorg-myaccount.snowflakecomputing.com + prefix: https:// + +snowflake-jwt: + display_name: Snowflake (JWT) + categories: + - dev-tools + auth_mode: JWT + signature: + protocol: RSA + token: + signing_key: ${credentials.privateKey} + expires_in_ms: 3600000 + header: + alg: RS256 + typ: JWT + payload: + iss: ${credentials.accountIdentifier}.${credentials.userName}.${fingerprint(${credentials.privateKey})} + sub: ${credentials.accountIdentifier}.${credentials.userName} + proxy: + headers: + accept: application/json + authorization: Bearer ${accessToken} + x-snowflake-authorization-token-type: KEYPAIR_JWT + base_url: https://${connectionConfig.subdomain}.snowflakecomputing.com + verification: + method: POST + endpoints: + - /api/v2/statements + data: { 'statement': 'SELECT CURRENT_TIMESTAMP' } + headers: + x-snowflake-authorization-token-type: KEYPAIR_JWT + content-type: application/json + docs: https://nango.dev/docs/integrations/all/snowflake-jwt + docs_connect: https://nango.dev/docs/integrations/all/snowflake-jwt/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain for your Snowflake instance + example: KXOPMLU-RE00572 + order: 1 + doc_section: '#step-1-finding-your-subdomain' + credentials: + accountIdentifier: + type: string + title: Account Identifier + description: The unique identifier for your Snowflake account. + example: KXOPMLU-RE00572 + doc_section: '#step-2-finding-your-account-identifier' + userName: + type: string + title: User Name + description: The username for your Snowflake account used for authentication + example: MYUSER + doc_section: '#step-3-finding-your-user-name' + privateKey: + type: string + title: Private Key + description: The private key associated with your Snowflake account for JWT authentication + example: -----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n-----END PRIVATE KEY----- + pattern: '^-----BEGIN PRIVATE KEY-----\s*([A-Za-z0-9+/=\s]+)\s*-----END PRIVATE KEY-----$' + secret: true + doc_section: '#step-4-generating-your-private-key' + +splitwise: + display_name: Splitwise + categories: + - payment + - social + auth_mode: OAUTH2 + authorization_url: https://secure.splitwise.com/oauth/authorize + token_url: https://secure.splitwise.com/oauth/token + proxy: + base_url: https://secure.splitwise.com + docs: https://nango.dev/docs/integrations/all/splitwise + +spotify: + display_name: Spotify (OAuth) + categories: + - other + auth_mode: OAUTH2 + authorization_url: https://accounts.spotify.com/authorize + token_url: https://accounts.spotify.com/api/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.spotify.com + docs: https://nango.dev/docs/integrations/all/spotify + +spotify-oauth2-cc: + display_name: Spotify (Client Credentials) + categories: + - other + auth_mode: OAUTH2_CC + token_url: https://accounts.spotify.com/api/token + token_request_auth_method: basic + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.spotify.com + docs: https://nango.dev/docs/integrations/all/spotify-oauth2-cc + +squarespace: + display_name: Squarespace + categories: + - dev-tools + - design + auth_mode: OAUTH2 + authorization_url: https://login.squarespace.com/api/1/login/oauth/provider/authorize + token_url: https://login.squarespace.com/api/1/login/oauth/provider/tokens + token_request_auth_method: basic + scope_separator: ',' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.squarespace.com + headers: + user-agent: ${connectionConfig.customappDescription} + docs: https://nango.dev/docs/integrations/all/squarespace + connection_config: + customappDescription: + type: string + title: User Agent + description: The user agent of your custom app + +squareup: + display_name: Squareup + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://connect.squareup.com/oauth2/authorize + token_url: https://connect.squareup.com/oauth2/token + disable_pkce: true + decode_url: true + authorization_params: + response_type: code + session: false + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://connect.squareup.com + docs: https://nango.dev/docs/api-integrations/squareup + setup_guide_url: https://nango.dev/docs/api-integrations/squareup/how-to-register-your-own-squareup-oauth-app + +squareup-sandbox: + display_name: Squareup (Sandbox) + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://connect.squareupsandbox.com/oauth2/authorize + token_url: https://connect.squareupsandbox.com/oauth2/token + disable_pkce: true + authorization_params: + response_type: code + session: false + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://connect.squareupsandbox.com + docs: https://nango.dev/docs/api-integrations/squareup-sandbox + setup_guide_url: https://nango.dev/docs/api-integrations/squareup-sandbox/how-to-register-your-own-squareup-sandbox-oauth-app + +stackexchange: + display_name: Stack Exchange + categories: + - knowledge-base + - support + auth_mode: OAUTH2 + authorization_url: https://stackoverflow.com/oauth + token_url: https://stackoverflow.com/oauth/access_token/json + default_scopes: + - no_expiry + proxy: + base_url: https://api.stackexchange.com + docs: https://nango.dev/docs/integrations/all/stackexchange + +statamic: + display_name: Statamic + categories: + - cms + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.baseUrl} + headers: + authorization: Bearer ${apiKey} + docs: https://nango.dev/docs/api-integrations/statamic + docs_connect: https://nango.dev/docs/api-integrations/statamic/connect + credentials: + apiKey: + type: string + title: API token + description: The value of STATAMIC_API_AUTH_TOKEN in your Statamic .env file. + doc_section: '#step-1-enable-the-rest-api' + connection_config: + baseUrl: + type: string + title: Base URL + description: The hostname of your Statamic site. + example: mysite.example.com + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-2-find-your-base-url' + +statista: + display_name: Statista + categories: + - analytics + auth_mode: API_KEY + proxy: + base_url: https://api.statista.ai + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v1/statistics?q=* + docs: https://nango.dev/docs/integrations/all/statista + docs_connect: https://nango.dev/docs/integrations/all/statista/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Statista account + example: c5c28261f9ade4e34891ccf761491b94 + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-1-finding-your-api-key' + +stay-ai: + display_name: Stay AI + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://api.retextion.com/api + headers: + x-retextion-access-token: ${apiKey} + docs: https://nango.dev/docs/api-integrations/stay-ai + docs_connect: https://nango.dev/docs/api-integrations/stay-ai/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Stay AI API key. + example: 7k9***f-***da3e-***hjtb-***22cy + pattern: '^[a-z0-9]{7}-[a-z0-9]{7}-[a-z0-9]{7}-[a-z0-9]{7}$' + doc_section: '#step-1-create-a-new-api-key' + +stitch-mcp: + display_name: Stitch (MCP) + categories: + - design + - mcp + alias: google + default_scopes: + - https://www.googleapis.com/auth/cloud-platform + proxy: + base_url: https://stitch.googleapis.com + headers: + x-goog-user-project: ${connectionConfig.project_id} + connection_config: + project_id: + type: string + title: '' + description: '' + hidden: true + docs: https://nango.dev/docs/api-integrations/stitch-mcp + setup_guide_url: https://nango.dev/docs/api-integrations/stitch-mcp/how-to-register-your-own-stitch-mcp-api-oauth-app + +store-census: + display_name: StoreCensus + categories: + - e-commerce + - crm + auth_mode: API_KEY + proxy: + base_url: https://www.storecensus.com + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'retry-after' + verification: + method: GET + endpoints: + - /api/v1/apps?page=1&pageSize=1 + docs: https://nango.dev/docs/api-integrations/store-census + docs_connect: https://nango.dev/docs/api-integrations/store-census/connect + credentials: + apiKey: + type: string + title: API Key + description: Your StoreCensus API key. + doc_section: '#step-1-get-your-api-key' + +store-leads: + display_name: Store Leads + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://storeleads.app/json/api + headers: + authorization: Bearer ${apiKey} + retry: + at: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/store-leads + docs_connect: https://nango.dev/docs/api-integrations/store-leads/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Store Leads API key. + doc_section: '#step-1-generate-your-api-key' + pattern: '^[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{8}$' + example: a174****-****-****-****-****c6ee + +strava: + display_name: Strava (Mobile) + categories: + - social + - sports + auth_mode: OAUTH2 + authorization_url: https://www.strava.com/oauth/mobile/authorize + token_url: https://www.strava.com/api/v3/oauth/token + scope_separator: ',' + authorization_params: + response_type: code + approval_prompt: auto + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://www.strava.com + docs: https://nango.dev/docs/integrations/all/strava + +strava-web: + display_name: Strava (Web) + categories: + - social + - sports + auth_mode: OAUTH2 + authorization_url: https://www.strava.com/oauth/authorize + token_url: https://www.strava.com/api/v3/oauth/token + scope_separator: ',' + authorization_params: + response_type: code + approval_prompt: force + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://www.strava.com + docs: https://nango.dev/docs/integrations/all/strava-web + +streak: + display_name: Streak + categories: + - crm + auth_mode: BASIC + proxy: + base_url: https://api.streak.com/api + verification: + method: GET + endpoints: + - /v1/users/me + headers: + content-type: application/json + accept: application/json + webhook_routing_script: streakWebhookRouting + docs: https://nango.dev/docs/api-integrations/streak + docs_connect: https://nango.dev/docs/api-integrations/streak/connect + credentials: + username: + type: string + title: API Key + description: The API Key for your Streak account + example: 'strk_7SGgswz9ZJrNZp7iJmoAFjwdaym1' + pattern: '^strk_[A-Za-z0-9]+$' + doc_section: '#step-1-generating-your-api-key' + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +stripe: + display_name: Stripe Connect + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://connect.stripe.com/oauth/authorize + token_url: https://connect.stripe.com/oauth/token + proxy: + base_url: https://api.stripe.com + docs: https://nango.dev/docs/api-integrations/stripe + setup_guide_url: https://nango.dev/docs/api-integrations/stripe/how-to-register-your-own-stripe-api-oauth-app + +stripe-express: + display_name: Stripe Express + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://connect.stripe.com/express/oauth/authorize + token_url: https://connect.stripe.com/oauth/token + token_response_metadata: + - stripe_user_id + proxy: + base_url: https://api.stripe.com + docs: https://nango.dev/docs/integrations/all/stripe-express + +stripe-app: + display_name: Stripe App + categories: + - payment + - popular + auth_mode: OAUTH2 + authorization_url: https://marketplace.stripe.com/oauth/v2/authorize + token_url: https://api.stripe.com/v1/oauth/token + disable_pkce: true + proxy: + base_url: https://api.stripe.com + refresh_params: + grant_type: refresh_token + docs: https://nango.dev/docs/integrations/all/stripe-app + +stripe-app-sandbox: + display_name: Stripe App (Sandbox) + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://marketplace.stripe.com/oauth/v2/${connectionConfig.appDomain}/authorize + token_url: https://api.stripe.com/v1/oauth/token + disable_pkce: true + proxy: + base_url: https://api.stripe.com + refresh_params: + grant_type: refresh_token + docs: https://nango.dev/docs/integrations/all/stripe-app-sandbox + docs_connect: https://nango.dev/docs/integrations/all/stripe-app-sandbox/connect + connection_config: + appDomain: + type: string + title: App Domain + description: The unique identifier Stripe assigns to your app instance + doc_section: '#step-1-finding-your-app-domain' + +stripe-api-key: + display_name: Stripe (API Key) + categories: + - payment + auth_mode: BASIC + proxy: + base_url: https://api.stripe.com + headers: + stripe-context: ${connectionConfig.context} + docs: https://nango.dev/docs/api-integrations/stripe-api-key + docs_connect: https://nango.dev/docs/api-integrations/stripe-api-key/connect + credentials: + username: + type: string + title: Restricted API Key + description: Your Stripe restricted API Key + secret: true + example: rk_live_51On1GfAemfaBCd0eHq***************BV5007KeuAVcO + pattern: '^rk_[a-z]+_[A-Za-z0-9]{8}[A-Za-z0-9]+([A-Za-z0-9]{8})$' + doc_section: '#step-1-generating-your-stripe-restricted-api-key' + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + connection_config: + context: + type: string + title: Stripe Context + description: The Stripe account context + optional: true + example: acct_1aTnTtAAB0hHJ26p + pattern: '^acct_[A-Za-z0-9]{16}(\/acct_[A-Za-z0-9]{16})?$' + doc_section: '#step-2-finding-your-stripe-context' + +supabase: + display_name: Supabase + categories: + - dev-tools + - storage + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.projectUrl} + headers: + authorization: Bearer ${apiKey} + apikey: ${apiKey} + docs: https://nango.dev/docs/api-integrations/supabase + docs_connect: https://nango.dev/docs/api-integrations/supabase/connect + connection_config: + projectUrl: + type: string + title: Project URL + description: The Supabase project url you want to connect to. + example: project.supabase.co + format: hostname + prefix: https:// + doc_section: '#step-1-find-your-project-url' + credentials: + apiKey: + type: string + title: Secret Key + description: The secret key from your Supabase project. + example: sb_secret_*******************************hm + pattern: '^sb_secret_[A-Za-z0-9_]+$' + doc_section: '#step-2-finding-your-secret-key' + +supabase-mcp: + display_name: Supabase (MCP) + categories: + - dev-tools + - mcp + auth_mode: API_KEY + proxy: + base_url: https://mcp.supabase.com + headers: + authorization: Bearer ${apiKey} + content-type: application/json + verification: + method: POST + headers: + content-type: application/json + accept: application/json,text/event-stream + endpoints: + - /mcp?project_ref=${connectionConfig.projectRef} + data: + { + 'jsonrpc': '2.0', + 'id': 1, + 'method': 'initialize', + 'params': { 'protocolVersion': '2024-11-05', 'capabilities': {}, 'clientInfo': { 'name': 'nango-client', 'version': '1.0.0' } } + } + docs: https://nango.dev/docs/api-integrations/supabase-mcp + docs_connect: https://nango.dev/docs/api-integrations/supabase-mcp/connect + connection_config: + projectRef: + type: string + title: Project reference + description: Your Supabase project reference ID. + example: bvzzcafzoysezumrdvif + pattern: '^[a-z0-9]{20}$' + doc_section: '#step-1-finding-your-project-reference' + credentials: + apiKey: + type: string + title: Personal Access Token + description: Your Supabase account personal access token. + example: sbp_*******************************23d + pattern: '^sbp_[A-Za-z0-9]{40}$' + doc_section: '#step-2-obtaining-your-personal-access-token' + +supabase-mcp-oauth: + display_name: Supabase (MCP OAuth) + categories: + - dev-tools + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + registration_url: https://api.supabase.com/platform/oauth/apps/register + authorization_url: https://api.supabase.com/v1/oauth/authorize + token_url: https://api.supabase.com/v1/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://mcp.supabase.com + headers: + accept: application/json,text/event-stream + connection_config: + projectRef: ${connectionConfig.projectRef} + docs: https://nango.dev/docs/api-integrations/supabase-mcp-oauth + docs_connect: https://nango.dev/docs/api-integrations/supabase-mcp-oauth/connect + connection_config: + projectRef: + type: string + title: Project Reference + description: Your Supabase project reference ID. + example: bvzzcafzoysezumrdvif + pattern: '^[a-z0-9]{20}$' + doc_section: '#step-1-finding-your-project-reference' + +superhuman-mcp: + display_name: Superhuman (MCP) + categories: + - communication + - productivity + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://mcp.auth.mail.superhuman.com/oauth2/authorize + token_url: https://mcp.auth.mail.superhuman.com/oauth2/token + registration_url: https://mcp.auth.mail.superhuman.com/oauth2/register + default_scopes: + - offline_access + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://mcp.mail.superhuman.com + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/superhuman-mcp + +surecontact: + display_name: SureContact + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.surecontact.com + headers: + x-api-key: ${apiKey} + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/api-integrations/surecontact + docs_connect: https://nango.dev/docs/api-integrations/surecontact/connect + credentials: + apiKey: + type: string + title: API Key + description: Your SureContact API key. + example: jWkZ3QYFe7**********************************************qlp + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-1-create-an-api-key' + +survey-monkey: + display_name: SurveyMonkey + categories: + - surveys + auth_mode: OAUTH2 + authorization_url: https://api.surveymonkey.com/oauth/authorize + token_url: https://api.surveymonkey.com/oauth/token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://api.surveymonkey.com + docs: https://nango.dev/docs/integrations/all/survey-monkey + +swoogo: + display_name: Swoogo + categories: + - marketing + auth_mode: OAUTH2_CC + token_url: https://api.swoogo.com/api/v1/oauth2/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.swoogo.com + docs: https://nango.dev/docs/api-integrations/swoogo + docs_connect: https://nango.dev/docs/api-integrations/swoogo/connect + credentials: + client_id: + type: string + title: API Key + description: Your Swoogo API key. + doc_section: '#step-1-generate-your-api-credentials' + client_secret: + type: string + title: API Secret + description: Your Swoogo API secret. + secret: true + doc_section: '#step-1-generate-your-api-credentials' + +tailscale: + display_name: Tailscale (OAuth) + auth_mode: TWO_STEP + categories: + - dev-tools + - productivity + token_url: https://api.tailscale.com/api/v2/oauth/token + token_params: + client_id: ${credentials.clientId} + client_secret: ${credentials.clientSecret} + body_format: form + proxy: + base_url: https://api.tailscale.com/api + connection_config: + organizationName: ${connectionConfig.organizationName} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + docs: https://nango.dev/docs/integrations/all/tailscale + docs_connect: https://nango.dev/docs/integrations/all/tailscale/connect + connection_config: + organizationName: + type: string + title: Organization Name + description: Your Tailscale organization name + example: example.com + order: 1 + doc_section: '#step-1-finding-your-organization-name' + credentials: + clientId: + type: string + title: Client ID + description: Your OAuth Client ID + example: kcLBRFmtYZ11CNTRL + pattern: '^[A-Za-z0-9]+CNTRL$' + doc_section: '#step-2-generating-your-oauth-client-credentials' + clientSecret: + type: string + title: Client secret + description: Your OAuth Client secret + secret: true + example: 'tskey-client-kdC27MPR3X11CNTRL-tjtxjop8mdawckVitWkNdaBaNRtZ48GN' + pattern: '^tskey-client-[A-Za-z0-9]+CNTRL-[A-Za-z0-9]+$' + doc_section: '#step-2-generating-your-oauth-client-credentials' + +tailscale-api-key: + display_name: Tailscale (API Key) + categories: + - dev-tools + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.tailscale.com/api + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v2/tailnet/${connectionConfig.organizationName}/users + docs: https://nango.dev/docs/integrations/all/tailscale-api-key + docs_connect: https://nango.dev/docs/integrations/all/tailscale-api-key/connect + connection_config: + organizationName: + type: string + title: Organization Name + description: Your Tailscale organization name + example: example.com + order: 1 + doc_section: '#step-1-finding-your-organization-name' + credentials: + apiKey: + type: string + title: API Access Token + description: The API Access Token for your Tailscale account + example: tskey-api-k7Hpb9Lcv611CNTRL-WJ9YG52LqXJXY9oJ7RtmXJdzWkdRMgBG + pattern: '^tskey-api-[A-Za-z0-9]+CNTRL-[A-Za-z0-9]+$' + doc_section: '#step-2-generating-an-api-access-token' + +talentlms: + display_name: TalentLMS + categories: + - other + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.talentlms.com + headers: + x-api-key: ${apiKey} + x-api-version: ${connectionConfig.apiVersion} + verification: + method: GET + endpoints: + - /api/v2/users?page[size]=1 + docs: https://nango.dev/docs/api-integrations/talentlms + docs_connect: https://nango.dev/docs/api-integrations/talentlms/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of your TalentLMS account. + example: mycompany + pattern: '^[a-z0-9-]+$' + suffix: .talentlms.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-subdomain' + apiVersion: + type: string + title: '' + description: '' + default_value: '2025-01-01' + hidden: true + credentials: + apiKey: + type: string + title: API Key + description: Your TalentLMS API key. + doc_section: '#step-2-finding-your-api-key' + +tally: + display_name: Tally + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.tally.so + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /forms?limit=1 + docs: https://nango.dev/docs/api-integrations/tally + docs_connect: https://nango.dev/docs/api-integrations/tally/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Tally API key. + pattern: '^tly-[A-Za-z0-9]{32}$' + example: tly-84m**************************56Y + doc_section: '#step-1-create-an-api-key' + +tapclicks: + display_name: TapClicks + auth_mode: OAUTH2_CC + categories: + - marketing + - analytics + token_url: https://api.tapclicks.com/oauth/accesstoken + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.tapclicks.com/v2 + docs: https://nango.dev/docs/integrations/all/tapclicks + docs_connect: https://nango.dev/docs/integrations/all/tapclicks/connect + +tableau: + display_name: Tableau (PAT) + categories: + - analytics + auth_mode: TWO_STEP + token_url: https://${connectionConfig.hostname}/api/${connectionConfig.version}/auth/signin + proxy: + headers: + accept: application/json + content-type: application/json + x-tableau-auth: ${accessToken} + base_url: https://${connectionConfig.hostname}/api/${connectionConfig.version} + token_params: + credentials: + personalAccessTokenName: ${credentials.pat} + personalAccessTokenSecret: ${credentials.secret} + site: + contentUrl: ${credentials.contentUrl} + token_headers: + content-type: application/json + accept: application/json + token_response: + token: credentials.token + token_expiration: credentials.estimatedTimeToExpiration + token_expiration_strategy: expireAt + docs: https://nango.dev/docs/integrations/all/tableau + docs_connect: https://nango.dev/docs/integrations/all/tableau/connect + credentials: + pat: + type: string + title: Personal Access Token + description: Your Personal Access Token + doc_section: '#step-2-generating-your-personal-access-token' + secret: + type: string + title: Personal Access Token Secret + description: Your Personal Access Token Secret + secret: true + doc_section: '#step-2-generating-your-personal-access-token' + contentUrl: + type: string + title: Content Url + optional: true + example: test-eaec4a3fe2 + doc_section: '#step-5-finding-your-content-url' + description: Your content URL + connection_config: + hostname: + type: string + title: HostName + description: The domain of your Tableau instance + format: hostname + order: 1 + example: dub01.online.tableau.com + doc_section: '#step-3-finding-your-hostname' + prefix: https:// + version: + type: string + title: API Version + order: 2 + example: '3.26' + doc_section: '#step-4-finding-your-api-version' + description: The version of the Tableau API to use + +tanium: + display_name: Tanium + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.hostname}/api + headers: + session: ${apiKey} + content-type: application/json + verification: + method: GET + endpoints: + - /v2/session/current + docs: https://nango.dev/docs/api-integrations/tanium + docs_connect: https://nango.dev/docs/api-integrations/tanium/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Tanium API token. + doc_section: '#step-1-generate-an-api-token' + connection_config: + hostname: + type: string + title: Hostname + description: Your Tanium Cloud API hostname. + example: acme-api.cloud.tanium.com + format: hostname + prefix: https:// + doc_section: '#step-2-find-your-hostname' + order: 1 + +teamtailor: + display_name: Teamtailor + categories: + - ats + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.extension}.teamtailor.com + retry: + after: + - 'x-rate-limit-reset' + headers: + authorization: Token token=${apiKey} + x-api-version: '20210218' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/users + docs: https://nango.dev/docs/integrations/all/teamtailor + connection_config: + extension: + type: string + title: Teamtailor Domain + description: The subdomain of your Teamtailor instance + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .teamtailor.com + prefix: https:// + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Teamtailor account + +teamleader: + display_name: Teamleader Focus + categories: + - invoicing + - crm + auth_mode: OAUTH2 + authorization_url: https://focus.teamleader.eu/oauth2/authorize + token_url: https://focus.teamleader.eu/oauth2/access_token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + retry: + at: + - 'x-ratelimit-reset' + base_url: https://api.focus.teamleader.eu + docs: https://nango.dev/docs/integrations/all/teamleader + +teamwork: + display_name: Teamwork + categories: + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://www.teamwork.com/launchpad/login + token_url: https://www.teamwork.com/launchpad/v1/token.json + token_response_metadata: + - installation.apiEndPoint + proxy: + base_url: ${connectionConfig.installation.apiEndPoint} + docs: https://nango.dev/docs/integrations/all/teamwork + +telegram: + display_name: Telegram + categories: + - communication + auth_mode: API_KEY + proxy: + base_url: https://api.telegram.org/bot${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /getMe + docs: https://nango.dev/docs/api-integrations/telegram + docs_connect: https://nango.dev/docs/api-integrations/telegram/connect + credentials: + apiKey: + type: string + title: Bot Token + description: Your Telegram Bot token from @BotFather. + example: 1234567890:ABCdefGHIjklMNOpqrSTUvwxYZ1234567 + pattern: '^[0-9]+:[a-zA-Z0-9_-]+$' + doc_section: '#step-1-creating-your-telegram-bot' + +tempo: + display_name: Tempo + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://api.tempo.io/oauth/authorize/redirect + token_url: https://api.tempo.io/oauth/token/ + disable_pkce: true + authorization_params: + jira_url: https://${connectionConfig.jiraSubdomain}.atlassian.net + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.tempo.io + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/tempo + setup_guide_url: https://nango.dev/docs/api-integrations/tempo/how-to-register-your-own-tempo-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/tempo/connect + connection_config: + jiraSubdomain: + type: string + title: Jira Cloud Subdomain + description: The subdomain of your Jira Cloud instance. + example: acme + pattern: '^[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?$' + doc_section: '#step-1-find-your-jira-cloud-subdomain' + order: 2 + subdomain: + type: string + title: API Subdomain + description: The subdomain of the Tempo API. + enum: + - api + - api.eu + - api.us + doc_section: '#step-2-find-your-api-subdomain' + order: 1 + +the-swarm: + display_name: The Swarm + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://bee.theswarm.com + headers: + x-api-key: ${apiKey} + verification: + method: POST + endpoints: + - /v2/profiles/search + headers: + content-type: application/json + data: + query: + match_all: {} + limit: 1 + docs: https://nango.dev/docs/api-integrations/the-swarm + docs_connect: https://nango.dev/docs/api-integrations/the-swarm/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Swarm API key from Team Settings. + example: aB3cD9eF************************wX6yZ2 + pattern: '^[a-zA-Z0-9]+$' + doc_section: '#step-1-get-your-api-key' + +theirstack: + display_name: TheirStack + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.theirstack.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v0/billing/credit-balance + docs: https://nango.dev/docs/api-integrations/theirstack + docs_connect: https://nango.dev/docs/api-integrations/theirstack/connect + credentials: + apiKey: + type: string + title: API Key + description: Your TheirStack API key. + example: eyJhbGci*******.eyJ2ZX********.kWB5******** + pattern: '^eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' + doc_section: '#step-1-generate-your-api-key' + +thomson-reuters-legal-tracker: + display_name: Thomson Reuters Legal Tracker + categories: + - legal + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.hostname}/onepass/oauth2/token + token_headers: + content-type: application/x-www-form-urlencoded + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.hostname}/legal-tracker + docs: https://nango.dev/docs/api-integrations/thomson-reuters-legal-tracker + docs_connect: https://nango.dev/docs/api-integrations/thomson-reuters-legal-tracker/connect + connection_config: + hostname: + type: string + title: Hostname + description: The regional API hostname for your Thomson Reuters account. + enum: + - api.thomsonreuters.com + - api.thomsonreuters.co.uk + - api.thomsonreuters.ca + - api.thomsonreuters.au + order: 1 + credentials: + client_id: + type: string + title: Client ID + description: The client ID from the App Management. + doc_section: '#step-1-obtain-your-client-credentials' + client_secret: + type: string + title: Client Secret + description: The client secret from the App Management. + secret: true + doc_section: '#step-1-obtain-your-client-credentials' + +thomson-reuters-legal-tracker-tr-account: + display_name: Thomson Reuters Legal Tracker (TR Account) + alias: thomson-reuters-legal-tracker + categories: + - legal + auth_mode: OAUTH2_CC + token_url: https://auth.thomsonreuters.com/oauth/token + token_request_auth_method: basic + token_headers: + content-type: application/x-www-form-urlencoded + token_params: + grant_type: client_credentials + audience: 506f6a92-4fd1-43c1-bf18-4e3735ea55aa + docs: https://nango.dev/docs/api-integrations/thomson-reuters-legal-tracker-tr-account + docs_connect: https://nango.dev/docs/api-integrations/thomson-reuters-legal-tracker-tr-account/connect + credentials: + client_id: + type: string + title: Client ID + description: Your TR Account client ID. + doc_section: '#step-1-obtain-your-client-credentials' + client_secret: + type: string + title: Client Secret + description: Your TR Account client secret. + secret: true + doc_section: '#step-1-obtain-your-client-credentials' + +terraform: + display_name: Terraform + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://app.terraform.io + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'x-ratelimit-reset' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v2/organizations + docs: https://nango.dev/docs/integrations/all/terraform + docs_connect: https://nango.dev/docs/integrations/all/terraform/connect + credentials: + apiKey: + type: string + title: API Token + description: The API Token for your Terraform account + doc_section: '#step-1-generating-your-api-token' + example: VbQo**************************** + pattern: '^[a-zA-Z0-9.]{50,}$' + +ticktick: + display_name: TickTick + categories: + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://ticktick.com/oauth/authorize + token_url: https://ticktick.com/oauth/token + scope_separator: ' ' + proxy: + base_url: https://api.ticktick.com + docs: https://nango.dev/docs/integrations/all/ticktick + +tiktok-accounts: + display_name: TikTok Accounts + categories: + - social + auth_mode: OAUTH2 + authorization_url: https://www.tiktok.com/v2/auth/authorize/ + token_url: https://business-api.tiktok.com/open_api/v1.3/tt_user/oauth2/token/ + refresh_url: https://business-api.tiktok.com/open_api/v1.3/tt_user/oauth2/refresh_token/ + proxy: + base_url: https://business-api.tiktok.com/open_api/v1.3/ + authorization_params: + response_type: code + authorization_url_replacements: + client_id: client_key + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + scope_separator: ',' + docs: https://nango.dev/docs/integrations/all/tiktok-accounts + +tiktok-ads: + display_name: TikTok Ads + categories: + - social + auth_mode: OAUTH2 + authorization_url: https://business-api.tiktok.com/portal/auth + token_url: https://business-api.tiktok.com/open_api/v1.3/oauth2/access_token/ + proxy: + base_url: https://business-api.tiktok.com/open_api/v1.3/ + headers: + access-token: ${accessToken} + token_params: + grant_type: authorization_code + authorization_url_replacements: + client_id: app_id + docs: https://nango.dev/docs/integrations/all/tiktok-ads + +tiktok-personal: + display_name: TikTok Personal + categories: + - social + auth_mode: OAUTH2 + authorization_url: https://www.tiktok.com/v2/auth/authorize/ + token_url: https://open.tiktokapis.com/v2/oauth/token/ + proxy: + base_url: https://open.tiktokapis.com + retry: + at: + - 'x-ratelimit-reset' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + body_format: form + scope_separator: ',' + authorization_url_replacements: + client_id: client_key + docs: https://nango.dev/docs/integrations/all/tiktok-personal + +timely: + display_name: Timely + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://api.timelyapp.com/1.1/oauth/authorize + token_url: https://api.timelyapp.com/1.1/oauth/token + disable_pkce: true + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://api.timelyapp.com + docs: https://nango.dev/docs/integrations/all/timely + +thrivecart-oauth: + display_name: ThriveCart (OAuth) + categories: + - e-commerce + - payment + auth_mode: OAUTH2 + authorization_url: https://thrivecart.com/authorization/new + token_url: https://thrivecart.com/authorization/token + scope_separator: ' ' + proxy: + base_url: https://thrivecart.com/api/external + docs: https://nango.dev/docs/integrations/all/thrivecart-oauth + +thrivecart-api-key: + display_name: ThriveCart (API Key) + categories: + - e-commerce + - payment + auth_mode: API_KEY + proxy: + base_url: https://thrivecart.com/api/external + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /ping + docs: https://nango.dev/docs/integrations/all/thrivecart-api-key + credentials: + apiKey: + type: string + title: API Key + description: The API key for your ThriveCart account + example: 'ASYDV5S8-0BSO1SH2-4BH5PO7U-YF8SV3CZ' + pattern: '^[A-Z0-9]{8}-[A-Z0-9]{10}-[A-Z0-9]{8}-[A-Z0-9]{8}$' + +trakstar-hire: + display_name: Trakstar Hire + categories: + - ats + auth_mode: BASIC + proxy: + base_url: https://api.recruiterbox.com + verification: + method: GET + endpoints: + - /v2/openings + headers: + content-type: application/json + docs: https://nango.dev/docs/integrations/all/trakstar-hire + docs_connect: https://nango.dev/docs/integrations/all/trakstar-hire/connect + credentials: + username: + type: string + title: API Key + description: Your Trakstar API Key + pattern: '^[a-f0-9]+$' + example: a3f8b92c4d6e715f0a1b3c4d5e6f7890 + doc_section: '#step-1-generating-your-api-key' + password: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +trafft: + display_name: Trafft + categories: + - productivity + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.subdomain}.admin.trafft.com/api/v2/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.subdomain}.admin.trafft.com/api + docs: https://nango.dev/docs/integrations/all/trafft + docs_connect: https://nango.dev/docs/integrations/all/trafft/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of your Trafft instance + example: subdomain + format: hostname + prefix: https:// + suffix: .admin.trafft.com + doc_section: '#step-1-access-api-settings' + credentials: + client_id: + type: string + title: Client ID + description: Your Trafft OAuth2 Client ID. + doc_section: '#step-2-get-your-credentials' + client_secret: + type: string + title: Client Secret + description: Your Trafft OAuth2 Client Secret. + secret: true + doc_section: '#step-2-get-your-credentials' + +tremendous: + display_name: Tremendous + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://api.tremendous.com/oauth/authorize + token_url: https://api.tremendous.com/oauth/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.tremendous.com/api/v2 + docs: https://nango.dev/docs/integrations/all/tremendous + +tremendous-sandbox: + display_name: Tremendous (Sandbox) + categories: + - payment + auth_mode: OAUTH2 + authorization_url: https://testflight.tremendous.com/oauth/authorize + token_url: https://testflight.tremendous.com/oauth/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://testflight.tremendous.com/api/v2 + docs: https://nango.dev/docs/integrations/all/tremendous-sandbox + +perk: + display_name: Perk + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://app.travelperk.com/oauth2/authorize/ + token_url: https://app.travelperk.com/accounts/oauth2/token/ + disable_pkce: true + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.travelperk.com + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/api-integrations/perk + setup_guide_url: https://nango.dev/docs/api-integrations/perk/how-to-register-your-own-perk-api-oauth-app + +trello: + display_name: Trello + categories: + - productivity + - ticketing + auth_mode: OAUTH1 + request_url: https://trello.com/1/OAuthGetRequestToken + authorization_url: https://trello.com/1/OAuthAuthorizeToken + token_url: https://trello.com/1/OAuthGetAccessToken + signature_method: 'HMAC-SHA1' + scope_separator: ',' + authorization_params: + expiration: never + proxy: + base_url: https://api.trello.com + docs: https://nango.dev/docs/integrations/all/trello + +trello-scim: + display_name: Trello (SCIM API) + categories: + - productivity + - ticketing + auth_mode: API_KEY + proxy: + base_url: https://trello.com/scim + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/users?sortBy=displayName&count=10 + docs: https://nango.dev/docs/integrations/all/trello-scim + docs_connect: https://nango.dev/docs/integrations/all/trello-scim/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Trello scim account + doc_section: '#step-1-finding-your-trello-api-key' + +tldv: + display_name: tl;dv + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://pasta.tldv.io + headers: + x-api-key: ${apiKey} + docs: https://nango.dev/docs/integrations/all/tldv + docs_connect: https://nango.dev/docs/integrations/all/tldv/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your tl;dv account + doc_section: '#step-1-finding-your-api-key' + +trigify-io-mcp: + display_name: Trigify IO (MCP) + categories: + - dev-tools + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://clerk.trigify.io/oauth/authorize + token_url: https://clerk.trigify.io/oauth/token + registration_url: https://clerk.trigify.io/oauth/register + default_scopes: + - offline_access + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.trigify.io + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/trigify-io-mcp + +trigger-dev: + display_name: Trigger.dev + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.baseUrl} + headers: + authorization: Bearer ${apiKey} + connection_config: + environment: ${connectionConfig.environment} + projectRef: ${connectionConfig.projectRef} + triggerBranch: ${connectionConfig.triggerBranch} + docs: https://nango.dev/docs/api-integrations/trigger-dev + docs_connect: https://nango.dev/docs/api-integrations/trigger-dev/connect + connection_config: + baseUrl: + type: string + title: Hostname + description: The API hostname. + example: api.trigger.dev + format: hostname + prefix: https:// + order: 1 + doc_section: '#step-4-set-your-base-url' + projectRef: + type: string + title: Project Ref + description: Your Trigger.dev project identifier. + example: proj_1234567890 + optional: true + doc_section: '#step-2-find-your-project-ref' + environment: + type: string + title: Environment + description: The target environment. + example: prod + optional: true + doc_section: '#step-3-find-your-environment' + triggerBranch: + type: string + title: Preview Branch + description: Target a specific preview branch for environment variable operations. + example: feature-xyz + optional: true + doc_section: '#step-5-set-your-preview-branch' + credentials: + apiKey: + type: string + title: Secret Key + description: Your Trigger.dev secret key or personal access token. + pattern: '^tr_(dev|prod|stg|preview|pat)_[a-zA-Z0-9]+$' + example: tr_dev_******************** + doc_section: '#step-1-get-your-secret-key-or-personal-access-token' + +triple-whale: + display_name: Triple Whale + categories: + - analytics + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.triplewhale.com + headers: + x-api-key: ${apiKey} + accept: application/json + verification: + method: GET + headers: + accept: application/json + content-type: application/json + endpoints: + - /api/v2/users/api-keys/me + docs: https://nango.dev/docs/api-integrations/triple-whale + docs_connect: https://nango.dev/docs/api-integrations/triple-whale/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Triple Whale API key. + example: 5ab87915-2deb-429c-a1e2-8b0495900f45 + format: uuid + doc_section: '#step-1-generating-your-api-key' + +tsheetsteam: + display_name: TSheets + categories: + - hr + - productivity + auth_mode: OAUTH2 + authorization_url: https://rest.tsheets.com/api/v1/authorize + token_url: https://rest.tsheets.com/api/v1/grant + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://rest.tsheets.com/api/v1 + docs: https://nango.dev/docs/integrations/all/tsheetsteam + +timify: + display_name: Timify + categories: + - productivity + auth_mode: TWO_STEP + body_format: json + token_url: https://${connectionConfig.subdomain}.timify.com/v1/auth/token + refresh_url: https://${connectionConfig.subdomain}.timify.com/v1/auth/refreshtoken + token_params: + appid: ${credentials.appId} + appsecret: ${credentials.appSecret} + refresh_token_params: + refreshtoken: ${refresh_token} + token_headers: + content-type: application/json + accept: application/json + token_response: + token: accessToken + token_expiration: expires + token_expiration_strategy: expireIn + refresh_token: refreshToken + proxy: + base_url: https://${connectionConfig.subdomain}.timify.com + headers: + authorization: ${accessToken} + docs: https://nango.dev/docs/api-integrations/timify + docs_connect: https://nango.dev/docs/api-integrations/timify/connect + connection_config: + subdomain: + type: string + title: Timify Subdomain + description: The subdomain of your Timify API. + pattern: '^[a-z0-9_-]+$' + example: api + order: 1 + suffix: .timify.com + prefix: https:// + doc_section: '#step-1-finding-your-subdomain' + credentials: + appId: + type: string + title: App ID + description: Your Timify app ID + doc_section: '#step-3-getting-your-credentials' + appSecret: + type: string + title: App Secret + description: Your Timify app secret + secret: true + doc_section: '#step-3-getting-your-credentials' + +toast: + display_name: Toast + categories: + - erp + auth_mode: TWO_STEP + body_format: json + token_url: https://${connectionConfig.subdomain}.toasttab.com/authentication/v1/authentication/login + token_params: + clientId: ${credentials.clientId} + clientSecret: ${credentials.clientSecret} + userAccessType: TOAST_MACHINE_CLIENT + token_headers: + content-type: application/json + token_response: + token: token.accessToken + token_expiration: token.expiresIn + token_expiration_strategy: expireIn + token_expiration_buffer: 60 + proxy: + base_url: https://${connectionConfig.subdomain}.toasttab.com + headers: + toast-restaurant-external-id: ${connectionConfig.restaurantId} + docs: https://nango.dev/docs/api-integrations/toast + docs_connect: https://nango.dev/docs/api-integrations/toast/connect + connection_config: + subdomain: + type: string + title: API Subdomain + description: The Toast API subdomain for your environment. + example: ws-api + pattern: '^[a-z0-9-]+$' + order: 1 + restaurantId: + type: string + title: Restaurant External ID + description: The Toast GUID for the restaurant to connect to. + example: 4721e7a9-b4ae-4fef-9230-b3dae186e0a4 + format: uuid + optional: true + credentials: + clientId: + type: string + title: Client ID + description: Your Toast API client identifier. + clientSecret: + type: string + title: Client Secret + description: Your Toast API client secret. + secret: true + +todoist: + display_name: Todoist + categories: + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://todoist.com/oauth/authorize + token_url: https://todoist.com/oauth/access_token + scope_separator: ',' + proxy: + base_url: https://api.todoist.com + docs: https://nango.dev/docs/integrations/all/todoist + +toggl: + display_name: Toggl Track + categories: + - productivity + auth_mode: BASIC + proxy: + base_url: https://api.track.toggl.com + verification: + method: GET + endpoints: + - /api/v9/me + retry: + after: + - 'x-toggl-quota-resets-in' + docs: https://nango.dev/docs/api-integrations/toggl + docs_connect: https://nango.dev/docs/api-integrations/toggl/connect + credentials: + username: + type: string + title: Email or API token + description: Your Toggl Track account email, or your API token when using token-based Basic Auth. + doc_section: '#step-1-choose-emailpassword-or-api-token' + password: + type: string + title: Password or api_token + description: Your Toggl Track account password, or the literal text api_token when authenticating with an API token. + secret: true + doc_section: '#step-1-choose-emailpassword-or-api-token' + +torii: + display_name: Torii + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.toriihq.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1.0/orgs/my + retry: + at: + - 'x-rate-limit-reset' + docs: https://nango.dev/docs/api-integrations/torii + docs_connect: https://nango.dev/docs/api-integrations/torii/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Torii account + doc_section: '#step-1-generating-your-api-key' + +tumblr: + display_name: Tumblr + categories: + - social + - communication + auth_mode: OAUTH2 + authorization_url: https://www.tumblr.com/oauth2/authorize + token_url: https://api.tumblr.com/v2/oauth2/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.tumblr.com/v2 + docs: https://nango.dev/docs/integrations/all/tumblr + +twitch: + display_name: Twitch + categories: + - gaming + - social + - sports + - video + auth_mode: OAUTH2 + authorization_url: https://id.twitch.tv/oauth2/authorize + token_url: https://id.twitch.tv/oauth2/token + authorization_params: + force_verify: false + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.twitch.tv + docs: https://nango.dev/docs/integrations/all/twitch + +twitter: + display_name: Twitter (v1) + categories: + - marketing + - social + auth_mode: OAUTH1 + request_url: https://api.twitter.com/oauth/request_token + authorization_url: https://api.twitter.com/oauth/authorize + token_url: https://api.twitter.com/oauth/access_token + signature_method: 'HMAC-SHA1' + request_params: + x_auth_access_type: write + proxy: + base_url: https://api.twitter.com + docs: https://nango.dev/docs/integrations/all/twitter +twitter-v2: + display_name: Twitter (v2) + categories: + - marketing + - social + auth_mode: OAUTH2 + authorization_url: https://x.com/i/oauth2/authorize + token_url: https://api.twitter.com/2/oauth2/token + token_request_auth_method: basic + authorization_params: + response_type: code + response_mode: query + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + default_scopes: + - offline.access + proxy: + base_url: https://api.twitter.com + docs: https://nango.dev/docs/api-integrations/twitter-v2 + setup_guide_url: https://nango.dev/docs/api-integrations/twitter-v2/how-to-register-your-own-twitter-v2-api-oauth-app +twitter-oauth2-cc: + display_name: Twitter (Client Credentials) + categories: + - marketing + - social + auth_mode: OAUTH2_CC + token_url: https://api.twitter.com/oauth2/token + token_request_auth_method: basic + scope_separator: ' ' + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.twitter.com + docs: https://nango.dev/docs/integrations/all/twitter-oauth2-cc + +twinfield: + display_name: Twinfield + categories: + - accounting + auth_mode: OAUTH2 + authorization_url: https://login.twinfield.com/auth/authentication/connect/authorize + token_url: https://login.twinfield.com/auth/authentication/connect/token + authorization_params: + response_type: code + nonce: AnotherRandomStringTwinfield + refresh_params: + grant_type: refresh_token + scope_separator: ' ' + default_scopes: + - openid + - twf.user + - twf.organisation + - twf.organisationUser + - offline_access + disable_pkce: true + proxy: + base_url: https://${connectionConfig.cluster}.twinfield.com + docs: https://nango.dev/docs/integrations/all/twinfield + connection_config: + cluster: + type: string + title: Twinfield Cluster + description: The cluster to your Twinfield instance + pattern: '^[a-z0-9_-]+$' + example: accounting + suffix: .twinfield.com + prefix: https:// + +twenty-crm: + display_name: Twenty CRM + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://api.twenty.com/rest + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'retry-after' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /companies + docs: https://nango.dev/docs/integrations/all/twenty-crm + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Twenty CRM account + example: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyMTIxMjEyMS0yNmExLTRkODktYjQ2YS0wNDI0NTViODM3N2YiLCJ0eXBlIjoiQVBJX0tFWSIsIndvcmtzcGFjZUlkIjoiMjEyMTIxMjEtMjZhMS00ZDg5LWI0NmEtMDQyNDU1YjgzNzdmIiwiaWF0IjoxNzMxMzA5MzQwLCJleHAiOjQ4ODQ5MDU3MzksImp0aSI6ImVmZTg4MjcxLTM4OWItNDk5Mi04MjYwLWZjNGIxZmYxYjRiMSJ9.n3tohFIEBBRMsyas_agbh3-KvKXYUnjyhrYzTHYC3vc' + pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' + +twenty-crm-self-hosted: + display_name: Twenty CRM (Self Hosted) + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.domain}/rest + headers: + authorization: Bearer ${apiKey} + retry: + after: + - 'retry-after' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /companies + docs: https://nango.dev/docs/integrations/all/twenty-crm-self-hosted + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Twenty CRM account + example: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyMTIxMjEyMS0yNmExLTRkODktYjQ2YS0wNDI0NTViODM3N2YiLCJ0eXBlIjoiQVBJX0tFWSIsIndvcmtzcGFjZUlkIjoiMjEyMTIxMjEtMjZhMS00ZDg5LWI0NmEtMDQyNDU1YjgzNzdmIiwiaWF0IjoxNzMxMzA5MzQwLCJleHAiOjQ4ODQ5MDU3MzksImp0aSI6ImVmZTg4MjcxLTM4OWItNDk5Mi04MjYwLWZjNGIxZmYxYjRiMSJ9.n3tohFIEBBRMsyas_agbh3-KvKXYUnjyhrYzTHYC3vc' + pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' + connection_config: + domain: + type: string + title: Twenty CRM domain + description: The domain of your Twnety CRM instance + pattern: '^[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' + example: domain + +twilio: + display_name: Twilio + categories: + - dev-tools + - communication + auth_mode: BASIC + proxy: + base_url: https://api.twilio.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /2010-04-01/Accounts/${credentials.username}/Messages.json + docs: https://nango.dev/docs/integrations/all/twilio + docs_connect: https://nango.dev/docs/integrations/all/twilio/connect + credentials: + username: + type: string + title: Account SID + description: Your Twilio Account SID + pattern: '^AC[a-zA-Z0-9]{32}$' + doc_section: '#step-1-finding-your-account-sid' + password: + type: string + title: Auth Token + description: Your Twilio Auth Token + secret: true + doc_section: '#step-2-finding-your-auth-token' + +typeform: + display_name: Typeform + categories: + - surveys + auth_mode: OAUTH2 + authorization_url: https://api.typeform.com/oauth/authorize + token_url: https://api.typeform.com/oauth/token + disable_pkce: true + default_scopes: + - offline + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.typeform.com + docs: https://nango.dev/docs/integrations/all/typeform + +typefully: + display_name: Typefully + categories: + - analytics + - communication + - social + auth_mode: API_KEY + proxy: + base_url: https://api.typefully.com + headers: + x-api-key: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/notifications/ + docs: https://nango.dev/docs/integrations/all/typefully + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Typefully account + +typefully-v2: + display_name: Typefully (API v2) + categories: + - analytics + - communication + - social + auth_mode: API_KEY + proxy: + base_url: https://api.typefully.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v2/me + retry: + at: + - 'x-ratelimit-user-reset' + - 'x-ratelimit-socialset-reset' + docs: https://nango.dev/docs/api-integrations/typefully-v2 + docs_connect: https://nango.dev/docs/api-integrations/typefully-v2/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Typefully v2 API key. + example: 'aNVlyR********************YxeIDz' + pattern: '^[A-Za-z0-9]{32}$' + doc_section: '#step-1-generating-your-api-key' + +uber: + display_name: Uber + categories: + - other + auth_mode: OAUTH2 + authorization_url: https://login.uber.com/oauth/v2/authorize + token_url: https://login.uber.com/oauth/v2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.uber.com + docs: https://nango.dev/docs/integrations/all/uber + +ukg-pro-wfm: + display_name: UKG Pro (Workforce Management) + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://welcome-us.ukg.net/authorize + token_url: https://welcome-us.ukg.net/oauth/token + scope_separator: ' ' + authorization_params: + response_type: code + audience: https://wfm.ukg.net/api + realm: ${connectionConfig.tenantName} + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.hostname}/api + docs: https://nango.dev/docs/integrations/all/ukg-pro-wfm + docs_connect: https://nango.dev/docs/integrations/all/ukg-pro-wfm/connect + connection_config: + hostname: + type: string + title: Tenant URL + description: The tenant URL of your UKG Pro instance + format: hostname + example: wfm.us1.ukg.com + suffix: /api + prefix: https:// + doc_section: '#step-1-finding-your-tenant-url-and-tenant-name' + tenantName: + type: string + title: Tenant Name + description: The tenant name of your UKG Pro instance + example: wfm + doc_section: '#step-1-finding-your-tenant-url-and-tenant-name' + +ukg-pro: + display_name: UKG Pro + categories: + - hr + - popular + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.hostname} + headers: + content-type: application/json + us-customer-api-key: ${connectionConfig.customerApiKey} + docs: https://nango.dev/docs/integrations/all/ukg-pro + docs_connect: https://nango.dev/docs/integrations/all/ukg-pro/connect + credentials: + username: + type: string + title: Service Account Username + description: The username for your UKG Pro service account + doc_section: '#step-2-creating-a-web-service-account' + password: + type: string + title: Service Account Password + description: The password generated for your UKG Pro service account + doc_section: '#step-2-creating-a-web-service-account' + secret: true + connection_config: + customerApiKey: + type: string + order: 2 + title: Customer API Key + description: Your UKG Pro Customer API Key found in Service Account Administration + doc_section: '#step-1-finding-your-customer-api-key' + secret: true + hostname: + type: string + order: 1 + title: Hostname + description: The tenant URL of your UKG Pro instance + format: hostname + example: servicet.ultipro.com + prefix: https:// + doc_section: '#step-3-finding-your-hostname' + +ukg-pro-cc: + display_name: UKG Pro HCM (Client Credentials) + categories: + - hr + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.identityServer}/signin/oauth2/t/${connectionConfig.tenantId}/access_token + body_format: form + token_headers: + content-type: application/x-www-form-urlencoded + accept: application/json + token_params: + grant_type: client_credentials + proxy: + retry: + after: + - 'retry-after' + base_url: https://${connectionConfig.hostname} + docs: https://nango.dev/docs/api-integrations/ukg-pro-cc + docs_connect: https://nango.dev/docs/api-integrations/ukg-pro-cc/connect + credentials: + client_id: + type: string + title: Client ID + description: Unique identifier of the identity client provided by UKG customer support. + doc_section: '#step-1-getting-the-credentials-from-ukg-support' + client_secret: + type: string + title: Client Secret + description: Client secret associated with the client ID provided by UKG customer support. + secret: true + doc_section: '#step-1-getting-the-credentials-from-ukg-support' + connection_config: + identityServer: + type: string + title: Identity Server + description: Identity server for your tenant. + format: hostname + example: signin.ukg.net + order: 1 + doc_section: '#step-1-getting-the-credentials-from-ukg-support' + tenantId: + type: string + title: Tenant + description: Tenant value from your UKG Pro Recruiting URL. + example: UO32145HGOGOG + pattern: '^[a-zA-Z0-9]+$' + order: 3 + doc_section: '#step-2-identify-tenant-and-recruiting-application-domain' + hostname: + type: string + title: Recruiting Application Domain + description: Recruiting application domain from your UKG Pro Recruiting URL. + format: hostname + example: recruiting.example.ultipro.com + prefix: https:// + order: 2 + doc_section: '#step-2-identify-tenant-and-recruiting-application-domain' + +ukg-ready: + display_name: UKG Ready + categories: + - hr + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.hostname}/ta/rest/v2/companies/${connectionConfig.realmId}/oauth2/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.hostname} + docs: https://nango.dev/docs/integrations/all/ukg-ready + docs_connect: https://nango.dev/docs/integrations/all/ukg-ready/connect + connection_config: + realmId: + type: string + title: Company ID + description: A unique identifier for your company. + example: '23444234' + doc_section: '#step-3-finding-your-company-id' + hostname: + type: string + title: Hostname + description: The hostname to your UKG Ready instance + format: hostname + example: secure.us.rdy.ukg + suffix: /ta + prefix: https:// + doc_section: '#step-4-finding-your-hostname' +unanet: + display_name: Unanet + categories: + - crm + - erp + - accounting + auth_mode: BASIC + proxy: + headers: + x-compass-firm-id: ${connectionConfig.firmId} + x-compass-api-key: ${connectionConfig.apiKey} + base_url: https://compass.cosential.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/projects + docs: https://nango.dev/docs/integrations/all/unanet + docs_connect: https://nango.dev/docs/integrations/all/unanet/connect + connection_config: + firmId: + type: string + title: Firm ID + description: The firm ID of your Unanet instance + doc_section: '#step-2-finding-the-firm-id' + apiKey: + type: string + title: API Key + description: The API key of your Unanet instance + secret: true + doc_section: '#step-3-finding-the-api-key' + credentials: + username: + type: string + title: User name + description: Your Unanet username + doc_section: '#step-1-finding-username-and-password' + password: + type: string + title: Password + description: Your Unanet password + default_value: '' + doc_section: '#step-1-finding-username-and-password' + +unauthenticated: + display_name: Unauthenticated + categories: + - other + auth_mode: NONE + webhook_routing_script: unauthenticatedWebhookRouting + docs: https://nango.dev/docs/integrations/all/unauthenticated + +unipile: + display_name: Unipile + categories: + - crm + - marketing + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.subdomain}.unipile.com:${connectionConfig.port} + headers: + x-api-key: ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v1/accounts + docs: https://nango.dev/docs/integrations/all/unipile + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Unipile instance + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of your Unipile instance + pattern: '^[a-z0-9_-]+$' + example: api1 + suffix: .unipile.com + prefix: https:// + port: + type: string + title: Port + description: The port of your Unipile instance + pattern: '^[0-9]+$' + example: '13113' + +upsales: + display_name: Upsales + categories: + - crm + auth_mode: API_KEY + proxy: + base_url: https://integration.upsales.com + query: + token: ${apiKey} + retry: + at: + - 'x-ratelimit-reset' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /api/v2/users + docs: https://nango.dev/docs/api-integrations/upsales + docs_connect: https://nango.dev/docs/api-integrations/upsales/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Upsales API Token + doc_section: '#step-1-finding-your-api-token' + +vercel: + display_name: Vercel + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.vercel.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v2/user + docs: https://nango.dev/docs/api-integrations/vercel + docs_connect: https://nango.dev/docs/api-integrations/vercel/connect + credentials: + apiKey: + type: string + title: Token + description: The Token for your Vercel account. + pattern: '^vcp_[A-Za-z0-9]+$' + example: 'vcp_6ppUxFRd****r1sc53a' + doc_section: '#step-1-finding-your-token' + +vercel-mcp: + display_name: Vercel (MCP) + categories: + - dev-tools + - mcp + auth_mode: MCP_OAUTH2 + client_registration: static + authorization_url: https://vercel.com/oauth/authorize + token_url: https://vercel.com/api/login/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + default_scopes: + - offline_access + proxy: + headers: + accept: application/json,text/event-stream + base_url: https://mcp.vercel.com + docs: https://nango.dev/docs/api-integrations/vercel-mcp + setup_guide_url: https://nango.dev/docs/api-integrations/vercel-mcp/how-to-register-your-own-vercel-mcp-oauth-app + +vimeo: + display_name: Vimeo (OAuth) + categories: + - video + auth_mode: OAUTH2 + authorization_url: https://api.vimeo.com/oauth/authorize + token_url: https://api.vimeo.com/oauth/access_token + token_request_auth_method: basic + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://api.vimeo.com + docs: https://nango.dev/docs/integrations/all/vimeo + +vimeo-basic: + display_name: Vimeo (Basic Auth) + categories: + - video + auth_mode: BASIC + proxy: + base_url: https://api.vimeo.com + verification: + method: GET + headers: + content-type: application/json + endpoints: + - / + docs: https://nango.dev/docs/integrations/all/vimeo-basic + +valley-api-key: + display_name: Valley (API Key) + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.joinvalley.co/api + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v1/auth/verify-api-key + retry: + at: + - 'x-ratelimit-reset' + docs: https://nango.dev/docs/integrations/all/valley-api-key + docs_connect: https://nango.dev/docs/integrations/all/valley-api-key/connect + credentials: + apiKey: + type: string + title: API Key + example: valley_a3f4c8d2e1b9a7**********************************************c5d8e2f1 + pattern: '^valley_[a-f0-9]{64}$' + description: The API key for your Valley account + doc_section: '#step-1-verifying-your-api-key' + +valley: + display_name: Valley (OAuth) + categories: + - marketing + auth_mode: TWO_STEP + body_format: json + token_url: https://api.joinvalley.co/api/v1/auth/get-token + refresh_url: https://api.joinvalley.co/api/v1/auth/refresh-token + token_params: + email: ${credentials.email} + password: ${credentials.password} + refresh_token_params: + refresh_token: ${refresh_token} + token_headers: + content-type: application/json + proxy: + base_url: https://api.joinvalley.co/api/ + headers: + authorization: Bearer ${accessToken} + retry: + at: + - 'x-ratelimit-reset' + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + refresh_token: refresh_token + docs: https://nango.dev/docs/integrations/all/valley + docs_connect: https://nango.dev/docs/integrations/all/valley/connect + credentials: + email: + type: string + title: Email + description: Your Valley email address + format: email + doc_section: '#step-1-getting-your-credentials' + password: + type: string + title: Password + description: Your Valley password + doc_section: '#step-1-getting-your-credentials' + +vanta: + display_name: Vanta + categories: + - dev-tools + auth_mode: OAUTH2_CC + token_url: https://api.vanta.com/oauth/token + token_params: + grant_type: client_credentials + body_format: json + proxy: + base_url: https://api.vanta.com + docs: https://nango.dev/docs/api-integrations/vanta + docs_connect: https://nango.dev/docs/api-integrations/vanta/connect + +veeva-vault: + display_name: Veeva Vault + categories: + - crm + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.subdomain}.veevavault.com/api/${connectionConfig.version}/auth + token_params: + username: ${credentials.username} + password: ${credentials.password} + token_headers: + content-type: application/x-www-form-urlencoded + accept: application/json + token_response: + token: sessionId + proxy: + base_url: https://${connectionConfig.subdomain}.veevavault.com/api/${connectionConfig.version} + headers: + authorization: ${accessToken} + accept: application/json + docs: https://nango.dev/docs/api-integrations/veeva-vault + docs_connect: https://nango.dev/docs/api-integrations/veeva-vault/connect + credentials: + username: + type: string + title: Username + description: Your Vault user name assigned by your administrator + doc_section: '#step-2-obtaining-your-credentials' + password: + type: string + title: Password + description: Your Vault password associated with your assigned Vault user name + secret: true + doc_section: '#step-2-obtaining-your-credentials' + connection_config: + subdomain: + type: string + title: Vault DNS (subdomain) + description: The Vault DNS subdomain of the Veeva Vault you want to connect to + example: myvault + prefix: https:// + suffix: veevavault.com + order: 1 + doc_section: '#step-1-finding-your-vault-dns-subdomain' + version: + type: string + title: '' + description: '' + default_value: '' + hidden: true + +vtex: + display_name: VTEX + categories: + - e-commerce + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.accountName}.vtexcommercestable.com.br + headers: + x-vtex-api-appkey: ${connectionConfig.appKey} + x-vtex-api-apptoken: ${apiKey} + docs: https://nango.dev/docs/api-integrations/vtex + docs_connect: https://nango.dev/docs/api-integrations/vtex/connect + connection_config: + accountName: + type: string + title: Account Name + description: Your VTEX store account name. + example: mystore + pattern: '^[a-zA-Z0-9_-]+$' + suffix: .vtexcommercestable.com.br + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-account-name' + appKey: + type: string + title: App Key + description: Your VTEX application key. + example: vtexappkey-mystore-ABCDEF + secret: true + pattern: '^vtexappkey-[a-zA-Z0-9_-]+-[A-Z0-9]+$' + order: 2 + doc_section: '#step-2-generating-an-api-key' + credentials: + apiKey: + type: string + title: App Token + description: The application token associated with your VTEX App Key. + example: ZNWDC************************************LXPNX + pattern: '^[A-Z]+$' + doc_section: '#step-2-generating-an-api-key' + +videoask: + display_name: VideoAsk + categories: + - video + auth_mode: OAUTH2 + authorization_url: https://auth.videoask.com/authorize + token_url: https://auth.videoask.com/oauth/token + disable_pkce: true + default_scopes: + - openid + - profile + - email + - offline_access + authorization_params: + response_type: code + audience: https://api.videoask.com/ + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.videoask.com + webhook_routing_script: videoaskWebhookRouting + webhook_user_defined_secret: true + docs: https://nango.dev/docs/api-integrations/videoask + setup_guide_url: https://nango.dev/docs/api-integrations/videoask/how-to-register-your-own-videoask-api-oauth-app + +wappalyzer: + display_name: Wappalyzer + categories: + - marketing + - analytics + auth_mode: API_KEY + proxy: + base_url: https://api.wappalyzer.com + headers: + x-api-key: ${apiKey} + verification: + method: GET + endpoints: + - /v2/credits/balance/ + docs: https://nango.dev/docs/api-integrations/wappalyzer + docs_connect: https://nango.dev/docs/api-integrations/wappalyzer/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Wappalyzer API key. + doc_section: '#step-1-get-your-api-key' + +wakatime: + display_name: Wakatime + categories: + - analytics + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://wakatime.com/oauth/authorize + token_url: https://wakatime.com/oauth/token + proxy: + base_url: https://wakatime.com + docs: https://nango.dev/docs/integrations/all/wakatime + +walmart: + display_name: Walmart Marketplace + categories: + - e-commerce + auth_mode: OAUTH2 + authorization_url: https://login.account.wal-mart.com/authorize + authorization_params: + clientType: ${connectionConfig.clientType} + nonce: ${random} + disable_pkce: true + authorization_url_replacements: + response_type=: responseType= + client_id=: clientId= + redirect_uri=: redirectUri= + token_url: https://marketplace.walmartapis.com/v3/token + redirect_uri_metadata: + - sellerId + proxy: + base_url: https://marketplace.walmartapis.com + headers: + wm_qos.correlation_id: ${random} + wm_sec.access_token: ${accessToken} + docs: https://nango.dev/docs/api-integrations/walmart + setup_guide_url: https://nango.dev/docs/api-integrations/walmart/how-to-register-your-own-walmart-marketplace-oauth-app + connection_config: + clientType: + type: string + title: '' + description: '' + default_value: seller + hidden: true + +wave-accounting: + display_name: Wave Accounting + categories: + - accounting + auth_mode: OAUTH2 + authorization_url: https://api.waveapps.com/oauth2/authorize + token_url: https://api.waveapps.com/oauth2/token/ + proxy: + base_url: https://gql.waveapps.com + docs: https://nango.dev/docs/integrations/all/wave-accounting + +wealthbox: + display_name: Wealthbox + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://app.crmworkspace.com/oauth/authorize + token_url: https://app.crmworkspace.com/oauth/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.crmworkspace.com + docs: https://nango.dev/docs/integrations/all/wealthbox + +webflow: + display_name: Webflow + categories: + - dev-tools + - design + - cms + auth_mode: OAUTH2 + authorization_url: https://webflow.com/oauth/authorize + token_url: https://api.webflow.com/oauth/access_token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://api.webflow.com + docs: https://nango.dev/docs/integrations/all/webflow + +webex: + display_name: Webex + categories: + - communication + auth_mode: OAUTH2 + scope_separator: ' ' + authorization_url: https://webexapis.com/v1/authorize + token_url: https://webexapis.com/v1/access_token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://webexapis.com + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/webex + +webinarjam: + display_name: WebinarJam + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://api.webinarjam.com/webinarjam + query: + api_key: ${apiKey} + verification: + method: POST + headers: + content-type: application/x-www-form-urlencoded + endpoints: + - /webinars + docs: https://nango.dev/docs/api-integrations/webinarjam + docs_connect: https://nango.dev/docs/api-integrations/webinarjam/connect + credentials: + apiKey: + type: string + title: API Key + description: Your WebinarJam API key. + example: b7e2d4f1-8a3c-4e6b-9d5f-1a2b3c4d5e6f + format: uuid + doc_section: '#step-1-getting-your-api-key' + +wejam: + display_name: WeJam AI + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://api.wejam.ai + headers: + x-api-key: ${apiKey} + docs: https://nango.dev/docs/api-integrations/wejam + docs_connect: https://nango.dev/docs/api-integrations/wejam/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your WeJam account. + doc_section: '#step-1-getting-your-api-key' + pattern: '^[a-f0-9]+$' + example: c0c1fc3f**************************************************************************************** + +whatsapp-business: + display_name: WhatsApp Business + categories: + - communication + - marketing + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + content-type: application/json + base_url: https://graph.facebook.com + verification: + headers: + content-type: application/json + endpoints: + - /v21.0/me + method: GET + docs: https://nango.dev/docs/api-integrations/whatsapp-business + setup_guide_url: https://nango.dev/docs/api-integrations/whatsapp-business/how-to-register-your-own-whatsapp-business-api-oauth-app + credentials: + apiKey: + type: string + title: API Key + description: The access token to your whatsapp account + pattern: '^[a-zA-Z0-9]+$' + +whoop: + display_name: Whoop + categories: + - sports + auth_mode: OAUTH2 + authorization_url: https://api.prod.whoop.com/oauth/oauth2/auth + token_url: https://api.prod.whoop.com/oauth/oauth2/token + authorization_params: + response_type: code + proxy: + base_url: https://api.prod.whoop.com/ + retry: + after: + - 'x-ratelimit-reset' + paginate: + type: cursor + offset_name_in_request: nextToken + limit_name_in_request: limit + docs: https://nango.dev/docs/integrations/all/whoop + +wildix-pbx: + display_name: Wildix PBX + categories: + - communication + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.wildixin.com/authorization/oauth2 + token_url: https://${connectionConfig.subdomain}.wildixin.com/authorization/oauth2Token + authorization_params: + response_type: code + redirect_uri_metadata: + - subdomain + docs: https://nango.dev/docs/integrations/all/wildix-pbx + proxy: + base_url: https://${connectionConfig.subdomain}.wildixin.com + connection_config: + subdomain: + type: string + title: Wildix Domain + description: The subdomain of your Wildix instance + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .wildixin.com + prefix: https:// + +wiza: + display_name: Wiza + categories: + - crm + - marketing + auth_mode: API_KEY + proxy: + base_url: https://wiza.co/api + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /meta/credits + docs: https://nango.dev/docs/integrations/all/wiza + docs_connect: https://nango.dev/docs/integrations/all/wiza/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Wiza API key + pattern: '^[a-f0-9]{64}$' + example: 6e0f838beb0a09d35f3f56b52b1344b262ecc713aab41456485d12c5f6edaef7 + doc_section: '#step-1-getting-your-api-key' + +wordpress: + display_name: WordPress + categories: + - dev-tools + - design + - cms + auth_mode: OAUTH2 + authorization_url: https://public-api.wordpress.com/oauth2/authorize + token_url: https://public-api.wordpress.com/oauth2/token + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + proxy: + base_url: https://public-api.wordpress.com/rest/v1 + docs: https://nango.dev/docs/integrations/all/wordpress + +wordpress-mcp: + display_name: WordPress.com (MCP) + categories: + - cms + - mcp + auth_mode: MCP_OAUTH2 + client_registration: dynamic + authorization_url: https://public-api.wordpress.com/oauth2-1/authorize + token_url: https://public-api.wordpress.com/oauth2-1/token + registration_url: https://public-api.wordpress.com/oauth2-1/register + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://public-api.wordpress.com/wpcom + headers: + accept: application/json,text/event-stream + docs: https://nango.dev/docs/api-integrations/wordpress-mcp + +wiseagent: + display_name: Wiseagent + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://sync.thewiseagent.com/WiseAuth/auth + token_url: https://sync.thewiseagent.com/WiseAuth/token + body_format: json + disable_pkce: true + scope_separator: ' ' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://sync.thewiseagent.com + docs: https://nango.dev/docs/api-integrations/wiseagent + setup_guide_url: https://nango.dev/docs/api-integrations/wiseagent/how-to-register-your-own-wiseagent-oauth-app + +woocommerce: + display_name: WooCommerce + categories: + - e-commerce + - dev-tools + - design + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.storeURL} + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /wp-json/wc/v3/customers + docs: https://nango.dev/docs/integrations/all/woocommerce + docs_connect: https://nango.dev/docs/integrations/all/woocommerce/connect + connection_config: + storeURL: + type: string + title: Domain + description: The domain of your WooCommerce store + credentials: + username: + type: string + title: User name + description: Your woocommerce Consumer Key + doc_section: '#step-1-finding-your-woocommerce-consumer-key' + password: + type: string + title: Password + description: Your woocommerce Consumer Secret + default_value: '' + doc_section: '#step-2-finding-your-woocommerce-consumer-secret' + +workable: + display_name: Workable (API Key) + categories: + - ats + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://${connectionConfig.subdomain}.workable.com + retry: + at: + - 'x-rate-limit-reset' + post_connection_script: workablePostConnection + docs: https://nango.dev/docs/integrations/all/workable + docs_connect: https://nango.dev/docs/integrations/all/workable/connect + connection_config: + subdomain: + type: string + title: Workable Domain + description: The subdomain of your Workable account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .workable.com + prefix: https:// + optional: true + credentials: + apiKey: + type: string + title: API Key + description: The API key for your Workable account + doc_section: '#step-1-finding-workable-api-key' + +workable-oauth: + display_name: Workable (OAuth) + categories: + - ats + auth_mode: OAUTH2 + authorization_url: https://www.workable.com/oauth/authorize + token_url: https://www.workable.com/oauth/token + scope_separator: '+' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.subdomain}.workable.com + retry: + at: + - 'x-rate-limit-reset' + docs: https://nango.dev/docs/integrations/all/workable-oauth + connection_config: + subdomain: + type: string + title: Workable Domain + description: The subdomain of your Workable account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .workable.com + prefix: https:// + +workday: + display_name: Workday + categories: + - hr + - popular + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.hostname}/ccx/service/${connectionConfig.tenant} + docs: https://nango.dev/docs/integrations/all/workday + docs_connect: https://nango.dev/docs/integrations/all/workday/connect + connection_config: + hostname: + type: string + title: Hostname + description: The hostname of your Workday account + format: hostname + example: wd3-impl-services1.workday.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-hostname' + tenant: + type: string + title: Tenant + description: The tenant of your Workday account + example: acme + order: 2 + doc_section: '#step-2-finding-your-tenant' + credentials: + username: + type: string + example: ISU Nango@acme + title: Username + description: Workday API Username + pattern: '^[^@]+@[^@]+$' + doc_section: '#step-4-generating-your-username' + password: + type: string + title: Password + description: Workday API Password + doc_section: '#step-5-finding-your-password' + +workday-adaptive-planning-basic: + display_name: Workday Adaptive Planning (Basic Auth) + categories: + - accounting + auth_mode: BASIC + proxy: + base_url: https://api.adaptiveplanning.com/api/rest + docs: https://nango.dev/docs/api-integrations/workday-adaptive-planning-basic + docs_connect: https://nango.dev/docs/api-integrations/workday-adaptive-planning-basic/connect + credentials: + username: + type: string + title: Username + description: Your Workday Adaptive Planning username. + doc_section: '#step-1-find-your-username-and-password' + password: + type: string + title: Password + description: Your Workday Adaptive Planning password. + secret: true + doc_section: '#step-1-find-your-username-and-password' + +workday-oauth: + display_name: Workday (OAuth) + categories: + - hr + auth_mode: OAUTH2 + token_request_auth_method: basic + authorization_url: https://${connectionConfig.authorizationDomain}/${connectionConfig.tenant}/authorize + token_url: https://${connectionConfig.tokenDomain}/ccx/oauth2/${connectionConfig.tenant}/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://${connectionConfig.tokenDomain}/ccx/api + docs: https://nango.dev/docs/api-integrations/workday-oauth + docs_connect: https://nango.dev/docs/api-integrations/workday-oauth/connect + connection_config: + authorizationDomain: + type: string + title: Authorization Domain + description: The domain used to authorize your Workday account + format: hostname + example: impl.workday.com + prefix: https:// + order: 1 + suffix: /mytenant + doc_section: '#step-1-finding-your-authorization-domain' + tokenDomain: + type: string + title: Token Domain + description: The domain used to obtain the token for your Workday account + format: hostname + example: wd3-impl-services1.workday.com + prefix: https:// + order: 2 + suffix: /ccx + doc_section: '#step-2-finding-your-token-domain' + tenant: + type: string + title: Tenant + description: The tenant of your Workday account + example: yourtenant + order: 2 + doc_section: '#step-3-finding-your-tenant' + +workos: + display_name: WorkOS + categories: + - productivity + - iam + auth_mode: API_KEY + proxy: + base_url: https://api.workos.com + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /organizations?limit=1 + docs: https://nango.dev/docs/api-integrations/workos + docs_connect: https://nango.dev/docs/api-integrations/workos/connect + credentials: + apiKey: + type: string + title: API Key + description: Your WorkOS API key + pattern: '^sk_[A-Za-z0-9_]+$' + example: sk_test_a2V5XzAxS0cyS********************************************NUSlZ + doc_section: '#step-1-obtaining-your-workos-api-key' +workday-refresh-token: + display_name: Workday (Refresh Token Auth) + categories: + - hr + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.tokenDomain}/ccx/oauth2/${connectionConfig.tenant}/token + token_params: + grant_type: refresh_token + refresh_token: ${credentials.refreshToken} + token_headers: + content-type: application/x-www-form-urlencoded + authorization: Basic ${base64(${credentials.clientId}:${credentials.clientSecret})} + token_response: + token: access_token + token_expires_in_ms: 3600000 + proxy: + base_url: https://${connectionConfig.tokenDomain}/ccx/api + docs: https://nango.dev/docs/api-integrations/workday-refresh-token + docs_connect: https://nango.dev/docs/api-integrations/workday-refresh-token/connect + connection_config: + tokenDomain: + type: string + title: Token Domain + description: The domain used to obtain the token for your Workday account + format: hostname + example: wd3-impl-services1.workday.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-token-domain' + tenant: + type: string + title: Tenant + description: The tenant of your Workday account + example: mytenant + order: 2 + doc_section: '#step-2-finding-your-tenant' + credentials: + clientId: + type: string + title: Client ID + description: Your Workday API Client ID + doc_section: '#step-3-registering-an-api-client' + clientSecret: + type: string + title: Client Secret + description: Your Workday API Client Secret + secret: true + doc_section: '#step-3-registering-an-api-client' + refreshToken: + type: string + title: Refresh Token + description: Your Workday refresh token for the Integration System User + secret: true + doc_section: '#step-4-generating-a-refresh-token' + +workday-cc: + display_name: Workday (Client Credentials) + categories: + - hr + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.tokenDomain}/ccx/oauth2/${connectionConfig.tenant}/token + token_params: + grant_type: client_credentials + tenant_alias: ${connectionConfig.tenant} + token_headers: + content-type: application/x-www-form-urlencoded + authorization: ID ${base64(${credentials.clientId}:${credentials.clientSecret})} + token_response: + token: access_token + token_expiration: expires_in + token_expiration_strategy: expireIn + proxy: + base_url: https://${connectionConfig.tokenDomain}/ccx/api + docs: https://nango.dev/docs/api-integrations/workday-cc + docs_connect: https://nango.dev/docs/api-integrations/workday-cc/connect + connection_config: + tokenDomain: + type: string + title: Token Domain + description: The hostname of your Workday tenant. + format: hostname + example: wd3-impl-services1.workday.com + prefix: https:// + order: 1 + doc_section: '#step-2-finding-your-token-domain' + tenant: + type: string + title: Tenant + description: The tenant name of your Workday account. + example: mytenant + order: 2 + doc_section: '#step-3-finding-your-tenant' + credentials: + clientId: + type: string + title: Client ID + description: Your Workday API Client ID. + doc_section: '#step-5-register-an-api-client' + clientSecret: + type: string + title: Client Secret + description: Your Workday API Client Secret. + secret: true + doc_section: '#step-5-register-an-api-client' + +workday-adaptive-planning: + display_name: Workday Adaptive Planning + categories: + - accounting + auth_mode: TWO_STEP + body_format: form + token_url: https://${connectionConfig.host}/ccx/oauth2/${connectionConfig.tenant}/token + token_params: + grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer + assertion: ${credentials.assertion} + token_headers: + content-type: application/x-www-form-urlencoded + assertion: + type: jwt + key: ${credentials.privateKey} + lifetimeInSeconds: 300 + header: + alg: RS256 + typ: JWT + payload: + iss: ${credentials.clientId} + sub: ${credentials.isu} + aud: wd + additional_steps: + - token_request_method: GET + token_url: https://${connectionConfig.host}/ccx/api/planning/v1/${connectionConfig.tenant}/adaptiveAPIAccessToken + token_headers: + authorization: Bearer ${step1.access_token} + token_response: + token: adaptiveAPIAccessToken + proxy: + base_url: https://api.adaptiveplanning.com + docs: https://nango.dev/docs/api-integrations/workday-adaptive-planning + docs_connect: https://nango.dev/docs/api-integrations/workday-adaptive-planning/connect + connection_config: + host: + type: string + title: Host + description: The hostname of your Workday account. + format: hostname + example: wd3-impl-services1.workday.com + prefix: https:// + order: 1 + tenant: + type: string + title: Tenant + description: The tenant of your Workday account. + example: mytenant + order: 2 + credentials: + clientId: + type: string + title: Client ID + description: The Client ID from the Workday API Client registration. + isu: + type: string + title: ISU Username + description: The Integration System User (ISU) username. + assertion: + type: string + title: '' + description: '' + automated: true + privateKey: + type: string + title: Private Key + description: The RSA private key (PEM format) used to sign the JWT. + secret: true + +workpath: + display_name: Workpath + categories: + - productivity + auth_mode: API_KEY + proxy: + base_url: https://connect.workpath.com/api + headers: + authorization: Bearer ${apiKey} + verification: + method: GET + endpoints: + - /v3/kpis + docs: https://nango.dev/docs/api-integrations/workpath + docs_connect: https://nango.dev/docs/api-integrations/workpath/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Workpath API Token. + doc_section: '#step-1-getting-your-api-token' + +wrike: + display_name: Wrike + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://login.wrike.com/oauth2/authorize/v4 + token_url: https://login.wrike.com/oauth2/token + scope_separator: ',' + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + token_response_metadata: + - host + proxy: + base_url: https://${connectionConfig.host}/api/v4 + docs: https://nango.dev/docs/integrations/all/wrike + connection_config: + host: + type: string + title: Domain + description: The domain of your Wrike account + format: hostname + prefix: https:// + +wise-api-key: + display_name: Wise (API Key) + categories: + - banking + - payment + auth_mode: API_KEY + proxy: + headers: + authorization: Bearer ${apiKey} + base_url: https://api.wise.com + verification: + method: GET + endpoints: + - /v1/profiles + docs: https://nango.dev/docs/api-integrations/wise-api-key + docs_connect: https://nango.dev/docs/api-integrations/wise-api-key/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Wise Personal API Token + example: 12345678-1234-1234-1234-123456789abc + pattern: '^[a-f0-9-]{36}$' + doc_section: '#step-1-generating-your-api-token' +xai: + display_name: xAI + categories: + - productivity + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://api.x.ai + headers: + authorization: Bearer ${apiKey} + content-type: application/json + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /v1/api-key + docs: https://nango.dev/docs/integrations/all/xai + docs_connect: https://nango.dev/docs/integrations/all/xai/connect + credentials: + apiKey: + type: string + title: API Key + description: The API key for your xAI account + example: xai-****************************************************** + pattern: 'xai-[A-Za-z0-9]+$' + doc_section: '#step-1-generating-your-api-key' + +xero: + display_name: Xero + categories: + - accounting + - popular + auth_mode: OAUTH2 + authorization_url: https://login.xero.com/identity/connect/authorize + token_url: https://identity.xero.com/connect/token + authorization_params: + response_type: code + default_scopes: + - offline_access + - openid + proxy: + base_url: https://api.xero.com + retry: + after: + - 'retry-after' + post_connection_script: xeroPostConnection + webhook_routing_script: xeroWebhookRouting + webhook_user_defined_secret: true + docs: https://nango.dev/docs/api-integrations/xero + setup_guide_url: https://nango.dev/docs/api-integrations/xero/how-to-register-your-own-xero-api-oauth-app + +xero-oauth2-cc: + display_name: Xero (Client Credentials) + categories: + - accounting + auth_mode: OAUTH2_CC + token_url: https://identity.xero.com/connect/token + token_request_auth_method: basic + token_params: + grant_type: client_credentials + proxy: + base_url: https://api.xero.com + retry: + after: + - 'retry-after' + docs: https://nango.dev/docs/integrations/all/xero-oauth2-cc + docs_connect: https://nango.dev/docs/integrations/all/xero-oauth2-cc/connect + +yahoo: + display_name: Yahoo + categories: + - social + auth_mode: OAUTH2 + authorization_url: https://api.login.yahoo.com/oauth2/request_auth + token_url: https://api.login.yahoo.com/oauth2/get_token + proxy: + base_url: https://${connectionConfig.apiDomain} + docs: https://nango.dev/docs/integrations/all/yahoo + connection_config: + apiDomain: + type: string + title: API Domain + description: The domain to the API you want to connect to + format: hostname + example: fantasysports.yahooapis.com + prefix: https:// + +yotpo: + display_name: Yotpo + categories: + - e-commerce + auth_mode: TWO_STEP + proxy: + base_url: https://api.yotpo.com + headers: + x-yotpo-token: ${accessToken} + token_url: https://api.yotpo.com/core/v3/stores/${connectionConfig.storeId}/access_tokens + token_params: + secret: ${credentials.apiSecret} + token_headers: + content-type: application/json + token_response: + token: access_token + docs: https://nango.dev/docs/integrations/all/yotpo + docs_connect: https://nango.dev/docs/integrations/all/yotpo/connect + connection_config: + storeId: + type: string + title: App Key + description: Your Yotpo Store Key. + pattern: '^[A-Za-z0-9]{40}$' + doc_section: '#step-1-retrieving-your-app-key' + example: rvR3359XuCuuuEgCgcHNrQ9TE8zwC5dMzWMULHZm + order: 1 + credentials: + apiSecret: + type: string + title: Secret Key + description: Your Yotpo app's secret key. + secret: true + example: tHrwXaIBaWETHLRwxWaNktfYeEteyTcSjiNJY4IH + doc_section: '#step-2-generating-your-secret-key' + pattern: '^[A-Za-z0-9]{40}$' + +youcanbook-me: + display_name: YouCanBookMe + categories: + - productivity + auth_mode: BASIC + proxy: + base_url: https://api.youcanbook.me + connection_config: + subdomain: ${connectionConfig.subdomain} + verification: + method: GET + endpoints: + - /v1/profiles + docs: https://nango.dev/docs/api-integrations/youcanbook-me + docs_connect: https://nango.dev/docs/api-integrations/youcanbook-me/connect + credentials: + username: + type: string + title: Account ID + description: Your YouCanBookMe Account ID. + format: uuid + example: 78c3430e-21f5-483b-8e26-84cd6dabf7a6 + doc_section: '#step-1-finding-your-account-id-and-api-key' + password: + type: string + title: API Key + description: Your YouCanBookMe API key. + pattern: '^ak_[A-Za-z0-9_-]+$' + example: ak_xxxxxxxxxxxxxxxxxxxxx + secret: true + doc_section: '#step-1-finding-your-account-id-and-api-key' + connection_config: + subdomain: + type: string + title: Subdomain + description: The subdomain of your YouCanBookMe booking page. + example: mycompany + doc_section: '#step-2-finding-your-subdomain' + +yandex: + display_name: Yandex + categories: + - social + auth_mode: OAUTH2 + authorization_url: https://oauth.yandex.com/authorize + token_url: https://oauth.yandex.com/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://translate.yandex.net + docs: https://nango.dev/docs/integrations/all/yandex + +youtube: + display_name: YouTube + alias: google + categories: + - video + docs: https://nango.dev/docs/api-integrations/youtube + setup_guide_url: https://nango.dev/docs/api-integrations/youtube/how-to-register-your-own-youtube-api-oauth-app + +zapier: + display_name: Zapier + categories: + - dev-tools + auth_mode: OAUTH2 + authorization_url: https://api.zapier.com/v2/authorize + token_url: https://zapier.com/oauth/token + disable_pkce: true + scope_separator: ' ' + proxy: + base_url: https://api.zapier.com + authorization_params: + response_type: code + response_mode: query + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + docs: https://nango.dev/docs/api-integrations/zapier + setup_guide_url: https://nango.dev/docs/api-integrations/zapier/how-to-register-your-own-zapier-oauth-app + +zapier-nla: + display_name: Zapier NLA + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://nla.zapier.com/oauth/authorize/ + token_url: https://nla.zapier.com/oauth/token/ + proxy: + base_url: https://nla.zapier.com + docs: https://nango.dev/docs/integrations/all/zapier-nla + +zapier-scim: + display_name: Zapier (SCIM API) + categories: + - dev-tools + auth_mode: API_KEY + proxy: + base_url: https://zapier.com/scim/v2 + headers: + authorization: Bearer ${apiKey} + accept: application/json, application/scim+json + content-type: application/json + retry: + after: + - 'retry-after' + verification: + method: GET + headers: + content-type: application/json + endpoints: + - /Users + docs: https://nango.dev/docs/integrations/all/zapier-scim + docs_connect: https://nango.dev/docs/integrations/all/zapier-scim/connect + credentials: + apiKey: + type: string + title: SCIM API Token + description: The SCIM API token generated from the Provision tab in your Zapier account. + doc_section: '#getting-your-scim-api-token' + +zendesk: + display_name: Zendesk + categories: + - popular + - support + - ticketing + auth_mode: OAUTH2 + authorization_url: https://${connectionConfig.subdomain}.zendesk.com/oauth/authorizations/new + token_url: https://${connectionConfig.subdomain}.zendesk.com/oauth/tokens + proxy: + base_url: https://${connectionConfig.subdomain}.zendesk.com + retry: + after: + - 'retry-after' + paginate: + type: link + limit_name_in_request: per_page + link_path_in_response_body: next_page + docs: https://nango.dev/docs/api-integrations/zendesk + setup_guide_url: https://nango.dev/docs/api-integrations/zendesk/how-to-register-your-own-zendesk-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/zendesk/connect + connection_config: + subdomain: + type: string + title: Zendesk Domain + description: The subdomain of your Zendesk account + pattern: '^[a-z0-9_-]+$' + example: domain + suffix: .zendesk.com + prefix: https:// + doc_section: '#step-1-finding-your-subdomain' + +zendesk-api-key: + display_name: Zendesk (API Token) + categories: + - support + - ticketing + auth_mode: BASIC + proxy: + base_url: https://${connectionConfig.subdomain}.zendesk.com + headers: + authorization: 'Basic ${base64(${credentials.username}/token:${credentials.password})}' + retry: + after: + - 'retry-after' + verification: + method: GET + endpoints: + - /api/v2/users.json?per_page=1&page=1 + docs: https://nango.dev/docs/api-integrations/zendesk-api-key + docs_connect: https://nango.dev/docs/api-integrations/zendesk-api-key/connect + connection_config: + subdomain: + type: string + title: Zendesk Domain + description: The subdomain of your Zendesk account. + pattern: '^[a-z0-9_-]+$' + example: acme + suffix: .zendesk.com + prefix: https:// + order: 1 + doc_section: '#step-1-finding-your-subdomain' + credentials: + username: + type: string + title: Email Address + description: Your Zendesk account email address. + format: email + doc_section: '#step-3-generate-an-api-token' + password: + type: string + title: API Token + description: Your Zendesk API token. + example: 'SDMWuOoZ******************************9CMz' + pattern: '^[A-Za-z0-9]+$' + doc_section: '#step-3-generate-an-api-token' + +zendesk-sell: + display_name: Zendesk Sell + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://api.getbase.com/oauth2/authorize + token_url: https://api.getbase.com/oauth2/token + token_request_auth_method: basic + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.getbase.com + docs: https://nango.dev/docs/integrations/all/zendesk-sell + +zenefits: + display_name: Zenefits + categories: + - hr + auth_mode: OAUTH2 + authorization_url: https://secure.zenefits.com/oauth2/platform-authorize + token_url: https://secure.zenefits.com/oauth2/token + authorization_params: + response_type: code + token_params: + grant_type: authorization_code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.zenefits.com + docs: https://nango.dev/docs/integrations/all/zenefits + +zigpoll: + display_name: Zigpoll + categories: + - marketing + auth_mode: API_KEY + proxy: + base_url: https://v1.zigpoll.com + headers: + authorization: ${apiKey} + verification: + method: GET + endpoints: + - /me + docs: https://nango.dev/docs/api-integrations/zigpoll + docs_connect: https://nango.dev/docs/api-integrations/zigpoll/connect + credentials: + apiKey: + type: string + title: API Key + description: Your Zigpoll private API key. + format: uuid + example: 3f7b2d4e-****-****-****-************ + doc_section: '#step-1-get-your-api-token' + +zoho: + display_name: Zoho + categories: + - accounting + auth_mode: OAUTH2 + authorization_url: https://accounts.zoho.${connectionConfig.extension}/oauth/v2/auth || https://accounts.zoho.com/oauth/v2/auth + token_url: https://accounts.zoho.${connectionConfig.extension}/oauth/v2/token || ${connectionConfig.accounts-server}/oauth/v2/token + authorization_params: + prompt: consent + access_type: offline + redirect_uri_metadata: + - accounts-server + token_response_metadata: + - api_domain + proxy: + base_url: https://www.zohoapis.${connectionConfig.extension} || ${connectionConfig.api_domain} + paginate: + type: offset + response_path: data + offset_name_in_request: page + limit_name_in_request: per_page + post_connection_script: zohoPostConnection + docs: https://nango.dev/docs/integrations/all/zoho + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + accounts-server: + type: string + title: '' + description: '' + automated: true + +zoho-books: + display_name: Zoho Books + categories: + - accounting + alias: zoho + docs: https://nango.dev/docs/integrations/all/zoho-books + docs_connect: https://nango.dev/docs/integrations/all/zoho-books/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho Books account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + +zoho-crm: + display_name: Zoho CRM + categories: + - crm + alias: zoho + docs: https://nango.dev/docs/api-integrations/zoho-crm + setup_guide_url: https://nango.dev/docs/api-integrations/zoho-crm/how-to-register-your-own-zoho-crm-api-oauth-app + docs_connect: https://nango.dev/docs/api-integrations/zoho-crm/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho CRM account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + +zoho-calendar: + display_name: Zoho Calendar + categories: + - productivity + alias: zoho + proxy: + base_url: https://calendar.zoho.com/api + docs: https://nango.dev/docs/integrations/all/zoho-calendar + docs_connect: https://nango.dev/docs/integrations/all/zoho-calendar/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho Calendar account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + +zoho-desk: + display_name: Zoho Desk + categories: + - support + - ticketing + alias: zoho + proxy: + base_url: https://desk.zoho.com/api + docs: https://nango.dev/docs/integrations/all/zoho-desk + docs_connect: https://nango.dev/docs/integrations/all/zoho-desk/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho Desk account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + +zoho-inventory: + display_name: Zoho Inventory + categories: + - e-commerce + alias: zoho + docs: https://nango.dev/docs/integrations/all/zoho-inventory + docs_connect: https://nango.dev/docs/integrations/all/zoho-inventory/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho Inventory account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + +zoho-invoice: + display_name: Zoho Invoice + categories: + - invoicing + alias: zoho + docs: https://nango.dev/docs/integrations/all/zoho-invoice + docs_connect: https://nango.dev/docs/integrations/all/zoho-invoice/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho Invoice account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + +zoho-mail: + display_name: Zoho Mail + categories: + - productivity + - communication + alias: zoho + proxy: + base_url: https://mail.zoho.${connectionConfig.extension} + docs: https://nango.dev/docs/integrations/all/zoho-mail + docs_connect: https://nango.dev/docs/integrations/all/zoho-mail/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho Mail account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + +zoho-bigin: + display_name: Zoho Bigin + categories: + - crm + alias: zoho + docs: https://nango.dev/docs/integrations/all/zoho-bigin + docs_connect: https://nango.dev/docs/integrations/all/zoho-bigin/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho Bigin account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + +zoho-people: + display_name: Zoho People + categories: + - hr + alias: zoho + proxy: + base_url: https://people.zoho.com + docs: https://nango.dev/docs/integrations/all/zoho-people + docs_connect: https://nango.dev/docs/integrations/all/zoho-people/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho People account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + optional: true + +zoho-recruit: + display_name: Zoho Recruit + alias: zoho + categories: + - ats + proxy: + base_url: https://recruit.zoho.${connectionConfig.extension}/recruit + docs: https://nango.dev/docs/integrations/all/zoho-recruit + docs_connect: https://nango.dev/docs/integrations/all/zoho-recruit/connect + connection_config: + extension: + type: string + title: Domain Extension + description: The domain extension of your Zoho Recruit account. + enum: + - com + - eu + - in + - com.au + - com.cn + - jp + +zoom: + display_name: Zoom + categories: + - video + auth_mode: OAUTH2 + authorization_url: https://zoom.us/oauth/authorize + token_url: https://zoom.us/oauth/token + scope_separator: ',' + authorization_params: + response_type: code + refresh_params: + grant_type: refresh_token + proxy: + base_url: https://api.zoom.us/v2 + paginate: + type: cursor + cursor_path_in_response: next_page_token + cursor_name_in_request: next_page_token + limit_name_in_request: page_size + docs: https://nango.dev/docs/api-integrations/zoom + setup_guide_url: https://nango.dev/docs/api-integrations/zoom/how-to-register-your-own-zoom-api-oauth-app + +zoominfo: + display_name: ZoomInfo + categories: + - crm + - marketing + auth_mode: OAUTH2_CC + proxy: + retry: + after: + - 'x-ratelimit-reset' + base_url: https://api.zoominfo.com + token_url: https://api.zoominfo.com/authenticate + token_request_auth_method: custom + body_format: json + docs: https://nango.dev/docs/integrations/all/zoominfo + docs_connect: https://nango.dev/docs/integrations/all/zoominfo/connect + +snipe-it: + display_name: Snipe-IT + categories: + - productivity + - other + auth_mode: API_KEY + proxy: + base_url: https://${connectionConfig.hostname}/api/ + headers: + authorization: Bearer ${apiKey} + accept: application/json + content-type: application/json + credentials_verification_script: snipeItCredentialsVerification + docs: https://nango.dev/docs/integrations/all/snipe-it + docs_connect: https://nango.dev/docs/integrations/all/snipe-it/connect + credentials: + apiKey: + type: string + title: API Token + description: Your Snipe-IT API token + doc_section: '#step-1-create-an-api-token' + pattern: '^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$' + connection_config: + hostname: + type: string + title: Domain + format: hostname + description: Your Snipe-IT hostname (e.g., yourcompany) + example: yourcompany + suffix: .snipe-it.io + prefix: https:// + doc_section: '#step-2-finding-your-domain' + order: 1 + +zorus: + display_name: Zorus + categories: + - other + auth_mode: API_KEY + proxy: + base_url: https://developer.zorustech.com + headers: + authorization: Impersonation ${apiKey} + zorus-api-version: '1.0' + verification: + method: POST + headers: + content-type: application/json + endpoints: + - /api/customers/search + data: { 'page': 1, 'pageSize': 1 } + docs: https://nango.dev/docs/api-integrations/zorus + docs_connect: https://nango.dev/docs/api-integrations/zorus/connect + credentials: + apiKey: + type: string + title: API Token + description: The API token generated from the Zorus Portal. + doc_section: '#step-1-generating-your-api-token' + example: 1_a1b2c3d4-e5f6-7890-abcd-1234567890ab + pattern: '^[0-9]+_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$' + +zuora: + display_name: Zuora + categories: + - erp + auth_mode: OAUTH2_CC + token_url: https://${connectionConfig.subdomain}.zuora.com/oauth/token + token_params: + grant_type: client_credentials + proxy: + base_url: https://${connectionConfig.subdomain}.zuora.com + retry: + after: + - 'ratelimit-reset' + docs: https://nango.dev/docs/integrations/all/zuora + docs_connect: https://nango.dev/docs/integrations/all/zuora/connect + connection_config: + subdomain: + type: string + title: Subdomain + description: The Subdomain to your Zuora Base URL + suffix: .zuora.com + prefix: https:// + example: rest.test + doc_section: '#step-1-finding-your-zuora-subdomain' + order: 1 From 20cd434add2df15745b61cd365f20b26b5d8aceb Mon Sep 17 00:00:00 2001 From: Sameersribot Date: Fri, 10 Jul 2026 20:42:27 +0530 Subject: [PATCH 5/8] docs(integrations): address AgentLine review (logo, form screenshot, pre-built syncs) - agentline.mdx: add Pre-built syncs section; fix docs URL (agentline.cloud/docs) - connect.mdx: canonical Step 2 format + add form.png screenshot - llms-full.txt: add agentline row (auto-generated) - add agentline.svg logo + form.png --- docs/api-integrations/agentline.mdx | 10 +++- docs/api-integrations/agentline/connect.mdx | 8 +-- docs/api-integrations/agentline/form.png | Bin 0 -> 28423 bytes docs/llms-full.txt | 1 + .../images/template-logos/agentline.svg | 55 ++++++++++++++++++ 5 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 docs/api-integrations/agentline/form.png create mode 100644 packages/webapp/public/images/template-logos/agentline.svg diff --git a/docs/api-integrations/agentline.mdx b/docs/api-integrations/agentline.mdx index 8c207bbb2c..df50999c96 100644 --- a/docs/api-integrations/agentline.mdx +++ b/docs/api-integrations/agentline.mdx @@ -66,6 +66,14 @@ Connect to AgentLine with Nango and see data flow in 2 minutes. - [Connect to AgentLine](/api-integrations/agentline/connect) Obtain your AgentLine API key and connect it to Nango. -Official docs: [AgentLine API](https://docs.agentline.cloud) +Official docs: [AgentLine docs](https://agentline.cloud/docs) + +## 🧩 Pre-built syncs & actions for AgentLine + +Enable them in your dashboard. [Extend and customize](/implementation-guides/platform/functions/customize-template) to fit your needs. + +import PreBuiltUseCases from "/snippets/generated/agentline/PreBuiltUseCases.mdx" + + --- diff --git a/docs/api-integrations/agentline/connect.mdx b/docs/api-integrations/agentline/connect.mdx index c14807c7b4..e7be12bf31 100644 --- a/docs/api-integrations/agentline/connect.mdx +++ b/docs/api-integrations/agentline/connect.mdx @@ -26,10 +26,10 @@ This guide will walk you through finding your API key within AgentLine and conne #### Step 2: Enter your API key in Nango Once you have your **API key**: -1. In Nango, go to [Connections](https://app.nango.dev/dev/connections) -> _Add Test Connection_ -> select _AgentLine_. -2. Enter your **API key** in the designated field. +1. Open the form where you need to authenticate with AgentLine. +2. Enter the **API key** in the designated field. 3. Submit the form, and you should be successfully authenticated. -You are now connected to AgentLine. + -Contribute improvements to the setup guide by [editing this page](https://github.com/nangohq/nango/tree/master/docs/api-integrations/agentline/connect.mdx) +You are now connected to AgentLine. diff --git a/docs/api-integrations/agentline/form.png b/docs/api-integrations/agentline/form.png new file mode 100644 index 0000000000000000000000000000000000000000..38aa272819b57b5514aeb73111949de84d510d11 GIT binary patch literal 28423 zcmeFZcT`hdw=Wz)P(Z+jCdU6(10gE;V#WLJ}zf2~FXV zUIPK?odBUI5IW@ByzjZ^e&6`Uy<^<*-h0mdQ6!F-rFm{kMs7*I?5nWc|61M3mV`z zox6sq7YKCK`>dRsvg7gxfn2k|&yTI3@AO~{>GEhe)CFC>tkt!Dd<-d$ymjw&#)}7HcJ6(<2PYn)Uehqs z?vLpV7-B#$r@h4pd6ai=+{Y5ux6a4M_w_bY6fhF~1FDO5z;)^3S61MXyLGu2xLkTF zMGXQyyf}La1p0pGofz;a^1mwnWs>NxoXXCtocOg~*qyrv+)@L#QM+@M^k;Ow`5j_0 z;a5akMd{sF^6;1jSFAzpS(TB9<~M5l5SqCNStlfbG6t z!zlr?@U3qtyy9q+tj3_g8qK}phvoQ#Kn!IrKNXYg7|LCUQ$Y5TwEMD^1Avq zGBO=@A-DUC^FXx!;H8`I&bZ9x@)?JOEC0(C-yIGVk8>ydrVKY^H%F16nKEEXHdWsR z(fYsdGlLW3s=s~uOgmEsaIU-B#n6Sj??WF>jwjKA>;;=|g^Q`pu$Yu~UZA9KFE(tW z8`wa-^h{k9LP2*y*Lm;XSCMcYu408jhP(A_T~18Ljti2L1hEc0ZMJD01G}E^5Lvgn z`i@P$nNGp${j-`)WF6?05vK2>5$?3P-2wtO&&|V9tKTGSF<5j385T{*IW9+fT8vuZ z@*BAM!{)~6gO3f4R@D%t&KG97fdT5(!tjm7Dh#N{b_eMWp7Lq(u&jN zIL=rKtuat<(@9i;ocgh|*qG9<4k;^V%e3F+Ur28|88dmO+29N6_EdG76y;w^NHiU?%XnRGui3s634ZedwVF4b(6>%z{-gyf`c@sIP>O8GE}%kU+-YY%89elTOW)eKxJ|4{p6+8AlJgvPGa{F8 zCh-;@oHp6#ey~uZj*4xEr3VT0c8ucAY=23 z_$8$kP@!?LnT1&%*G{YoX1@w;*7d&4;SYukvdJpPy{z^SFxtUVyDyzdVr4Yb&47g1 zHPxR2{9g_{<1$MpJQ^Du(0(u)h3#)tAyi{4kb$!fVx;XspI-lT`CPF5R}^d4)oyP7 zos~8gUz;@2Vx?ZZyL^$Osld&n)UDMgzVfIJ>T{q=N`1G&A0ykRU~gqN66O(c60t8Fhv@*?kHIKsu)&qN$*^qtS&D}QII4w7<58gU-n!Ug$3nlGB5GVKk9 z=PE^bDW=VfYfmUz3akPgwf(4!?z?&+Q;S1L9hybSADWS09E>2stlDR%8VLv`Q4yOBK`W>`5#1jH>LGJuRMyovyQ% zB^@?qEtDo1#HM2Le!(X{PBJ?eL#qOpFP zpyhbE5RKorr&sF24BXoUjeajZW2u)m7(QgQJ$>l|D!mA(hE|VD9ILB;a9f(vGCuk< zYw76O?(ZPSiDyAxifEfBritEfnqPASkzBw`G=4b9EG%r<#pI!D{%t0|cs9_@cK}y) zmfa)jEH)jamXX;fTQU3=`40ke4Zg-P0o+@TI#?@(`W z@pNP7MosfY+156KPSV>JrFyJGtrE@{H8w{Kq~=Le!H7SM1?1Vg?QzFIt;%0N)|U6d zKr`|$ncxdHOD=T(03#0*3%u0#>cyC~j7ymChWB4j`lfjwO*W<^T1$ETVYH(mNeU3F zm4SA4#)VWafV5Qrx^b%$7M3TJ&sq0CluF|8;dP6@X4vME3+p$ZtnTlF zJCAw?>z4F2N(5O>584pB3$GFjCp@mDh|P$YPKRuAu6l1q0@J_r_nGZ8PTwvrJB_qx z$zs~Gs3_qYF^F2Yy_s<=3O=YXT8Cdj><(RA468Ayu=vq^*en0Z(R3;-LB=BNoItLZ zI!$-_;$-UzB>imufEEHYfw0ZrE}vaFxV!F3Q&Dk8C6Ct@#J$=7!CrAY@hz}W`Xz!X zO`!!so7Csulc#=e+jl{}XPL5W-5b-a1C+khnbJ2-Ki9%`luD9d+sLVWb?%(Z29x<# z_W&RNyMVESoh%yPjok1OF3e|}V$DY2KSKY_P&5&RYP{4rYUih}eRxO-)H;_f!&geB zk{)$t%x?X|m}xWIRBzMU>XjBm6T8XlAhcD*cU=yi+NCd0+Cel2$m`0Pz34dCLar(n zOr}Zw%~{p?dJ9W!a|5ulkMG-L$pJiHF(?0j3^-mIV0t z+O01A6Vz0G{(Meiqav2ux8Gns!~-x2c$Hw8_h>9uN?)E3ki&o*ts1aq;dArP_aPfSLhT`4577|M%~>KDJZ{ zby;1^8mLIBawX{6YC?L7SEnS*@^+s*N$*lekUpDg{o3Zr#1HI8#Sq7>Ao= zY6Qh3rDf%+X6^=1Zcf!_qMZWsD`mZk-k6s8@2xy}Gi@kbuqOOwD^YxLH*;r8tt6i- zjs2Jf)G)d+L_gD|LrnC(8Pqp@0>8ub;Mcq73_z&Nc z&5qnxoRd5KDAWp&twPt`8@%gLtRlwK6d4AFz($n(;88lek}h{2ynE*oM^d4H1XOZ@ zqHP@KkQ>zKc@j*DIwI>bH?8Iy#~KaES5Aa2m*_Foqc*A^6ibmdY*nRyY+iDIV)Oi( zz6zPGe~SD{KWNgY#rmRMiJ?{2Qt0aT3lVS((ZQfPY~YqH<-+P0*J5&1;)?@{M2 zjEdgm;zns%5D|rIwsMQE{9|RDYTN?_Q5a3zsN*2R>bupD5lpoiIMsN1&+AI>ezQyOo1jaTJ zWG!koDpfWAIGcWwD|u{~R3#$PVGq-_4UD_rurTj#SM0Qz3N@=iCC~Q=P8b)L?C}CL z452eysnKKhJF2<_%kRE7f;-OY)b8mopTBiVG}@RK{6J(wYxYkKCDrY5hOJlyhKknw zbX-hrD4LSBUbJrW>9J@cDU6^#UOVPIun1}*S!@J(;zI2~)TZA@?e?ydR!a|uX$;6H z2AocLXypj&e2pL42OE!YldmuP8vOIs#`-h)m#B7~Dusq4Pq#XT{8e*S3;$a3?}_Wv zItQDS@{~~MtuD@Tkv~J0TOYCaS}?fRwSuT9d6K34fMyk>Oz(n!-24qv(}gv`>xZuf z#D)p1hqt|qLXhN1G1RkZmm6N$ahq1J<$bV}K-Oo38aA?jtC_36-N=Q z=uGe;a+HMk0Mc4P-YP6(gJ;4r<`q(3u4N$LOWl3%;t%3f;_TF>DND7V^}Hi#Fh;phODCGBhouReT}dNq0_TGRA6`p`Gj zNU+PR+13CZM3r@N(OxON4By??J7{TW;@p+mGgh&6e{#CjFb#fd@TC@)@u)PkW>OAJ zmnirJWeJI^b>HRl0#2B`aIinCq$5X(cHfcayzKF>B8oe#%5@TPE7{aXDfOqSo6-*7)i+MErg(+Ae1k>! zVG5;yD&a}UkZ*IE-#9_P(l$eR$Xj;E%p;ptI(|Vm8{?De(?a*SEle6_8qj&4_eTyp_GJtlrx<_cpclgXB*a?biQfZT4*N3O|13)5p)GZCl5ivL{Pz z1UP8))h2m`2EJt$KqVhTd@}t8k%Mj56&P>Ap6^f-?uV3f{yF$uPi_(Iywc5WD>_Wo zN30D*1j+8j#|EvUmo{K~Kb@-eN& zO_E}yJVy2x@*RgQ_IJz_S5a+_!1_FieBaF0L~ddjw759RbjpS=Fg=& zf>wg`o?fU&>2dl_cjfA^z} zcPU3Q1lQYYr=5(>>DlKA zoR};yKlPcb>aFX%Gda@IsHQ>=%Z)iAHkci_JlZ>bokGq55id61a>qYqVS6K5Y05%k zvP&G&M`fgmegVTXPF4gqVP*67Rm zhGX{ua9@$8CA?N)b5#4wZs~_hL0{c(HGFf2G;VNRisc{JTiI&X&)7i*q^UqsC~>^pRJ#ne7^l?x@MH zLHbQHv)XroA)!l!QRxW5^s=clj-PVlJ@{~3i?vw zRfJ1yJ$J}1oOqiJaYXnjr(Yqg`=^?4)fgpk0=5IGUhZ}G)fz{nC~OBFr%Ca!9DJA8 zX+Bz+WIn1TUbl7X?Kd!cO{uCH7c&u?n^cTqf?$}c1LIpye42=G#h*?~R3qvy9AGbS z(}T6;>x@1POUgP2PUSa3B%pfJ69y`p{wI-}f#6q%j_pM7)PYfNcBOb>UqRr(!37^Z z%$1Dw>=Exo#KF#RH>{xcNHcW&s4;f;h*`c#^{_Nq|_^bCe=?-1`zTuA~(vyLeekF@m3OOCd$z(gQcSs@ z!R!(G>E;?7shM?$18#L9FZw9uMvwK{VJ^KB#)P&0`Tq5Zjh}%5e@C)Co@43xl;(Qk zUgkW;+W$P7_}v@>eDF=h62Y@+uY?UipM2QxJ80%TMG1 z7&1V=GN!{!vEI2UOra~RYpd+_0ioe2BxJ7E{!fy3P-YAZ6cdr3QAJo!nmoF+S+dfX zrcfV**eD|9XwW5HK&Vv4u&{){aSAKx$Q$sw2a4wYO?r0OOs~W#G@EQ09(_KzLNK+2 zt6!3uu_xDV9TU-kGmS4{^a_rP``PDu zjoyjnHorq2?ThYwvoC$qCCIkr>X8(|%?}n++zHJhp%se4_D9x7F~75&0c>1dVuD_I z*fU=7Y(8hLI5nq(Lji1YD^KzEa?wX$-`7N@+8h;qQnm;=z>3q;qGIw7R z;-^EgXfZ!*tbUPn)%WPQ9P%D{RLGbiSqwX7GDy6RNTqIdnA+n#ERHht6HRMt!pw3+ zPbKxIo`}0H`mx!E>2!h1uATh8>XNRYZNhS`zCcT6n(5Wf32)0W#z4O?FxC{McN+S( z!++84aP!jd5$S(A-+RxEmg9I24Mu9td*4C|TOaOz*mt)R;FNPZ_CAI+I z>n9+7&mxa!R|qO%ABbQgf*~x~Ch2V}UU~@Qc%%Kla=Hl}sQGSf!tA`j$N_E`p1*ys zC8pkdJz17I)IK~(S&F*XxYvkBC=)qaNfgN2ejOq`)KnrUw(Evlcrg-Gv#L=2%sglB zlKnZ5z_r;+Qs!qMCiSG=diI+9jH>)-LEclIqQCVBq`@aFp>#)wJZw|H!hAqVi+8fl z*;i&85^BZ;5A(kG8P`5rMKd??Ki<3u(hmUC*=TP%;@vOiohg$TmObPV$BvIVA`Euq zJu>4OEz&Y^AEfm2-yHuYj=)~{f3yGpf4J}ePp^owHBD{!ZIN>3dY}S9EDrAT*Q zyN=%8;Wg=UGprLfG12#spsFqjt#KV$sWv}?2a;DqeLx_wE4>yM?G-NC+sE-}r8>_2 z-O(xM`OIf^Xn4_Oj1OUz%*}tGR1rE+p?ZOt6XGAs7I^%p&3jNs@|WZ}(8Ei!-S7X| z)&BClo`lcp5yG&fn)CSRGI?WiaOzoNmHX_=1`2FN#{c){4~#+jVRd`1LD&9qs3anH zSwB5d5kgVZ8Tx8)O||Lkl$D?(R_z<9K?}*W>PtkL)wiv8rXLna&Li#Bh)z zrh_uW4h_LKojVe3cOL*O9_4QQ7bLCMupU5J0@8}7Pmx<|!g5bpZn3PGJr%3kuG^DX z%NQ4TNo%kiwRPnziBM@YE;d_!|Ep$5cw%bqddDZi?73Gy;)b3Y5VQKYOO2a_PtAON zs~_lQmC5)xktneTiUb79tjVUgjL-4DM^l9v_TCPq^%%A~1V{aKjaN`sb{xYA0u5g7 z73fj;*&ChaousBPWrQC&3^sV-_626A=e+SDcC6|}!4sD;G_>zY%1%sceZ$yP#T(xS zOvK6buqeGr(~6kH&P($U-(m=Ju>jeoI7=a7Al<4;J25LAt||Wo(fyLC>CWa;8ns~b zyvqlEYuS|Xrlzfm%+4!LZUHYViGK@hw_lOp-@B{&Hl3UC;OL?J!`ELLo@1R1%FHJ*;sz+3{;3p_Tb4Bx6_SXvmorW8&Eb1iw>hU0fuHGS!j_o^+9 zpWm@W#BH$EYSE{KQQmtnmPauqARzOJrsfzNs0PkKK@VwX%OGn*6VgZA5(J;@dpuaf zKG~-{sA1wZWIeXXV(;Pnsdbf8uM{KOVM10S?h;Owb!Kdrp^zkQw;H)RaRr893^-fbun(cQEh|QsJC3R^J|5dnv5xV=iNcaBnJm<1 zfWfMUB1Y@rw-c$*LCQooE&X5QpIDJ}B28t^i0yS^iis6L5L53Yy1P|I8odDmJ-C+z z{QzqmCLZxfeA5+1)-5?pG;BQpLnc_YjJR{w1IkCNdpgNYP{h#ba1T%k`h^X) za9`JH_>I2Cl7t>^;s~?j-*VIb)rNHAJdO>m-kZ6*9F|&XVYm>HeWJx=fAIv}{&SON!1U#hE7GsV}L5R(m^x*#N4 zzh@Y7+O8A0Hfi8=*OBlFJ*%mBWyEngMwG zK2bLj&n!@da<-Nanl8+75jAQV&L*JV*QJR#<7GG*U2xBae$#M5beZ9|oqB@AY$!2{ zXEBVvGAn~AKufeLb!XCx?HCr4c#jaauk>EfN_6TVOTpsXvl!y1!4SzkgFcZE@fFs- zjJ(x=E}g{2;RQGxQW@l9FGg{JiA>@wOCm2YJI*%$+(le7`{rKG#3@(kI*G0{IR~=2 z-fT)^-t^lGAWH+eI6vtCvxbya;c=lnhq=_4p;7E(@3PINuLkY5X#R%l~B1pr1CE3|7)wT8#z$$hM+MJV%YJ97*L`&8bb zhc~BDD^L4wMYFJ7G1Y#kMK}~~G+xu9^e;q0mQi~Mdm36XFm9!oUHr|j$T6IRvdXDK z)zIDE_YADg?bA_Cq~Y_7?7MeW{3I=4CoM0<370c;ZTItWOyVEDC_cnGwVw-zH49hdME%MnDw~@ za;LqQ1ss|LpB-bA%Dod~<-7=>#s4EgW#5H)1+}DipMpRFH)qS<@`RC-U7JF_wz~20 z)4q1>5sU;56e;*EqaaHjtz(N8H?G3*s4(=ipzI%Wyv+FZnx+!}p!e}v1Pb0qk~|RJ zLAQ&bPcD$4a2AdO?~V+o?i`hyx=n958GgGo{BdB@arnb)^KafY+4ZBCs*hY#gX=Yl zC8Hg?^dKeMJ6X`LrGSCU-j?hMCCj_?)Qo7FI#1(~T1hOvgO|x4t455`e`CwXGE$3G z=*kc6G8=|LJnuebwRFgQ&N6nwJa1PO9uh$$m{}QhSwTJGT>9}m9Wu$OWd~ZrsqXdC znp(QU5#RZ+b@?dgztDLLTuZC#_Oy=Q1=*8r-GaXD3kNI~)}r+uHN}I%qtyW!hRUuE z*rQFJA6mr14l=_g%NYZYdRRK0+%Y*#$b>Mty9f* z2XXzR#$$cVZd}EP(U+`mEM`g5(0GMms2Mx*popAR{Y|A$UKWq7Kdf%F_@)G7iZLF; z6L(fuuf2N&3LiMruw|rcfyKz=eb}Q6Y}40Z(olH@%u1_9Uh&zZi1&-qN0QFFVXdoJ zNuYGVNOjX|T#b&08?*s3(YJ^V@$|bWyh(v?*rFkpVh0yWsB1SjfIz!lgjpM(JoE9t=_0n*nFk6`S>SpRQf?q&HCHF zn?t!+VP0L}VZWT}B%+h^2UL$qlZNJS1^iXaw232La=Asa)hWWSzFO#rY_g!RUNc>S zFLXSez(U5EaJv~yP9^7s;{{tn{?HrD*L_(2pyb$tGrW@JRb@XLggzp&U)8F!zLiOy zWq&1s`ZnLIhhGEQJBExaYJkohE&{4w0_7e-){_fsrk^j<>o$dy{jn~B8&4+$R{6Z> zs$!ww!)0OkeasWS)2N&KRT6Csfsu#6eWV66T6(;fKy4!n|*B8Qu zjsu*rYl`s>-k{;yCHMGLSUvYbb78mwsnICj3Va zm@}C4_2-Iiw}b!L@Jf zeMVD2!c?QzSG6##@gK!E{i~Ps(^&_{?Vv!}4N2jfl9qqH7$L1h$qM{E_`oO6D%2L`Jx_65 zX&yb?>N1_0MgARcjjw_oOPczE%~FS;FcItA0P9|S=84|Jw!Ks#hwfGQrPu-SAYxxMRx{{jTxxH6k!VvEs)&oxKsz*1VP8NQlI$AfmD+fl z0EJX-WQuE9haP0O%KmUn0mF}cwx>!)s=Pa*GImz|LvZeKQ}yK^s&zS$qeYB*I3CRN zLX;Dd9gX0Dr^;AP8*6?d1P68U>#W*^)M(Kouh?Pu)8xgth9)Q3(_ zrW%j1|-T^=4u;v-tpxmTExl->cHLpv|&@je!;44O8_^KYf1P~YI9IRk+ zjTn-@f1JuDSB7k^Z^^pr6g;AW6Bg2`Y^sPVsGuKoiJwBYPF;VF%fiM~2`OqzT8-c> z@sN;1buiMzq303oL));^iW7Xwvd`)FPX%^2as9sOMOd=uaA@A>iZFSI!d}{{pzdAZ0rxoi;`!vtmJ<@Kp7KJm)07SOCAZ%veJ zjc*?m;3$*cK7qdVRt=56XFpa$%WYLrX*wt9c#cQHVGB*P%;MSG}t2YU@T??7vAY z;Yd(DXNjP{`t(2hvB2@^1WM@Yb3;5r@jeQRQW7d1VJ9UZ zO>!DmRHS9M!ULN^Z-Iw1-gh7dG&GN#^6f^qUI%QLluVtlq+%_)B()$Jjiw2Aup4OS zbxJ!3bUnu1u8dE@^})(_E}7RDNCuus(}`2K>0tU`SGo7L?E#Z)&bum!7#0lQzNBgZ9%nibmSbo_~B6HtSAIt{dcInJb%gv`ej@c0l)`|N6$@S|yxN8^EI+AKw_ zI@}VRrQlt!-$L;zj|T+8DpN%}1g=(FbTv4!KJUJa;kIcZqtmnjx$3Ew$+&fPLfN7iQJ~QR zlUHi7j$Rd52dJ>iy3MK8|2Ew@<#{twk{hfTf-Ew{OHhBfUfVcgA^9xw=mS{r#zEh@ ztZ=gt()i=`VFOVe&ipSsEQfpVnoI1u{F?H8)?*Di%}!CNZd0Xye@ElW3&K3RJ2VZ4 z)4gKO}PLZvsLQ#$6adFj-IFDNj*A)^JXb7kTXKil$Uw^}v?KCxX2qn2g>;yexU7>I;n@#zz!6PhxaG4)>36 zL9|=x<;7-{V*_86Sq05o>Z zZi?HO8m8};Z)}ESx*m`3+`~+OK$m;FZ~W4T1cC$AF&e{V_OwX1 z>2dLyAAgxyBb%&F`WRLhwvUxijg%5Fb;08C?5o&7_s<)lOAOMRTp0Be;%u7M+!%{Y zuES)YA^2J?Ko*T0Bux${PK{cEJV+Uwsm{|pd{H?U)&Z$A0PKV05s9OD$Z<%#VNCKV zX*y7!`f#eau|~16;5h`k#5D{BNoG%fd+5M5Rv?q~HmqDIu67OuR zCvLx;N?NSd;}{el4}l#rh3Zx&j;{{*J#f&cKB9MRd*ZNS1|HelVis*2!&#YE*rAU? z{8 zu21-QQ82h~yra{v2g@KxmdSn~ZK~PjsTm<*)KwMaj!0e!U3BP)k#sP^H)Q-7{hTk4 zk(TbHqvL;J2_ho?&3T$rDW*zzNQf@=d290kd^d%y8$YZ&baG!|gtO`HPa%|PqcZ&` zNW+}n`wJiVgz{6JQudXtbtCSkTm#~F{|rGUQl;h{?zfs0It~lQ}g0bM2|B|leH81*HOmf&zMbVWoP{D5EQZnVo6{M*{)6*^{y+Zf>?an!pzrD5 zXWf6r=w|-A*Sa9TIo;M&Q%h^)M`V;Yw_q3GcvLDvUb#^W_*4P+-$!}|2VmdXoE{&2 z(H;o%8>^xC+1lHanrRuYUjbsQ>44yL5&09n_3#n2otd4!cmLeDW^K6J znWi#vXb%2Ri5fbrFa|;dL7%n<`^=#wzAgl`C8=sJ7x0MdhF$uwz+{(dyE2m}Zuu)W z;>=rc|Llf|Q*%2sZg%H>7W7V6MRH2YPyGj=nNL@M&MPV^F50ntbT^LJ|49qVg705K zo`rn=3!#N`U-uPgF=t{h!2ilLb!&SYd(Z|OD)LefB6rAE8B{L4F;I(rf(y~VK&Tke z8awJS64u-iWsu)|YB^L`J7zKUOd^uLODr@4Y06#{=eKK;={_wHyiUk)jKK;Qmwd1u z?>8n6MSMHR*wX@{BW~tep`1JIw?W}z`V)tYPC)_AG_& zrpeAXWy#&MvWy9eQpo3}^)s*}`u14iECY6zc<-(gG2+fH2!zF$_1^TaXL-9o_R7pV zptXt+y0K)A!sS*MZv*YmTcM-yhN4~n0|vyTvWcYt|BA_arAca%*T}sdvqqEX4QTK~ zL3aU(M^?_MqJ#Lwt}2ncP~FY)V(0N_TeCw$1VtvX@XdOhd2tc@US~}tGbp^0Wp?dS zwV(Rit+!@~0BX3EwieBz%fRsDu5l4V{Kv1XDVad)4P14WZKB`QA`it4eU98xw!?>e z0@b;CtP4=^(N5h-l#Z6-z=C7fgbLyc0=+(lds$FDT5`fMmY>3YHJKBFbeN$A%?Q1w z-29oIZ&Oo!np~1=++(Dd$R=)xyyG}7x_B$Ud$`ehuqao6mn#@QPgY&?<-km;?lHe9 zG5dL}#_=%|$r$!*b?gX+FYwzNLHRKcUfZ)Sz>U%!9-5EnziF`(W+~+6S>IATtl}8= zdCo|9T#U1p27&C6FBLRB9<*y|_dlV5L$&4o!17op6HCppV(y?#Ll4hNtly*sO6pGb zNMo$vOv*^PiCuf@-hnH# zW0}*g)@<(3rJ<#LqFv!juf;%TfhE3bord^b?hg6Fl`ErVMZJTrF5vcEm$hok%C^{% z%p6<1QAqhC=!>*ne6B99bX9FoT{YCDK=#8#*^)B+(C$S&e$8tNkM~xB?4qTFeflJ~ zg%nRkz;Mm3$zKDAuLYU9(X+#7!R0#i z0^H=L2O01;)-#z1u5|q)R5Mj@fr}$=Rz4>EzOiv$kN3FzS@(VRt=b{CetAgUU6GxcQve;E;%+;%w>YM3?td`SZNr2P3M|bzttrR}l zN6JA^%bvP}cfxy~Cq)uPXOi_b1m!OA=`Z6dd&jHrjJ&XN#nrhbr@5T68-X5vC52Bg;PJE&U3Cj@Zt*Zp*^;x$#ABM9A7dqJX*G^v17wX8khS?h?6Y@cReW%DI4<8@Jh@^XOU5*s z?!JEJtv`)UkU0gA+?SbX`#jb?{7Hy8;t+$}88|W|PbIG$I;bW-6|FPf+jE#x997KC z%c!A;82eU>;OdL~HLii&(X%mqAz2C5!J!{IWK)IhBd%XJv*ghU(2B`K-(tT<2>QFn zsn>6YN~vf*rcdyOynU&@G8BmnBqv6uZ}~b87GI*ly6OO$EGy}v{X>->uBfahP{XNo zBq|^QhX_##0uBXw>E4Nbxhtrrtdmg+COLbz^#=`|$^`*=nZ1l>HF9PnXUfiMT$j=L zm*6>&l;8hS%y=dJ4dVtJevnedN)56p+}TlN0e&~!EV(jUMkRfliGbk93pv^yKRbNF zH-;QRk-mRBo-}*ypV_mhmb{PKeJ0pd!p@+c`HC_%=%yfGOHXzNjiE>@ohw9`o)l8) zAGvq4wE~ioBUav;rm015-%>3SiKIS7W|F=c4sb88_nc+80_N9b-Rz1C<#_x0&6}m+ z;o*av{Xnwex+;+yu-}6mz1%c$9FK=L*cCHtY1h0m694aHP>+8kV9aj4Qi}`i=o~zKb>O+=l@2Tb@+mcklfHz$ zaPwR5fS$`i5*O`%9?knVE|uIKiI_jw6##+Uqlb`JOEXEv12j;obtqB1IlYIgZJYe# zv|uOs97z8h&;$;nEJ2mQyp%QCttYK}h7I0IZ43A4NxO0^lwX%i8xp z!6#o5UWqE$pFK`YvHwRLM|j`NQvf6%#Sb{s0uKBcv2VbU#s#l4zPuew%L?S^{VPE( zK-5UE_1p0-*~jaupw7Hdf|5_{MQ9`Du+mPgO@`3XnwfO!+=Ku}PH#L9?Jh{sH6#TLW$Yc~pYujK7Q z`{*MQpHkhXUve`7m4I3@6mAZm*X>0aKnWFUUr*CgkQk=hl_sRlZIz)0-%`9Mz4&^~ z8@GTHLufXnt`Sx8f+mW$dku6WhDuynBoH@%XkHE( zt2?%fEDn_NU||hu*Xc{)*KD2-{v+gsHre`_M)(HWS_ewaVfNWmn<5JlpLlm(gVlsN zk$b(f*AQq(K<>Hx>N^1;KBZb3bkm2ox0x2NKR3POb<8uZlio_80bE`*5)EI-qRqJQnx0LnCRV?YYGA~V4fC| zL-70u1S*!>Gy08-PL)K5Munr3(xbI=$t<(oJnlQo0|o2vi3kZtbkpZ^$(BYbO4!mX zg|BGv(UEN_*4>JGTf!!oUwK(ni{|M5!4g+!HtX$N#;~R3f)I7Ah`f3mgOCLLMqzuu z(z;>}=6*n`2pt3DL_oPSZHLU&Mg|I2SXM6Z~JxbWs(CJ5uS;s)=qip7xiB7};Il@IxzOl(J)-#b*(UeL=PRG}NFpFO> zHA`9=N{np7#)b8tlVSvNRZkP;x)OtoD!O}_efipF^((}hG;+0kaZmdL6e>v!LR#q? zwYHpXTf!`*%W>HNW%s*HW!>ebW#0&ZiBaeIxWDK9o&m}Cf5m-}6tMt?VibNGab-at zU}LBAw95{SMJF3JOMd{NJNa!N=hw&%%F+b(k6|6N7FxYjT2LwuT>Ip__dVc--u;)> z36w!jIWoyezCTYX3J@Xs@J21HQk18VRzT`?&ISF;VJcLm=Z^{0GosS&a@O!(Dky_@ zsUuk_2n)EV0VU&NrV=kfX9#rv*i(4XG!?;m?K^^2X5q6+*jU|=Zo&@0W2X4VR|kQ@ zD;nipbIJ2#UgFlk{Agrvmk9GwDS4a`rGmq>7D(_l8@_0a{B6^OV^e0rqHdM-gQ9jh zyG#OgBbaXYjro_Aio|S-HHw{2=-pp-eH5!;< zK*Ft!ppynoh!2uXhVxF!nmrvR6EHO0j%?+270ICy5YM4HSEvubsO!B9#uNsGz+-Ox zqxeMb1a7PTvILr~)W%PJv@gB3vr|+* zhD~{u3kpqpe}UB6F0kru^^uB$sR&1G3s{;Y(9!inu}`DlDS-HxfwW4)Ig(;(# zXxmmXvH?2}W{u5-O0-ep7FNR4J)si)c^g>E2xgG(4beRE4=slX!va8a6PW1w%c-=$ z8za`qg=(Kw7?HJ&@!QPyjn?7Fivur|&*b0EDq`9&#}`nC0&=B0UVtuSGhu*K1T9}z zI{1Cn4DiMPQw1C^QSM94UjeK9uY5A%;3A{yVZFhDgXrg@g4|V6v5oe4}@xL06wk4Kq!^Z8R+;U4IB=5c})s@0&umy@)@3} zb!7n__q;GowH1{cIq{IQ-ZqRQ0pKBs1q6~(U4_yO_4pu{snk%%mwPq;{LgUB%}$|n zXJGUDoo?xW`TH^d^%0(b|1OczN>+NO_ZWjgdY1hFqjY93jTG=ToYKo3T2uXodWy)f z;A9(&=aB)I+(}tZ#-D?M|YhYyb*KlXN5S3eZ*u;K^T zcDA?cs~Mw#F)h@_Z93#MG^?AAB@YfHDG*=xgsi|0ZB#N4s@6!^Kx=rQw5+(_oI^w9 zN@+v6NtfU_$$d+x=cDjSOFz687Mh#9Pz_|<8qvGt3F6cQa9V~0tmIF}Y7?;yAknm7 z{#cV#y^_CNn(8$At=Re?y;P1kr>zIo^!!P#SpSt!iXrywiNJzo4Ci^Zt0bv)8Jcei z^uKrdC8dJ23odG)*_BD|8df#S5Rzz^r>qps)|8rKlmqR$lU99C4P30QmRvpR!%e_v z6Y#jc8~i`5c)_DFSex?eGX9@&7r^w`^|l?}Iw z4rp;aJ?ZRw_5jwk%ONZ7Hbu2r5lCh`+3KRK^@I=J`!{&=9iEDHNipV;_V$_H)iiC= z{8Q^PG!K~$6Q-bJw?mCOXU3j*U?L}yDSr- zl&SIJsUL3QM=?ByzJm{VI8d0SSf|qVD=e=ah=)ZPHOuTjUB(IvKW!6AJ>DUtg8Y$fV9HU_7y{0%4BH6aLN-J2-CP*e%K zXv~fayukyu+|U7Y+Spng`zofvYB>yea3=_Kl{-7Xo^!<3s`c~3(b6Yel^l*98B zxgxafE&JiII>5?6|Imh4;mRJv9gGMBXn%}-|O$-wOnWIbih(TpC>6&Di&B!D@V|p zE?n?xFvMaXJ1FiZ!JouZZ(zvU{GvdTTWRjyDALsom#fM7*L^SBPhCQ08(0h^H56G7 zCcxjh5}gVI#rnLIoj2S40UPzYp^f%3?pRfFTf#<7wvK_>*t7Q!f4f5(_@IT zbcc4}V>cyK0(VlP+49&Yr8q>twRU!HeI#3xGTP$WICFqJuVbn)IZ-7C;wBJ^Bgnzd%%<3!N=tZWNTXh(2YSu>q9HYlow2i(PvJXN6doo3O= zb~EJGw& zU5Zi;JTU7_DLqPouSQ+RjCpJssQq&ap1uj7me?70_S%>c?Q}3rB{~B_0(;bPaJHka zbb7g}F07*Z1^c8%q`mEv$UbwXBPOAIkY&lj*RzYEIYFvc{Z$bRJ#_NVy6Sm?+5Cko ztvrkV!??-cha=p!pamOf7hV(QwcZP#+<(~u&}Di>ctO2HPT}F+x_fxFnLKHZ%e3R# zsD#)rjf0k^$CXc4-8IRh+ypao%e&s~*e&7xqpb$0lQew^RMN1wAoA_#&^D_b`--;h z_DradJ9@4&v$D6M_!Oz6{Ax5@va#Ze-ke`~AKLe`4fB!d@qLbZwO?c)4~sZ+1#u45 zHD|^~&&=;(KKirl<|;&;jwHV|yfBFV{?AQjO*rx@vt~rgNpgQ!TV{P>zyx_Z3NE=H z+mX5Ie7hn0wL4sVLa%CR-K^q466gKP+@T#>;XaBpp?fP!$VkW?$eEvtzE**^2XLFK z*AhiHo7=a}AC$R(A~k&fTZbMd4x*j$Df;)y{Ny30XbSzuCAxAk!3dKjFn98zh`xXr z=UU&?HbYFO-VxPUW0{ZD-D?hFV=HIjAtuzC((u-rHC-mfA3y@+oaZ(8)5-e9`|>iK zCAGR#?x&Uaqt}xFLjdb}GZMVwPO3xr9e@$AKVyEg(!cw6G~KYjaiF7b2pI_aCeL!#-sGBjo*nP|0tgYOoN)6 zV#s&RPEiYbb1QxjWq1tj0NmkYo=LGepcw2hTy}YuH%tSt4LJ81h!J@R(=ZXKxytQ) zpxMr!WDcbomzK~sHWGr`@BWvM5FRPgSfoU>!KYN;;mn6zn2)yL2@w3v7-KfhFUx~M zYkwv}=lq-2T$cU<%&l3x*}z$->~-!n6gF~%i_MtfU(~h-_1G+bD5YXWS}EM{Ldho8 zuoXeiOcz;q&J42t%(^$7NN9cOJm?}^V~yT3?e9Z%k(cNGVTji?5Ob@?CzggV)Dq9q z3#B3&EMN`ew}G=?Wnie2blhr-wB%P=mciX8%E2SuI|c{G8Z%4T!F7*QizzvuKF5Fb z8R3~wmu5{w-2AATxh9gYnr;O7LYf|(eP!ZeQ7i)8TbQZ0|Ja+^M#!Wo9AX zZR18(kd^~ZS&U=*dLVB}6Wl_A6S<(SsQ%EuVuBoDG4z;Rv#j|Q+Qs!IGr8i(E0o#&n|=juhBC_4BJhZ zAM3La+^ZNOP&Svtt^dK86km}NeKmnM1U_*KG2BKb56`Fivy7#LxOlcrqJ4Yu@HtD zR_e}Rj^+im*mr;4PZfzz^~2!M$6m(s@S}k&EsE6MdhF0?D7^{XH?D zA>C7s^C_#JpA>T`)j6yBI@w)x@5GawbyDkL*PomG8Vx2#vs*E}?OUvZbHd1Uf)Nqe zya*$T>EE(`!5^5~pPI+DygI0CHhRIA=-@Hpt2kf8-OTyZ2bX4$X`JC_*c!bCO?7{GNY=pn>g1S&zaUuDz_)(7BrGDfw zok(1Pf*(rxQ51!3U*+Hf?6+5MdgFr`C=cm>{GAI?grtgLU)$`%6P3=Y)=%_Om%7{t zVb-XG3fN9#wfeAHeeaZ^(%AaR)2fDjMnzT6sv&c~5$d@pMM9W5?%j82O^*0wzy~di zqF?_Dx~QycAYU4Re3?>(#Ve@#I5!sLFlg;wD3Fsf7ZU8fN8Xx;r8ZJ-pcap5u*_{9 zFOux6LN(hTsQH)>2ODEY`8`3&1q?qF%%@p<=4F+}WvG{H-$#ev2aO#$YZ@v-j%L}9 z$FIgOvquuG$KX5gyFo4~n2Dk}(3EOs?EC|@(a5yi7Y|LtqSu`J%SLBv6x3_rmel=0 zDEC6qt3T(9Bo6!VNawcu5nyQy9jk zdSZCo30~Ak>6-D#It9XQ(P)xppX}XOA8q!5II)SOu_=@iMFi9G=)PxZwiY9%L5q0) z`#bR-Z|O z2rC{U#IhHH9{)-H*oRP56%cyKiV;EOUFNQkxO^(!y&!v^gX*6VsYi(T(!~YF&brNA zKDWn}6z{vJ8guP%P>h?5T0ObIo%i~Wo2f&ZFx8Hv(JH9VlWOI%+&t$S2tjSr>DkQt zF_R0KU$j)~J$ zw5oRgnz$z~%Q!tilP#pfxJ*|EAy4df|BMh#3#Xh7&MwgjK>yxjLy)2Ax#(V(qkeRn zR3GMs-X;xo7hIiWIt$Hx6O_E?voEq9iXrmU`a*=-<>SMn!pS5KE8AGWmke3*{R&Ng zt;KQ`#`$@laUu=n6m=Dz7#H&S4anzf|4}Lv!S_X&r9qwx)Ms6injFKU2H!cEj{Ou!Ow$W!#PPoX@)obg|(B~ zFl@vA!M0GxunyKN!Yq4msouYkw|{e|BZ{fY+OVjs`KDH(>oeOBoBEP1xZ6r?`_7=&G>4582NBU3OcwCwyC4sj`B15+BL8te)1(-^k{ZH^#*tk z3SX0|dU!@vjS3|$whAb|PpE6}kKT5yI6ReuPN%XV7zLAMi05C%r?PVcce)hmvzr}s z>}q_oSn^bAsmvQg+hcH@h$_SN2;8~NFE$@@7C9})?bh1+XGYO&6H7mw&%ZuJdPmX1xgZ zu5*)HE|$XxPDu@i*%IGqG9p8Ypm*HAwp}DRHs}14+-825xY^rWlqOUnn1~�-cFa zz&oj8NKHftZ%{VevL%EPMyNS_!AZ*OjXEx1d0u_Y8Nj;Yy zr8`juKN2oo-Nl%JnVOkeQfV6U-Zz>Z*RH~^lJC!s2Kum)0Jeg98;_r~pkWuOZB3#^ zq18yWnbzcpwROU)BGfB(RChF!`pcA=%z*V(LyNC&$cAR0S$_gd-8#HDZ|Og#UErS8 z_AE=z{r7KESlth*2hDqVz~=!e{~9s9*70|M;)^;fKmSO3>x2^o6MrPB%W(g2iKS?) z8k9U8vT6RV7lSWq6<8A$H_IlpZL}+`UT$Vd4hQLeUUYHcA&F4GMfuaK9L;=E86$7l z9g})%7eKPw@bh-hH(9km&HsBJRV;5!>}@w8-yS^*(OGeV=y=vQLB?&cIpITe>^ zRAMBfsmm8JHhgI9!)Gtf;J!oWLohmIV3|f2PdV z;KHMvaq%;UFDr=6n|`owBWjUlTq0foI5{Sv1Gh6FVq=cp85r*&k_7C=L?*GON(#88G3(DAc$$XtUlLshDRnM~M#iL$q^qdFTa99==B_+MCj`(VvZ@(hnL9Q1 z$`{O&J`o$dlHB&N9Ii|BuThaCjH%X9Ln#9x+qQP`!i4y(s<3{(knbKkIjsmV59`SD zB6cQxZNrjbbEo0P1ZT0F;pS1E!=^dN$~oQq5>R4Bqdm$gWsN)@=-B7TTRwgs`Q;B| zeDQE6Og;6e&K36vZZUjB-(UYl-$pqE7BYD{u3n^vn&T7=)nvV`*`2=5h13LaaP{!A z;AEbQ-dd&t{d2F*<}T-fbMDCRUs}z*A9#L-Fa#2veA9tUGp05B|r_XsSK=&_XBY;HaC-DnsMB8uKi`4C-F2{TYPn>h6XG zEXBZ66STEq(Fx`-l8IX5oZWuB3GiuGfZqtBf2iuCiei@4Zm+k{bMfYvboK^Wr>D7AC3oEH7g}HCs2Ydn6lv_{iAZp5sB$A#F`GBl8jYfb8M@m}aXF3r zOkL#VS8kv)(a0YyKb5GgV+$lXe_!7C@QSjc1#i0Z&nCAAUI$oR{nqs#uof+~8E)c#zk zbCoy-6$!`j!sv%~t%nXkwyS9WSAbx(a!d>8JF+GIchbuLGwuBU9S;BCEx^10>lfQn z75)G-WPCpVWC4&v*vkPqD-Ne+Vr3;k*jnEB?fAA`I3#6cctbcprvV$i z=nN=WUX-2tj`*~EFy{V%a^@$@v4UFk;I=m>&(in5cVgWGqy&wdwKw)1Nr{92%?p6` zskPuD<%X1TJ%jPGF`Zpqb~kRk8zuYV_5J1F5MiWmS-7+Dvifgpl&l<9J-Y|X+}$yp zJxpt|Y)nk%ncGS3PBzr3Gsf2U;A0stdw z>gwja15J+7u7lU;xX30w6r<=-$av|F-ASmW@0XjopWI;qzF6EEEs05J57OkWzAPv%UI=8}HMw&q@!g*|xm-i6 zOUrap#?kh+Yhzhqpk(klDkI=4>}u*_@R8Fl_V*}Lk`M+&X_C9|h~|nR1fIQfpS0@P zvxLtNG+k=HE%xp^a(ZQ-XOmDx^IeCR?Bw*ykcLaa@*yQb)h?Ugx4VZgxAy_dGTu5c zup)w%`G(6HV>GVztfrY58_$pWHW07J$t39)ZQ02eEng8)%pqU?^HjKaVi!nvl4o~- zDHISy-cpQQD?PELI=;=+{=%**uU;gg?+5gsr%zQ3BPzF!I#wa^pj4S91&ahEB}=sP zR*I8Pp4_6XbjQU}1)Rw(^L=NhULJ^ox`u}3AzEfZ*s8ROCR<+vUUltLyu6)-Mb-B0 z+c)BoR3fqpK}E2{A|R#rAo)++(D4n9;f))ttgKYsp5|4YHea398cb5`8mDt!XP);d ze)jA?-C4TsL9=Z{tgw3Tfdi=ufVxXr?ZJ$$jv?zCEq#I1Q1~|X+tS3xJ3Fi&KmY+B z^-%QvB{0sjs6ZB+&oEX{e^LcYPRx9FzeIB77F_LmVX|07L#lT>_nemvh_-2XGjS zKb?o6(e)wD;KnKyR^VATCo{yW`bxcq2ApkbyC7bF?era5IB0x*sIM&ssm^8c&8)4p zs&(gt@)vxl4CMKrkAylAV2H?@Wg@;UUBNE3m~{5^I7CD=d1AT$NSwGa)a-Vmup?P% z&Rr|M|Iv;P!3yb8yMLtu;0!RnZVNpyTr+G!CvKSc|sjq02(hJ_G4F-C$u?QX;0=m(*bSv4e!(W~sI&`Q+8F%8g))1)V z4n)q`n)cgS8+A9fpqF^5V9iXu17 zPvNjuu}8EL2j){0fF#tnH7X7P}vsrVYJER_eF!0`;k3_Yj~h727vE3()d5-XPP+_eZW| zMULlfY=n!}r;iw4zs_Kg8dU!HZt9O|C}3d-~N6CGP`e*8U; zj^DrATx;V;jFmc7zP)ng%0{P^!XJOU*ZKlnF6!Fac1Vg&N5djLM~sgE@!kqAJNtyk zy%R%xI(1DV-3&@bz+kJ5nKYyHpO5QNBCeyhfy<*ukMzRV-+|yB&ZM$ZQ&P5s!Kj~~ zfAz~p zX?&`z*kFvZ)^Dz8Di%(P*O+AusI|GXWWTYGL-h}HI+nP~hq~^V+{v31_L(u9)YOH^ ziS6Y^EGM@nic32yzc!>=N_TL+OZy(0xLxJ%3cxIrS|F9pdiVbfd2S#&3RfH)%Q}4U zU>-n#*cT$C0Jg&RwSEYc-t!tfxMPvuSQm`s@bqL)g3Vul{k?f(vlXd77P9blv02R4 zrhi$%z_mZU%HP&?lN2vtSSoA?u# zezwX^8fHz)ih!DZH3{@OvnP90kfy1hKkW>I> zk5!GD|Jthl6Hl3>WM>yEnx~tpiEckqvXt3sDY~=yuQqR(CVDt+U5NJhLJ}}Ymy!x3 zWJ|#nPPDo}lLR?x_N8*YK!vWRx|0ziREtNBX$8E|oM zs#CoxWYSPkQITLrx7xdZe--kry)}d%8ngOkA>3WrcKo;54vAR7%4^@*Fyr?1Jzy`6 zvSmlU;j=ThKPYU~bX%WA;kSjYs>^U~tN-%vKWD?-C@l>=Tl9<_YByt#q%(3FcKeKR zSu&j7NT0T8YsC0^&EbPGc~h-&Yg{?9KlYWsd;sZ)h8xjD9&^Roknb=bLBMM^29*tmIcx`@RAi4XYZ?B+YUa`qSb;Le zfC_UW;${Tc!3QPAJ^?Hl9m>YaQOMfT-K}ui+uG)4vxGO2WONWkmqTc|2aY!lPg@(5 zcwINdgC>q}`H6trE%g8t<2eBKSz9`FYVAjCJ`8k+nkDOckycLAAL9-?KrH@j`4fR& zHjZH8%#;Oad`8CHxt)y_87s80f2{u!{Muqj*@t_vq24H|`>k5a?nCUu8MjY06r_zp z#xJQ)kpJ1HX6xWk9T*g3PeF4I(jNeQ{}+qlueU=(D0ee`OTjA|s z#1t_p*Q$yIveUy;&eq%eMxD|ErbqqE8JpX;ja%~u<_8N*7mIB3qw1&Qf8jFhKCa5d zC0T?m`eAHeg+@u4?+pfBD(FLtfrCuzwvcZX1%3-REY?V?*}kT9`!v7p7XdUH>?Gop z24ch!@r=A_jXTlniBpL2qD0DwYI*+CGQE|H1L*kR+U6)#CB6F34}{#`(hm1*%K$pT z_bQ+=U2{x3Ig`z+oa5^UzVaKJwh1h&o8*y>v8 Im0OSh2Wd4TxBvhE literal 0 HcmV?d00001 diff --git a/docs/llms-full.txt b/docs/llms-full.txt index 1d1f898bb4..a55d8eac41 100644 --- a/docs/llms-full.txt +++ b/docs/llms-full.txt @@ -13938,6 +13938,7 @@ Use these slugs to construct provider-specific docs URLs only when needed. | `adyntel` | Adyntel | API_KEY | [docs](https://nango.dev/docs/api-integrations/adyntel.md) | [connect](https://nango.dev/docs/api-integrations/adyntel/connect.md) | | marketing | | `affinity` | Affinity (v1) | BASIC | [docs](https://nango.dev/docs/integrations/all/affinity.md) | [connect](https://nango.dev/docs/integrations/all/affinity/connect.md) | | crm | | `affinity-v2` | Affinity (v2) | API_KEY | [docs](https://nango.dev/docs/integrations/all/affinity-v2.md) | [connect](https://nango.dev/docs/integrations/all/affinity-v2/connect.md) | | crm | +| `agentline` | AgentLine | API_KEY | [docs](https://nango.dev/docs/api-integrations/agentline.md) | [connect](https://nango.dev/docs/api-integrations/agentline/connect.md) | | communication | | `agiloft` | Agiloft | OAUTH2 | [docs](https://nango.dev/docs/api-integrations/agiloft.md) | [connect](https://nango.dev/docs/api-integrations/agiloft/connect.md) | [setup](https://nango.dev/docs/api-integrations/agiloft/how-to-register-your-own-agiloft-api-oauth-app.md) | productivity | | `agiloft-cc` | Agiloft (Client Credentials) | OAUTH2_CC | [docs](https://nango.dev/docs/api-integrations/agiloft-cc.md) | [connect](https://nango.dev/docs/api-integrations/agiloft-cc/connect.md) | | productivity | | `ahrefs` | Ahrefs | OAUTH2 | [docs](https://nango.dev/docs/api-integrations/ahrefs.md) | | [setup](https://nango.dev/docs/api-integrations/ahrefs/how-to-register-your-own-ahrefs-api-oauth-app.md) | marketing, analytics | diff --git a/packages/webapp/public/images/template-logos/agentline.svg b/packages/webapp/public/images/template-logos/agentline.svg new file mode 100644 index 0000000000..fed99f2089 --- /dev/null +++ b/packages/webapp/public/images/template-logos/agentline.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 2029254b18ca3000591832fde3e3d8709f38f2d9 Mon Sep 17 00:00:00 2001 From: Sameersribot Date: Tue, 14 Jul 2026 15:21:24 +0530 Subject: [PATCH 6/8] fix(docs): replace agentline account.png with actual dashboard screenshot --- docs/api-integrations/agentline/account.png | Bin 1914 -> 136062 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/api-integrations/agentline/account.png b/docs/api-integrations/agentline/account.png index 4b26a589d31d4a5d55eaea283eab043d0f1b0ad4..d835cedb615b05fb5a43e07c41722068297df90d 100644 GIT binary patch literal 136062 zcmdpeXIN8N*EaTH9N-Z~89`uFigfAHMN|v{R7x;Zr39%F=^zBukpTrXflxy4BtRsg zND0^g=^YG#fKo$?lu(oKojjvH&->@QzU%$@<>CM*IcJ}}*Iw&hYp;9l#N0A7;`vqR zS1v9t9?*@e=3HFIBDuH@F@HG%J2M7Kf@H02M!d2dVh6bD*b~7+F;Nq%CIL^Fx z1UTn@a0BYc#l`Q>ISx=^V!>Qo`vst@2A07NOXDHw5Ledz>Q-$s`HyEqJip&o{dnZK zc^|*2tZA2;b#|q)iGaz#3rBa@36Hd5_cZsIwEMZmslzpvW4BH{vHbJuiNgk#)%U8y zG@JChA7=TD&t=xSIR@(%O{tAM)N`xl>vh)ivu_Oz>N2+l`tto1>7xi!|8WBRt&`$^ z`=8TZ!ET2FGS3>8^k^AOkjt7V@V1SRk1XIO)^-&v3>Xg; zbk62lS#8|Tiq(Uua8<_aT4tz^c=-?uaxiH$ik-Iz-#^XHFCb&`cddDEfpR}CUEv#i z>C;;@lyxD=Cq#jJz9fyYs3_%o zLI}fX`Fd}|ga5Q?4*`Z9xIjGKHnDsIlzUa1LB8fHF#{8PJua(tAYBf8;dZ}Lo8!$~ z@f;WEdOT=N@UoG|^CtM{J+<%>k*Oc8fRtYizNKn^TYtU$(iLniYTR3^6g z@B_IM)`Utw_BU}bDpukv%+J94)r$j>PMRuFL8_SV8sPtuopk61+ox5oBjhO8^zTVr zX6WCuBE9*VMVn%$6(h}VrOA12n)iy3bo`9OehB0js~Hk>^Rx^ou^8J>L;lUHCe4J) z))&0$;>-PclmBLmYcqz;$T-!-uJU$8vu=|4hEsHr-W`&j2eW_a+SzMG4t;5QbsyU8 z`%gC_GxLK~A{3%C%W8Yx*YPY?KI}3sqrC23I#@@N6nGnBX2uRp(@Fr^Gc9m|kL3qn z`>P+WXc0;kHVc!SN<>R^bo9FrYgt@xf$pkcekBZPHr?rmwsMRYc#Rrf1O4R$LAl3& z?R5Mz?A;aO$?+SVu_d|r@4Xa?%X1Vg59)$Y2$hy8Q(oG?mVHG7P0N<}hGj_pwN4Ts z*9pgh&N_zq7)YIx<(0^yNxD5KT~6T3c5`1*?)~QpTsGyU`D0!l6-yKQ<%7h1H}yP> zdxzV>`R>x75jk&v<2xZ%P@hv?QUq_?D%)T8PqoB{2YLqs&y`=f8WYs<*5O#HmyZQFnROFc+4HR@#r~hi zzYTOvj;OzI;$~V`7YtqoVdZyJR#i6b?$63J%Yx1YTGLF7#eA5(Uhy2s?(gM1iGH@* zt9NRDu1N?nTZ=8H!UA{nGcm`M|1{pq7J~n^c~(A=)q3pr{rU6c=M$EJU!1J;R$rK}pORs<>oDpjqdney z>mOU|<+^)+m!5MSF;RG-srHK`YxWtYa~9^o3i&R-40%y-im5y@V*Z}hh^@J9YDF0R8WFMVI{%uqF@P&q$1uLs1qf+* z;d9wv)-&@ai9;C;t1ZGdL|7bo%)`$SgCn-YsbIq0;)IK8@c?8}?o2g(>i4Z{{~;dv zk-?7@PA+Jx_^8iwL^K|bhRZxxF|`M+Sh)P zKHp~~I^2v>q^ZZ$i8%zOk}JpWync|gf|xw8PxR!wsmDls_8ZxBOaEIWc}OlnSI^e) z*;1jAX!zjL!bOgtS1SYM2 zS1>JvsWEjaIO`_ktRwhZtAj)YTw{X3@0I_n7pk;I}@~ucJ(+VRMIoIXavGWQv zNkMFdjkD|P)0OZ+UmrG-OHo`AYhp5CG)JudU3k)&;7CHvc=q-^=kzUR%T)K9V7nNB zc&nvZM_Kkbyy`w}Zgvg*O}=vM8=c;uG6|I9&lOqQi`Wc**3pM^(uSwWcc?3{v!+{pA>>Z;!=Qv;Ac`&ZkmAanW81bH4i&Z&b!vr7TsD4Yl zu3i071Ce7eWTG3!aIIX^<21b`laH>#>rfwrCwV$lc~mLXGatrj&EF;M%wmxFo`@Y; z)9vBfv~AXL2Ck%Ob1Fbwg?sE(o8xyIu)nNcwsFjlv3f|*!#m^&mF)Wx&GXrmzBzi0 zGi@d9mflhu?Aeq?&Ah9A)-8$MDF#9{RiQZ1EY{QO@n=f#S;3FRX)F3vXWoIwM~-t4 zcvs&|cQw(X>ujS`LzYU`o;R^WgHg9=34qNp7!%4F139BrhkX-YC!=aX4&z&0o9STr zN@YI8q7@y>XF8Jiz;+3`YZv4l8^;DL5r-BgtF)Py@MI}{%ZX;PIdE0E2>%3rmKnHvI$}S`+D_D_ai^^)vmZb&Zux8BqcpdxlKM}s zCkPb)H;*JB)&z(+^5Z!v4QV-$taU@4wPOSbu(Hbz=DU>xJ-wYx%w{naK%1DU1hI14 zBEzO{*K~J3eaP8!>dp@bth4H2vvwVw8pfEmxcS%0Oxcl$Jz8?po9i`ZO;8R9a=N65 z@Qs_6%!^)97pLo`&57v1&Jx{vhCf$CgOPgsJ3TeQn=9uN^spaVUc3?)dHBtMGny+b zj&2p&Bc3>f??~+HIq2*l8N_RJkZ`;&<72!Ee!1y$LIVzvN zRkt~TK#XtJPq-Il1opqs-vwq)|Ft9jWz%Z={7vu`h2!79P(-7=C?^enY-9YyxLnH?)gflYg zAMHHkcs`DzPK>LMFQLc8Jp%%&%=BmanXxtLD4{4sM+mAXH z(8niFN5n=hDLqTN1R5a1eZdPjlQ^cpi~H6FXLS9{26 zvq}*h^At51FtLhZO=QJBW%~Dn06eMMPw3#$pcWg6g#fe1Uw@l;&2)sdJHkQp zhL0Y8M|$Y##BQXx{l&hWV@}B#LBlW4*1Io{R4E|MASuuaqtvEKEAeIHmlomkbmv=2J+0fmQ_L{k(7_8F)tc?e zqHkgJ>}t%kmoE0=#aufteP6Lg2BK{6OJlD*?nGpI>_%WswV}HYTAxzs!UNb}-R+fe z^1ikVWIvKnotPwHYu!dd^d8KcaJ8-NP}-hGUzTaTwmfbb2wX_{X3ejjf;ucHkWV1^?aK#;9E z+xtWfIJ6%P2U1|F_Avf89TJFf*YvVymHhiV3H%+_7cgyF_OwbA)4tA*5j2h)bk#>W zp$Uo&xr2sg%6;8h&bD9K$3(yF=Q3c>G*Ii^@ZM|#j-LD;%vYw#UeDTZ&~H(>-}~o& z7`!3*mOb!^nKtW1uj8)YY{Ps4{6+FbRkt{G>u=1Xe4^=F5#u?A(H>oCYB|-DdJnhO zky9LV0Pye^`vK1HxMW|rV#=l4oST_>)*tyl8*tR-^M}^7F0JXwCu{5+6@5jE2Rm*( zfFh%l2jRxR{|TutIo^wdQ+olmTS~<#bIv30zVw`1SpQWhs9Q75cmGh@x3WUV4J!3< zhn^8h;0^Ax+qRqk)_7A7MF+Mw9<=YU_uIb7g&#={P+P|D!o)ijJ?v{$ho0T{Y;qX2 zOX@{CNLwX)TbUAUcvfv(ze=~Yw^xr@8`zk4B9B^ruA32N>^41Ls5Hd4I120lA$r>S z*E4ZvH2e3VWy!xpthJ4O#P<9)LCHFzz4<9`4YIRg!esx2%x`7y-azSlqVvm!C`|e> z9?^VR{2M!K2j38?asG2b#bF?dyrO?>lYh|R;iyWezt7hsjgkehk?5Bi4*EQFlhK%c zZJ2TOP3(59X0>75e&0eMFw8LSy?B#@HQ&VSQL{rggz&v-ri{<{w`YXRt z`QHL+97Rdw=q+ITCz;1e&L466M%7}?Hh6k?kzH%SW?|qne9QSk$AeWopX~RB($Dyq zIqkkO5@QIA)*@bu^|IveP~WKa7$t@qz344%(#uupxnwWUgveQ8eh}+CEAsx)9Dc{_ z?svG?wI+-hjD}=MRn5I#Oe!|PR$6Bmw`)i{R2#^Ui|;(dIK?D7K_E&UkWOS_76dOP zHSFHG(ro(MIrU${) zB}$Irvtl5s1f%7TS7G#29>LpgDANh+-F0`rUbVmI>oo61%Y1d-XrV7!teetsCoU!} zrok1w65e>((-H!#DeIDogV=%o{BOqj-~K8dRd2aA;!KI8I^olT0e=y-)2UJcU=%^$MATu4_!pCnGL5a)JsZKuv z#x+YvepvwrQatfJ#~FgM+tg7f)aa9Ae8cI28HnO1 zkLN5)kBNm|P!7=zT>28y0TTS$buQj`Oy;#qz@QtPT2rj#J@a%bVWhI8sh{B5u?8!v z(NNi0q9J%n`>bJwwWEA&rtP&FPk){M> zRjgG1XcZiS*nws6l67%cRg|S24h~~N7QLnFWH0OO787+ghCQU9p)OvIHnxI250DCkbLY`?={Ak<0qw-;Ec)l<1 ziml~C!TB3oJxmmN(EF+cLRTd9uuqGlt-RltYl8lyY5a84VvWn!pp*OWj>tgY+~C;{ zu_&QCVmseA8}m{uQW3iN&h2$8C=pcEDq4nwXHG3qTIdHAh848wr5u;kN$laRa@5)3 zw~rvZ=2W+&`wc@mad*zuH6Z@fQZ1CG?)h}NqWLtp|K#}Dh$UdvE(710ME|OwO}hK# zeeWLXrsj?~=d+w30exVdAJ?7DVr2x)N(^+(yga^&_T;5%tf$9T-2HN;4DfH2Oybhrv-;m@c_(DK&pDvmJM_?2)ed9=520P%y(prp zZYw=;^N-$!tUS_1w|GdILjj=WyDD(fvUO7(1iA6i;-Xn`JvH^I!$)Belay;f*Y)1e92=lG?V;tFEg@_QgVW8xvG420kj9U+wVKo)5;0bgyFko*G2qaQy;CHhI3*HRtpVqVtxTLiTgz${p~2M)^^W8 ziebxDNrWz+?zhO6GyLIv6ti_UpYt9~X6}1JwldwjW@XNg_!h^SV zbNXEuH;9U0Qb(E?1v9=kPJcvMGN-pwh4i~qT{fo$Zo2nQ8jMzkpd?KjucF34+CY$- z*}E608%8J9upjm4V#~{ir6(?tCYPw3xu3{d>60IT4`+t0lt^WU8aLIm0_7h$=a}hy zIXte+g6Xq0=hDkcMzlaQ4&ZVQj`le2tR=@4kApq4xGNLZ6}PK5&otc3qlnS#tR1zq zwtQ$S*otX}P?EYykoAjILYn&5gQOcJ!Q3MAQHfGr8I~Du|pxQXKtVeg%1uK0%Xbq_imXzk3 zXwzR4$vpm^rjn5oC6&2XS6#-uRxYMmUT3Jq-K0nz_$`}w62pZ~KXO!SjjVX>TpW2e3fk%>~6i~Aig+ar$J41?q zv0MCI7g)yka7Cu)^1nqUV!^WGFV!&=tGcrQJ2cQLH&d|0RTqh7+YdVI&sCDX{v=Ff zGWuI>HU3SQc!R~@ZUC&gSWV`a_AUduCHM!93ex05=lq=do$pF$AQUX8$%24+WY7D5k+% zlt1e;B9dCFz10TQFIZXIty!0)1RUe?F1vY6j97A^dUTUMSRMa8t>zz4;%~gDQ8qB^ zEu2(EglUBSU79fjoK!^&Xu;SAkKCb`Lq`d6Q4$hh{@CP?C!ecnC!|YZx?~1k-o~CS zo1K=&%IsEN`f`wK`Ac5cqE!}F1A}SXoLyB<>+E7^Pkl$3OEShXmJsvuewUc96;I{R zor`EM3PchE3C9`)@Kj;li`LsIP5Vd9k$>`sy(^>Q2gaZP?RCCG|Ij=VpwouYX`w-(sbsLUU^2zydnP|KR)ySWpP{$>`knYl{Q7!(fh?$k7w^u?1)fX z4|U9c9_)P%Fx0=LtgNWEGZH6bo9nv7@BL_ki)+4*KrZzV_NXif#Pz2pl0`^|{k2f$ z;dKrSnwBf!G*S3J*Y>_sCcju12*BPPF_J`_R6F#hq0){O%COcs#i#ybJiz63f19Z1 z#ZmOEyu-bVbyW|&0ThB~iFD{^x(>Kz{{7dAH%B+A2H`ThPe)mY9{>WwDr&GgPYd+8zY;1Mg;hy>-k=Vl*wXR8``l?60+g+3a0{Hvua?Qzv)*)O&^4HZj=2$|zV6`#Vfsr(?;mXzX1x1)bAyKU9^C|y zLU}IS-anf(8Zgbp!}db(=muxE?wkwQOnhyU$;YhYL<{-a*#u^=|YazhzIF#%?+-MFI@_H(vC{muzp z>X=benG8tXyf994^4)e4N`sOqjQnl3dU!{BncXXUg`gSICy z;9?&O8=^wE{bI6DAo4B6o%fAla-_q?tkbyuy21E^WmO`sWAydCCsYT*RUl#I85p2R zWhLb|@7tHYI`(4lQ#jvCannm->Eg5$R02v|cW-+jN|(}8Ju0O3d+-(mO==44q)1UaK74^2-7WW6~&ZETa*v}ePSF+A${W+UQSbhF4O~1}^g_*T1d)mYVFl@P6(Bz(*79YfIeBDyURUL%< zx*Gg$nhr0T$OWk7e(2nb5zhY;W=+j!`sFCCa+Aqwu7d_zjK(UMQS!I`9^U@B?l+E} zo$-Mqr?y<9R#G06M=*muot~D3KZ=z!2{AXlCKqToXM-bKbPqkH2&Ra9pXuHLdHY@c zl03Hqf}b#z(SZErLRHj;N6>N|{SA8)eX}#}u1-7zmFjda_;4yswxqGnKuvhjavhXW z9d1*Uc5|_E8KpI3RU{5>ABDOSp-{AhwzI5&XD@JP*Iq}g!YiQeWY0}6`x;zpr#`;- zEcfIj{ItLSv-+w{N|0mRA4<7ksi*|aolA%oI-@DQ&`k_6I?@uj6-i0A72|x#di58%olBSH9-{u6!AoD>*Uo!l}iVMkFw;A>T8o zf3xj-^#RxA5kPO9Z3r$g;_huo36V{OyOeI34EKHUZ&7;*gFGX^0$C+afBj4oUUxmz zRv$Ywc3L*E${gtpLML{RZQ5Z3A^*#W<*=oHEhFBqXiaX9S55fVFTO=>_D&u;dST$D zm0ZenmAI?CYgy&&_^G?0k9o zP(R;3TQ}&=ZYvg=Y;NO@Xu+%0_99)$Kt#Fdsn2TYuARCe!uoKCF(j*BgtuGO3}>`v z4IFTsu;;0ghE|O6_ja?Z`;FZ@j`4)L>?&`YueoPH2?F<-on_3;Y^BB z^i`keGmmckY24_d?5@rTc5DdDqy`5!9L0!y>q3N=`_CKfHjsa~bxt+iYgAb=X&;Ff)=V3ums`l(i?V(PkbD;LdXpwoX*}ZnK;6_LVxX*5 zrv$-*y=uo9Cv{z-|H?a?DF<4;bA{f>ynW%J5#~WPN=!}aL3K?am}@J48eb$U871L9 z-S|a%+JLGZr5(D77k4Fe!#z?sE_%A&rN0@OPwYO82dX62lM(DM(;%d_$|aBW-Q%E- z0x*Hi%^w&W8VMze4wOO@+!qEHuTY+H&lw}lG-vW}Y2JHZo8wDm z0}ys9mSXeQnv{1JCfufT7&_d@DCswr4hE;|luL9}r|Y~15*XFyRqh1~1mhuC61L|O z)FG$^FYO6-*Dk1nhkFDDyy;H42Oyf~8r@j-2&xIND)Rlu{e#e$uQk*NikHl%J^7a+ zfu9Zjjl@AI9f-gJ4rFD9Gu??D*7G?Fe^01>u5|UA){YFb+VJoP&2nHUi~G^1chU2` zO2<4o5PYwz+IRgrvE;VringKD7}Fu!mCs&l@1E&r`QGV9&#kXbGYdeC3XFyXS8gE5 zX^gJ1{`as3-773b&-P+)K4y-VoAk~%%DKGJu_#m3{+&uYLwoO7!VU-8nmZ&HrGrj= zOWW)2<-VCwTqH_0Y!VKLVXypki47z9E(<<3SWl?3RxrEQt-0-cXykt8bLTQxx-Zfv zROSFXlU5TUhYd7}toX0M% zcK04i5nVWeO)4@S3SgV}9rtg2YRfS8N%5a=PV>F@XR6NrR@%k!)V7sB^4e4sdglyV zMf1t;E?s}|c)f`-aR(h^X(}+-=mjzl_>lO>i8#H^RDH=N-$g zvl06JP2l<;Pt5A?M3W+L>^ht;>jx;e!MZ|AC;Pk4Uw`pSC)*wiI5PVOr@l!SrRQ7R z)NS_iQR;{-fm?|YYr)?jStNGy4qn6?V0J^URAuGor^qWNEcVP+<)_6l>b6q_25%+z zokuxZ&O|;0Y8Sm)hFgY)+F@Q$CHVW-#DoU%hr{MG@db5DGXhsymu|GCKT6*Zciw5J z9##Obx>?oQ$l+11qgeQ$mrOf=DU}nAdud%F@9TRq0(#QSFMJuTw=Uq1iFZWS_U>E_ zgIaV4-xNH;k2ZU_`uVbQzv*3>l+T?K22Z%D4dLU5aZIIaD}u(;M^Po$BqQMwH_e^r zzDQVS^^N#s7L_<#O=|HtyuXz4);_$cP$wv{@VZ1~UQ5{4pD(=>^bVW}i0|7P{38C~ zq{$6ZagNd;d?9=S^j6rVP45_VS%xtG62mZ!go_my@4#T=taz<^L&^7Oq{d_ zLLGTF9U)O-DDZYY$|8u9kGSlOObjOmC4QPkDv zS5z{sx{4Ua;#2J~B0+A>{;k7qd}?IRxq)Z&@4$Z}x_1Oynd#c1~#0Of2?~ z-+7VgLp<5K)muRPFy~8K?GL-jvh@^~dKF4h>0i~TZ*v3*<#TJ84U5uEM(F2y0Q<9p zN&01cwupn)WG1h~{y`tFf86SRwIb^;H?|HbS4r!_CAC1dfZ0Jc)$_rXjfipgoYU`- zs`JyA*Q}98!|jX2WXkOKa>U)2kKyvid4~+5MD*#B2*0Di#2y)K_yeza>j5tw0**e? z>i*I!EwqAnz)pAVjds6wkaIPCPB9$|U#f;6!XFvjo%ohwAeB}4p%UV0c+6f_g!$yw z+K8jF_S*L}6j!#V7Guyt)ioCN)Ry1^LUm{!Lp50x+L0C7CgNYucQw}`3RN%~9>?pL zZrx##dAp;wAx-AZODRrKTU)y-QAuIPz9A72*^9gx1-1#{#sdiv=7>wnr-$GmY0-oo zm1ln3F48b)ELkbZ`lQ3FYEo*O1Cg3JDskY^B>Vh2@+}n{j~UhKh}c`P9h3wKt9#9F z%w#?JRes%TEn*-qkAE3`k`;WdteI-ZDaHc;_!_4aZ^A5yDln!n%QVRn4tPn-P_?Ji zbme_Vu0_zYdTxaA^xV9-QXRd?Z8@T|^^{8SBq%70CciU`2EThs$j65_--#v1Rr$MK z&>ndhmQkGdLZWo*a~K~j!?pWi4{pD#l}a{Dj=-OutJs|gUCQ{|PjTK=msN9cDoES7 zXi0*_%2LGW#)Wd8)hZ^ODN)Mod9Sk1sO`@=_7{K7ZEs}0!4uU%FVq+rKj-oOup5Sr z&F35TD9bmf=Y0jy$BIp?NI0DTgWCxtq_mCmi^=y z2;V)xyt_Us#c>6KSS(5V|}{^-;pS#H&M8TXyC~w|~Z@1d_CjbnDE?pp#rfZ_;Uns26@})Meo{ zsxqlaSM{8tfWzB`t;#_!&y!ok3up}#V|wyovuD-plgm}y>u`N*0ZEfS*<&|{UYths zbB<}lLx=PbQ82rpw4>OUN5GvXDXfdI7~I0^>7wn1kj-i_dt{7 zXl7Cv!btR@`SbnyH*H~ytfQ^lD%w7U0XnBx(F&-x6w|YSp;$jaP4{eP=(r;}rGvT~ zlPqMu^<1N9tUzLyx)klqo&L{{w!DrnRcwj&JD?be$v1etsoGxkf9pQ;e z*O#sNqg(FJ4iX>cT_WaVly8LnuF`o@7ZvdGC|#&j!--8F-&$a|A*|u~296^ED(w8z zDuoNe^<6_7+!m_!ael>5jxP6?`eh;Z%0gXh2K>ige5((CuJoz%m+v{Z%NkSi`;XeC zrDm#*$V2<92U1Lc*e@eT0x#?h4vX-Wa`je$Pm4#mf+3w~Z}9o1#%P6|JB588TIzd<6RzNZx2gKUz0w1W_krXgs{BGYM7@nHA#n(`rVe3*h^$E)O z0%NxahTiP- z6mvN?%c10-bjNg4axF=M-Qax)2q>C>GJnG3Aj!eOP2gOP3t6N^{}Ym9$q}5=ACZBf-3#Fl6@(BBV`olC+6@-#9 z?ccEV=>tl}-PiKpw@rAd=W&uk8Vk=yx`zwGfC(oBO*%-93xytgo&Is|J%&-$yBD6- z=X)GJJaT2~sQdd5>;8+YQNejYR>;hza4HvV=@XlEOYa5{B|L*w`ko8^rXe;gtRaSL za^!z>>>J2tEot?yi6EU#8t8oG0EhTHI4n7`}%S8%mH$Uu>)o%H&m^ zc%?nRSm(3$M_IUktoE#3m-gr2W3M4Jy#A(BI_{rvT@68Y1@-$B(dsNl4tLWaq=&$I zOG)k0^AI4u+m$la^Di&lo9Z6g;4>QtP*M1X59)2RP}}LPit>B@rt$GnT7C)j;V_k5 z1JX~y!u<#%xw3(JWl3zRz_G!kHX0XBKR+CVEL_ycO=Wc z8cRaKolbKTB{IRax!`KGC2LEzuXrH3eUs3ZG5MBd{`!(LZy%6N*im_MJkGrgi8N=(;4floI2;H;E_`hTGVZr| z97{=osH0zH1dNiD-kGl`_q^+`_J%5fE4=Jx4)JSkMV(iD&_j)2E}L#_m}JK#N*=#i zhA+dZVbaP&+f5jVlPG*vlc*I}TXaFonJ&sy!RpP&)jp*oTw}RNf)N8mY)m1RhT}RW2cJKk_cUvp_s%b8(e&8yWLdCXAtuIjgA> z;fx+8k)R3t!I|nTya7+(lcnI65XA@T`WZBdm@*SP2}sN?kK#~_g^_zQYj0<@+FCra zZv|kBs(mOP>U*J98|ENwW(%0Xp=7$kw&3fRz`Fb6_gO+<{hyqgA>DzL1W-t@H(s^` zxsr0Nf}O1J^|Gbd%_rPVODAFI8+apd9d|8R1VUlY-Z*vCQp>e83|f+$6d-HE1=g$&Kb zD%fffmNJ_CZ1jb3`;^S0eeS!gWjv{MrIeH~c8#>Fty#DnK8ueAXsJ&0f_%HnuZpd9 z5Szj^!b4&$)SQ;+;ps_%lYh!F683lN6c$^mjEM>~Jotx*%$?0NC?L{;g6L;AtKJoHWJ5Lnwp$C%M&Y z&v}H5%nf#~#mCO0*(3=85L)|(3UKL~>xf#zVeDK1r9*#YU<<3CZEgOrsz}isfc^p` z3=m^E0O2%HFyKBkG$NB^hWU|C23So8rDD-~7LAls(LS_dnOppS{8LLwsCZm-!41{_GSb$R-l#f z1S>16YX|?hoUC#8EmxUi(|>WAm$|@~|DT)wUvK;U-;d`1%SYOyn_Es*#bRYBUQ2T5SFfm6{S`6!4rXqZSD~&4!?~&z4;}rjcbBpFbIbN+!TzzU zHWgFPMWUAtE84o8T0_#b8*vNfDv?1+{)s0CtjnH08&wKF2j(lVsJmcWo)aiXcOgBk zAoKp{ZDhQa39`BbnhZna_%k%P)zrP;#z&q5#x5*qO)VQwfz%LL&*-7rQ+d``^+HI^m{VfM+0FFValy3l%c4JZqqj;Gofx;ELg@_k<0m!88}{7t zQdW^s@>=m6K3)|fw77_^^E!Cxtb3)aC(^30r`34lb%yyBG;aleXp33Na5dw}of71V z*s5uDSxUYhA+gJ)Qc{w2!J=#jttH3JT!tfTqt872+Yyh)k9^?MFHLp`l~ye;s@+|{ zsR1?qAfUF_GoVXtB*pMbOM)2Qk+opGK&ip2!>OfN`^>qzxy-Q6dzXLtiDdIaX~vCd zthk{(^Tr){g}l7UOB)wLVmcd+8d(xW?yK!#u$Z(3x^bP$zkBU94n^Lgd!@?B=2XhD zTD#{DxvCAvF2?%DMVwF^>0Ws;A?D_>5tT9I3Q27dH@3_)r9Dx$E%L$j74mN1l982V z;1MkF-V!lk0!FD`Y1)rqO&-(#C2rX#UUT*j#xlhkS?N9?sS8|@!ya)&*nf!TOBR>6 ztu{F(_UJ+JgsS(bYB)V?!a_$hS$sTbBD`+<>+`PvIiO!99J)5&Gaig;sCKtc^jH*& zP?E1`>QnY_W{d9XZ95Y255_HuNwTr2JQ-a`RfzAngH1tWU*cYk^PijW6U z4(#0WqVM&+4_B7QyQ)SUaP=#7;Gpq<*uVR|@K7ak&p7S$Vu9`y zchZHjH`Q1zs&&b3eyKks$d=-7TWSE^x{i29*jRTd+59A#WMu*$b+^wd8+q?#qis{o z`&yngj#QqF8vP7NunhiaN*M5xYHDi6k|^MZQ#Cqd?O0Y%Z={SBQ0{v?gIlov0+c>> zYd`mX=Z|lhi0rnyZ~$^46}_jYF*O1|-np?1Z{BEjDY-6XTzOL`XWYq`@w}Ni5_vEV z)HdAW1;G(d%Xj5h{W+eUY|hvn40PZZPCvaQaqW25FA5vsw{kYi^T864&d6tEC6*c) zoJ4SGcJlb!wZJ5%9}2F4X)N9(A62_ki^04cwC#6?ToL@(F(d_(hCm8|??@eMN>wt1{pY3m7gft)K zJ5{6r!O3iQ2CfUEv1mK7i{_NXKYMnxD^n4{ zT0(v;aLN;Ctfi9%;g(;w=3P?F6y-;fQLYY(y)d?-RguwxCj)PpVR`Yym1S!KiU<>%x?_b9Em+C+i4##lVrV+ z`&_}?$|`9BZC1qi_JPlHW4`Z*01mL-5n#}G#fa7C#^U@D_2S-Sf&{#Fc7JQ1ouyDa z&7YK*czgznZKttfDs}B^o zmzXuTzSi8zthg0s-Rnx_NHtwfN~KixqcT#Ss$joheESL%3w|lET94@FrIEDMbf4N?^Pm0NNQ3-gCD&^dAwl z%Lbt&|3Wq)fvPzFcIl$~z~;+etHPe~iIoEm$J$6V#Ki&NaQvPhHEb`&3eVzf_$sfRP3zt6?j7@MSis`^hpen;BoHS*yX|h!B65X(IQUAt zi1!*>;nc8*Lv&|SVQ#`o$^%FZ!2iaW^&i++O?*HZNd*dDr9CP>BHR((8#Q6*fN? z!~vs5S~@tCD>=73-NXSK@7@4g13y-HQ_?ixnGxF`#1^V4J{G2?aZOAjz-cRRG7I7$ zU~<#cJkh**+jqma>L-Tw*<1P`b0{=b(j+At|7b?Gg=&s>AgOwNz9?@~d4o@PrP({*)`JWyXnawj2 z!0z}8Ex_+sL1yJntODjsBXlSXygMdVst@d1!{Yo3H|YQ-)-l&Q4jKK7_|h@pIgz`I$8A>W|h;@oEnO4!|luK$O(_ke0L z{rW{!ETagFq9PzLBOppuI)tVmNS7`If{LLNYN!IDqS8l75JKok2Wg>(fCxyJUPFff zfrJ(Uq2#>G=={I)opaYc>)yL=)`GQs4axgF&)&b?etW-{fsj-n#;73Oa5S-yKSZ5w zEgUg&$7wb71x)jX|90<~4<2<$1^Rr-pEqAPRs^oVgOaIw+R;8C^$p`DfiKxR{T(C6 z$}nwzincNzqdO!|naKECt6;Tjl8UaZ;`Rf#{b%Sc9}6zN^yrbNBz1#Ga>r&A0H+TD zdmWb4Rt{;G)MKN|{W?a;e{UfkKH=JGH~TGwx?+OOI|j;tz=scmJ;&_$gv_fR1Nvro zD`sOK07UEVq+B&Fe?y?{Z)1GitOS3X0`X00{H%@K29!_(Fv^w3N(+ec9!Uo{2EcNE zQH@|*X#IE7dN1%+xt%X_0pH$pSct~%x5m_9OR9{N!Pr8@$uUvews|^H0)>k;JyQ@>5GT&xi0JGU@W}$IuELY8s zs*8%c16xINOIRn0{j@W(~-G(W!waLhVCOn0&+OF2W9yu+>u=_@P0;Q^v? z6+j~Vo<>CuC%NB{bo`X^`>|gJ$XwhH`Q`rXC`G?2OKiYL%IRM!CoaT4bM?{wVl{V{sz30RXIvKM z%J8mtNZy5{bly96>;78dD{lVL ztBzasObF}E;plB-XgyD0@51W!FoM)of8`$g^-*|!THir^3A%d-D*6nO$yA1Z_l=ni zb-TAdG`BO<0f|a!tKf-yf~dFQg+G_eeJd)P$CGi!Q-jIW?(jC^2g`Gvp?dja%seh~ zS{CQ!^#L@FSw7CzNDcxYC-1UY%3gR&B!@t?m{FLv%UR%*_x6GGV`3tk6RxIW+87LW zc(>$Q$J*l-v%Dz(8*Ciy6sA@1E8u=L`)MzJ`eobG2W$AN{s8gcV(4T@W&os@Z@bgC zQ>I~2Y-$jmaN5PVZ_d+^NIq^vuy$Hm7ZyUrYYC9>3|4Bq1c^*VEW+Y5ca)e<$^)nn8O z%*CfxI1E$wp`xsZ8&QD+fQxD70wNTYb^b2j&6o0WHV^;=65#`P}TTp1rq7z3%9 ziG%x)?JFS+1acI$kYA(%u2Z05Baj;q#2lecExj6V)Sv3V`nF|+H!&q*SuLSlM<>?) zxq2|0qh=g*FJumVj5%wSQvm_~fHqOvbOX{!fUBOib`0zm7O44KzDxj)xB08BFLoh$ zWjZc%1?QJ0KGO>VUqY--g;mWXMEi47s0MRh&x>*L8|lsO+!cU! z?2&;%7la*P;7MnKnDY2slwuL!@_*;51k5zS!E!(GXs;*GzVY>$QXFp)V3%x;gBdfl zV*-#$O$Rc(gHwFAfKvJ%?cw9vUht@&yW#TcIC@y_(-axZiihOw6Ki$VIN-67@;gr~ z0Ix?D_~NeLyLM*Yb5W<5IAjgQtUG@wGs(}3*l--%NB{N4b05dud*p2xotbsz$+1HP zrrgyev-<5mO*jSTMHrttLKExvVaI0iIK*rL_z?6Wbw4IJmTpG&UaiFC`;oexDlL7& zWp3kh)NAhC9h!hqds$_z%d2B}{54I^wOGhEt}^|`F?UN_w*AKRb>E|bbst@1&b`Gy ze(pccIPGPajA9@1p^rzYRt7U~nnG&+vFi7>iPH8ML{nUKJsgIQT@6!pTDbvrc__lS zKsJld!QKP$d`#@xaMcrirYF#vTgG|MjJ4i4X*Lyn67CpS@ot72sf&<>?&zhbYn6n$ z$xl3NP;*OdbL|@2O9# z+)O)$Mj$bFOl&nScrrs`*#_JxbCLSpbjNW7)O5@y#ovQGXhK-YFCGFUi@T%r#W)(` zvv3s$AGTN|cI^NmL~F`3u)cnJMx?C9F^U3jvtl&5`SCGn62n~y!T2ULjeo22*%J4s zdIYM%fva%payFq7dswKWc<4bU;=s}6Kmc&;wE(f0lPthiDlXjmRJ+!_h-E1RQS%cpym(YSA;ym%RIDTy>F7{V8aD= zG48Dj3rcp~s6>azpIG-pNE|T|nt0ysjJ1~UxRgd%p#QBOS6^n7%WYq*d~wai%AcbU z2+4Tw@Pc)12(euwvciagNVK?AOy6W^F7~;s%00}dt|c$eH+?0atm7$zG=a6OOq9{X zha#rDP-?RpVY}E-!&JdaI2I&B`z$@U-nMSwBa1x)s)jhf$aI45M5NqUI~9cMxw z_$!&XHV?PvM2(KvgzMDwIXWgQ?4#0<$@@sa4{vaquR?COr%Ua~@?7>~%Ott_lysjLYGxPyB9XEu2bKCgg| zL0aMd6*xuNsWBuxULbGqUX`!N?xQ60!SBTY9FfA31oSOSpjlbfma#5 zCh&2ax1*1jzxT4bpV_@N2i|g^DyF$2pxOSy5COE>>v9>{tdO6Rjd4Sd^QB%0B%NAK zh6EnM8MqY8qqhMFA^boywzD~+78(q%eNv3<*Qt}w!M5hCd;XG@b7;%Rk%-EuEJ?mkDGM%$}-0*T*fQs z54vs&A$v75guh47pXabDOUAnW6^R{OW0zD9^dk<-y1kOB(&?~H%FttxBS`#&kfnE> zh9+sIe<6_9#B68*m`ro*@}SfglU4$aIG&fV!#;=`l#Kc6D_?1zrWU*pt`m0j*!Rm>Is1JN%xepo{k(9_^Na#lGV>V3sEpgbJ&V?foTo zL4*(I*t)c%R>a5?nAIg>o?$@G8>q&WArLT!;okMM@SnWI#!tK!)1#8EI?V|I^g(YbjKM%(CjMyIddyeoXaSEM$X0?Q|_A#bM3JmIv z$VhriKwNEi{FuqlTYtdeZrBZqTI$E`bUQKC7IPPl>9!eL40{di7ZQ;NM$A1$6nds^ ziiKso_K6OEzI92>M2FGD1Z_gNVWG~W!KJEqX8xEoRlZ@z-l~-@s*_|^r671&IM&oz z<9POu^vr1vx9@+l-F^BBu>FoegRDw%-DW5-e5Tm0|8s6$o`zez#}Q!ctlypZp=|Ct zVB_B5P=_`2QYg_P)cG#hz&m>m(wf1pVaZQ^|9*lp`f$&A4HlA?xV?>`8pCilP60D~ zva40#SegTWtL;j^^Ky(#nFpDInP02)Xm-*i6zWd)6$s#Xh@r~j%hn?IUlv>A?1fox zF6ZRK_roVXa@ZFJ}6E*AqjkPjC2`EbU;iS-RI0Z0qQLHbW_azZ}r! zR}h*0vmp&R$vGNr?l%M8*{#Rxc~&Y&EmG?iV)nZ_dF?Y0hQjuD7WKNBl-8uU^bV0= z9`&IkH5Fkxj^)x|;xhb_m{hx}j9<^fb zX-YYXBh8$a%Fn^cm#QnT4h!v}#wUq7{o)?)`_badZCJueF{6=b5KY%q@_Q~9-d;f%r ziOaH0Pf^Ll^KYo^Y7_lTA#jrU03;jF%l`&Ii3!sOGJgc93Wp@@eb*i!E_Fc?^4?a; zZ9y_7D2oAVZHK7q3BkP`ckw&p>D#nJJvfbma1ZE8=puCeF?0O?=mk35bD>= zykp;9L^|7dAcV$h;Q7b-Eu(zn<+S&leYx4md4S9&)Sg(Hu1H5sOUsY6Lhp?+(7S}_=>4B$ZkkQiL1x7>a0IqoF22KWzSfTIR) zIC;(%NOc_No~r3zan7%ZoIwQYi1a%Q%T7VIsHGFB--2W}rJAulI}LM1Ki1rdA1Nd> z&vIdPjlg54dVPOlo%5Y9n`HwwZzFeo2YgUzZI&Fw;i1DhJ~lEAy#4ipU2p#|A<2L^ zkZxaD<`%A#e9NxI1G7_Ksg|IypOt@j2p_1Hm39#dTQpzkmY!5UJeaR8Up};1s4IG& z1*zKcKAcw@UaC9aYKMiq@i-`~cKr#nn^%$FL)lo8?ko$YkKZfk(8$CaX#eF)Hf{5H%0`?eg07?S6n9d?-8f(Mp?pU8_{4lsN)E^8 zZxPl0t3qJ6HZToW&sD7{jt6F%41wq?w4=AxocvpSvYp)#L1@c_&$?JcTZF5tXtDHp z3%gIil#jk>zw`$3)#Q^nbe)aVuH3nY6%X%tn)@AB*ino25jc@`U6;G+`|qpGV!PoS z-Xoa}m%o2jkaZiAbQ)iDES7VtsF(1?n|lG%C-&kYedSs01AJ1WLxXB+kPVP_yI(8u zBU?=j#UHhDS&d2}VkksEI7!!2uW*Z|%A>AKLEc_IgWEGBUhLRm7Z5pf!|bTqw}=zl zmtXfej({O$p>&ggo*isDwyVm*B#_2ac+g7r^&X-xtb_gB&5sj;@d>LMUejZRp8gp7 z&xfiNSj->}rnlzo{IS$D3*s|a=;vR_k6Bl={&4NPkclH8y%*|GMJGt|wSk81{+7;; z!=&5wR&iyW8)DspPaImG1$ph)r#AS0JlP1%peysmB-{^11O?zP*_?$v9rv~-AWXXD z>MA8u_Ou77l!XW6NLkO!1Ha2$5)$GLRnr%jB&`){kII}B=5Z&0GToA(B0Kw&Bh#@Y zVs`!^kDVg^AwHQdYT&9*$k5G!!hux*-N9g8B!|#;+g8nDrnY4g zsmPpKt)(0#t8A0RG1;;UP{TL$)%)nNFYh1K;oE!cS9^Gtf76!ZVe!WaP?mkMJ2n=+ zny_3O^_8-HKm`VzmqVxIa(O79P2NxwBgxgFO#e%>RoKKFVUv%W>-Md_vLPS?e*0yOmw^=#R z=us+oL}hHvDjk&9uGq@3G=nXWQiwfp|1(064u_cZ;qlV8Q6O|17wK;%ePCg~=A&Ca ze4D&u&9GmF9G}WI1#KoUB5-Gp_lm~=D|xH@v|38<49{{9-6<4X(Y<&Uofj}jiB`wt z1xNbi;U;YLEOAlPF-g`=u=7_Ad#eK?x`DB5`PWgR1k;@buJqJ!iP zU?_5250af*473|MUG{U(gObA)jSv2RF$g-1*o}eCqrmo~^L+R68I5vlV@qH!TTp52 z-ik!7i5JdBaqc3DR3&&~`Zg%qkT<_w`vQwM#R;~DKVZd31hKaJkmj6Bsz-ar2p(kD zV(hM8H2AEn&nGbfS@P3XL0W-oGVVc-uZb!^Ns( z!~i}y=(RF>hH$DQeYN18jqZiDpV3pQlaG2SG+~LyEXsYfBrmYlF?RdCb6z7b0qGJ1 zF&eP&vBA+;WR$Qz>5c?UbLzF~1NVV_*Tc6C)BZIayi)W}Lb?1>#Lnj}`90?uVpo4v zd5$!?7J1&1`B)Mz_D2o`1;r~DyqwiXQE*$EXhkeg02yhNrQ|4KGJI(EntfQ20VZ0h zASF-%aOC>Jb77^PpReuFRO9VBhhd_VmM_C$zP@Qkzf!tOb=zjSJeexh6XolI5hry8F>bRvRw`@vF22VR@?;Gc#8A+jFbrRfV;U`E>FfFRo!*#ai+q3~vNC%5l`yp7 z)k!m~!e70Fp?52vO(y%k(P5|>@(1KYk4bD(29Mp6Go%+hMLB1`P%u|M^_C?wjP|*r zKhlt^Edk}X@CQer!_(H+u;H&xQ_=Cp7Lpn9suoW#ZixGYTY2n%Jx4B_nS3w=H}fFa za(FIiFraoqubID0#eO3%RwfTBGbv_Pvt^WZOKY~S;#J~?mPhH|Ee|wwPO9q`4;DwQ zQ!SPs*0>Kms}ZltYuBT!6!P_~$8^9Ql7|5*zfBizK$lx5DJO)F(W}S8Y;WClj8ylS z`jcIyq%=^Vwsn||062XHW)R%ybJ*xqC?TsJbT-|iZc{TLb%3xH7XU394K5-c><^Ig zl%aNE`q=A*g&fj!yJ1L$zHCobbY?;AUsYHjopd-Is1f<5c>6V?A%O0M> zvaEXv=)f}bX*CzRQ1D6AWBc2w4kfR5Ht-qUCe8a?-bZf|Wwp$F7G!D`gC`#R@ZSNc zG8b2yP#|LW{yK;oI`pd%mO#Mk7ew4EgeQ0~|Ds^1{n7E4sY#B~! zITYy5BBTtWfCmWtZIfPkF7Vb#j+q{UjGVVU3&xPn+joKHyPc1e^7vYP>5e%DxOM@vz`iH_FX%Cs*GAx_(13DbDYGEnR7_TiyXJimxAiu$xQAEc;E9q6S+(XqGdf^J z_;6KlW7X+M{|8L6qE_&vHbASZR613KXP0%%F)n&?Cn7n|BssZ&P5`y@D+M8Q;~x(| ziQV4wRMpeVBl=o>EHPPBf2gA3wI4Px5=?L%T*Fb%DjDK-;mHY%GpIw#c*8Jon0q*O__3d(eVQP^o@X6FNBi?{a z+(PaYcJ`bEXjWTq(?o&XhDE}nap;9s(h=^o>=eIb;hSBaHmNB zay)iy>glUSC@1{DME{2FoKKmDv+6kgQC-ltPw^kREB{0eX0Al|3dFQy@WUt^GQSoq zHbrv)yvM-4pAOcE6F+jEeiev6+rgrh>_e^;z2l!vHNeC@17@8RO_yB{_{^?5smdEz zEBY_d;lzm#15Zi?K1p}zrpufca|S1<6Ox2dmS(7lk1wWX$eCMaxT9aD$0d|+)GZ#d zS6uCTVrj$uA6Dlp>kYiJ>WjwC(`I)+N>*5h2^UP}&@$P>F|T$uQas)q|1(ztocRG? z`ZRqw@Ef;Zt@tD`>1(eU%Gf84u(IVZjAZ$LWL?bMx9*A*S9g;<%7zQB1DrR1%vffrCjY#YrE_(2}#GysWU`24~kqf_$q()$EWhlh|z+f7h-0~>dT4=XEBNP zKU6{N8jFk0y=|7kJFaF2o*5TI?FoVaQ`Lk1U%G0lm3JHNfm8K-am)l6D`kBW-y%J? zdAVWox|gE!%c6@%m0vznd*vnK8am1No*xxBo+6t6Btr9OF~Y8Kb?Si=D){u>SFoV} z&?Ay^GV>BL$@R{5m!(Jeyex}_p7^@K%g&9T>znRTZET$adW^##iYNusEGFu{VYOeXhl|S{Ima5aE69T}0*byp_ zZ5H_b_2{0)0Bm7MR!SF%-GQL>-`Dq$*K{koJRkvy%U88I=|^tZ{m^%yU?>Ip;_o7s zX#HG_Uj~^n-NoyH5h~{NHgSPPE$!adb3#S@w{;af@ELm0Ha6V}ITPJbeRSXpEB@-5 zam8M($MALnYg`gTd~m!Uc*tBi-XgnDERlqjQs6=n0_=%V1uRn?@3(FUTF zkJFjROM^pfz+-co?FesQ7}n*?J9*3wA2?S{9Vp}gbeRYLAn`9|w5(;?eC{YGY9Qj# z>DsuZjc37QCH{9}M>;hp&jKwwyAgSQ7b?6Y?v?#2VFFN~fBU308rdcxvatAaVa(C% z)tZwk7dyC2k|Lu&Uv}ldd3W!kC?OfR*-HSm)Pw#%1ht~H+=MFYKr8Y@()3gCNmaE* z*CoBp%LzUVkvY~R4xr!knf9QzHrb2!zloZIo#09KK^t@edC9}2{CR7d&27nq<#75a zNs0s^cuX#W3^x)y$?#LZPrQx`>| zW3yX5aYAAEdjuIhzpI=Ub%>UZM;fE(6&|NDCnFY&O~=Q7WuvG|l>Mf-#OK_A)O*@c zfy5P)k5)A`z`PD{^x5XwvBuClLSXo4!3yqTjL9N2`KHD=qhW+^nW*s@6%Mq7tU~f| zzoEQ2T2Rk4XZtPlWObF$@JR0iy2LzoXxQb!hp``BhQSFXU9JU|HJv=139G8)&BH#halVcst^5QJw{`Lr}XY zl?QgaE|ln8s&IA8yEBB0oMg zxdaPoVVq*C_O3o{Q`K6)Vxk&&v^U2lBF_=?hg8%U+mZWxGr4}_+&trm2&X}olbyC? zVPVjpP5?UoJZ}%CMlNnCHBAcLYqLadyX622J>a<%=S=T0d}yv{>(054Sbco9xAS%) z`76}$xx3#Z7u9Bmu&U&*Vh`N8H>1p}98JFt#8@)%X^j(W`H#;{ z$?6#!e(l*1s?@nt-?Dl8BdYgo?QTxoHpT_OmGf+}Tn|)8U3o9$huyYjJlSRZR`$bPdP{ z>(*ZR6${3ig2}A~c$GCHZ;uT#HfKJ8&t{|4yWoSVGunTi6a?scIpyVs z08Jr8<-vxxIRcu{^mA8IJ7)P3Z5@E2S^vyMi_^%huZIBqt;M^RCDoC{g09OA-JMgP zhHT3ASTl@c8(C|7SZ|j>-sUuwtAbm%u5b;r_Zs5vfDx|*&EMH9`EJNXr1-?2up=;J`1W6NqgbDXMul9Xu8E%7~bEC@h;&^JIB@jR?pAcljrL& zysv~hjwzGADjzR^Y|9Zr8#f$HW(>PiijCOQ|fNN2<@KYnv z+oLM_;4)UHxUFu>jte~9>7t=$2zyW@k93!J%ZxHh{}cHK1JB0v!L2<}cz>J7yM$io zIFFWmbxl9JPAWRMF2ir?6QGy1&|0~at_ZwcCT9gwrcQb?8B(~>gYAs={4z_ml*GNZ z3U<;xKMic-F)e%9Bk`NaKR5Vl4MNQBQ_?B%c@GrV0Vaz>|7Y#AtCD`D#(*BQ&gT79 z-n@D{m3%(u%jdaZX5(Oj&Zyyo{0iut*aPk>vKGZ-(Qlt|Ly_OMPOqSEZXQ~nsz1X9 zdZ{_D;3bkwv4E)@U80ZI>oM3$5zq~gKai_vCbKB`YL1}G-333}k5Y5uNOY5s%MCz% z^mu|lz%_ex@T&vk$626%2;fH=T38ecfkV6OJuM4$P6SFO514_NQ8N7L;TpeDL$W2m zD?R+Ls3kmOi{KQSd7^Tv_Iw0~ka%it4REwKLFwV)gnJ?l1!^B;wH&VKJgqDW_e~D< zFKQRm1U!1X4qxfLp2`2rP5{ZNoyGvHruj^8fFoaOSemg zhi9npp?8qzOIBhvbz{Qe{6NNQY088U3gfnMioE`t7p<;uyiN~tg;YBc?|RybcF=VL zNm-CroV-p;oal1vxwjj1+r=rUFNEdq&$%IGuG&JD6p0MvCk8|~9*romPIT5kWvy69 zUNFanT(xMgMJVAy77#F8omyibE1SPFk0v~t%`rD+Fb@m!tpnEEhIaZD_MA9T9#aUe zY)3nh3Bx_BD|%*eA9KqE2d%{b3L_d-{YuA96NbBks=2ADPCU{{u=JV*Wo=z?3b>a ze(B@_?8nN+&KCN>*V{QeoZ7DVVCGY!D2Yv((r`Et(O0N~2&hxC>(~zmXE_1{4AD`PIH0%F9^ zd-*&-A4~YROD&b*m`$enfMQsvaU#A=|Ba%-Fe=_|V4-XJVr=(7ql=w{{^D%#oOG5H zxHpWY2=uV(V)tv02f>=zVm0BBc&BP#=^}%uF+m@zEyAVu@qU`hS!D(u%Q$YuB0pWX zmz>eXvH58M^>V8q)O=?>uM2$-8npV)Lw|UM2Tr7a`8)+&{MF5_x(H z=2@w7v^+m~(%e?Xy&dh7ocWfQ;mfR}ty?57>%3;9cFIf4!q|z zDW-cIg*U}K;u**{5t-cowL~Sp+`>X5fUbQ!^R)<82tPmlqtn7B`SU?SZFP+l{oTCI zu8GdLYHvuA3u`1dH-uPMSEESZ$3f}=Xe?d?J*Y6GNZiKgY{&W?U)KxH#=G0@?q$AD#v+DfdSP>}C8oq*-3G9^11y@@Ivc@`;b^0*th;Wn0&4876&As(Axb%<|s z*ec?E%+$QT0%NVW333p2aefWm*qG=6r3(ujI7*|4|E@21c7gH62LejD$m2Qd@MXPt zFlAOY@YYN&;6DJ2_5TdXlzk+NGUkud2YAz?gM}3<91V0rni8JhG_~oVIkmZ7M`)#i zXW)#vIUjlL!KN(SEt0iFPY!Th($Y$ep20Q`7VCMBwCHr7m37z(^2#*oclf8F@BWjJ zx*TqC?6K(yERwU9m$N@7@VTOnZe+O9*%Igk-Xi{b+}8z1|t;)>q=gV8h{t3QA_8-q>U6Ng(G&ReQJdUYf>%a%*whg(waj+60}18=JX2REq> z`PS)k=?xWUH25G@#~LRxP8ajaRL%75Fj6Lp<%ud1i z5a1g47UvmF8{2J+>scQ@t07E}xXD*NfIsIg*IoNFCwk(<(hIo+ z^J|$8V;if4qDY2rt|)|g-Nc86@2{apwjvP2s7gSUhnxIB&;gU9OBY%%B7BCg*PJ8b zVX-jYQeasc;7ObL<_*sc{*T#J&l zhtkeCX#m`VYI8^=KKXY;Gqd*1o?q(j@n=>RFn{*%rO4EZNOg!{JG)MFi=ak>_gs_u zkcHPjL9gck_QTQltjmn3Y;xto$_yaP_GL-zapQcCqonKHE&n+-;zzDw3}3ako|t5W zC`)GuKD--%grMZd3FDiD84RklM8w@u8gjI#s1_jq@(KW5$M$g%vpM(h+Z_eSZrPWK z8cW&i^&nZWI@(wy$GKlaMEYxy`_2_n$A1 z=&`XePIB44G4CskslWBI)}FhD%}}9%Y}s#gNK>Zpt~lZqRcu!-zU8*~+^`_Z;C#GJ zHVYrNGivT1W5@)9fJ+OspbHD7&o`!@xg!;u`f#l&rV051k0m9P`vu)M+@KIS8xP@R z3UuhrKXR0KP}&5qCQryzPf6*&o828I{tf(KS4xjalk2IJT9(#a0M7wSKe;vUWG!EL zMp(jdu~MeBJ&M(WKmB5|I{+mYo9_|tPfEPg>1Gw7P5Py%7cr{c{P=Y5-+ug>zf^8M zlZ1nf0Z%imOmx5HGWCh}8m!iUA%lQ+G%Y<4MQGU$d{oQJvs4V!x)s+Ky|)Dr4$cJ~ zqDsA{6xiVNAIA>b_{_F91=_8}(!84(M=UYa?cVfw$c0sWNm6DkFPS)Ql5r?4B7p3Y zRi0>CtJ^1zky783zi50==ufh+kECV~tMqk+2ZtuHks3gSKEq>0UmOS)9HpypX z$X2#!*lH+4bIYfcK3o9pG3zZMlFUa9M{=*^6nK`bg#Y;XD94L5Nd+3fx{6?TAZBJ%_p*{F z00dT~gkyf!TCcX1FDc8!27u1lv(zSIOlL^j#yZxyK1bXf+=6E2!;<@n^# z=2`wbLW3;~Tz8C2Qb6}LSFrs$z?FWgQU2>};ufQ#_a|mPQ?oo>MPU2_Rq2L0W`Em= zhVs;hPAO2m*WPPn>+ASU)vt&>eWhSttv?zbBTfXlq^fdy=1f|mwP-%e&_eT46{N!6 z6TdYqR-b`kti}$Q98#)l8E3NH*AW<~+QC9I5t#JVBng?O*Ej`FF(d|#*O59eSIvW$gJqWp?&W=i)+2k;n! zfE#vm)F>WPev;9$Bxt{tS)DxPs#fUZ70kA>Qr?t$pO{8R;(+T6;F5Np+L`LhC4|M~ z<@ZOvIVYnW?seXIZ{A?gaWq|?G9}`1!<}8uQP;l?hMJ^J(GKoZvr9St$Xn=;c#20| z4fAoOi)Xuy>5t?utP?$em{!BjtXu-^Wx4k>Wx2CL%t^v$Cr>&IxPyy0uP+Q|)Q5Ak zZEQ-p7trK_#SxqxwJti zh@cvpf9geliOc9waDmSYHq`-P2!inogYS7WN22;b@ok7iC~1V zoYEDioU994G#|$5;Q_Uq-QAe*Bec>FK>aAvcW=##ok#q;FSeFI@bTW}oUFlxH}Jrn zlzTBlf`_AT1MV<@o(6Jk$B7W8ivu2lh&A~NW*D;sty@=|-#5M~htH`>3=G-zw{qoY z78qjoDO*;%VvL712D>qraMVax5_QbXX>9si?#i%;)U#fC=CX39j%$Shc#h-Gjf;(6 zn5~9(9`oG+kvm9;YV3&dikk3+rYKOq4o41-6bD*ZVFO;Pawr(L^+m61Y1kB-*D1-% z-E=8U``<;UU8_4SyTkJ^gkNMMlS+%DL8ZrRu%;p;^XtlzvkebB{1-!zSz=xPx*z@Wt852%rHI` zQZ@&xrPhK#3++skrfFKTg}`ifR=zveJ|HWcfOsalRFqcwIxF0*Bb%K(VHHK-65|?D zv{opnrX6JKlNpXS94V8$AdPyClte87Drl2vf4=$;1? z;G{>y{yz+GJ94DELitFiQCq*D=Y-O}9rTp66#HE%I%(|1?hE2J^s+H@5vK1TNRWfe zIHGV24Gp7SoM_~*&!t6zZeI&qZlX*L^AU!Y=ipo`8AkboUeijv8k%(X>b!Mu=aB+$ zToo*^kdz|JY;wMF?o>mNMvZHo!4}#>Hj4)E?@^vOBh3B|LquDqe%@s1LlD!b_J+5h zmrwM&HEha`;_lPt=iNSgVmI0EVEkU3Spm#HEr%7Unn1t!&0Q5gTTNEd&FORkBH>A$ z(UEu=$r~bpVTljfLRo6mE)BzC|Brl|yG4)6;*c zKGE;*pK8b4*^swXh8s(*WIh33xL08DL}Nsm?;eQyw7K^9$2V|PwE6ORGJH;Y|6OGS zyTTBaN#Vz|JY~DpJDWBcot3vTW$8z(#6AzH;?V@Hp^={B4kG^Li*(SkZo@~lXT_<(MEhvZKTBLx<8t@8Zt? zWA|tVNFNFQTbcQh49p|RyJiDb{dSqEV(OKb*2*{t6ewNq zJYdU)X3lln>5>8Ee|nj6cE~G|>~X#hDuEYf{*%#_r1;q9{a<=YTgRS~MCHY1IFh2t zBd&$^vNr4fo3qRPx{4CWU)!g|w>*W#4i#BA0KQbA)`?bfiBqNB zsodVv*~5A{oPVy|b;`}%-B5W@@Kx~Z;3Jc3&`I8r@-zZBY)@QL_2RP9m$p^=yN2YUrpavCkpE@&u1R9F=ris;OAT}TNat`iaJ*>O5DZI&II&fvzrD17{6h2MVd z@Z}t})%o}%dHUGy+(lw8b9WfhvIp?;pT=57QAHzdzjaJ?mK<%(SNH&LegE7WUU_k< ztU-dMN~*DR*PDpv(2KtsAep4&ML%$O@6vI+_+Z2B9OE}~_n#)RCE*SsIUR-P<`OBl zy+txK_>$d4b^eV*faf)}pZ>C6-=iuCM0Z_iX!yrVP5B@o%bMLE7GtT}e8*7M6%`T& z@vG_@nO|eK@FMC}c^t)C{%x6Cw{*J0Y}j2lvanc7UvPlDi~X6g&L--<)5fF zZ_HIwhN4(1T)YRWl8yxYm;md9QC~EvlS1`qt>vRgJA^!c=nHh^Iw4+&el{fn~~S7N)(J9O%b*b2_Oh7 zvJ}gZmYn{V8W=PsaHh1%8z`x?fL^(KpZisVOBG=IODoU$W?HDXIq%xtviwH05il&x zK(cIUI-|Mc4hg-;F|F1HP$CS6{O>8JHe5MZW;U%#+I z^)}?R2e+D#xWXao?r|YRNP%WPS_*t|GINE=OmDLTT+Ugo*zESqmnkpX@ujvj-T=FTbx@N7rZQ>8AfT2Jw_K5U9xxAoNQVx_)> z_!_?c@;LpA%<3HvuyrSzWN&@7KbQ=|MIYUs0vnccW?O~M{_F{jdLa2)-dSR&NXH>A~a zV`!$mqoV>&FfOYG+Yf?X300F=E52s2-6{M~y6kn7m{n<7n#Alncjo`s1Z$($2@rU< z=T&E)qFSZ+$|B|h1Tb-??`FOEm_uXs1yRy_S%4CwnA@=@eR|%xNBs-C!*_Ga4G%A$ zFLbcAtz^XpJ9fV)FD=pmt}yTmN!0dU09@i)|5TQg>=W6Iblzu2+V}&u6{Vh9!NU{HQ2a0*RGhb-sa0P8&QHI{95S= zR1u&a78)AmMQIDg&W`j1HnstgkB_HRzOFu?ui!s#ZLA|>wC5r2r=dVo}Yk)zaW1ln)`)$LqcEv zewJ-*B=V4O&BAv%t7f}T(e_!7ckr)5s0WxXTHQ%AyP}%D&d(%zrPLJabbP6dUg+s@ zW2v-&*iFQb*7lnIOKaESfNYj(f|ZOqx8{nGX>L=LtVX;gJkE2(j_+`02u!AomI3XK z(6le;H7)Urh{b12pyvgiV^9`#ec*9x(Na?bo4lG^Ef3?GzfsynIJS(A>wt>g_I}L*R$ctptVH79-DkRrhXanp=c={`5_pFJK3zf|_^4;qF?c6* zyjwMVxTl9Ji@(gGuN`ZV2R>SONn22tTCPf4{2*ku`#yzm#M|;Iu0>wjHyS2ej}nML1n+H{z`<>_vRlXaSvL=(&%=B_K>Jnnr!V`34_Ey(W)#we=0cpP}fm=-C|QHqv-mB_0Hcf{qySLf5^$CqL(Cb=IIF+ zKAr~DU$1I{PR^y-eMBJM(X$9&_p*%poJx0H-{=wWY~a>(xgk}j_?ueK9hqIHl$mA& zcSveR{_^!SE?Us*^qbx>(d#4e^>3#*W#3jh=+4pt=GY%;ZRR%Lv3mR4i-q~=Hm*al z$YiGmckGcw{ZTxG6F1>z_M5g=j$vGy zWwB*hwmZy7W{^#0(%5wh>%+sr%)o6u&QGcmDYrr&*K_kmxrK_}wMe|8^;|F|Nljev zA!ojimL&Oxw)psfL%tRCWV=K;i|PdCas|aO*(TiDrzMW5@A<&X_RoUmWx4KyIpMK{ z%N95`$mpM5qOFonL7qJZ@8*idZFPs2?(0%z*Ut~D{CbHqUv@&98XXw%j5)Sgh@Xt% zKOsOm9|yU>{|FWEuH?%0y(3f|^|$-4hU4Fo4muR)khE>xC;AX!`OQ&p|NBaRT>r-9 zzbLj#nj(G;HOk-C{J2$E?ZXkU*_ygQFz-H6hd2#R2={yNi^1z7zrH z_STQwTImzh9~1*uw{|xIX;QG-IY#fx%nNVsNg^4}Y~klZP=Ua#r~Rmzt^MbeN0FSm z2R_E%olWCtnNcM|0fJrn-H2IR#g=O7%MBzo;0e3{8@e5(&`#H%gE6UjdCR8&Z&0tv z8#PlKkKhCi-jy65kV&*fv*N!A7dVau|3Op~Sh11vX)P9Qx!vnsTuu>1=$eJQI_{jz zl%w9xv08@oJC7R;_VPk~%bnoUgT^ii;T2_B4F&D6?eCjuM!9mHZ|5}i{8YJNiO1HZ_|h~>7+SMc7$-qa%`tnYIT&0 znNSogc_nMZ^a8xDzbAnNX3-5<4lmE|fmP!=ra`O3Ey2UyrEpF*2zQ#N@QR=c3>-2! zrmg>fAolVnG27dO(f8P&+NQbZSh-%IS=C>B40pTYdr9 zuGVMw3R+)z4XTx_%jSPlu&UWh)kL!zag^oeY}HZwd0!@Ehb&TA{%#JyNRm6L`Ifa3 zS<~`t9AQX9HF{g2-jQV?3Ci;sZP81=TQ4IvXqPRh>2~6eD|lAvviK2Ssf|*{-MN=T z5t?8LRf4c442~wc$#O^XGWK*&58X3X4rW0?QXe0mju{>Hw7%fCG+saoZ2A(%v{6jt zikM%B`$l}qo84ZzP6ucTxg7co|26UF7VDkrvaKTGjJ6SfBdOGurCI4Bq<4qM1CD1= zQ}@3LI&6p_X))$mTMkCkGnok$P;}zCywywmaGS_0A=`_0*O3nmD17&acZU01S5mkr zZS@0{->TGSq}u!l*`#T`perjFf45RNuD?20cAG$})^P(U6N$>iEx-4;w;&}vrbMje zl4l|)#pG(P`ppoB&Ez+{fw9@Q6Eic_myhAwKh(y*S>7Fu@E}$NdTG*e-3Upl;xaXS zXVdB?jb3|q^R4I%xm?!v31`Qk2w%zEX2;Y~vjhh$X-T%2QE#w~$i-c~+ntp~* zYInrc#?tGh+Lm~UUDCGYZX2L>P`|6isXkwkc4l(AN9-3eW-<{d;Cozgits~I-3e0I`213vavR;o zIV|0g@Ak0UaU@BkOQ2eP_VyiOVpPuc84dUZ;umpJbbnxKDm?FMfoZq&`p{>_RZ~-| zJYAQYHeA?JB4>ch2r&+=gcv=G)nT;G`X+kdos}x9K+ltAX`CNEAfSzA?xxQf(s5R| z$^NWSp`b<}i9v27=-KAYL$=aS{IaH72Oc1VnYmvjN|-Dq_^rwq3=>?=_C;^(NFGX%g9| z_tlnDl&Y=ciURS`_nNLsHh`jWy!vJMUiqXGi)}c^Cwm;m2}VE8VxytSvoFR&gJ*ok zz&qe&@$Acg+ZOsy>RBm+9PB@T)7^gbkNBTde@XslcUDr@`e_327 zD5_n@9M7+$=$R6sNc0E8}T4gOJ z8Q96IFdsi!{_za2$#b3kv!tg&V=DO-+IvpX$kvv(iuvV4H$Ix7p}eOsQLOD=8ZlCh z%3<-;@w2!u{f^FyS3CB8MZPM_D26X^Vk0A?{hxzuc?TtR>b-2u+YVhPY7a^9GwLdy zAhT9tcN&~DfJjA3dXS?{c%(?haQOscAuI?G+KwfYFA9Hafx`hB$N*@-mqU$Q7>ayD z_GMKInEg%?)5y|}oNlpavYq#=#884pjpKnLp7A1WnQ=Y4dQUr|J16Tqyt5k;&7s|# zd@3}ZJ|IO%x#0aKtU)gexAAv*Zqn}xjcw(f-!Cfvz%S?;m ztm~`vU0%MRyo{Zq_voyKKX?44`zJAk)wZ1`9rM13c6Y$aC=H>s~Ci_oi zcfjz(1;+OMg-+4bP-LWsuq;!N2(WvH5XTFUb{&o~bbBMd4sW@95?vIknUxOi{t~=_ zZXL+KNQFMO@{$~#_A0VV6EyX;5 zn<*_o$5*F&kX|Ga&Aq+y{S5Zh+{*sd-8(9CeCA{?Fe|Hx10^rN>XmYsdq=!j;tj?u z6?oiRbg13!li=h|{t`s1tAtyD zk-kQ=q`g9jjZ#r0zKF-R{kNT|BUn2dhw^-o(V*iTzO?BmpP1q?y?qFUz3Tn4=COA} z@kz!eH9a+ugDaDns%qT6}* z+;B{2+5k{V@=$XF)4LfN)OLGG38VH$Nuxk1*(Ay_`@NfY|81MbKNS?=#HCup(?`ty zo%;uSF>)Zp$|@{oEc|Jn)(q`Z-n{R9DT9M;EwNhY>vxreDtb>JJIFnojRA)lE zIjXR&j&Fmk3X29xJ;(9@1rYE_J9})4H3b>?2A6o*F2iF#%GjsYD>{{bAq*y>j~?Yn zD|L|^9T{cK_TB|k(1p7Qcu*?LPf|FKWh_WMU$f%pbZvhuahe%x&u0b73q-j{}HKCg09v)-)oQhTyl<#F@QLoIyszi;DY z{l_Co5ln_RFV)_DYGcgUsAYHuR4pXKFvrb5YTNB=HtSBs7a;X&aQP7}=Z~EejcNgV z#{fbqWzvA*I|Us-NigoQqj%q>U13|>*S*jod9fP8N=rxUu(VrudIZ=}$2+0dRL-E? z$*JHnhdoo*ixs-_@~tc;5u?>kMlTYR%V0mb4;o&gYyJHszK1hAi%i$sJA^_kt3;iscxjbT*2XIh?!z1Z9PXSv(wf@I1CWqB()SLy2ghT{r1G%+Dv zG@uD?*M&t63`VF+w2CK~{yyQRM3ugl(eKH75QU0#JJwAYr_T=yimc;%qM-q?wk`rR zByLVl+?14*j+vo1t!}@6`7%g}jD&r#mD=mVPv4-)34yXUoL9jTC;51gds%rKG&41* zyJ=(30b>pR8b{J(;+1AsOq|VBD1_2269cCiBi57dJL)GNPOM?+uNE(VGMg#mx7~Sh znS+3=cM`&h|p?y`7N zr2XnV^se||5qfHm!?($bBGuNaMMzC;4bPyIki2>(pPua`{=*+P28W)Ln2T7Fi+syH zRa|5iGswp$aj(kcjEDY9aU7GZb#)>0d~J&Y{O||v?r*=QkhvF)!MKdG9IO2{DnT5N zx0VeAgtK<`&0Gsx7vvsLKkuXC#&^;bDTQl%CXyn%dpBn3;74*?Hl<&(fMK(H6IuZ59EcaPa9WxdQo>^BSJb3pssLYHG3QM%yP($sH<;{`$G6S=(uN)12&OG0Ev9WjE+0|6!cuDbk48^YEdDP;TBg0pKEf1i0 zC=)bE6M;R zi&)QnHV%BFd%^zCRmqx3(=REE4O)v(0*=BPw?IAvYt>;*!mhd5SRM~MHn=VhVTc9d z>m@{tkbSD*vxj2B!tYJ4etW{#57Ka#r0XDSpwZY8_z+*!ywvpt+iSBoPrQ{$`>s3v z=6et_xds`PQK}eB-fQx3wIOIRMWhN;%P7+CbaHMnvcY?}qH$NpFVK6tiRs6$r-09@ z-+7%Z^>P5QTRL|Q=07<$MHjyCxZpAQ5xF^9fU~@?@akf$>00V)CyGIC`u^h18+x-v zYFLH3K6{6e13j?30t3srqTpvrZ33L5doqI&drC!38d;F`VRv}4k!_~u1O~kjilOyV4L^q;{i2zs!+RMz7T#nZZCv`|Mk%$kX&YMY zrO}EAV`$cbePC#ILM>KH`Npel5XP-^Ly_FJ*B1bLN!WLqu5x7a-A&m^ugqz$#+LKd z*li$&W2T{7sD`B-BYL6*`0?bl)kQyi_%K|s;6S})Yg-<>#Pw0hay^Mi6?Ek4dYYDY zP2c2kg>$iprgHe*MSAC_AL@sBMaJ*5%{^pZTFY6aJJ%aj-P{GGokX z){?LB9BH3Xdh!s20h#k5_WQo|ieA?3snHt+1k8@Ig#bItxuTy&wfk1Z^Bva-AO)3NBb|gJ zB2QG$C*ltxp@|T^2!4&LRiO~-i-RuDI^rBWfAnW7Q`E-SyjxXuwfk6Imnd5#WbvB7JJ5!Lx;HdY}z&lDMogugJ~PvxTFM<_gH#p{z=mJE<-Y5;V{i zlK;@}ZKK92EsV`0Ai8FtZ!kl4H8t(H$ZZvy_->H*za_`d-$A6bRn6{AcC;)g=3H5 zns*r_y&|dcoLy4OW}8|26Y+4>Jae1kr@qG!S*4@%@@*r~$EKGUD*}cjb?%c_kCEaD zI&%31r4Dxe%VNIovr&Xj(=Kfui}-9{KR#I`t=E? z>HQQ^{g$eMjt^&2jBesoyYD&_F(SbMt)oG#@3-?8|12tIq0BK1>N9;9Bt5z!GRwBr zARMj+YUejf`XYBrvA(?mSj>S~G*WC7!(bnd_6cB*pJrpXyEW@iQ zdbSQq(7%Jqoc7{!B}r1+LNE6uph|D##5qK^rONM6@uC%QA86Q|x9a+C9VwG0*1{Mn z{h#AiOfirs&;ME<+JGfuFtdwLjFlEgJ99IHverKa7gxWkEWtWmY!4UTldqgc=c9`` z_6{_p-|Eashv*P9w%G&6w5!ELE|YRYq=28U9ClD})`kePJKr0#H*BTzlG5ib1gBfc zno)C&o+N30i?`L@Z; zHOQ6e{jPmJ7fA8BN~&IlpDtaWkzZZa&9xgDRBcFdH9UT-TV_E@nV4YeXvwWz+HgDh zyIp)mJNUwuPRw+{bbT_cr=daIZHcQ_2Es{;wzQX$L zR+ofoL37X-NwSs>?%q9N)LGZCQm+tDI+*wdMgN-2Ul~&JG4>Hg7TKsWx^nM(X4z~Q zstwz9z$PuexBDi-VBCqG@AvhDfg}BL`5vQXmhi~M?4#JYcIwV<_dgmlqsN0=ZWxKU!#NdF{} z@7>sDdnP;k=_#jdXrJsJHs&Y!BS}DUo~N^)9}{T6mQ%7sA8`%Aw}1V%;WeotW1yNE za9FtmJ`2^D=b1Z|q!iH0?4`LAxZ9%P7uFg~6zL($sYsq9nQ`XB?e~oHBRnHZ35XFT zAuDJB4{wCXC^a8)Elwx`#(lp@W0KmBeRDt`9Oy`I|E+>k5u1eE#)6XbN){9v8oIW* zDYV^q9}NfJxpRlw{q7&#RV|!8kzgh!#PQ@KBeJhkU~;lwSUiN7-=w2YU*AE3R@qF0 z*x16hJ>3w`7w}933mCO5q%y+7pgH4P7NgQL?vkF;jEBd^v_M1-yJ=2#fwpfETZ-Rw zTmi$XI6u0BfReA}!$uOb4f+VC3IQ)?h#Uw|P;iXEf+WRJKFzn>CFOwLrPNNCaMam(o=?%r4zuwT8j zp5I+#d-Fc$-+|n()_9Oa(FNg+(_jwEG|yjpf!BW-`Ig;Hs*v>+^8Map!1^f4&APTq zh>d-xj*KPxo8-yW3hWCGde&9#{S>HJZ))HwLS*u=K6519ZA)KzW;`UXFGYxv_Ql(& zNY!wW(t?D)>HQNJyb%)^HrisePgdKBKHJ*>d(l!nQhOrADC$~JM<;u+eX?sJ3lx_0 z>uh)XY%l$Wd+f$yJGwYHolI;j=8;=5((zYgnh3j>rjgmf1lAPFq<}APp-0Ls9jy?%=kT=n zN_1nqSWcWGP~i!hoU)@fAZuY4P#+=aSxBm2s(5+8cftE{(kl?omfu!dF*+H@PNI2g zH_#t?8hDyyfx8R1x^4RUI)MY6mzv%&dDRWI?z{>Rmc>)S`)(kONWi&)rGR;c^C(`% z==t~YI$0dgG)c9IrE*CKqu6JOcVi}=G>;#HU$4Ao6BLA=tt-@ zX}ZYqrP*(%+w7aKy!ND_c?)t{LB8wR8eI-i$r5*6#J<|wxgwf7AHC)*)ly}ZYerYR zfokf9Eq)-ockdoE5PYFZ^CrSQ-j0{ee=a=>6v{-wVQeeQt89ESG9@IuVXXY$t58j8 z=NdPfeP?;${YN^{cK#p?!Z#b`=gWx;8tU?P#*Bt`Rol+tnIYdtwJ$n_`sSY?d@%T^ z_`BXDT|b(W=WX(;h*xWbY@C~pIP(7Q3g!529c$-+D9X?X91ELt2R%uy*Is65>c}sF zMg^7c8C%NMIW-Dy>~n<=EQk6eYNnoYEyrekOFyN1xnGyTkc?OovFO-WP|G@w@J9x% zJg&#`$9efLQ-+l_vp{eFb5~$$5(KIV(oY^RNde24CzjDr`sa0IGh#Gw{RkqO5i&uk zy#RI{Xb*>e{dOnqx~NIvfzaJP=}X~RsYB6OX@{57X#3h_%Gb+}5Y9xwY#t~5EZ@5L zX7)B;T#-xdxNLFPcv$=1VrKrC_&#}Tj>tU|H^A`q)$Tj1;naM=6j{xB-*zW*3aTRO z(xNZz=PzFDLwz7?&qEB9f1@@zBSaFia){;~+inBg?4hU>QhbJX`Kg&O1w(VWcsU#& zCEoG7IOdH(9#YH7IsJY&MD88JpX1-Rm`Ni#0Fg7Xgkv8Le|(Oi>xt_C|7o!Zy$&(R zX{I=s%uwv=MYhjLUy1voTL{XBD1!Fh;|FE6asSNgk5IPQr|pOpoLuHqI1hQvowlDh z9&ySOMUTW!8YM{X&>)u`y#}kbuQH)G?q*yuas$3c%K&(@_;>2Or4!d;pmT&!FiAFX zvpcBsS0QE@5~B)6o$+kgV`*~nk-S|LA;TLfl5;;#8wU@1YN9}rkt;iE53ImlLXphn z4=Yy_GY(TNc!W_78aQ;*{1Lu=o!uDCD^6@IWC|Wj+>)r2KPrYZ6+!c!E-2xXD=2v+ zlB4zGj!x55c=5C${Icho>iXay%{q#@??Kd&qZ1AU_MDm^Y7gi49_^M@?QK{j;lQ`( zHxKRW2ZT#oPB9{2cg+(&MZ^${$A+6XX^i@nl6UN_RdAY0?nlNYGBgWTWPofAC`^yk zdZITg9!q7id`s~n4n|ZlzdpuMCrzG;e80OC7Tx%@uACb!ZtPVt;L+6_JXj~1aqnj} zlib0p8FW;pfx}Kc$Ay<4Lkmcg@=NCzvvmhN5Q(x$E6Z=sQk=87c^BTf+FKsyX7n|9 z%_-qwQ`%V%9@pj#^c;y_sIVsuUo&;TEsm!v&uu2411X(9yFO-oE^7TX>Jyfns^I9H zVU$av@EsHBpv!aX0hz%Q(NVYw_xAL2%%)@d!;F<99Y^>t&TpsBYAx@o!uiB62IW8c zu~Dv4Hx*e>%OE>C?qV=AZEl-H@|F|EH%a(=q5M+t^mKi8B$uWjbwvLbj&E^Z zYB?8xq|xpm#gfymWM%{oQnz2}qtg1lgZ!0P)WP-M-HXkW>)Vw~qg|fy?uGZ!aqa~j z9gdHe4u-i>D0=c}Hs5rub}E}`nRDyK$+r96(RuKh35eWwT(&iIzBr3bQj8wUzf>T( zp4Gc-h)@QE`^LdWmZhYUfcVX1vP}5zoLq)Ic`+ESqgy zZqgi`<%h4-C|$Jrk>Ivb(|@U8nL`etX~cN<#`}5q8Ja&5?ts+!+Zo*BTHW{XX2-9I z3JW#nZK@bNpYS|O^1A(|_r!E@ZrB2@`_)m1@;z7yhS>Y)S~9P|>rjPib%wp*4DR>5 zy0f7^lBqo-InV#=oyQe*uVKUsl2txE9D4(Hb$2EIU-&lqpWdHc)|Krvpu|1hNPd`! zWjdVRp_LTbX?v84SXO@ZxzMV`%mWJV@ghHB`cYIj*HWG&ME%R~?TGSiaqkt@7Epb- zU1t!QrM~Hn*sQb{<|?aRweJhkwho~+Jgl;4tSH0c8kE<#21B!TQ)%1Yq;@ssY=~Jw zin!;3lZ`Dt3qg_Cmw=OL`TEA42T>{ON~Qz%4NFsY(t3?5jY1l*?ke6BhOpm9UN(hnl7z-r_faEL17GP&8yT4C;wZMt9ygoSRHwD!SAn~fW^ zOTn0SXE$b?wS_=LwKu!fPJwhEHF7_Khbg-~A04NrS8cAfS_l}`vS;N^IJR+4>sjch zw%{ZgdM;jpw^fy7r3{6Tlb7TqS!>qdC?ES#mL!7!1!7Qk)@g^+lGjYv{etGCP3MIK zp>a5x%c$m-wRS@01EUE#*pr_MKfj9TI>T^O58#?rJcCd;%4wOzTbTey>Vbre*#({x%7Aq={Qet>ANHd6<*U zX4D-P&_eDqrkzs41p>MV1r$D~p-)#eu^5 z`14+|&2iy2-G@HJ*&j3*t)tdV0eo5Vk>-Eps-@kDPwKmeID((;C`5N!#r;=^D7gbE zK8P6-=1Ptr0X$mX0x)zoV7r+!$#rKTCZkMYfVZ}<$Yv1d$oXkU_apElA+?Xe)4xb) z)raXA-`tsB6s$k)mLDd@@TdCW2~a~7Y0o=#*DyAFhVQd_Q7^OUY%`woHk$El^M=PW z`mnn%rV@%VkIhCV*fD!gaM&2d=P)8r-JP{xlAomtMr?<(Wb-%T80_#WhwYz#Fbt5| zF-Gk3a(eM&)ri@&5Y|c-69-z`|45Sdk?1#+>`uTQ@YxsF|K`WT!bbPw5rO_v!ocjY z==+(1u4txDcUW+^!Rc9F)SN$H)#!0sSX(9pWk}M)J(;X3{Umq?2;5)eDT3zlSY--` zkyPITSHYj{*WXF;8Ql*;#AC_1G2_S}S4sCDD<6k_Rme6eY0q%q=>H<27Lyu-`K@YA z*4~+5GSCHksqm}71nwQ8)>xx}WifupV>f)8r0e=)#<|Eu-$vrf+FVy$e4Y4Kzm*43 zu91h*_B_rV5Bh_nU&daOVSvU-z$S?AajfJ#FC0O;{Blrpu_W5n4lT@o^O6t_7(gSW zs<9ckw-?k(VhJfu*ccxj{H8@;48}zM|Ac? zIlLR;Se#N6I{6pq3o08V9rfk$6@al%gk1jaMi1)JEx(2P!iQG};5({}mLxr#h!JVW zCXH@$`c6?KWTgGnXRvb7ISKMnX)6haHiag3IuI{{v+NuP;rS=VKuk7D6MSIt3l?FH zj(}capVfDBs6t$vhhz4$B<`!_ep=CZPb{-0=mWMRU%=Qp_ne`&n-11FVQR@ZNhTrt zT2{}>fV6Ln@PSxA)A1oGy=o-tZRdghj_Jj#N@*Fusw-P@2E52|HN>AaqK&6L&sA(1 z+-01kh*15Ow)U1JKOz`izO}~>u$RD#4N?%ZNhr-=hfF%-!_2wewawWl4gNzILyhJz zqSNS)*zdJUI!6hY@v1R2v?WIEYwqUcZZ-Lf4Ma9Fq7J^-^}9~o%7a5oI|;M-I=(KF zS1%~e64E)QeaEwJ5wvIT9!lPwg&vi(mp^>tLbN2%9b8w(c0AKeSlU3ksz1Y}OL88L z)7XNU{cQ~8(o`G%Z!%d+5-GrZ5SI(Kjb&Lfe`FThIT<7mdoG0~0!0D@0Jk!3a}V7( zSdYcyfJT39+yBW~gf{)Tn3>TDy^7txI|ZXeilRQ3`=-161uqMzzvbClF#-LwbI?D zE}o`yIdPm|RrC@UAJ^5bj~8|pohxjfgh}P~&xZ14T0P7!ptZDt{MKPP>l1jB=OnIF znPqabA2Qd%bD2M~^zGzBd=d#8<@oUlRLkIwB%(&RdD@a+u|y9Ey-m?22W*p6%Bm{Q ze1(PjeYJ}G4{S16;`!()u!zDE!Ar^{L4^ehBDJOLI( z(x%mkwAw2lcloOsfK>PR@7`6Wt_~oPoe?=d+?IUV87|pbTF_wmyrjS+Egh~7n6Da5Vs2Q!vX1YdKJ7s)wb#}m0vEfSbi^QkLLvkm(Sg;M z!xG) zW=DLGji51;tDg*_p)Ou?WkE zIIKaxXoW}-3;KwyjePsz22NdT3oiW9IR|Jqs|a^kMoeMOyGU^#dG40Z9(_+NCxMal z+}2xForG0Wx0x}38?-~8e|^~bbj_46N{6X)Zv!R1KWcZeuT$qZ{d-~*>1u&zmXY3! z@tP{5c_3smC!y5ythNte_m z7F{=x(L$q~Zt!x2MMo`tw{Fy#cP{!D+ccdm5N^0?RO=u)Y@!>K_xzuQ8_a}g2=>(y zuE@`ux)Dy~(HeQ5I8z~7MRYjf1Slq{&(J6}gVBr!$K56k+x&;=xRLR}4r{iT+EW-H zG#8I!=3cYF-sTwbeE$^W*$@S7#yQnsR*3i8)Q*$IeFn*q3`Td(b#DW$*v^T~LYM2* z2X5DxUB494OKFfB=e9GC4ly%)eKM+dobYx%miZ0DzP>a5R`rP3Jj#*zI@bWYEgk9O z9hGI^{pBr@%N>uHlq{n5obYO!(zi(1r5Yd)Je`p^Lm93-pVSQpD};S zo6W^0gMaISv{1j{-*a5O#jlfXwM#awgx4|4h9$V&IrT&Og*on@AD!Q!i*rVH0th&+ z%ezcBVGra1cevL6PnoC<&q3YDZiG26;4LyQzS6tvDx0-L?rI&XJX0wQb-%(J_${O= z6)(Ma@(9hCBYjrxQt0^}FbhTwM)Ga;V8}t0@i)Ijyxu<+HmDO#T819{Jkdtx(I`IO zE(a>Bxj)ng@EgaQ`%wVHQ+Gt>v6-o0nw&pDh94+^rw?y-yR!=2}EtM%S#<-@T%@=)D#I;xf`!VHI%`r^zh zE=(Gfao8_qmQ7w7(9MN^PGwN4uEZ(llsL(}G^OS~coMS{|77ggB~IWcrsQP*El`x< z>zv9AJ)LV;W z2VN|90`XN=uJss4xds}KgU0Ivb*oqj7CO9yEw!`o#D+7WzaZ$Zyz5fVZ(ezNf`jO+ zp-i{@NfZ<$!+5ka`+2_fBv;Yq=&=Y7KVj-mNez6dO|tF=T5I2%YkUvv1Y=V=mQH-* zws_)ESv$7)`RC>rdpUO%nuOJ$fnn;gaJ7GjO0w3Xl%h?UmK}YBvZcrbw=-{-)fkqf zbfjpT;oYW=mO95)3r-X4CiKsRJ^*CC=9^5>ronY;x@7hkN&4mg#XYfJM^`Bu#6#VS zn2T^m`QF*FjlUXLB3Tl-Kl5o{*RS+f9mEwa3{BHvQaiYx`~hMV2A}0hmejdhnY{N= zG|AT7XhoC%0PlvgX!1*R!%#AVDwc)lh8Pa+aKWhfo##v_NvHoE#>KB%^DAmC3!Ju> zPappr6mVNqIJ~u-0TuW0V@PA;Ddy}**XqHmmoKyLZwgb}Kw8ll*?hV|W=|4d{`^43 z`|D_7f4$0a{*h32W8do~fuA@@H|`22Q)&h($(ZN$_+q>~tsmH*Jp0U@zSkhO_v#I{ zoItGt4OfwFXihlgtAP)gchaPA4T7+?m_!%Jf=I|7mY<$2>(+AJPT@@IA8{l~X*4a? zucSB2c~X`wez&Ej)uSSpfE2XQOHdv64UeKIF~jC38995^d}~E$mt!U1A4vqU_%{x#Q9vaPY#k7U7t)M7ER51aFW!sd`R%zKP%?h z3u>3}LMDKrzyn1FA7|8RUG)V9(o@@XqEqkj7U~A>e`V*=`*_=X>il#@YE{MKddp0> zQYE^{CH~NeYPEID`_4IW%8R-vT>az+(V7uv6oa*t=2HXul}tO`h;~M+($-)R!Zqsk z>m4WD^0F>AzfLx4=cvEDA=6sHL$-tVFQr>|UZ0Y+MX-MqgOlyhH*xt~36?7Un@T|s z9!N*d)v3kuVro{0GsX>=sm|? zI7|03M};`WUy!u@`+i}_kf!}E!2|(He)Ip7(|p-FKHa^!6f^|@w)Sfj~19P0;qQ}0yNqkisCVlQ!y@5v9>E14;Kc}eOU z7(~{Us!B*mto{Biyq!uTiaQb(LAUK}(-Sj85$D<^(6&>BE!SB16k%pwkQO53%n z6s+*Tr+r6hOoCQJP}Ghn^Oy>Ez@k>2j-C-Wh%k-Kdc;Q;T=r%$r5N}h700EXjhz@- z3){57UC~6k+cD4;je*)fs`^H>X%*YpvO@TUWc8=#^KMyoFJG!i`40^aIxMu{ptg$! z0dGA6rErgj(gb|NcUVVEl+Pec%Wo}(XL&@@9y4yD59b1z5hGlDGH!*h zY`zyb3lG=`^@bYhPJAPHyW*}N)t%J2!Nte|xDbwwJN6#~>lq35kApB(GPHManLJL@ znaC#CSp67*jIzp#Bc}dp$e(LTL8wtYPj#E+wKh;_Q!uQ*Sv;&MBt^*7(J6D2K2jwA8|%x#GYn)7@sUy*PS01 z3X4EWTEk7G^rmP;lNeMin(+qKMHyXX8l(t7|v9%3oKC)T{=t|%qS^wYXO zVmUBLWs9am2#MI})45tBe>?lQ{yOpBgb7$35d`nv<20S|+AnCH>t8DxDfh{#<$N3@47Yf*O!n!kyZo~kYA zPE35+y8hVZI^gdpH6r{ZYIln)^{;;^5Th>o}~zXmw@I;Mkq z03o*m=44xbZgUQKL5$Am*T3QKfv*ky6-tkUrEzs8TqoB213~XhcTdE zVE>1-=iVA>Wh|^=)#5*iUQ+u1G2KGeR6jkznSU&UNefB}&ML!jkoV^b^XD3iP?958 zMyA1_Rq{zfgVg)FbUA*DS=$$+nVw)XM^*4Zv<__%6g?1;19uvZ7?HKk+ zJiji1W22XeCCNv{GVcQ?5S*IJii61hj}i3$fVy<-cf;1JB{j|0A(_GnvJ%;{sxUdF zuxS5#Ack1pE3!YNPZ}d~V~&Dovq(=#z31{oZ*ZW>%PEDxT~H^L>ygRRZ*aV`Pn;&3NtU~dy8!z7NN2J)_?m$L9{B0=%Ihw$(jv%aN_K-EoVAAJEqc=|megk=eY^%c^)qVMOxJg86YH_%^ zf}`z)$h`j--g%U~9)CPcfGj&e2htMggO~iiup=Z2WZMtvN&+*^+qN;!sk%Wxoy}vw& zL6su)Z>%RIw>^%+A7lQ)fqbU5wTsGT_c7l)O^x*FUtF$W+FId^ori(aLFV*NSlt-?-R%7oy#G@^^k}F{x&W zLG8r3`^f^k5u5HJDECoKfhN`4Q+}wAVg@+$C0YD7fbW5SO%h1p<=^n8kC)|^EtfIB z5yv!}kgb*B2v-RlPeMnd%yKS^Od!|U>VO(hdNwqd4&wOifDA{;4fD@MJ#UC3S z_VweV3}Mg5xFD_LKzehUk;ELet7lyM+J0N(6K)N7-2P9f{<90h2k4ppC?sT`Rv6}) zkqh+>+IxDCb#@RhTZ@D7DS+_Ddu*4m*57|n(tweg#G+*k3c66A->{%&!RvZl#u9>k z3aVylX2(-K$eEU>VGbc9-pM=0k=K_yJqH6kKWA1pHUbh6_5euscnvnM*reZK>M z(a@$$#~~BNWQyq8XO%SBe!>+>%W#SNFp0vGr+1arhSM_d#KmI=2?vP#hHffI3 zm}+8U__AOa%li{x{thsF_mxB$DkK~M^ZO`X(WBmRxT+NuA=3B($|CnZU*diwC+u6% zI!ACpDOwJH38!p zc{3g~B%w@J`#Fm=} zfPXtYq$V~x(!IF@mQ1e9x;i@Fra6y4KLnI1=B7Es_O@L}rUh^Vf1U9b;hj74`^!DM zXn4opS-1<%DI9Fr2&ciq!s<|T#=IF=q2jze+?Yq$c2!gVaoXJIsV$XzWS?RYzS?Cs z^F!d`>MBoy?S}aWlSOL80!||iU`{V8>hZ8pe|2*=32Pf0E%WotgM))FtEM7@|E925 zVE%TK0@@#li;J&@19)cO=Wgrk>+(7}RB$j8)9t?zn(%G6ItJk6z!S&H*LXAc19J&*NpqME~3zF(^cdwf51U33uTe6nzH34?%JOn*Y|VTflGp z)ULc;076?UbofH)U-?;`(~zHvo(LB>6@b&kmVcnm_J^!$&4Dy(3*oRw_W~TmBYyml z2hejgc}7~mJZ2XCHSB+`1w%>wU8@78b_MT0^t}IHwgBm4;TnVbTgu4ZOtTs%BjAXh(Nv*>Ml)>_ejaiZkE6Rxlgf1-7s<7&LNwssKuU=`q1 z6hJ9}4N<=)^*2 zqWNG(FFerh#X;ZZF^|y?@00Bpb^a8p3p$~|E)&0RabV87+!SVbRWZSg7qGV*N2*LZ zU_lPhKfoS3T6O6Eb1phWi)Jxwc+W89m`OmwICDVBFU+7$#k)q~z?|0`3ryRI{dPO2 z;Jd=~XT~d=+H$Cy+4X8Do3QEN{xiWq>4;YIY%JaNLlHL+kFrq?maf6lh}*?2Obnax zG7Qkuy1>vCNdR38uqz(pLxxDMFo3;4glR<>YgxxJcwN2g4Ee?Bqb%3Y{y@}NleWHT zJRl5irKYF<9K-pkmqSP&BuZ%?i8C+9?EmZ6QxOHN-4|iaU%q@9ud+|$kQ$g4Gmv!1 z8d&?*ka(ic2b$V)1G4a1PjS?wKXuNSRiKVJ1v_> znHd=vKqEjGikg~afOlj>I+h&|Q@hkSQp0yYw)$k&+i}du{nbpZ>mzmbjvD7x5~AS9 zyomKt1N-(jvgdl)IXMfbd#K&>OOL|=NVy|Q<+G$KenUe;hgOKnl8fYmi)3USr!tUL zXviOui3k05<*qpijR*_ zYz{6&$*2E5kbtT%d2R>d>@37g%&J~7v_S)h49g4+$s^aznMU9LgO;b^D#3M>~FtFoO@3{tzNC?H<1K7RkqOeCrkkyTVg;OXh9`^_STf6St| zB)E9*{1WJdvc0{4m$!H6r)$AKT$Qz!Od*2=XpTur!f%?hmzL&4KEj|*GPMI%=TfhU zMOdAATtF!qgohHLV`s--(sbqZzV+2#{k*z7AAu}~?b_ZT0l@9;vE6%oR3sl@b0v zJp3FWQ5QG2ue(qF%z>~nYYd*Gl+=P#O>|O{m9+HguP(OqSNqg!-@l7uV`5Y$kNp68W`&07n!@<1SaB=r-dJr>hWXtLS3qZsS3=9cOHPYhZ7Skfj zD`#x!T3T8xVT*Cny??jW7J)kUKkTXiwU3z`pN6=PMragcdUiHybX5Dbxp|>c(GB(M=;L zp@g)6f(imkN~45;fT(l|N=bKvAW{MfB1$*XAkr-Y7Si3_-TlqwQIF@l_xFuE?qBz= zamE?A_u4DonD3nPd7k-lvFcO}IO4Uw!4w1EQOe2by0x|Si>RnTD)SPw`ucj$gIKll zL0XmjV2kHUxr7efMPNyYKBA-gci<-W!VAEgG|x7QHLIeXMQtti<9x;%21~uQWxp_3 zt}>W*1sw++Ela1GmQZNpMVZ{AmwfbMWu)UySsNY)pz>rtUSnSki#rg%lGxeN5f46_ zw6rwh-`%@?DP)dRLUHj2H6`W8dkR8Oi)A&ir@$~|l_c>h>|`=N=rCLl!$03)S(}>A z5>&u$pTB)8IB+y9TZ23~NF!VN`yUJbI}{<(7lr8uUyQ6eKKGq^N^u2+aRYkHSeTi`Y`AdR*x2M-j@|%!2Kz*mH`Jk! zJHUiP==>yj59*$s+9?p(=X@0r!3YBvoKhHNu*?%-in&$ihC84TG3_N033{o`+waT+dJbitA!M%PF6B9Hs@epZCumh!~r6!F| zeALg{XT>?rip$90ffp4J82BNhaF2(0DjStM7cL(wZBYeQ-^_VZrvsY`c+>ktn>GjI1m? zet^yNkI{)QVGXv7@5^Z0WN+V&-U!40*Vphf8UwTcag+n1ks#k3lY&GHRm6sZg#!;5 z2Cxp81#hu-0-Z;(MH-IRet?1{H1srBKfT4iLe(Nu3dDhOS*|3XGJ*mWet%L^TR26{$DjBl^6 z)IpKYr%#_^E(}-Gf$43SY~%iFUd%}UV4=F4K7avv&8hDc(E<(x$Or(B9pYv?*!88t zudIxpi-#w%sE73-@f(KJg972#%78P zg82p`jUFPOmJbm5fJ5HCRs3M;E*c-$HV_jdA@-l62_38*I0HykjGHPcnHi7;Kq@Gj z7rRLEKS^r6cq5_Z1F6T=M!XuBIB+enQ~yafa5eoCXQxes7ZiwjS>X_C(Y$J8_q{ zBQe28AAF>E+}~0$YKl#LKc$qv%z~9dxYGcFpLs1c;eFS%-rMK63;P2!} zQX36Ha?j$e54|HKnB$|;RR0@J1#SysO(9+N3DQ+sq)7hg&rx>m?t=Y9>EKy130o-! zlxNFIo>kwgTSdJnly*7I^bPt=XHGLVQqNsnqd&iaKN26`5B}z(8G#=&%Ax-384)FI zm0rCLs)QtH>@HV8)h$dYtZJ>vHck?G{(nnf)UdW;bzb#!Z^*g7$iyc^HozO>Mjk0J20Sl77Nzb_MM z?qtqe_VK~^5=ASG|GDNxo~6_i2nef1+Jh!Im|B9NYL~M1gKO7j*ZI!oclnvf*WpXk zSIc5IdGz+fq7r7`c0DlU`ZH1FBmp&i7Ruo0o&2$vi#_j_hW!>b@H~-9KczePD3_IvU>fUgTT_?R3>;Amg7-WBMg?Jj`cgSG zl`P$Qh;X$&5$Hm5#npe_kJ2!DOoW{{4*8nLX3N>kT ztq-BD3_VSoJ5&)ht;wNLpg;PW6lT32R6f2OmC&!UC)nU3Ahu?>%r$i8PunC~sYkwg z3h->hAm>*ojtf{Uoo1D(AlH>1n2F*lS4%JU<;k{dITINZn%(rb%8|>B5*YxwU;W<}RU3UT2&aQDb@6`J$ib5oW4@ZaYB9! zO5BhYqT*3e)s(|cTJO!$mR9?I7a42}P)FU#d&FE+&s-;;B8rWwB6WP|;;K^!Z>WJ( zpZoc8KMT+Oe8d0wvp=uNt!rofzN~ej7D<_N8xqEb(ml}3o0JyZod|PW`$8N*j>VG9 zAZ5WE`MlBK`F-6WA#8Q$0~>|T`FwOcX|lG78!t9MN~H6FLIgiVZ|I!R9>ohfEE*L* z%DA9@-lX_qJoYy#9#2lmaxL?{-X#;gN2jv~}R4BQ_Tho+cv9YnZ7MUZ>#WA7TWr}g zPi~Wm%1zGhIB@a08qE+veK4pL=8RMdvqvh0{i+%EfB5WowT{Snq}EQ+oQa)FSw1n; zj4PmWB>VYh>MHBh_FpANK2VQ~?e4IgVid-+lU#74QL4P#s3l#GzB7(@{ocwuL&nM0 z=G^B87Z-y1Qyh+YD%ME0Is|>mGn`Q*y6aDuqI}HtMdxN-2R4ObFI;mnG;XpH$d|qM zVJ_XdfonN7EqTdOqK<`WnMT>2nWR$5u_5`Q`65#EZWAel_pAIJ6vF#Ie)e0@%H{h% z*1&t^fameE1m1PVx;Fu-Pe!))CC23$5__41glNEL1s5VEI+_}?GL#Mqai{w8Irr@r zI_|T`6fJ&YWbw=}e8nK?zp*qNtYuQ1#nl)Rn_*}>9jxH0eeXhl-ug?@8P`X?()3by zp>ij!T8}?A2@2=-lvz(Ob1}(n>qyKUdxtzE^?iIh$I7K%(%jx~5;7c9X)yLTz8isS(bZ>tPm88jtL51 zu1NYZ&KPg_BkK|h5;BmWuPvbh6yXv58>7<@O#Fd+Xp3%>NI-H}oPqcxfIEabR{wE0 z<)B%{n^MqMvYaq&U0eh*GBaEI`uGh41jRYO7!=gbZ+={~uQM-J$N(SUXV_5(|AtQu z3MkTu{FO!mZ|2`W_4U%k2-Kx&+8>;7l)22gkKV_h8z zg(iCIh_i`+QyWEqi4MtCMFcRxMSX5=4iQkk!!d8eo4Ve?v1l zXvdvxUQq;elBy)D&C|{LHy@=~;WfRWaKl+aSg+dJ<^yKZ@Kyx0f_{K*jVDN-!9?@e zOY;c8!Y7L_E+%gl-d~7zn&NG8lTWj`;iDGu%?HxyMqDO>Tp4#Ra$Q-*oca&alG<>; z0>hEZ6=&spWIlQx6rgMr-nt4&nU0Q*vxFEZNJd%iu00wzhb&8Cd^`%k9B2_9+Sm^e z)w^yL#Q8K&*R8B@xUWYIk2qBC$5{0}|N7-iZQRjp96IV~Q|H+3$H9%Z2|xlM1cM0g z9i+)2`w5s05uoLjmG3e#ZXnogMmiv~PD>9F$n(#^#m%ISIx<$HFux_=AfQj;X>m)w z=>A0>Jv2v??>&t1;ZlM+6^_Kr3b9;+mswcGw_+d!XO@pfO`xxa-vM+BQm@h1ZLlGs z08zQhfmPXfN`-g$@`DRWs|UhJG!J3S3;>~acHBQ=1bpFiR;{uQYhowC?!QpQ#LVux z&Q8a&{MHhIAL2;)xL*jGEhMB=A+HW8+ZLlyatYb%#gKBJZjR%njV1A|d*ZTGiUTlC zPql{#lDvdcA$xny?ZK5`O$Ho>-H>!1Y)RAF+v^V)g6jk$T`gqf)Ya8HN+CC2G9Bw; z*>6_-VDf7?G#7xcwRuzZJ#@!AjaKVTyyFYK1xR{psd8I;z_RWX05nFXrk|iMUbE{2 zL&p3ZH#aFnjYyUs9uY~ZTJoLD?G9{;;?-|Yl`9#2MwJIqIiSl4X=zfG1Wj7wP6z7{ z$wT(ha$`pELt$Y;cJ?WVkC6<3tZZP4lmNb$r37ug`9EZC;eSHnI><*`ZGX?ZK4O2u zPuyVQ0a1Z3BUY)C_EYv#=MtAb)Q(z-`AKrL4X$G2y64Sx#l{>vzlcX#pnH zz|zy!GtxaGJNQQ##(P2G*oYI@5RfPZ$SS-Dzvi{MgedU zYFd+|?526RxJDL>hn1)0d|>iG%^+Gaz@=bkvmnSv5(1XmQ|`cyjO&>xHmC*!>0u&4 z+K@5}OG_d^eZ&Fh(01Q_v@ldjg~|g|Y{0Ht3-X8n3qBn*_k}cpo14(lq|TAV6;roS zd>v5(113r;DkP6zxUNbfabH<^EKTI_(o)Gd0kU0vB@+r7d=!~CBY@=~$y@;1>tH-2 zwq69d6B`F-bqor&R&Ecq$4J?P3@`I8y=R5wd!}->7gQWwP)ygV1^8f7hlHzRyq zFIGN2BlDe>tkqT3p(<&HY(OCQMD>u4FNf(ZcC|q6KyS-_)VYAFXE%G+wedgpQQvA@ z%YN)xtkdu^5H(QxuEdNRFD%)GvQjgo&fR z0ky|G%7kBXPtQ7kYW(qw$Bt(uzX`C9j$EJLzOK#x+CnXaL5h*!XpckPHje&3r63NQ zaGtVeRXNbCE&ePX@!X#DkKt~MnqiF37|2CoJX97%ck;JqrHkVbD9Gc}9$i~<5wkiRM6k}#W?@5-)&>C@8F<9E2f z4afEIB=YR+ z>@KphemdM94uPbr;P!yc&MXv<^2Q-d%*!JJ7!zy`l3+vWHbrvdVxof?1&HFyj3slAef0aTw&vU8*DDXcG&HFa?GXiq?FeA}TWsQR`-q6Y zIZkXaUA-ei182a;iKv;b?rmUxz*xnF%n`H9PqV?e)IPl9Id_@mXFbH;4$#^T2j;|qjkiXHxhYfg*)h_%HyWX7|)Vr4^Q*W2IgP0z$M?e zc}d1|qa}avAfe^2b2z7hpwZ_~*IIyiE2*Z*v!0ZJ^y(-eG$!OW0J7UJ_W9hoh(O(QWjuf= ztd}|+>LJ;Y?^^@k ziVDG3uU{u7C1Du;h`vgjdcE$+$F+}em80p+%_6J#hW7Zgm4*zN%%2M=;ObKeX$TZ`=6H7<$I|doUH_05nX#v? z9*#+Hrz}l}9`0smT5Cio!K}xk>&1(=#T?8o%sD5a5@&?8{QG1tUDUqVbXEXoBv!|3 zph}%OXIAt+Cedt7{#Sh?*%bx}t+yXfStOI;!1$5#ElQ>n=eQEEH>dxC(miQrX9QDy zVfL2FQQGGSAJKDuo^72`GtbB?XN)?B6;i_b``m&fxT{gYUG0w5DTHcRK7PmcH;qi@ zBxTHnE6NTDzDJRZJJ_5t7#>zU|Hs5ds&U>$xgYIL=NmTD)~w8^PFfW-H2$!6aG0l! z$gusv&BHS`EpmKaKAJD#t&kNUtGL+SCAPDneJ@>Bp|F^U2QA=avaeYcr-3*F@F1Xo z@kvQH2k8iW$N8CUtgSf&1)q6s2!X$=;c_M$^w%=O(D(a~8yLL`&Qf@Ks*0K@=F zNW;RCAQ&!K$*k&5@s1$O1zM*G;w+6~0{OIdzVKV&alq~H7>3e_vdc#)nXfnqOW)FS zMZe<}{BgFXUf*#s-1{9JI*Q$EeNC~sMWcj|MYLsAOWXYHaB8Y+*{8^=r5^3CU&UKyTD+SkKP545Q55|DkFNb)31 z)^d7qUNLr3y!p|&?Pqc&Vk*9y36_gjRKwEP2_t1ek#(+2fwo)3gzr}=3bMAPc3-QR z`wP|G^vUPyacmt-wrZaYWRZL*Ch(hV5T-o5IYMU8roacRa_IOK)G<@YMDNEr^TuMkw;^X;+WB&mGomMh7&W>PrX z^O!y9y>!91c^|3=Ps8zJM4swYZ9KkzSwU+%?IRT>3f8)<7kNm1Kp>0m`Ku(2uq``6=hWjxQLFMq%7cYD!NoS4R z*B>nisC$>qc{^@y+gY+{`|Is0&5Rb^<8#&}->OjY-a8ZCvu@6KdJX?&AVEi!8>Sq6 z{Qie%LeZ}Gc*#0^ei6fbUXksMRx5=V?+PMxALVz@Me8WzS-4!VU%dWwyi>|@r10j< zicvtN7o8e#cRTt(<59exep#7NjU+(XPA7lZh^=Ok;rdUVdOkdmECsiaNYw+s819csjc zU&BaT-`eMs1AEv70=lRVP_vwz9G~0XhcbxwK&*)Z#TuCwJW%I=p=veAB0eJn4)~?Hau~EzegE(TKux^e4_h|&diKy+PAFLx`-f6!+A7X zCAf`M?kx|a-$t$dhc}f3H*Sf|nq|IpU**_}qfWx*4^^~IHbhBj4+dda(0!~Gs&1&_ zlz){4*-nPu%Q$NmWuzD0)gEn2x-UD-Owd+rw6U+QEfb8j^yB1Dhr7Ky@hBm2pk+{K z%#Fu7-cn4srQ>4ryhNQ^fs_!2=-JIQswYnPFW6xzB-5Oh(9qX+B^UTNDbb{fraC*Y z>0EhBTAHH!_1m{6P-Tth6}rHgL$=X_88|u&l{q_>hLH(5ybpCxwX{wFnb001PS}kS z!fnL1FBbK82(qZ;e1eE2?aRrI&Q38B35a{|Z(p2(?jLW5O@GX*5AFG=QxA2<^@{sf zTSMGQbPmSIuL469B?{2$kmL9%fR=$@_;EhySY@88`1v%u;=_jzfvkrHK__6z5P5z6 z@dJ?K*OQIULZ+R$@HaM+$lYN>0|f~K@4E44brtIPjujBOdMJ~QN{8{SM-rdES~GTZJb5V_ukASK*`M1Kfo1UyOU}#<6>ZrUG>y8MPxj~=^}4L$ zL*7{#()TZ8T7zEWGo^g0;sH(m=uW>&-t@z>J}h5599H+tW zPVG@K7uMGVj*lz!SGUSQ?a$uJOxJ$)5)R5w^j$u7P~`FM{Lg9;J^VQDmCbHQs8bPC zTTu^=?}ohZ2`YPL-qY4T+P*-$Dok~Kik=;}Cr85<5OF$SJc%r^$)PQm`PHa6DLTv}zXG9vP=Q<~!O6 zIX(;ApwC~vP;4h<2>|b4w(SCt<_2teL`Bc-PnsToWiXN;IhXI^unIQ-ZZpMSLG z3X+Px`AeuL(y@2D~+DhRg(7Lkg=I&U3v0*>%)2sKJsuAr$Uk80{u^ypBt?9c4 z%dmIXQrgIKY9oF2zGn5$wvgval{aGt9|&UN%v;TbN36atTNINkrYdzZARQry7Vh`e zbr)Wno@8(>GXMVgPqMM~^Pb^ob-zMUufb$ljwGit3fq%WDtH9=t712A)|C{6F)Qdb z#|owT^!eX{%C*3J0rCn$Ga7$@s_{R=jCl1(>I#-jRNmumwu5PpqqMyrW8lIc@5UYb zv)tZ>frTTog9eNu;*;12iFd$xJ{vZxbKD+uK=KN6QyQ>5hYTNW6$9fK;dA5}G*M!D zi&gB51tLtG(6F$dKeKA20ULtwcYuL=-TtvQ#`mFIw+nLHn?~=UdcZB%(y9 z&EO0w9-}a={N-Iu`su>j;&}A>FN5!dQZ|U8UYJpOwuH`>br#FUN9>xZE1$|p)o^*c zlB5eF^OIi<`ETO;D(-I)f4J}|C&}Jp|2+{dCh?0n%;7Uu=ZY)PCn?%6H6$-7lR358 z7inM74zZ8htWdpkR{UK$nj8lG(~fMa!c8+va+2B=U1OA}g&Rg0=hr+z-shbudFSb=*N^p5@VmBV0&fjXNl2+)5%h7xdVROYldPU2sbU3#U2$5 z+l58x z{w%du1imQIlS$(f^we4AVf>y_mCe{gr%fx$acTCo8;JF3x)uF2meiiLXjFe1H5gxx z$ME4D4#exWswhj7bpGIIeQBwRQR(pTPscONzh=6Sz)3A>1l&8LzJDq%?2JHKKEXKb z^=lr(*yL~ME10008SpqhgnZ}6X7?>lgpP)Sfw=Ov*%ceIxQ?s!sA*EnuGTTtHkfs1E#ZRuk%uV1Y|#eaG2HW0ED1&!-QCQ+ShX7kf}+)v2jdt zscmva`_7QdzuCfKB}ecoIg$Txb#k7A_#L=0dlOO|I_Wp^1nALT5A@S^ql!$agat zjelc^;BB^2Bg}!nkNGt+Qv*ew_ZVCy0~;ejgAu5i;VHzTs1>E!UToa_< zn>>$>-1(>p?9u)W*om9sAyo}zW-14r&YwdB4UjIN*Dj#{MLUb62jC4p{K*nj;YJ$8 z0Ne;dxPCeO{pU!13k}yeE~cOmvI<2`kvE`V2w(u*1Ox^_zJJbx5ren3e>k(W^bDH$ zri#$dE4IK308DZ+uG#Rvly*-52q(WqT;<@<735<6sc5VNybKtiBlhM0xvUXh>7cnd z!^`WtGlp1*M6y5>1d5nqy3BtK##Yj?_1$y0=)jo-6kocQo*z5%30N_Dz!$7$Px+okJfZAIBrtTQZ$c(ApfmQ&8gjJw#fpe;v zj)nG~lX!mn`V|09GL`RNfNT5@*)^?SLEJX`|FuREl0OG6Hwn>Du^vZGgYGFTj>|)p zFp|p9qvfZc;`{a;qsRCkk3Ia4Nii}ln4_s--8-#C0b!qZu8Ld4f@5Gc3VH~}7vNSP z)-&aavcmgomJv7QQCvb51cn&x0nZl1aPr2rTQU=Wy*ESRm#CNMc??9jFg;sIY|01E z%c18+<@zk>X-PV_<)8Ns7+}?a{&F@X?i{qvc~-DqeFgT5Oc- z6lYv*anXJ)@u8Hj~p9T9`lk>YzV;UDT62pL%z=aZ`UaJr(jq+JrORV-2{fs&v6Bg{6EUh zvuQe3P#XzJy1{IHUR5PLF*Sv#n<3#d7tQ^+3qg$w3k%<6X5Iwl5v}tK{ea_m5TDCd z*5373hX8TiG&E#}$(IMh1VNCTA;jr(L^X5=wR9sz{pJ`bgr*K5sN+g44iZ?#CnsYf zaH)d>?>PtB+<#&yh z(FtDv1A7DSxa4rFKi{~W3HTog5XPbq^vrcZpRNw@yL<%8U}8#4PnVAHHsH-%p0VSP z0f6KaV7{H^>-gksx}YcL;|@ND3s5Z-h_e2@nabZ?&JaYwf`Xvw!B1UbF~HzYL`4_z z%pX7IjJ1}ygf#-jn3~@f7qaDVcr9pQes?mw$ww`~aF~v9VBq9DBNa>ymXr|nZoi3Mm{0q4B|^{oKJ$+Mlk3&M% z8VNc1xHq9N2otbT2rdo$lSXK_eAC`*F!mDC(@y}(=s5BO#}dSj3};U=T)j$6K|yix z%9Z+q-F2&tnN}+Y|F-XWdnJe-6C@%)2$`6ec%F$m`JWvr7!uX=Bx%u3?Ottxk@gdY z!pd^v&D%PxX0qzBx&hb<=9Qbuh^s1K zzfcoVwQ&K`QS>l!A9rQ7#>|6~1vDy%5bG1L`4O)#5hSmH2&L3u!PaS zw>iHGrZc@i{PJlj2I7OQ;%W&H1%hVnHJg@6^tA`TNkK>lfP(-{r4=NY2?_LwO9^W- z0>#P6ojNCST7!i$2#NFO7~hA`3I*KsB>=WjxKNX$DjlNHijv)gIV>5$QI!?Ll7%oj91C-KOnPB7p-Q$+Ydv%%2kU_OAv7^`tslY~-N(0JsaO zJMk@o9Rp>*JQTzn>&RdZdGe}fV2fs~-^|X>*Wt5Qc;>oJvLM;G)#c-(<(b7ri3blJ z43vWg{IA2v{tYRX?%9BvzU|}7`$6@?v(^CD1IW(^RvW4;l<5OT10XE~N}%bEDXT6i zISY|rS?RsnNo#~h1eO*BLi~K^O%qsp5mODDGlDIE-$3%XQ>e%p4BpO0nn)0&4`~Q| zZ-#LXfkjv?ZFVE@*zxtiMIrVc037)kek?Jf7cXBv5cDy)q(~A}o;qNw>HXKU`ehM= zASWwh2&7=3Tus-ilu=amSBK0n=owo`LzpuX6Vc-iCYX`wfKb?OI5-qLvjQ#DW0l+^ zflOHEH@gNAHtT}y3RnzACMI{M@x4$$Yl}NvFofax39@AV*&4-Th}u%YWA7dcQGp3> zmo_6-Wcc`KyK{U0vd#Sb{A$SYPRLvZcwfLCL{w8?U{g|3AW7W-{^{y>PGA=#pn*Ou zM0oEa$Z8Qi7@_bE3Q%?EJYR5Q%a^MHfs{pnTJd3bMMHosN>VH=EXRqLQousGbMKxv zbSbicBAPCQ6t~wNHwJe2&UE`iIPd_=2h9hBQXqG?w+~`~G)>TG_HBA(Tl2>N4hAA{ zV0pp#nbX1jD_STc^Z&oCXknm*rkb#bt_)(8IsPXYPf*}!<~joTvnyM}H^gm0A1+pg zo(IezkPJTu?HWip5u>v=mwAz$y_-}eEfEzBwo%AsYhR&Q@^ZH*OIA6{_>?0eVZTMH$OpWf30uLBrQ z|JMH4P}4vuUzE_*zp4s(sQ|bAEeZz(0Z2rHzEQKnaWz2XbT|0;XHV)u^%3wixM-EH z$H>E=1Ao1!sOZF@m*K;QHBfE=j*iEz3zM79xjp-tAftkr3(=L|<7^aE-U9hBxT+BG z!JU~l;vW2ChxU$p%hz|_t$ktolJP^`}o@3-Vck(llDLOX$C)tJb6VJ|9 z&W7+vpNS5Q;x}%4I>1!fBsX64qf2ADOm2?HI8@s(-^$cG|0==09s}!lCVJKctP}KC z+ir0t?H`JtLs7Y zazp4t>1+qMKq1Ja%9*3j>tlHOr!Bvm(&cz($>(~rks79# zPu&A7Z!s+NC&Z^bEJ)MS)8F?mnwXn2LFveU4qZPmnB2U)-^`0yxVbxfghub6oz&HQ zGecSfX9q|o;bD6>u>Cq2#UTz)eVZwaO|wLIA(G=Aj6cPxP3K4Xs<<9#zfL-9P^-&f ze||$;0(BCV^m*3y^7ZR#kO2MbDkou;e-$0g3QO5SBoQtw=&#<~X4-YF(ir>b^!r{7 zp^)x@ZS~&XX43C2kwPx^X?`;U7!M$6p9cn}?c+&ZY~_pNlFLL>OxpfA;AgIh@=x2l=7 zwcgnJW$Mg4=d|6O}sMnMSE`Yo^BNR-sIrwt{ zeLsjxc!D&L+kebb&dfjY=cl2;!NDgsD_ziaQD+~J1^SG~{b|XYtYm@t#sdt{%)|yf zQ9*LQf22zym%KcPye}^2+uQe17{9*Ykc1aO8f^XNL;OA+1>|IoKmS18Ci?fuQ78_v zlNzXnDADPMzpsKq)i~;|Iaey`k8jF^Zp7Coq#G0vJiBTA_BKED2?}4d5-jlx66bwL zlnl8t!36CclZ=^#dLhmu{-jHUYyX^FH}?#Ec$Te{Z75e2LKlwkKLv=v_Ic-V!?4 z#qgg)w@1?fCD?D;+MYvl{Wg=(AO(j#Mh)rP^ScidPoMpB)*CqMfR{jl_295ti>ARG zRdV^>^2?Ur-=oetcax$#+NRnx3zR}_FP`SH#}K`d6{>k3?N2+NydKs)A4Exo6L#LX znprEIDGXY1kIUg0z2wATC}q-M!xRf-a58dpd7*g#T~fBODafbzbqi0$$zt`%0@aCY zQIDvewF{OfDi%sHn4IwKgklioQcCLTkpLqFHI3i>h_>QQR({kP&LB;Fd{Xz;2l4Vw zW77(B7*fBEXTHsPiaB)&OGfvvjK<#c^d9slx6%qBDNqZYC{nfMIr}`Dw~y&ADjKwi z4r+@HOsJAeTMu?->3?6~MadWYa_a?qZr>Xj^K*Ce%3XRs>PVNJ^`Fr@pD4GdXQ|2%+X)5CJDbTV1i9U5tJMq(u_Z<#_>+$X-O@a!b* zlLZEc=%J*TgS(|mnTPye^=)Wx0Pr!FI+ zq>_lcGMZ;iL!i%Teg_^ybzM79t6wPW!;s|3lPLY6qO=bX+nV)ld>|;I5J3C&RE%FN z3NI58%5EkEpn-gq0uDjl4B{(5MrZAMaE4>to45$|hgJcha2poL}Wy0h=_w7Q17^wHgC zm!$87e*emSVQ}TKOsE<~>iN>^B^1Tc+0G{IsY7^EJKbbT(k4Py=SEky-zyjHMfjh| z`E|GF*b%*gsUL@h*$R4lo>Fn-ppWdV6fbw9unjriz6yVp%oQeWFP&<1qy9+cVSwbL zh*w<#xn?Ja@Pp^`WvIrNC)})U&>u`p8a|shAF3+%*w>~~p~NQ1?Ve)E(y4G?Ket@B zBg{KDS4_y9<9K*&GE<3}aN|?8kPDsZ(U8za`F4pKv%;-*S)8hn$3xWv`xGa4On-IP zIWhfJmxJ1+rK_d6t40HuH4R^fy+>b=sb=jx;jHH)DVglOEu>W474^+E_cLYqwcAf? z#z92aprkRDq2_SeY|!}>nbg*d0CuU229H_W)C2w`$N77e`%ZiD>OnD~_pL;k`_C^w zzgwprsKj5#qO@4y>T12}Z05e^o}KD5q0BbxO!ZJ#l2YiJUDVY# zT24`Gof+P_8zO6EOEuEQwL;ztDL3roLJ!nbcAY~WL*~2k2mcu7pWM3OHH%2;oWX%cIoSJQrpuU)QZdwKEqzWs2KW#g)8ND z%C7M>rRr2hH!8L&m1Xw%<5=axVv)Q4yYcR89hv#tcFqdooZSNnZ)ZE5uWYSsvS=S) z&HldBQL7_p<3t!v+oZ{PbGPVL^>)#m8(rJUbw#1$z}RMozA^5|(Z{X+9v{bdH`E!-}b|wsMb%tXtsx=77>}Fc3mlaLJ$2R*8 zB0Q3Dy0cm%xj9LlF6FTQ$OuxHtSlM^|X5Q1%c!ZD}{lIgO4{34W_C19gEa)nw94*JXSEq ziKN@Qf#B8irmFiWLq_O$pLa9J<3Q?>Tr4%!etNTqwu?esThuajJ4T3bpGB-N{xWO( z^44N!Z9(T=Uvc$dZgWg@7Tw_*c|La)1ZF+CbTi|xXP;g67)(8XJ*ObCn{rW&aQwDJ zOyq@0kr$t@epG|ua7ulIB4EYA=)Pe2J*BlR0pZdT+p>y`w*LM-b>-P2m~PYAiZ)Rb za^GgVo!zjNkGFac8lwkHnolEgo>)H?-+l>QPx(8e*9X{`0LB$G1in>>rNXh z`^X0ym(2!Xf1;k;b-UwkoF8fx?gdND)d!E4y-s<%AF7xQ#A8Jq_bMG>H0T$)cz?hd zV_Iizc_tQ|C2!jFX)A69>6}{bGyQ)$$Mo3$XXj{g=KtxOUnkQ2oM5`>`=;hO!R%TY zhO#nxx#O}Ca|NZP4GCwll4w!=kJ>H=YEhZ89r`z=xMXjs#*@$;9SIMFZCT`%Z(W!FkK4*PUAuz& zKGhYS&ULw)QG-kl*6*X)BC?bNtu9N4cIt%-Tvz)-8)CY3v`yu)*+1OXM#?fFFW*H+ zK+|=+w-&L#iQzWTO))0VtFb|&5^&VH*j`YvtFkTmq^^#z8obq19`Ew}fs$E)dU$HqSgfT64q-+HJJIXW z`TRAW`g$cH!S>E$=g}d?_ovnjsl2meYs#vR9+Y>Gmr!lsSB3BVnl$|$ddQ@~?7nUK zXVO5w6d{ww66wI-v#Vd^XXn(2Zx7CyWV5q}R90zdWj9Yv8Y|*;7Y7$9p7IpYwKIxh zmK(No-e|Os5PslbTu_%}Mq6E_r?BL(u$~&MEHv0_bMRPaayhM^oxo``_xu%B4TgyR z?De3aIU@^|u8A+|TSMEFzV*=-MlHOtJBdeQVR0SZVCs*Cm+ziG-P&Q?zA=1MEy6=k zZSHZTqSJa9BFI|Mn>B7xoo(T|8i=P^_K+I;R=1Oti*l$MYzh6%P^K+Jpnr2chXA^y zEv|o1Mp|Ye*LPlxP+!_7_E7!6tz7#`563NB&BBzl;Q~=A?9A6x7c@eYwFoQ%WVr|1 zGs1AjZgdS@p6)8y_t>wDr93;tG$qqnUFp1haS1<8x#>ql#!!{aq^(cvpdvR%R_J-B za2~a<(qZzneDPC7vAWlpn^?FzwQ?>FZ53tgiCip{j5OZR5(*Y8x`vmH{993(^+V zo3A5(#6`en)bF=*I0%CL#Tob&6%%w07eqGO4UZ(C;*(gV&Bi+jPy@`%<=}@L!l8K~ zhqG~WjF7s1FF@@)J)?NoIW3%aZ@Hq~;(Oh^aI)diu*Yn%#Zre&Zgpy|+kSukc-rvx zlg5p}?A)1di-neFjdaV~n!Rh2dm&deHu`xT=KQOV;_fahwtK9VHqVl4=(Ji452Wi< z=ieN5ox4Q(Bf584?YUO!d`Xx?X(wC6?LGPF3qo{wbL3hyd)gfFz_tDN*$SKYeYew{AFS8pl`n6L#}#=yJHNOil#duq7zZEzOwN&` zGa87|EHk+A@8nz(`E%m0ad2Y7ZFY7~Uh$=HOjPDF38{3b^8O+GTd`V2$7Q(0z-`)F}klaQ}S-@*0F4=>=k99*^RGk zVMkI@nf6<>$AYJM1dmFD_v@J-@9G*r zd?mb+AChr2aQ(18&i!t={es`-;e4)piokLeOINW`@7=>M(EU&f`mmYZRjhii*Q23f z>yk#5=JEdVLD;o|g3Z9VgQ%~BbZyhsdrD4j!kwL6b1YPJ-ND(1)hBj~MRuOh9*p2T z%-;}EE}L3Vb6afYP2bcDJUV)7_$n+a)7xdsWH6FD|EkXZR`KSj$k9_T8k)WGCY^2@ zk;C+={V=-6vjL>nC^Go>r#N#$@|n9|_2?uMgh}gIp8xhprfnF9-8i^6qaykIBB8G> z*Xg^(t4}ids48Py4?CH6vWAyc+}tX`gNqb&dLJ3(GFGXWZ=J+rSe@8pWh}9}*VLCM z%D-c)wjFkQgaA)u-?~4nC%ec}3IK&+|U6dv2g~ zNvH4X=aO)$%?XTM-qK;m%nz$y_QQ4Tf-1Lz?y{-t>XnHtx20-L4oJvOPh{*q~-o!KlE-i&^Q>4=j-!#kZrfG zdOMB>3vAq$3yRH2SG;#|)$50=?@gSXtJ{{+vadl+7NwIKTIFpbM zbv97YrN#5Hoy87*T%?-4x9qWH2k_FhI^5@CO| zx_RMzrhEub&!Ef!neKCe{@6B;xtoVe4TE{{Y8pIRm0sDoUw@SAddF7$kQq^;I_0o3 zHB6`BqQ7v|uhiF5oHi7{zD83IpIdIxcFuiKsY;WvAS8Qc?jjQvD}3=(36A57q?|J? z_YR{(B`lU#^LBT4A%4@<^%*^PnIQU=;3{v3^1Gb$>1w_COX{moxeonuc@*Vn810Nw8p}jX;$xp#vLT8 z1l~>#tkid|l!NqQlXv(q=U_H$W4~Lwn@;G!($rN4Yi0Kt_F=n2?EU$Avg=xGmCN~r zMn_{3GBPr4Td+qLbGMsn$nj)EP9}QEu4~xcL*r|2Z{yk7%^tfiyEw0T9NAT`x+yiJ zDMYs*rz)k%ONUnN1XXu63hzo|_4RFZiVP>;uh!Ao*)!;+Avm0fJCgR;53g?97hZW& zwY6x$(mUVjaWo&YStu8^Vd$}n>4CEp7=SdhC}A$msPgt{mnfc@kw*nKx-Wh{jLCX$0OvTdYA&tZI@g!y5te;eJ}NXgKFed) zX038>I&O9CdR)gB;YQ+CbqQp^7FHJY2#8!Z581XbulTrf@?=i06`@K>JjJ~;bDsYi zBby3xOjf?##e3OkXT2$gFdr@K)HQ>JZ4IF_irWe8wG+38;z?C#G|Yzl_AQh2@x}$! zoGwhk+w=LQ_^Fu}rTDbzZCA|^Ix7HS`!fd79K+4ud*UEkdh06S!yDt-zqZ2IV z7CHwXJW!I>ZB1MMyL5~@@|MxxyFi!v&&y{iwQ9OUDkslRD zuC1e-n`(LEM^4NP1_j+zZRUrvE_!VB5f;nw(;dP%YTxTg`N{Y97MpCQ;wn~>dJm9p zwqKuCi5p^q+}th=DO%r9-}ts1Vgr`u1Z#Ke<+n8nRmrk$mV2a5E-sccdFCai^I8KH zpHzXiPe{p5j&pZL9hsyn>^#*NH;`7nwT{8$s<5C?QMm@s#NdD}A+B;8DYmxRd?BJ% z;M{BHSt}Qfhau7oy1Od^^^cVclS&SJ!VyIHl zlTgU`$cb9m_wzCWqk3zLPg+^sH1$S)evRHU*$B!v_a5hK<$s!cIGR|}-Iib@vUI=P zW}2J$kEa1vlu%c>sZZWtHBjkU@WfR~+;c*IHDqtaJ8$jf`Hq2sjGx60YvX%sm4-%F zf@2NJwimUv-bM2d=bLH8du_zv9v};>dlDv6t|ccC@|JhE!XWf1szpy0~tLy!quLwgS@v#Ey?kb1{m>aR?<2R`N~>|GPXNX*XN zKuCQNY874ddU9!S+}$&4y(D|fS?bHvp?@j?*d8xv!bmn!bwz_0Mx6`E4-1;`3D>8~ z^F=UC>zDQh3{)G!6PH=qq@?g&n`>9VA6K4KsK>^Oib~x*f3B&;(+*E^D&oP0{lAR}b*Se!OSs>}Nx(lH_7ZmXGUyXm><>bMPD_LBFKcxC3$d>_VpyUQDF%qD_q zzPkj0xc;yKEMUn!yncQuExtl8t8!UpuK4;c!P}y)Pbzgz6>NEE$78|%;~*L z?;;=bo!ZuVH23D3qV7=Y6}mQ+n21md?&)0TLNOB;R6(h>_Yh4>%^+iU);J`FUvt(_ z^1XS}T3JnQ1(R9tZkm?iF7BJhXMY)zGT}3AL8ZN6F^@Ydi#!NCrP^?-oseSiTY% z>q(FzMn=6j1@Bdq0?KwmZs+Iqy%dOXkOg@zT^MQ!A1Ga2ezrqM1lw*m`K~CbR)BsO z^Pxu{VlpY(5NfRRP^^PlW^Vq+wFM09P;_G zb77Aj!~L^Mi_ckgxdA`a&hn8(BAqG z3bjffuP z!m-?dWH&M-7uz}*ACpz#R%1sUor6R^mY-5sZ#ov4R1&?7iiHMs^Va{?pFZ*Xf~#IL zuRT?zIzbzqHNDZ6tfjA)S$>|Awv-@P;fNyE=(t!>%efLXF{|tCh2|Cvgv#f?7_%I0 zO*>LW?e&t!)M7V5SXGBx>LQGQJkHi48tZJdeo}%^aA$aW`&aJWD!y|T zQh*o{XF2h$2yb4B>Vs`m0qD!U8Sm=5d2Zdkc2XLchkn0mgMz{%W?_@mPLMuf+OBDd zC)+r;Sj@SXtk&=c5Os$5ocQ;*ihnfuz3 zW>)O>QYWM0f;81q5d)t;UQyrZ>WI<1q@bQZbECHDk=?gP6fE7Y$*xy(t1mn0xeoq4 z@kuz8l7iK7{PIp@hP_5fmeBQozS?Igh~()dG6OOL5{bV_o;to4J*4G0DKh@_yXeW_ zkF*cxx&{-S$gizteF?ZJOeaIGD|Jcms6xG`R*1c7rN>Hdo&N*moF=QTQp)qOSUhd9 zDoVHSR9YsF*E_^Z7ty2-F5VgRsdte*SwHdY?Q_zdu?s)0(eLa~Aa1Q$_p^I1DTg&R zysKuHK79!7Y(Bdy^zx@k*mhK9fn4uS8AVLQ*f*u=fwzQtW1Qs?)wB4$-1MGgt^B0h z3v5l%RdmZ#<~8mU4K}z<~cJ z;@(jz*06ETq%BdNZ??+NQ(?CO6lgX>Q-w=_U&xlzx%Ks9f)@=ZE2!+jx=t$9RnchBD$+VG8rEB3TuMRbDYdpf zt#yl2z6sYcg=Dh)?CyxOihelfp_GLaN4xxRWHlN*L**E!hH%h%W7lx2iSxwt*Uz-N zNbUQL>S>>L-syR4;)Rs$v|=KU=cRE;n?8)g^}H>8fYVh<8xGEJbDexdFML6{bN($N zjYnvJ5_u-FIw~>8{Yk|5SBmo0T2gvZJZwCdH6J=QrX%!@C2<>Iwc*W$J znkFEgE?)LY_lRM$D(doIYO1;xUiiF+HBC<2_d@6n75i1V-%D-A2Q_2yYtFIQKy|My z@ecx-qt^!!?!D|`KbF?!6r7Fa;xhA?LOcr2(PM6wNqN5s|NbDDg(W?u{W`XrbK}TA zw(>+i1Xx-B&a&0{$qWaJLS0y6D+ZX_Qn5~?6g!pAWKE5U{F!9kMkfE)0MU?7u@a<%Dv+S;aW2*53BqN*l zLah*XZTl`w<~0NzY7UhXco?DSrA!*9zdN`T`~2?a4Ti2~A=Z8m{PJSjo{e%W%X7}q zgj9hPOHIQux~@ULl-SY4YI!01;n%dt{^c6yb9JGq)2`BJG5ZHjpJN4QDK0AIvnbr( zRAV`#{E3koZ*NJs6{j^Qh%QNEQV4Hr=LsED$Id!7+M%RR?!*>*ggP;qnKiSj#-g;w z>oS)QFtpxq`WkDlG`_%y&K*Ntnp}QY8%4_^tf2X7NPM@SPO}-CmhHViZ6K#{>_`=^ zmcG5D$|GjT=ZMdp{;w=mMM^0w4fQ9`GaAVwX@=61K~u@+ozXe6$o_`+$kd)jHFK|5 z9DHA+O64ron-P*l_fLLSZPKbx!^qyK^Nan7b+a8e9M{lN?Yd&zteu$ea>CiemeV~p zJVQ6JIHUw?FP7G!*_iLVX0=JUTNY}VQDO6P!lb9eO}as|O!DoPaXJGPyKZJq{|4i8 z&XwdX|nI^Lq|O;PSEd9h6qWm$*q&1$vr$D19BE}4@NpH+G{x1H&O_DH!Sv?1SfOUY-g z#;JW=(5;b*f7a_jF0ivKd^S>|;UONi)?Z5Q=JtG}4N11iN#B(zn%Z#&ui-z$8HZBx z>@z3mYzagW6u9D7o(uuS*E;c z=`yp~MS=P`rZn$i?)y;FFaJ|ostAA9H=TtAovo|YsSt(Sh^Fu@x#GYJ z3JdG!QFEDCw<(y{6|9sM-a=%XFdHdjqG&T0ajBvTjpxQu89&VwUVfsp7f3FUeZ?qw zqW~qZrpYUTXR z8Xb=FRh{#W56p9KWqrHuE7G7_CKL44mtdFv@)eihoz8y4aY3yPN|&&LJ{rZf(mTeK z57p;fszaw6j;l|12zvGZo~)_LU>qUYSZf)VU73jH*ddS%OFG);ZNEQXMtT1GW^UM{ zW6VF974LZA*aQ=9e@*q5E+36%MYw)uS8xj?Uw+H$t@i5sH3!_y7D+GT)M%;+61HctPvNrm>aFiu+NjnoeF`QF+~P{(5&p2~VnHPNsYTivzDP z+YOD_(97PYi8F^wxxb9H&y}99_x8%t^PVJpX?~CSJ`%@7@3v$--(4;%T)3;%r_iTb z_G!bO%k4#adnSE%=e+yF%I&Pl)#cgJJWD)9`Swpetl$k_!p&=yGA6pBa)EZ|r^_w7 zEMUx4t91QxhVF;VK))R{msR5QSC;&Z<*>Mf*wG&=xs)D-TI#RYfA=g5?#c*|c!~9+ zj+Z}@N4b9DW+Hi@Q<&5!uJ-(Ndv7M6>$v<)=Lbkg?j$-txA(@%C<%@=H7KjijjJu{ z1km=nzuGX#>SR1Mkc$7orm7Y$@i{8RtBwXg8QynUuxx3?xSl>;MPA}IQoi7h*I?SL z{hMXp`z2Rn#FIzuOfULAjGK3f%gV_KYt>1OB7Iq+W;~EBnQVTtcdJ(^|HL`v!?dcJ zPBKz1HrP&=yQ~_D_M2iu>Fk=b%_mP>loz8K@Qm;)VOu5OFr$G#7X%G^L*}OWbyyf& ze+I^dXYxrkkN19_AxG5hkXoYC7hDu<#p7?>@7G)Nr1Ml(>GyN2;pjczt;Y0MckOI? zXMJyl;vV;GUJq-Y4lL)iRmakDqL7xCs?;f5TVti$L(YrzW4C9kq+`%7n2%MQ#iLT<}~@O4=Osk*-Z87Id>bc6;4$(mJ(i~kP?E05#|e_yHpv^Wbf2ZFJ$C6F$-5` z)Cw74Z58e>>GVlk4_TZDdtqTg(GbI%te>3eZeP$(FK^*TFYcKy*xS)T7hG+;;V+_B zoEZEWH}J$lRppkhW{;h9O6<&R%1T6ayM}>#|6koHlx97;#tja$esKZqPZ&hx#KH~U z(^Y(Q!LTAU5vT^23zSDM99cbv%0WL2WN~eXMl$LfB|p6O4(8o|y$Yk&zkM9yphK{j zti12Gk%Hy%sva*M7m+EWQIu_Qd`U`;LM*Wz19yylsI|dFY_`9j@ho4 zxuFwZkVkE^vg#(?Rj?_W|JJtMmy<-GjR|4049sbxb}ZWywmd6OrF7JZ z?dsoh<%3=h2$_7MM#y?%~G)jU{%<9ZNY?To&AV9975)wkFz<3kIvg8h)8UXqQU zk->hQzjjR(HHsZ*h!)n@q>#Smn={db(96@R!?;<#%{tfZmJ=Eq8^8Lv#*^aG>im z4EP2NHI$=!Oy0s!V_5a$HaNweF|fIGg5=F>nUcQ(SRG?XKM~J_c0NYr1q$y^5W3!r z{9W{|9(w<8%_n)4MWK;Fn`wSC**P}Ay(Koet+Y|~FZUZC8$A1*h6iE^nl7KYGqm1a zwPZ?oU99bdD`OjCPYv9)PeosKHA!!ApClLus9H{Dt)m~R8FT2w=b#1$Nq7=&WA&`X z729)9g-8e{v*j^YUjOc|lio5?A`<2nG!tQ?CYwSRCaRO-pDUdC^wg&w{q%8{AK^oT zE3*$)SjsmiF7rCd$V6srsTDa*sk=J~#?HCocI+qgoIK-v>ocC$$ntVdE?2w=sLQi7 zeHnEHX&*72O>@$17dslk_EyDYw!-~zsW1OWKXtv1*0-XSIVKSnSR`3-)69+tu>>uN zy~OibkWNJ=|7T#M!@*|y*7cz{~!M%x5R&X1r`%Q^Pc{xI#6yPVf5+kenF*%r7(q%H zr^FY1RSGraYqZXuIu&t)rc_ey&v<8>(~&A<-gm?H_8*k=0e`QV(tBK|x^0+%)S@hp z=h;5yGhS(_xVD30g`!xMiJ-cr;T9GU5L4y9wpy?IeJ15<0Z~+TE zfjtZFc+aSEEgbnq$D?jOpEN4^X!+#L#+f{H-=bdb!qa;z!UeTt^%ovF3ncxR-8gXs z{t`-A^2Jn$Iu}79TlhTYjhHRfwOl&qfsU@^{VKZ_hsFdKUplbfS?e zo6mJ+5)WOe+xQ-ug*K!4^N;x>S3OPrvM-PvKDws1JNRJZ?IX%#0~)u_Q?LqXY_LhU zzJ5;MMWeGW=1}u-SrSiky{$)lJB~pR4LQn9+``3353}PfE3}PO}lrAl*Bd>Iw z{iuJ3>1kNABUf-s%ionVJ5hsU|6Z2)F<+<4bZX&ECUdk(ntaheoSXtIHiTQ>&pU6K z7#UrGF%Q>Bm;+l8Es#}Q0Avz+CjuweZzm8EQyhhHq#YLWu*PQGid!f1sa@=U}TXFNmtW7 z>Wk=up)UqIVtr}Nuink0)~|TTw(O#FJ|-_i$wumm*5iViN0?C|oArZS!S}Adyz0b^ z4mT@=E3}xj`7`leo7DT`VayB+wHqq=^`ukg_6R)wCV)haJ&;ijZ%Vm^LGZ@J7+u+p zF?%vaF??@B?pnV8u);Bt_uWMY{`ApC{+%u6iS!@f&tRiPxHBb$+iJ+izsq)4l}{4( z@#TQQ^Z0u(&HnrKs_`DVj}76d+5UfkN%8L6|Nflh|7Oq}I$?i)v+CfT|G$2b>kAy# z5=ZCvC#gyN$>7We$hWN+3W;cgzwci;ZFF}3QmF5rop#5=NIch18D+Zyip z3Ks>qPDXZ0^7?5<+UWg5sw(DVFYnf-*foNWmYTmk3ldMnxqF8%pgxFgZGB{Qn2U6C zzk_-;x+w+T0B~NK(*19(Iw~tG+YabEV0JT}qm7WfO0vGS1E@q5d;6U1*^+X=QwrIS zz0Rh&%^BTv?QPAK+#U}Vaa)j_q5^OTg|E~&XVn`@5?N&vlN7RNReuX9?@x>REY%uj zf17t!NIPMuN;VAYSn6VN3ZUfWCu!s1n$^XY)rFxKc1|lO=DWzuB`X zurP;Sd_G|e5EaP^2HfWttlGeCE=^YxJ`H4FkkT4?}cSp{a& zAKjk1DRPks#*N`9I7+c8UklH^P-OfMEG8PgQ66q~3%$O+e){;c>slmM*&3n2!SMj{ zK>s;4{e>2=Ff)6vID}E)=JThFYfc5o6f7&CS9wi;(4p|h4-9krR^Ln?$zp;97o>yf z?K7|%fIJ7_c!2KywHh1*!PsN2x}#|bk~%g{PIaK)t}MU+2ygm4!znmr1;*)2BF>O6 zS{^XZEkHM&0r=WcE_i6x-Jk9N_=Wr+8372_zAm*>t61^%ojjE5T&g=_yHUdC_TuyK z>;7XRt*k!S3kjyi#;A-8>n}T_`wyT>!vxSdOHTn1=%S+D8F)WYjkLe5?aXn{fM*L~ zpapDM<42X9O(bKbC=b~B9u@0T715k~Thr}`0FbR# zxm!LcnW3;4b<3U{W1{lpBX!5}*^wMrS)fL6E!X=q=1xK_2@eo-_0Hbd#+n_j;#S=a z4-GW~eOdJrdg|#K@c?IK<>66TTU#UaG<&7wnl{t=4&*^E6F@^vkvyhVr%SGdNCW*! zbceeK8`nAA=2KUJs@pbncfh#mro zL`6`U1AIhRESxF<7dnbRvbnL5Xf`$kvu+riw**BvfGEu@ET~ynpuv2w{rz+ocsvP? z85-Gl0d_?G@@|d>doM@;!?rat0vPJr@QYJ3p!nAbNNhkZ!9z-2SXk($mL^`#>Mp)g zp9sN(ACB7>tE#B9+kEJo?*tm?ESMHHTl!fOb<^k-0H9iIM8T=lygfe~@5`X9sTn!Z z6rBnL7{KFNTf6#3pNErE0jPT2K&&?(aPcvM4w69ll$|ZHDaMtPIk_jK%dTA@2TA}!PBWnZNVDS8t|WPiMI*E-y~>xDm&cq-dCl9Hnqq|2;Z20< zi@P5cnVF;s!$-u^Kx+B{z|~kwTD`QhrOOU0LQBddtm~_&h&lA|IZa`lU z78!{G#t-=zAq3n{Ym#)xEx00jAxATf!6TBfL}Zn2D+ne#&UBzOe4=66fkh?dn??Q% zXfq!34L(@K&q;lvHZWd+>FMvjF9}Ik-RKfCZNLmX=Gx3-#;QR+e5?S+1iq$Rjr+Dk zcFlbS)^GCz{su@l91Nx?Po z!otJD7f<)^`^@1P2%2y$9X&mQBh~r=`NYli*LH5)jvNR8UtAR!9Z}WPM8RdT^70bh z5i$v&;>jr~#8nh>nDAdZ&7o67wAkKKmn@2lV(il3Lwj?K-#-8R(d7I4%Mf}nSXQta zqP-RW1gZ;}da^Gq<0GY3y2RJfe z5MOa#7){t%8nv*p3dLF=0J_U$zR+I`W`IshYXNcsK)rwuNGCGr9r(d_aR&cviIJaQ z9o!of_aPv^U_DoR)ZE${3#{7Uqcdj(Z1xwRC9cLWxNa2w(AYN3+~YF|^r<*qZFkU- ziyAb_ghQjE(4ZFy#EjD|@e*!8+i=UcfpUJZTpNThI)JK=Ku_ukR2$zWSL&Y>V)F7- zVX26mpu7$fa^RW)9Y_yS$pG_aWo2yxRDV8*5D*OuBnoHd=2Rgeuo8!80Avq&-gsTvp`(en{qF%SSCFlsFDV7BnME)X|1 zYzAs+OHhHVCWvt@XHFiS5`!3+y@&^H-;xE!*MekjW<+=>87Z)$Bqt?-HOQ2EoBT;| zu$t`WfCmV^9=0ze4>g$r$?2d326BtZt+osx#1r2 zM#_Qsr^>^J59h*SVlsZkd}l~3z*2S^E4SYcdaTIj7ZzGJgtBO58@?n$#HStNwmy{U z!9nZr=NE)}1+N5nTp+zk^zOerjg80X1<;l)Ws(M}P2%oe%MS9CTbXE5k(7J|vX(Zi zKJ@UUvpK=(5+fF9az2$9;d~`EbZ8ZvFf3Ad-@F=>RFLVwAMl}d_x5wqC$64DoIzRZ zK;TY%3gC$0x2f6kN)YeM^l+~$j4)WV)J0EK2&IGpoR{fb#SN7dxz-%xMpc+TE*x}g zguDmtcx~jAw+8V|ut`$^CtP>YTL(fq(H20jJPEY0Jpq@kE+gY7wi4OQ45-*4K*c+O zfHpDVfL%psvhhl^?kk{4t-JymBP2fMdpo#@y3tnH3af3hoHV{H5U_#7BaRqrU?pZ@ znx;Z*cPWTXTwEV)v2p0!2Y5@bTmYJ~LQMx6uIpRU#KK zpDFkRv7Kp!Mk~Ic?yaiD(%3~$@SosP0_l$r;@z3gyqN;}X<{^A3ceHYHTalUqY>nG$0*yvzwo#q`KvxYlNnu{zR5{Kwi%5+MXk<1R7yv{1py$2g1h8OIQrn?! zSU;i@eZ5l~#b+G_vacB+pFRt!)x>?cP`T%&TV#6&C>!<|wD*8SwFsU_J}|BC5IHzI zGj%c3?WwbSFo|@&G>8{gD~`~SN*r_oIc)FNBVvoBV4xuFF5U(_o=HWD0A;Tu8^)JS zin_r=%Yv-v*AL-CjJYFMAuUt|$^tL~>Tvw&p}^qLrKe{o4uJtftTML(JaQ)pP8+$% z>dW7v1-BcW?fMOX!~1?lr!Vbb6+CcO7M7cQL%?K~eqP^WDFt_!o}J`JLqi)eZo=h& z(ZSHcR%}#M)ZvrBrdCMQDrN;~aoEwsKzs={CS*d5qf2H$h~l>1V@f1$hbIl7Yan&F z3-yMKygatdb>-KMZWVgBU))_hlA&Lz2W)=6ki&cgH49b%t3!ALnqVR4x%XZh)fZ8Qd!&$BhznNP!>Ug3J)?A`P}9Fru`Aq7;*KT_C**#F3PT zF=%+cm`|S+Z$!w}1zqgQZ5G48s5nAh-Lf~&9B4RO(=~I6U(nDX0~bdG<(HM|fF_3u z07c>@d>=#BkKclvvZK2@4G1b8!U|pN#6Jr*<&KoRMY1q61BjBFe5V8>8lBq3r}hnp zgsU|`=Fs9j)7&0t9cF^V1Qs)m){FjhhKZ-9M=#2S|V{F{4{?4ikI`xQUQaPLtc8&X(ILe&wmk3bS& z8tZ!PT=#(MWX!KE4jc{LOP%kjp%B!$q5j2%bm;Z(at*ah^)Gz<_Fdw~sFxh*9xG&Ss^DK&t$8h^USNO2`)Eso=`)=n(i1RK zDnss0WXh|4!UBzk+LzkABn3cJP^<%-BgEju1QGNrp?bu&|4(n_3CFp&$wPZ3IyWG8 z!jECg?u2iP36XO7*o~+i_mRIA0ui(SN#Wi2cc4uDq~1Gee~F6p&b_^=W&kxY(a_9R zJKx+ZhSpClb!s~bN=wK?z-$0+7_hjHiS{}84^sq@3F0v~3mcm(Q3=B83z2%@CeSVr z6Fw-W4p#1eMSl|PAW*7@?5|;V4frRR;0aMPLY8S<*a!KS+~R)ySM}F1-)i8T2p@Q& z4kcQ)`^U__mZr-LHta?*5;UOAuYfe|!!X)UaXAlOgqw0bA}44~0txmJ=2d(&+za zBT&P-ysREM=1O@BY=GEDx&n-H<$u<}ALtt>AWec~=?`_pxIIL>f$sgCKqC3z*B(GN zj>A{|!$1N2aZ=*@@qnuVzLwa%Xd0y@ehC*u*xVlC3jFh`Vm|I$P243-COpo+IV6D8 zukPOucm>p!M(w|eCoJ-5qxT=vFZK)Qrj%ZXH9rkq34z`HrWia|!))s4S`OkeJ~9F1 z_V2DV35jIuJ;I>quS*H3zjx>lb%fD90lIKlFuounk;R`E*PZ_`#{bRWe%lQrhp6ZP zbTI+~0)SoM?1%pa$rAk^Y#gD$jfNsNrvMCVK~iQ|LvCzhLK}TH$GVU2xxw(cyMI=O zVI0h~Ww zzAqA2Z8M-4PKhziQDvtiY(8#@mx7%fZ3ClmX>P}`W2zI1IlFH zS0WmdFG6Ml#*Do#wsZ_MCJH zFD}7ePHh()4g>ulScw^84!-SG$%M+!M?h%?b_R9o6uzu_VSGk@%kgoN5YQIFIE4g}YmZmLpML4HJ7^c7EswiM`V4XJ=|U57Rb|3<;% zE|e|%iRhP&G)laOynFzWCQ=XDlyRHiO@SLGomlz_0o&oyX_BsI62V0s$^@xX{k*d!w7MXh?aeg}Vw!H1 zx`_3oV(Wm~5;_=PV{I%g+d*(++*TkD$~f?;^L>R1Kt>iN?p+}Uly*ego3OAj@bOxO zPhyBV4saFb!2MN%tJul|!M{kk6w=CiKpqjR1K*2Y8X$ECY#_u|j@WW=&=jyZwnK-D ziq^BY2m02* zujj6X&`C>2{j^QPlxhQ4#i+C7%l2vDe}IHkhjxwe<5`5Va>752K%RAE()aIj$*HLq zd{3dET`k=P$)%As6ph4$+e1vh{~HGQj=G>KAl7`+$R?9^XzB1;_ue8FF!(|DtQ3W~ zOlWJ(zz+Qc9kz<@T!@fFPBC;4=o1iAFycFi4QV2kU^-N{(A06N+Ns&U8wp8q|^n`e|R(W%9^qkx6P?&y=YqGLW=p%D?5(52}uu-2ZNnylb@ z%KW~`1Uv;RRQr(TxXoqP5tkWAHfFKv`n(hu&j1w-5u;V+n#*V1o7AQ6t&7Zix@0IH zbxRuQ2z-$i6W=2(Y;3xCnne-=F7VIPUyp+xLm2Roen0x>3UvnlJCjK_@tV*cKyZeI z?60=A_EGVv4jg{Ad3UaP6?n?-fZAId$hKgCMo(Se69H|2+7SsLeVhTxt_<)QRM5Yf z!DJDeDX?j>ZMVQRs4FWYK?E$h+V_+!5{*XZInAm;I#BITVw>xizdNfiQy+lwr{^~@ zZa$UqRj=#43$`}aF1qXdh0<$jmv_rZ|GDg8T90#YbFBHWPEK&Ns0s_K%yACLRgBI* zY58^8p6bw5hBD0@T5ej!_Q`hL@|G4BZTQMPPk_V@b&79Si<@n&&qL%T?q&whRi)9z z%WxK9g#7g zUtk6{pc_bDtU{Hi0X9qQ0)V;+IEt#j`UoAs*aBY@m%-&6@Ep-gtzX`c2eHpJjKU4Q ztftzV$5e&&u|9(QGuKS^UAi=K$O3VRuCwN*eS_7fQtg4(v~8ehI?itZd?7O#WP=r+ zrO+3QGl$)#Y{Mne4-E%wXXiEF>UfY$Ho|{8evk~x-B9S&0f%j6MMsBfWYdI~HHlAr zm)qj>AnU}Sj0s1}tLyxYPi362$32bs%-h?KV57YEPQI)H4CZV-Kr-q0hr-bw1LEJJ zes48f(b}JOjT|G3#9@tFz^T%ztg6ZcCnCVEZiOe&muIGI`==hw13ppcq5iT+px@&V zK5ulO=t(WQ^WNQ>#^w`U17)5rd+X(VvIgFV7oVupk+$=1OED&1*J{(=6eJ-jZ zBKM04+IzH^*^TZ@;u#WtK0b6sg&u@rC~uYA+z3vUK#3R7PH_y5ox}-=;%&777uGgL zgJyy6^A*w4L96z6xmqhF`PDM3JmuA^!(hlWvibxhQ8i^cdT2X^*qDTaH986sbs&w2 zE7RWujuuue7uI=nydjPU;LeXkqKa`-lky4|RWaErNLGre$I)XkN*3Lg*)pb2lhHAL z))`OB`NUl-+kUdTxU-u1vK}1#MNAPp&04;Eg#Wc+#vUQ0WXM}lp-!E$ZXiIX%qtQ| zT0)Na$2q*D_)rwgyKhk3(e;n5Xr1r5?3liAebdvIteV1?B>Cp)97A)rKDAKiNz-;-G;bzCGvXd{=+b5QwVl)8m5igYt8 z$>XLX9AQB2?wOu|CzSw;P9^3vvpfC#qt0r<;x(q=^VlkTWv3q*pAUsM3U zu;R9RZ!#hQEB>1^;1^c>_ZxqsmZ%T?uKv#e@tV2V}xBYhgLvaBb*89@A>X*3GKos2un)^ z`abA*t`hZApc9}@cXo(DypqYu*_rsSZfjWeeDIsZ_zW%zlo^%bhz0mVp&3qn;glQ` zRQu0vS3$PvDiYh8(JvksUu48~-B65lVfLRTDJLYn|OmX^hUz z#N}!x2Y46jL^Rhdn%BlmqxnR%fk>s3O22};Dppr$s>>T&TiLN(B*Eu#-&iKgOMYk2 zZOP3VP6oTJ)~&*R_@CI2`@aVN|5uiPe-2ovtFHmi;4$BTrY>tG89#eE3ShlKPjeWQ z(fm)w8;*svT05%_)?d+lXc3d0-6}BfH!qx-c&=geu|y4QO*hUezDPM@S_Pfk=bwlF zK2}F^qA0&A)V$r06-h z=vMy5mUFq*r$_JpDzcDOs5E`Xcf$3x>u3Q(MhV>@WrRgZovr>8B7aYQ?Z93iZmpxK ziyMPWGeJzxTi3>lX|Hu0M<7j~Effbb8d^qaUsZ^*_ovTpDb{rIv~lU{qqRL(>oc0@ z9`u86%KJo-;fR~}0o;{L0bBcF`X+?U1=g?oX8+%*LjEhK$UnQ}{S*-_wl+SV-Q|M8 zto4+MaL7pCq^LQ{NWyR(nx3ntfaw9!yJ+ZCUXmtuqJg(J!^U$~8`$Fu{ewtu8?we? zCkFp|+EQx8_UmsB)sjY6hnRcT{U{37RQstS9!9v_ey5T+!B-#6r}4MYJ-;qX&0T|$ z7K0n=a}=}-nPsW^#`X$FdAoIM%CUhvo#16-#i-9~A

u;RV%2N;S2A-o+4&4|V7H z>>uWg+@G0B3$1wf1ckmkqM{GdV!NY&A7!5ss(@%3zno(CA4(`#9ov7r=kGU){|fU} z2a!gFvqbs~9lhAWh}cXbzfDSChFmnqI(nu&W!0#sC)*CM5cT*2Ib#(Jn4gIRC3Vd&zNVJEt7;s5Jhj9- z!Mm>$PJD1tteMSsttR8G{AB*_QmPb@JAx}w6VVXie1iMQxTNUj?Opi=bx{{zV4rLI zIXOKLr*7xMc&cPF)^w#0nCL1#p-!_7J;}B*RiviVW%HbQ4n7e z^t;tim4WUUeRHVb&BjJNh6{JC8rq%p}UOjTpuXsuYh8k z`aIO@YWnZpBX6qGiKNXRyM%SPwTdOvdC~3gBF*nmO8Fy{ozJaryP1D|p{=R?I(reV z*EhUXQijuek%?6a5V+*Ca5B|>bxxmnMKgQF6dOV{N9y-8s~4I4a4aDgEpG#Ta6Sg% z6p5~*=0l(WE~=uEm}+U!;YhFk{tU^flh7F$CHuGeDKRQZW*{vDFvm_PK5(G;mgz;L zjl!v^&z8dcL}{iU$x}1iBY!$3BtEk_BD@HFC_|B}if$zpp*A8?rxRcP0W`t{l@p7t z&|2`Em8RUaap4%ZTRiOo2NVBh{7CA5oQ_m6S!a;FB%-cQ&i4l8FT>XNKgJ=1^B=J z!3*j$du9eYk&#S?-1jaR9r*XI;U<2-iH2233M?H8!Di`q04XFGM9Sgzjtw<)AVy5AWiAsLPm)6&a?^}i5(q$qgt zyo4|G3P#DOs;a;KuW-vn^3-=4o`MYpw@`%be6N`%c1$~Z!9X#XZTq;;l+H1aPLomz z>5-3j)oGDcbX{(72i||T?{>lpHc|K@@2dAiD3NWIEeQU;;}ek=GDsMnsQ%d`i!I#l zfMEXN+OYKAo%YHd-Vfbb`+l!)4S%QJ0D* z%O!6hEV|YYplAIrK1Ph_o?@9C(6_8Zy?fl;vOO+~cyFjS5UX!7*%Pa@u+7a87sptr ziM&FtI*(mH!27ECJ6FVifnwHp9<8{N@w8cIb6&LaM2vVsm%eyrc!lfPNXB?PO*1sZqFPEq{#u*vPq~ zuJBsJdbyB&iDu>(VMlk1+(A@16U#HfGoEpF{X9dMu=eL}ma~m+D~mT{PMS`y3zJi2 zh-IX_V{!>zs3=vOKce4(^YXrD6Stt+xqUy%L@2R+QbLq;dA{+MP21HN%Q?lubXE=L zEE)Fed85f)P9L}FW2V2il-)n%r-neWu-9uQl@4mB1r9bZPA$3hn6kHu47rx8xaW%x zsmaHvux=#_B|jEWb;wcDwJZMxJLPE{%T2qw9=W=Nd2AP~EGJFQAJeEq(cbs*_61|!< zip{FnUiVL0o!fVfYvi#uH;kDXIT9L{8E05J1Jb5X)v1~;HR9&!#f?jr<*-8bMTG<* zjZ_IKbXcf*5}D<52PT4;kw^pQB5HhtG{)lX1HZKSF;e=f3*d3yV)b;f?F+&Pd9nrT3gQQ|QLLCJVz_aBqg)MB#&_X_lj- zR0pvun^QJnW1Y+k@^f?ZFz z4c_`m#VHS?N+9zGkx7| za7-<__he&%u2qOtrx&TkMauk= z5C1n9 zrHR?JP_9hFqa8HETqbo{)n4iidC&jlWUC%K8iiXi*)XxJxl$RmUXeMfUWzVM|CIdD zluZG>fRqQ$hcN80K1py+!ynyeDJd39728V#`c0V z;*@hoE)y?(7wTNx@^Lqc(1M9cHa3k!i$L$+NF&?h!~!?xHKVe%Q`8iD?g^p^*adbCUVJBK?%vwX z5{W=)x}+cfRCGJLFG1GiELF z7`O4}INyO*LtN}m)-BztbX)LjQjyM<#|p=`XX*FE>jGN&=iNneY~_sLMA2^~qVDx5 z!=1pfU0?RploMY4D+W1UmtD@S;Du`N^RN(9 zkC)gAn&~L!yJ~D)-_@2@GN`jEIYn*DURYE=Fg@?qm^SArCf^z8H(KM4_!N7SAU~5y{Hd!~HRnB1y3uH~R;W@=5#Cigkc`89>NH2Q%U6Qu z{S~8~z;xxN8JE>8sY9|67Rl!tjy?q+HEFIUN5x@tX>zj^jU7}F4s(xf!d8YIHUZS@M>8N)vGtA?3D9qMJa*msqT%(;~hj-Nl*&@TKnm{&hH zC+StM12XB=t80GTp~GE$d>I&rvq2d#hpJP;vYYZiS%$4iam;B*hh&6AlU-e_tSKM06-0pkDda zjW|-S;nW}biz^}bUeJ6%1d_;8w>qrs(-oy9);uJ7!!>WnB_ zze1BE(q47lHj?`X6g8q%Cf?cMLxS47gYIUGO{uFB(Y_rmEG)(a3)&-{@%r=FDs5L$ zB8o4Wp?sTW!z8ms_o|nsJTl=jZ0O8++^SkFg^+slq(HY*zSB}%2DqU?9{z&5mQ6;t zowd>OI+5#qb%>$KkLf_xB4b=0mjR3&3xntblWu2Jh+I27mhTL9lwax*29!=lv0Xo( zW`+7cm^%-ssIqR)V{Wm9Rsj_RS_P3LC^?$|0m(U|NGh^~B7*^Fksvtkgw}fkR&A{ zR&1gwAr(#4@KHfO@SGW@Wp-CG<87epNA%{|$ zrBvQLO+|ko(zBu?_oMpz*d{Y;`IYSQ)F88!50OjvS6>P3<~$Lw3kfAaYKbn9uB(qP zvVO3L=)K=Uf93c>z`GM65fN!UJz7vd1je3$4(u6RGRBdGc!+BqxBn8O~ zzOLtn*XlmMW}*0@oF{-yluD$+?35^X3d027Tl&1dMZAd!%Yy-+g@= zZRDUuuypd|<5l;AYiZWvrw}D9^D$=3vv?Zv&@(^K@8^X7zc* zSJuQI-1sOl<6>*pu*u=Pa}{s?y7{EMk|q{Yd1p*j^vS{FE24QU)TI+mj$Q{V^n!;P zD%E!;(tNp$=Q_M?G(aqvZ+_dT+XC{!@ML|SyL}6pT^M0s_F*pKYt#p`6JPE^P7*gQ zA@|8*Io<>Nna95NXQ{8`Igmlaj|cw45N?+p zi2BzZACezxJ*1)belGpC-(c?#lBhrbxqV~s_#dnYiPzD`|Jb4;`G54mGXxTT5fS|0 zl$QVSDd)o^)iI{rAP=~2u`^R4fjT_Ee?f)K*cx^yr9wN8Rt8?-ha&7QK<^MBP9112 z26`2ujn(%;QXtT4IamScmBHiry}Bwun?O)so&OxKJLZoK>p;va(bOVNm~iP5kM|Ljotn86f=n&Q0-6%_t(alp%)0^AVLqpdl1C6 zW*n+g$Mo^2{ie@6BnzO#r*PJF)!z;8Uxk!rA3rJpb%9hJ>M!xW3p*jh^B+IkWFRU3 zcSGSM5>aqEs9?=GSWF+f@Aa3gr+HMfWJV-z>odhu`89N*4aU#0z@q_flmU2e9)2YT zn8G!YC!dKRX+i;70-}g^Vg*qITUdC;cZljLWU%@nJq$a#NPcwp$q#D+2j7?=CU);l z6=XQlIPu#-1}TIo$-Q?E09Jd!bv&@8q{oh79cQ#G2g)@8KIIej;YWz+CD?wKL4#&G zpY{9`5l>*(Ar1%M_P2*T$*?Yj)j}YZT)u|?KXiCN#zDTnqo=k|Y)7ixB}Msoc+TQ{ zQ~|TESR>@2plqfKRNGrddlJzuz+iyhX!#Mj+x50ISuWAXdJwRKJqM^Q-4*`gZM+z$ zMB<&k9Q^?lU8b1iqdU{I%g*iIp20y)wulp~cW9Y+fn$ipf`Up#Rn=(PFB&Le&{@gF z3uhuympq)4!^&@|Y%7EOrwrBti2Woq36M2Fj9u>d{uFMS%&UGW0%V%Hu z4%dN2Iz;sX`~yHko7EZUN{o752c9^9VU&r;0GJq1i2Okn2r@#^*0vBv8GE2iy5fr6 zXF%nm34jV|DDG>F%g6D}Kz>rCBD;5!XWEP`%0mh_XYxZ4&XPi}1qA}K#KyTyr z##Rip1%ePZ1;E14@JpvH|G6JvFNiOfd)I*+F7()Rk&V8_=vX)dNcDZ!@D$Llh%9`( zs8!)s3dj*c5&%sB>L#7#RoHxY2l87@PcI&{Dficb^KfZ$9Z1HScS1P&E+VObfDF*2 z)HKS#Ka+cYe-F<82dV_9(_}7gmfD`JS~RkbCo!uE>d8SfL5K>tkbwSQ&jl*qLRYz) zF-JH>LM&4v=}QL++it8;6%?-n9_y9}>-a z_W*v8QiA7zNGK3h7O2R8>Ot7=2sX{6pVBg3s*lD%4}eA|-|G$JKo|O<&jEoLqQ!!e z^0$H6WmU^o0OlJyx^d%6X5eB0b=d@a5?VK+1jpeKB?EM>@h44X0-#U;<2OWIy#-xC z4Nx^0I~-E^4$#%@w>OFA3twyV@uyFpo&p6-MBPYh439Zk}-N5Vu%)o8l!Pf7wKGW$o@Y%+6bzua_feb)d>Hy9_41^ixwIPfMO$cud z0~rkn4Ot;;B`A%;7!axrN+Cu9fHg_L0Q65!;|ex{xGv1OB3npO0yqw&q6JCRsY#8! zVPE~cVy;ELkaXy(>%k?BHei$h-v#|F$nIo9sMs`KfgXwlXryRJhlvmxot~SWh&}N? z%eD0FJ>W-BwhSpl3?K|)ZsqsqmCdIsz8%7EEY!i} zyL|ubYk1EhAt~vCW%nC#7l5{$@C6zj6TlgVFjetBHJcYkf`~q$3Db<-BNY*;k^7G&_i^ z3xPNV9x#3IJB%1wVJ8KI+ycc7BEbW>YmQFon?Zhq6yS-0PPRF{7woxM53=hCd%2IN z43B!90y6(3M)a=q_!h0``C z)hm_${6m48njpi0PXRFy0@#D=(5_rQ=`h`Ol~&YE1F-2MWaktBs04Gd1QH-U5L`UE z{->k;Lr_Dt(~QbRUlRwsY;DHc69eTed*vag`X$+zl%%92k143}3p?4?>OiNfs)hq9 z%OnL_%^AMN@xPy)TKlA4kyN=gRT=0m0o>$V`C{PROUf4V&kzL$$SDym!r;azAHs7p zK#n9CxR4hh$N-JWnuy&jq}>NWAA-DtT^n#3J`R*9Lf2i1#0+W}FhD{CFaRGBUVPUo zRB=uUtqFjK$5o5$A3EraAMm)B*f|Acwld&N-32D=0SHC5!*qj?c!ysvEX>HvWahmB z3WU|MgicV~SbzVm>uuvjsBC*6@O5BkF+HHM@*WGJJteluyjFb~^6rz$ph5+R8pIwh zl_vg+%e0o31>I{{@@hcd!Ab-PFZ_i_Y$ogUx849?MmPNW=>rp!I`Gq2tV31)U^-;G zJ%pQwECDwm)YaMF-w!w;$Ssb}(4Ud}chYCslH`Q-KS-EB8ORJ+DDZLcc%XNNK)Pp; zjsO(277!qjj43%V?2*qYu14K@rggztr< z7TycMBRAd?^50{@7j%UiXb*dW6X4{jcA5DA)i4+oFSl%Jxe^u>7fHUG>~qC{w&#VcW)kw;X%3sSX?zWHXfzl zk`C#%Dz@h3B`bz1xInsr0P8`sI`|#%n;^CVlW$)`i~ju#GTQ}yObQXiAMQKiibv`z z3fPT8a)&9RJ6ai68gIh%uQDCA0i9~QKCF|O?J$+V%#!wGmQEI9ygW=2p^20#osYO8P850_R76CmY)VpZ5Rt*XXCwF>C`}PL`o$pOB$!k{7axzT z+(>==)?nJahiH*du>x8ayepBcWblk3G6DGW4^Ccre)vWhH~FOKtnS@)L&;U>eJ~hd zN(w^H;@gd{TCzy4{Kzg*3OvRUcX*Z{hml5{HiKDJRE7GW&aDrilbo=x)(gIK8_JJ2 zlY4wSfdBUH7?_Uyd_)30ALI%4O>1OybTZy`wq?i4CTwqv2|9fNk2Sx%@#S=7GZf{%0GjJJ zZ?5&*HHjb%0c17?`7oco{yZkHB5QII1=u%|Q34!ND`2~YAe@AZ;YbPv#3+KQ2a!?^ z4?htVi-Ha|!B@E&0KSLYdO$cw3o8vPECkixT20tq^;seFX9Odag~2F;i}@kBJwo|* z*WNRH1Rn`&AE@LCgBPqIXec?!VqXIN8vz#%nLl7%24|?_zdb3^%FoCs4%6bf(}LtYp|vUS2Eg%Q+KtF?_`jBcgc(w4 zcqH5!)CCcP22AzU-Q}N%h(&$w5~{ueg9Db0hKo;4VDa;?6xKgRys?IrP3tUAGXL0J zi1vN@ax4R~BQQV$5oE0d3(88y${^882MnZK2G<9ez)nIBLeONW6j~ew`mR7QNDqp8 zjj&oE2!y&dpd0mnzuOEYMo^p=(M12KI}7GjFP~&l?W*yCAsA1eMjkHXaFkU!&ws7K zhkB|lVE1AEA4~RJ_S&x9^TGemB>dywNd7yP^Zy4M2>$^Oag)jKwt(WqZ?tm2uz*j6 zx*yf|c5kom8f5hOp#}uc`vO)xh`#2WqYMNxIIr|&?RyQn{koA5kTyVi8ivj7nN3$W zm9e<7bq^WU)GQ@M@06Q2`ySL9Se$*_@WJ5sx7B|PGRYa^grcoN;wzlyqT`Qp#m2{T zfj6^qX%uj6G9u4&4~d_cNE?f2yi2t23r%5iJbA>o>+Rc1hieY{2fY2b{}IEBKTaxz ztEgrz)@Wf+{S4vP?__*0pZ}8X5^o~Xl&2OxT>gDNJJnuLcN%1|MJ;>xq6xQfv7^2H zazYbpoSeCn)Azs)JA2Y9lF_F^IV9(PI~aEN5@k?Lc!P1cT>9L{?K`{Hhf_6CA*19i ztW)nCIBoiS(2kj6l3)IV0ZoZ=+hXt!6$I*M_^UTfY-CsE;JKTo zc%UPe?q%nSQq8o{z$U&xJ-(rOWdH1JEU(sOQ~m^X&nxKz79IT}7;x4O^Iyc_v$yx1 zsd{;R@4CITlX)px-|uAg~N)tkOB2F?sVm!RO}emA*gY zp;Wuv(Ag@k99f*lws_8zySQtGOI5#sgOH>7U;%q-=gg@loE=eAr0v4-bG>=^LH?21 zJ(rdu4@o2vb>!fy(VhO!0V5JU*TIpik486~fisg-sg$p%&U6<@x~@!j=HEaw?OeFQ zrPOzyd($9SUv&P}07_D6@Aq&qByiDQy^W9ZW?Nta(Y3id9E+=FoNyysIfLd;50cS?@%x1P9Z|#z6BQShIj_K(K}@TUcBKhPWMk>P z$>Lgr_I;7{&ep93I`?IsUaunEp7k$+wI-WIx~@j{-GjdC?nP7KBKqOzk!!Nw*$fTY z@#T_YI)&;SxiVT$+&Z}PZoO-{+?_kq*uTEyuh$Y!&ucdKd`jhIgZr+Y#lWwF=_IP@ zL0>~bE+aLe$rM|_wi)i)mUMiI<9*A)o#n8`5j3PM4jr|Cmc|(Tj+jjmH|80KEsX1tj#=# z%X)?;IW7Alc}`A0VIKKvu1v$8ZP!7C%oG&Gn<;n4Kjc4}cyJWl5gpfQ`&gW3KjSv` zhH|7~>i)Ek<4paENO8N>^hvsHyEk*M={!#t+o2aqgaT)9iMn&$x!F8*^_AtwuX>)k zPnCVhFL?D|AEW1wQG!l9kotl^a*I$ z$PddOdIfODmmCCX4mXXDKMk$DOxJ65g1r=dj;6ka*g!J()Y9&J)-wf9khw&#+yqUfiRXZo(v;p3^Zw$> z`%6q66XKQq4-39l)vhSbr&;3F7<4`;+eI#V&8$`i8YcD1ua8gDyg0cW(^K(zo=wsH zU7w~YRhmd~VZ2}GfI1G>P+<2xEYRbtd)C8sDWU_X-;~_IyQR!zlkz50E6+jft@7Po zR=3yb>h^lxe|qd^e|r_e_U!gjCpGmFF*bG?`G5GRaX(Fv`8@}R`PWv=nnfTzCb)jJN*%v7h6g@@pOs_qcwZ zPUfIq(cNvA5oxK`Q<-5~%b&sn-=m7FH^m?{VM;mjF`DYmrO-p@izIzkN||A>SKr@Y z*9!V*5X_EQ#S4H7nMhF#6q)ClpGL*bPY({L`{9fNu1bM7nd3*J$`{vAy{UMP zT;;(!S2t1tAF#vAUqswd>d%*ano4MK*tzbA*!s@${!-V3cq!U857*!<|Ec{u_AFF0;SL3QIs%>!)?=ahR?p_! zBQEIXmEvLdjjxHmOZ0+5*vbNBe0Mg^RfoMLBT()dF-HlsqOe_G7CVNx+|h%iRc&=F zqY;IXq+!*+4c`3W0Pa5b*S;mM0swyeSTbIto|`md>wVv9xL=}FrKpUpe;np7p+oV+ z&n09=R9>5-`CX&QyZ&oPtu%Q5YlgUiH{v*0(+8V(_UV$P7hANz09nE=j`i!FN+J;! zfjMf_smmnEN@qUkCtO%6oYmOzzFzaPlKY&rb>oUU2@^!IEsZ8V?(r=roo#j8yc0WV zRl)OEs{-0tkyDtMyg&{7_|UbbgzPu9BUn(}6xQQcCi`18WgGsVw`;UA|Hfe?^; zwc8>jRZFi(rd6d58Cd;8VPGKr#?UY%#Vf^smCK6!pHs)XwVpGRtrsN&FKb^O4}uJw zfyt8nw>V{>$#yT5B*JM*X8d})zh0e*7l%Q!`>?2mlQ zsowQFp@-i4Nj#bD_(b8yLj900;;DILhVzZ~{^^SuHf&i2RsDKjgw)S=3Z8k!BHZ%g z+Gy0YyUW4Hp^az#kW3PDDg5k2@!gH@TeRsS)Yu<8gQ-1J=~O%aa#zr( zqj%Snx#A{i{jxziSR$vtNW5*w5x15OiVIK6gU5Os|(7758uTKFcy5vMEId z-raCc>zFK^siPG2yff&6tLrYd!02_gGdR!_&>j!vQm18~^G+^m$56hs*b$=)k-Z}` z$dm5bch3Lz1=s!n5*r+3U~Oq`et~nAlV&(6o!&M(8qMVy4skyoX&q;EF^^44TA}$z zq7&q1-RT|Xs{K6fZub-nXYJC&ZxZL+Bv`M_VGOJK)hq4{i)fv|XA_$u7dQTTsy5@M zQnwa3>3f8H3QsQDa%cF7O9}RseB*M2pZ6oEL?xO#3$>SMtlLh>XDh#1FBE)#oRk=~ zdPM`nM6a3s2(3>b_gsq?{r*4$i=ppGN0m90)vY-9jD3=lrHOC$`CEY2ZRAy8{Dwk* zFlEno1N@rkbi0ETDYw~hC^@so)(a1(Z+``P_NB*+kWV}+6Loi*FH5;LdYS0n^Y@&) zj?ir5IQ~H1WJ7}ItHshwBHx-HQVNQyS*t0zrP8@tl==j@%MWf(*y6Y6|BC6bYVUs} zzce47t$5wT07Iu^qZ@f8ohR+JRjY#q za?JTMnPb!m-%_tt?ks<=k7%EJmLV2t$JbQWqi`ouLbAVs>jKqtGn)v%rnUg>>j$c6 z8M8ZhEd9{*1ah(jXSyIEv^9UgsD!BUvhN6c~q4e+r zX9h!*+TG1ZOr>)$o#u=0&9UW;efzX?(|B|I9VX+@g4|(z=#;Gu-8kC7td97#cb9m6 z*KJKLOu4PGDYhP8L6q|~OgC3Hf1VUMKuEN^buDeOIoObvw3tmj)RLt}2c=@@t~Vxk zE;3(}FKeI<%G( zM6(K>I7>Mnj~B>l>qKD}Ab`u<)1F~E$Bgf^+G4M&7r>((?_ifDDk)U6G8JV5m>0PM zF{naira__1ftUWY@5cn&Y3^j&KC+b%4OP6PE4UzAM>q#XP025<)zQjo4V+YKiYD5d zWk|8Jiw-`zn=ZJH!lnq!T99)P-c)-y=#_15UAnkq==xZ|3J=Mh)W~8y#)aCh8dED( z51cx}LEl=cDCLK-H7iiF?9apo5I&s$Y^1&1cgnmyYD!%`O^#^kDkqTd*vuBu8#i;bi_8|Usef)#>3soGKxN$%1%GWA#KvR^F3)P$5X>+~)2Mh@ zdizsvNR`>>NM3O|=0hOdF!Is${$wu^4XwYLdZ|WdvSps$OM`b)-{-hY7ge8Qh#V zTXaA3WjO3Fj2zXQo0H4-Q(qYJiHVb7%IJrEzq&=6#b#Xc2>R4#|(vVB) z6}ncm=SHqvoIvI+F{fK5w=8>Jw{{ivl)Hp~i42+yKj7=I@Hft7_=qoorhwA*fD{i8 zZufAh;-SxoUg*&|p&>jssj$AW;Rt}(~?OYQAvROgIbM_Mt(dHOA*ygac@ z6XEYrdIXlSPoedc8HB7H48``>r*g6AfWXe%JlsPSOe?Cocsdnqdh3Lkr1M-`+NG?L z!#vYkj^BD-snD)aX*7J(+XwgyBB%IeIR&-m$nzofWVZVjbDhoTg ze9=0j57WD#JE;(v@^+Dy8f8i#CDzaeV9JKeU6Rex|+> z!qyIFZoPx{1RM5FK;rq4C>Z~-2SeW|EV+ko)6zatl&-=YOI^(J};=K_aH`B>Hrx@MG;^LKJ zW!&xs2zqYl((>DD`08)RSFF#f^5p1aE}2K#mMCW44st2eWh(pK{ac{iaX!=GHhI(D z_p#WS+Oa}4{KGI8rkAYQqmp#0v2qj3=t~?)Yc!sLQiEd+8M>)6G|H1A3uSVVin0w$ z=!uO|uE{dJoKXU%U4<Pk(E_65_DziazCps%pxATvKm9tWS?1Jaz_c9b!*lx zrKOc>L~5jlL016NwwYQqT{EWJ)TEnIU2(-hPK}9eY3l2v%GO84P3D|@uNsGsEcF|T zkfQFKUEB;3Q`e9s7s*_P;)x5xp_9dwB9fAeeoQ$J*c`HABRew;BFg zLS=!*^&bQ|&#{fI@~iruWPSNcAyszn#$ zMznUCxW;q%F=}A#u^xoYAPm>0rOMir6VI+|(i3imQZ&~rv-?rpev1W3mY4P(IJ@KIUsZ{!M#svYk-RkMlI@8+B5k9(StY8vGpO@_e(! zxv@XqVbR^uGcXxOm!G&%pF&Sqw&G1^vwElQ_V!na@iL=!7B!Kknt2VZ<^<1)umSh6 zltw*j6;)H(;Ij_q0?pZd(?Oix*fzNEfLcHjvU{kd?x%*5JKWwc@_H7Wkhpp?ry zflp2eWD|PJX~SBDT^{ViT0Io%X?ewAo++Bz^t#F4x}Uf#r{t8eojo*hq{wV4D{NlZ zkG&CJpb)Cz`# z7~fKwD8X)SrM8%q-2)YG<;;IJ>8m%#$La=6xs*qbJSjHPvpaz-v6CM-%zkG+&aRWk z#8;ffdopbQjSr`DT36WXD5r%}?M6Y1aJZK+(3wG?(Wc~i9^MiG`VqU{cIxny@&)hL z_iYOb&)qd0$)Yk*R8r!%@K(}Vw2A%VK7*nUv!$8z)^u<!$Cb%}UbW8Q>PTi2Y!Kjwq`Dt}ia5GrbA&}dA@f3|}ubqly zqp_d4M6#NcSeA-%atyVyM6g(#A}3afhL=tK-MN#NTA1~il=$b7+1@fZPbOTXy_>fd z&9zC3Ih9Ls%(UwAQ+*>DTCHoEzdl{JCK+;kA)VUZKeKK?5HNwX_poIS6TJ+BBvl%EX9byTXWtY4cokyM+ zPOg1>427X4zRLKvpJ%phaulh!lxkCP%eTV)wk|2g?7gF91*;jwmGDl5^%JzhJ!W4| z{DrDro9XE~sji^3)x*45j?tV7Wm;~HrByO`#_MTSK;2Y%b=J=7NhYtQ>w|EmQ9IK` zca!DO*tsl|+pQarC)`zM&SU+ra#!(FTFdRBSwfm+hp|Mf&SZ=-=@ACXH#fXA<<3>#y#tjGSY~7Dl7KxvwFYC}+u=m$Pt7kl3-07XLsc z?i41WBb2yG(UF(XN?zfqRN*kgkcGj)eLzXfjy>Da#3)d)`=4~{O*claJiq@aI_)!qo22iD?UziD^SDZ`=Bo*S1 z?}@)R{PZBrNjpG6rNu_C+rH!SboZgheiH9L8DIMpxvqa^@#Ti8L`Bede2cK<U ztNz!DDz8)F(dqHpHZFeNZ(qI3e_gFJH&;FSkW?Zm>r;T;@lRigqD&OOu~4_j>S_m> zeJ|hXUVT~+g^9R*VUn8G0o_m%VX9)%Hlf+SPiJSJ0R6^orP|NF)c=~t2Yo4)ui;Yi ziQh4;0>f0I*4*;38-EpFrfwh~Ut-!4@~w$f?-<+c@6wT54L+KCBYI?!GLY()`W z+c)Q(m{bWCf;PGhBkd}>GqW*@vIIgIx1b>A!=UsnmR-rt`=EF`l`OC3&i?krK$v1H#rb}qbx+Ts0ivgwrM-rQnm%2U0E zOjT9$ziHExVeB3}{W8a1#pMM%EW*Ev?P#-7l3{o$lw>(GCa+iZySGUkJ9K<(ak6Qo z9g1M!OjH>~4n*ze^b&XkK6&S-M3p6zq#pKab`OyJcLdx1SK+;=dl2eH0;GF!9pf7i z*iBTh;cL=_MlCIaweO`YXyC1y^@x)lDxsIT-@9 zNZ7mnvAtk} zZrz&Rzk7WK5x{Z)R05IqQrsvvOz=5n4j(=YvFxrxyUkMd`!VmE5PGLRb7n6lO+k8S znMh=fzFYQ-hGd7>KVfhX;OU{+n8hC`y;=ZIE? z%}o-{I{3=4x)DIY`hUUq)IeN96%)Vmnp-bMA|#fy+hRsAx>L-g(znHS9;q~1slzTn_sKaMRwcl%ORvW`Q#bqMtX@^$^sA-dg%SVfzxa2X*o0GEhu zKs|VH8|g9k&=kVMKldxId;i)Fg||>XhP&STQTgp3XCe9T z|KM*7p|y{3CrGULGF7AjWt|-rl6G*w?ol=X4eWp9<+=+hkf8l5sTzq16ES-^yYcV?95C> z(FEwX9pAovqg@>v2P08`6s@%nD$`t!zRN-v#2VYc5+^qpydAu|hiZ@ofT!&f0_+At zcT>6CC%~wP1gMLnHQ3UCSw-@*8yH*%;)G%k-nguMB~tlPsG`1p0^9{?7bu>8=zGsX zg>>)$ph1wV^ENgw-f`?cA3mUDOl@ow5HR;r=;S;g%H*msipHxI65Lf^Z4X?S+` z=1AHuLr9W>RCQ_Q6*GdgfR%{hv!)Z;yOpT(aA$BR9-0=1xqy6`=1I`AKsA>~kM{jC zbtT?N>%dXy*Sp38^b}w}04V##;@Ci4BY_`Afsz|qBkB;?zj>#ZV|$r=Ib~p+ewi-; zObKT$hlD%|UZtf;ynp|G)_AwIIBx+w^QJo+a+USz?$||;{b>J6NnHmgK`z+&#~HY? z%gVIg8oc;5APU$b>&z@H?!trEHO#N?Fua@DBWFqiZeKWoZred(_|G}=?e-)u%@DbC z*2$(>q`eTs+V?A|b?+T8S$qvYeGh1p{^4VO`5vHLe(n6*#6ntQs8cgL`olf!-XY2V z|KnA_Y2aQjo;p3c+>d5g;jIG3^ugET)c+N(4P z=3#c+S;sD3oXtJ!Ad;Ydi$B{Uk#ktw6bIG>2s2=U{w6aZsmdYts3X)X5HR{REW?!v zJGaf5&i-7&fhX31ugMSEwJu2!&1LlmjHD{du_|?g!t1-drT(Iy1Gkbp=~mvvaB{ij;Tvj*mP9N(hHD7B{xI3)B%jLEJGuFJz>IcIRua zuZSeC8Ll_P)w>pMcX?^W_ow4=R=NU?W3%o(#4n_A-PYNq$YrkLt;Zc%p6_&pC|BqP z=(g;srV*>U^3e<6du${h&KdV(YNw)7?W|N=?8auL9J^w0_clAMd$FBk?j?g`Rx^d@ z$W&Qe5%$iLnx#Ptp%8g@!#q8+$dD<~;i$Hc?^i`H^<&L@N3`9VgdC@$BlgkuR;m{h zBzCJ7*y+h~I`vL(VKGM!_sjm6HxC6CKs$&eN35tzB> zF7_BG*p52f7Z+kbnbG*WbggR#EYaK6Ttk%B6P5A{EhAUT9A_$82a-(Ev<_Nn=TRQb z+&n(l*n5Dfmk~SeQDBM?PWX~s`8pe5j&CuJ)~APo+sv#afKCxXJqZ zj{Wd5Q=sL{F?yr;F;}dpa{5BioJ*?Q438j|IPM}( zw$SiC{{6}1*P{G-@p9QNv_1H*a;7P+oee7r6IGb3lggY4`p|%jPfu)!vxT*%O zBuLhKnnTZ?uSseeT#Hac=9OhBlyk=zRUMsdo5n^QU3!J>of&D=hqYF^p`vBhFcsVY z2bF>2JE8PfAYNe;ehDULL0KWW@4h>M1?!SDR>(!9B|vBNGxU zj_c87LrEz;kDo6cvG2{rf7l<*z}Sf&UtgW;(`A8wsVkW6Ma6n^W3FG4dgkC_Ta4Cs za5j&K^ei=x2=|OeUcs+u&wqPN?8n%uqBR)aSp9IIm>lW&|D-OjbfCsVgGJ%=u?&u~_?juUo-mF~pgoFWLv@Pf*hAWTM+$JwoHo;y z0*Se@q&9pwOoa*QSZbJ>h zIDqBI0fJ+f<@h(pej11HY1X=ki6tn6Ry|4hFpRwT^u}m5G3pSQ(xE_m>A~+J>x+(| zTEryz6D6CJ$zu6(9BVTXv5ZILiX#2^ET^y+uD;@uoC#Ml{0DM_ds)W)cBTx%e9W11 ztxk-6^9UFy!ci>4-ej8K>YEttsj26xA7Ar3d3^BZ!#nBrOBd&q!+Yh+@}4N_pdadL zOQi?K&xxd_iqKIU2ouG%he-X`$2@=BotHEb0HPT|+axEqoa9^jW>&_0 z-z*WE*Eb>Oe#^Dt!t1#!oyvpF1ChNoc*@CaK%E46O{YuDwJUE*$)7i&wqCZN3KSM1 zC8X*0YNfn2T>EUUmRO=EyTan!d&P2jnxfEo2GiqdaUJC>;Yv#&&M)XEtv%&#HW>_Z zzpmf!S+7=z>SUeOmX;A*4#2y7P%EV7FB&99ryi+5O_LQDR!%QY8%_z`J1d;FDJs7F zZ;7wH+x`a`wsW7PZ$RFqZ*JN=Xl>Pj{9ipL*1=jh*PB52@ZKfuTjXhWmOxkIxBH1I zQTrY}xTa~tx4&xUQn+*`4%Z9&Htc%k8t(2!b8{~}{*}i8OGDdhO?kD)-(-8GLaC44 z++PZziE2ufhvPccfi-luja$Vb^gsBN~%658Dufr4URljxKW95p1~ z&+o^NzH+DA@u4MGmDx#TTHj5gHUS1ITz^8oG|M2~lOVkGV(XSk`U=`Hi!asz9rS$v zHvm+A5G($@Pc$=BSG~L9aQ)!7fBr=2@+m=1&^GNN)6Qq71Ru`C;OagjqfSfGx59C& z9A|!$!YlmZKU{S_?<%L%Vcr=OjYy=k@$(tQ`seQ=m`ebSHLxrSM`oct&chn5T8`}bl0zQ2}0 zb;X|iE!$_RW>|w-?Q>s`9xtt66m6=-%hs!G?GeaTGsc2e`!>y?6lp?X(d1UbmWroI z_ceF3mJ60n>oZ^Yt@eqy{#d5{TC8#co8+phv@Z&x^gG{9Lh`Tc*Z+&`4%3UfmyXR! zkd*YNC^0*r(KwjcfuI?am)Eqnb5!N8vE!WNC*?uU1}M++3f6q~im&YAm^t!HuGR7v z{}*m+?-n>SIpX*e^Bn9;VnwV{zCWLM4|6%Y{X$;W!3G*F-=eNXm*dhGor#x;Pem2^`|JK=E;3tZQuk65gHNzu&y-oNR_;WD8=RW~|fB#$b9uNWgRER;gaUTZXJQG0O-^~MQ)BkuhZG$Gx{i2bH(JK9U*DmZs-f<; zS$mJAcA=Yxg06LC%B``6dstTNW}A7K-x-bq27dZn#_de) zB2^9x)I;u(HW5Mhudn6wc#UPVJ+$NpPOFdB-*6|6;REwSD6D%k)71$m(Om1%OuU7G)umuK-N}Tg(y?$zwn{mKN^#MYVzNdDLoZBn; zwOd*%naf(LXjyvwGwo69FU^9RH-!>f{OZ>y&)5*dIa-~9)NXT3Z7z=Vi83Ur3egkZ zR3xu`e*4~K?uk5i>-Sf5R_x=UcKFn!2L_pHIYF59uCvS4y-RLc`OQ(ZNvIXg={8MoQ{71!`H$5=dZ z-U|MFd{wj$K+>?)$6qY-QXF>vuLLwUCVU1Z&+$g3dFQhE-;p@qQ$ksq?EGx<+S|`| zlk~MR-sL`5;@aQxHL+Bt$mU#?k~SN8Z(hhir>flRV(DSB?@PQOo2p z!bTi4k8NKWGPd+^!mF{%oWaS2w|?@4$d*c$ZhrUGgvUpD^7O3zt)-Z$UpHN1j!~ML zTn2hbi#_icPLQdkJuN(64!$5O=r8A)tQ}AAq(4(y1mEw~qQx+Bx_8Vr~WU!4m zFkv(6qgQsb;Sm|_c4?`MU|T9W2%VAToT^1@#*>+O?@nZyf2Bxg$!oP$dAUiaynJ=O zL027m`$OTSMXp~ag&l9xR?`rgOVP`--RH$=t=mHsWXyBcF8@`yfqI0|Erz{^58tz@FE zk{O|@wf#*C%buk))>a9AUvAZ>Yd5pI<+>exQE(%8hN}LN7U5FLmT0GCw0WoLaQ^|pEv|&Qdz#lirKG;v z6MEoL}4Ha|?R((QVBn-Vu6OI-D|eWM#MCI*2#9}6x-`Vumqs);P8Ov**X zXZ99OEcS3aY7DMM3*7rN729N?K3R`;7<%s?Q(XRP`BC!P?D+x((-n?6vHQXY_+Q_S z6)V;Z7#nOx4@_JQWicCAc&v7)EKFYklh2B$Chf?|Ow@`T^bq%L)IR-ZqN==T=GWRt z`|po8ElesJwDp>^pbF>!$257>az*;zSxie07E<&CEjYR&+H*Z_3Plp9n)PWF)e|?I zXZq|+yVdZowI->}6)acYxcFjJa2bjO5y_=bv9tphrXY&E#^ta!#6dpsa??{S!jf|k6g4+a80;YW&=jMUE_4;xc5atr^2?P zSV6eT+4iIrb-3yC!<+iCL*3S~_=IrO1g4nhCk^8t2cToE1%aUWbCv-UK8i!%`3a&}E4J_`&ERsXH# z>V%innX%KyMvCe_=bE@2);PXJ`B}>8l0CW2YY9sI)1;&avu|QO-@4pa)*h^LsL+4g zx!GgeVNc~&_i>P`Z*|{k(%hy&CZG4Vhq6#Aw1KRD_+JjKNU8s}v`x-%2)fpX{jUd# zDF1A@KbMMb%nEbA$!@OBvL0xub2;m_uJo}lQiLM5&V@sp#`BH3?RU*)?0Un?>{U!G zX>OllCr25rWazorsnCcOs}dyR#GBiD#tQMHC5j~Rw-+N$7v`H?PuFu*WolSMIj!=F zY-jqDx!178`#`a*Pm-}kZGCbN;Y@V=B{=U@)wm{ zGHQAqC2K3^${oo%Vy+k4I@NkF<=*pn`}$`V=KMiQRuX!0sRA=CI=!DdJI<1sviiGvI#350@2YRP;_usvQ>wnn zl#=~$F}FTdZaK=cCf$*6YHedtero#j-OG~ZcAKUTW%B&l^bSwEAq_HHhQ zOfAA_fzgaaLFlw7wl+wr?4eq^C6)k)8i7)pIh>m&hAJ~ZPbO}_CFlLPsos2wLrAKe z!{P!pw(&SyYto_3$+Gb{wsOX&b$#(lIpVc>hi7cYPvp2>+F14DET#e5j*QoY8#5FhHftJ)C zUAxxAL+*;H7ycU6D*T?#(l^+L-KCWoAN<9<<{q}&@Y%W_wRx0z?`WZ9&F8Y}M!N=q z=W_!=LVUx0U+y)UIS38nrg|un9cKDEi|nl?uuUcpa%U=d1L>c)guXD`H>{-5vg}CO z`teSX1XmR3%m4DKYa^B-Rvb8 zNZ0YX_+`z6o)qdoqw@}m<1uA|myg?*4@WmS1!lL<$BnsFSogbak8Q3^%uGezS6qxP zN_!A+@{^2VbzNH8;p59Xtq(jqbBNM;?ae8ddIuAmlP>X4xHxoYabB@ddf&{bdoAIa zwhB(VmtHev3$54k`Abgvaia#zvoQthyfsSo_Icu!lUdPBBbM8rPN%vOVgt=v?yqD0 z&CQf`qAT=%N_c|In9gYUy*1ucwGlkgTBLoVobixgxBeW{I|?ue*Sq`$c(H zE!+i}7Qt-Y;M}9qv>)7LS~hB#sKw6WL@X=oiC_Ia>blY9F{|s@b6V}yI+aU4)0*K) zt}IPgR6EJk7RxkSoO9h9mDuPyu5UkWpfX9w_gNmm+tE08k(&f|lvZPln#}5YOOuAf zFM4*1F%)#33J^8n?p)E)wo}vQUI>rQTkX;5U7ygb>`rDnU$cLoB)4yO@_g)@i|S#u zI*Jds+@}v#%=~*8arR59(QDlq_W&(?zN+FP>q*P*tTC}-*&IcwPptaCu~PBL)V+PG zmW#5b(r5I(_&=I^@2DoTx8EBJ<4;f=l_DrOGpIBXm0n{56cm)+10oOzJ@k@TMj5G! zG^IpAqz91_2qicSpg@S!&?6uT5JL+Aft0i3s557sb)NTq|2WTkva*!Hxs!YEdzWip z<@2?g3%^dMv%MS|-|Illsx0l%+=iO!OL6RK1(N7i-Zfe<^oi<|W5@e(ZkcLI3?%^% zJ-spvEK?07pYMFmOg3M2A69OHgjqWe4o5wIf>`PaeE#KsvJ00v-?Iw~g1bxG|IV9t z(}9r8>Wxgjp+yyaG0cV3=ed+_66`P8gmmS_TL{@`lL96Efwd)x{0qt3&*$q^+xjdc zs}KA2=UW#LS4%=>A{0$`9_LTBsc=%DuG3Zx-3K;|k|IjdU`%<&h+JV9ZHL_%rIMV^ zwyYkDClZ+w396|#PCV-EU>+uD64nDzPx{A;jFW>nkDMarj<*MVN>*8YyKgm_Esj^u z`|v_p45W>dUX3g;=9hdA{`B`aTL@#qR&@)$3!@Z!M2D`b zezj&s%QO9stcy3hL2iW}QBOlnhD1`zx1y}E>zm_FL{>2LG|}I5wPwiDP(oO!UG)R1 zw+AU5_S4d;zzMtR<;T0K|B~;YQJ&wJm6X&R&cAw|Lj=yk%TER&HMV7~3{W2Bu`77> zZUsth0%xgBQkBahDjYpxPKpt;h=g91Axt?<<=GwhM)~nV0C6bbY4>5u)dJS%Vx&jhT?i?Rs)e*dOxDT2bCP|7t z$sMx|`?E&dA2Ueqp8Cr4T9N>eKRvF*$SY*JxobS@bY2DkRwDj*3{JDfBzK>o!? zZ=X6aJn0rJD!F(6=q;XY+@_yT(oauJ$#K=0Y;fz||E)soj;%A1N&B2xP8;u>wmjG3 zHS*d#lK?MaJ?d_>jIb&{cK@)IC*xJBSNt<{sP8$z<1>#LZ6CHg{6|S}pQvu_%hhoA zQ>f=HF(yDF3SVnIp?up-&u|3PdN#Kq?x)(7P;0P-R6;K!NyhOTmAJMg%42#nwvJ)flB$azV% zCkz@BXI4Zr6!j`M4tb0RUR$k8AbZED*EMZLk(evCA4CLWiSU707`nGbeI4>l_#Y=? zKrv!^H*o(^Q?GfBqrNlk@joT@tR%Xn$LYoeco|!44o-;6eT4s?&D4 zH$W<)NANCxU>y3bhXD>v?mA}{bk(o*ZkJ9Otkd2g zQ(5B0A>D-hmM5u^#ZydW=v8hD8@WkVt?KE=0^ z+$U;a(Q8%{PajL^yT&=Bx{j%>3_lb^O}}?bSytc}nf+RR6(piU7+C>=X!U0W*N}hN z@&M4ta|MuPvZl^s)*q&ro`#>gv&@MW6WF-L26NQ`xaB)jJ-zg&7XX=KrNe~zPltkh z2i&txknuS(uA29(xFpy!D99=fpGtWZ!e?!0_AK3@sOvSG^W5bA&EfVhMIS473`w#R zl>hYG9=f{c2viPAr9E5;St?x|Hk;RTJ&?0oh8}zhYKN`8H=yf(AxC_C$B9WDGJ+j- zDk*Z;LJ$Trw}F}DM@u%FXZRRNv+KIoBefHw#tFQm`PF2uMtDl@^2MkLM+xyc%MkXVH_O?Q00GWfWS{-{lJ-0|a^zt4WAcRD_4zYSwC)~+rdl$351(f0ecT&9~p zV(xh@;d}o4C_%z9if;WVn5zAvsBCdYi_F}x4Ug}m%fH(kGmA1a@A`V=+Y+ggNp!=| z&RV^bKXAqK7-D$bvgT_RM*?H4NAtwv%d*)f_5T1`0`6@z^t!s*U3V;#uRN`NHvH|( zgG(jF!U8+1fY38Ylm!VIxGVxLh7kKBEhETW`!mKmCH%Gy=>s3PL|#9JDnE$ z^9%zhX9vsVD8vuFJ$rqp^{R>n5uL(_!qe231Cb(QMN3y_rB44!WHJ;!JnP#m2u09L zBbrJ^BkLN-qebFi@@pQDZw&fGi#}WvmPd>9kiZU0`s^s9QF2rdB`WAG`Z67norBt{ zAVmIcB7PhM;FIFL_bm?YDb{l49^}rQ`3EvH`f>?g^ir}}-I5Puzx3$rT-<`uqbJa} z@Am7azT6#dvM#4$KURJmzdK6a%S~=^CoyoLp^Pa5d0U-T;1V0pXjd2#$uqsvZ{L$G zKonTmcJK|x{tODey;2+JQTvoBqe~v36WX`L_MFHdv>&6@hd+os@GPuWCW3LwI=bZ| zE^4kFMCCx%_qUtn!y1A0p=4~Y`N7kuaMYU!0_wyclzn$@(@u|eRamWdyV#dx+^-)9 z8A?|ssjpP!3ZK?4gGp|~Km7cUg~s0%9QVya6OT4fVXWJds|yqAkaK&7E9LdqEhu0T z1G`@Q|B!(uZcHL*5ISB4X`~B1g?vv2;{&Dmb=&=4JO|l{ca3he!aj?tWO`S8e7Kf( zoi%(!nlW~>is*x(Z*?AW&FqMGN9#h{M-0%qc7}3fvx!#C*q$70YRuDe;^qWwP4niQ zhhGy0hM~ph$HClGd{x>F(AP;vLA=LSoAa zG%9aPX^0cAOH(6N-aPYdlLxIFJF9NZSF@<2f?8QPSG6~_`rrpiABeqc7eXL8ZM+(z zk?yJ}QdQ;Vvus&Z9b|*BF&+v%CJ}B|{|li~_h4-vJwYT?B`p`*Iy~K7RaMgKU1|DX zY*A{Y>JXH~#&E7ocJE=irjR36nYtsITk)!;>rT)5q$CY12zqULF}i-#P4|*%OF2Kr zY3iz^J7KQLV2$|Ui0dVAWJn={Q>RaLiYU{iQN~b3DKU6FmaK?)WrnSIpkRlNKC^h! zfN~(wrlY?9M=2nU z_B{a^u0}h$-uoaj8!<2zI5E{L5c0=5HA3JcD^{NDUbwVyUO`1r*qcBT&(8Lc@zRzK zQde1+Bw;Q=v-GRG#_lhOi*@GH7t;>-Izm=ljDjJ6*_fwQ_a+T&Jc&+Z|pCM`tX)7bmoqYQ~WjO|fUN3M1uc-GlfR9domDs>^N? z60F*c5etx~4THhnfgA>q8xGiO|6-;cudulaQd&V0q8x||`-Ry%InMv;)+?4^Wcs%B zOPKp%?8QK)-ST4}e34>OT{yq|*Y+8N zt=n1B39Ywoz1yCg?p7-N=zwt+UjN*q-0USQlo5NEa$F*Xm>{1mm7#)yS5MI{oCk8x zB90p-?-&opz}~EdzrNHIgb&HGy#73FJV8VC+n&aAW1@O(D7fi>(nW_~25N0})146L z8#VuX@L2Q7qVjSQ2yOFNDg=?+Vu$#hLw_yOp@?HH^iWL64#4>6#vUC&qu5y8a9e)N zZo#05gD-Dac@Zi{IDe7*A`S8RXx8k$PGo!Nc;gN9)}MH@5EURxeiUWQj;2Z;1R9eI zv!v72v4wFS7uNZbsHhF7mu+W+q5TQn=Y5O#S6DKODDi%ea9kZQlhi%E8$qdKwiB2~zD}RG&%>1*Qa|g4UHGl>3z#7yQ)o$EOpvYwzCE5Dv z1k7T#=a_qF)!r)1=%q?rp6Xd%H;Bpc@k%May|CFJU`rlTzAe~x<20(~W`*flc{_fE zk$shf;BJB_>bNJkKixNUY*$p5OiJQS@oN39Vc6Lt`J%^PlaX=whH2}Zw+Hr!phn!YEqx5r`49j-bO9v!xG=< zx4YEWIHNHjLw|T+}O;O8CeEuS5o$I*4`oonz^&4k* zree3=w66W)_}UQ%`yeT+%;@-KsZyGCEXC|Z<-l^sWBli%$-}gV2599Gu%*TCC)oN_ ze98H|2t2_5t4HOZ4LeN@rPSJcB=JYV51)VM&aV-E*Seb($2;7{_gy@dkt!9rx`u;_ z9rFoa)dxP{TeQXi23)LU`iZMVt=2%mVpebyQ^O@@O(7`?>V=Toj;sC9rO*2MCw z@@cnTEvhEMVN0=K0tCod9QY56-GaJ^=FXss+H<}@nM;FEQm@;-+1~pHJ6@Jw5r84b z570LW+~-?XkQYgM8ifwNm$qF2^m`NNmuiT`v1b}>6?LTGdNLTiqbC4D84_J^qp1jwqZp+2ZFoyZQ9b)b?et6|InlsB4?`JlL}6?mjV~>g&my2-NF$t2 zQo5`;a(^#nSMc(mO2BuB3mx!S-B4QS>-OM4M;hq*;|Q|r{2b@RT(6Np@l_2i^P67vzWi83g|BuJg%Tj$Gk4{~p6jyjL$v&57FyGV<&h;g66@#Ih*T>UMgSeV z#mX;fL?5cx@reo0%nBdsi{O4)S52q!u1y}*M%wbqwSgX^}Wt1&~R_+@pjO)#@l z_&=9vYRL2G=t;B!Xn+hA`N}vO|KV<1N1D97bpGu!!EYf2TCO_{?2GT+_Nzr2*uz2 z+sL!Q;V{{it*|PQy3B^%nu)jT9_{z>EBG=}H$C((BTqqp>#rJq`ag!AZ&9WKpP08c zE4F9tT;I(golpIugg${@iVp{i;xNj&K0qSE`^f}r85x?+`;%QlCci{6iE2f8?816` z@X(E0spZe=CCjp+5$Y%fgZ10JrhBig^LnnBJI~LiLN=3|HlR(pkZ~?tD`<)AiKO4u zeLY!j{3gc`o(-S*)zXrmnU1P4Y~GYFkIGQ^K|Nd5)>B z8)m&^lY&O-L%GvRv=46~{j8DW5&kXEP&XTgo&icw^4F!t~05 zg&B%7E`svHFDECRX4>Dxw$p?Yj_J~5k_88w>(#**+`{?!+GqCag(q@)AH<;ahkIPu z!zh*_djqwJW+p&3GB+1cTp5A;(j&DqBqNcwyB4zXbNSpA5q3I?tIlj({5-%K(f6`v zr)+L@(@fVFd!ej3KN=0iD$!z0CW&AYH3LJA@WU_IV--!9Pw@+~?aCljSL!%&&0GKI z+P=I)3Ds^$ZhTaiyCyChT_IjZY|02dBaPT?7&Jq-BcB=C6qgqk5V&td?Ei7VtdtQJ zNSzN9`A89HUU0mBHe|a5eQnm4kwc>rNb9r*pg$>e6=gK#zIWd*IY#nDoKa*eLNQ$fThft?@GM_HAi$_6o`SxZirLu z>QCm=cIe_ls{0%;&$|WjkB+IHba0{2#FU&T$NK}`zx>)QP zkohLhQ&Q{8Vn1?CQA9w#QJrDeF&4eqcBg!fyH13ZO}96dwY`c|Q5r5>!0hXfo{N@F zy&c3EBle@J%>~7(J&``<0Zlg1dVz^Q3@_F+wpUh!o-@Dfei!wG*=#UuCpKIheI3*}MR2 zQja_tz1Dq|CB*3Jl^r#4hMQE@uPUbyspHqaFRad@mc8h4vctBaiu%`8v>s$i$fc2X zt!QP`zSlxF11`7j2LK( zXdO;C(-twIW-r}3cs>k?Md>GX7;F3%iZ`jt>=>m; zI%-3izCk7rmb2PW*Dp>Bh#Xm@@8B{8`57UD+n7#z1r-%$3V!m)+&HjWJ{ zgPT@+c6!4PmC0Y0XqqUA(u2Es=a{pSH6}`Wyd6R#v%b7;%Sb1#Jq6CS@rpsUv&wnF z>;zO-gHg}B79Em$1Vd@Y!Y-5rBfirqKSWR+>v?=HI9D-L7F6|Se(z2IoW6g7M_dMe z9U+T4tm??VJjGw&1(RVthx*3eOsLlPxL+F>!d!nklnP!G3CEt? zJmwPe)Ara_3XQ}aM9(SUw*YxRGrQo+)l@H7z~^W21IL8pNKai8RAZ@jokP%3684Z} zKJ1Czhnt*RtNO0*ry?k^l%%$-L8gKnT}83+l%#=H4UAZt;pdrCzc`$GS>;7HV^J=> zQlKdR;P&KGP8t}<#t3z_8nv9^#2JJPfa9d6C*xkkS~(XboFGm-miBU!Uy(v;uSe8$ zWORqs1U6@A{`@GnVgpz$;w5#b(%0v&6!Di)Obz@94Jmiu`d5^N`E)%Ybi(2$;GZ;Z z)eNtki4mo$J)`$zG_1}IpAA(XmQf`ohi5nR=n(doE&l$)JQj0ZCVMhY;_tWVmOgz% za2JUi_S5~IgU07>u13Qk2#%m*Pc6(V7;L$a%WNc|OMg8K<>%bvPW!M|(z#_#OEZw5 zP|r?RrTI_-GBlv}UB!-`LCWPnKc5s%dA|o1RttUMf3=!v99Qs{SNv~qEoIp&xG{u* z^i!H$2+8h#3B1cOnP1TdY~$C;aP_7NAfxrv!6cHxflR1fO<1@$%|4b?)*q5jjR)hC zcSfJT+@OJ+a~zB~D*t4``V^!%D#YT2|D}O}8?LeE&c&sdRh&>Ko^*_#^1aSLATC9^ zw?-v|5u=mfeZX-1z;w#~vH{hcXlV$SYrT0z-}Q=5*ca<6cRDr21lp&B)9MkJNr8AjSwwZ4!5%A_%7IN`L)EEvuCG#f0U|L zz69mApiG|w*7!k8)6J@*HIk^oHhe(HF_SjG(AVR?vuh;(7pAnzbd zN-W^sF)(}(^qCI9(rZrUn?)@S&d4n^R6E8@1y|+#RvZa%9ES3W!&pEDgK_zjfNCOmUPe z#_q+S@}Qg*e2*WuyJT}rjN=E&$ma-0x!R6%8$%mXUCMbqFQp8mubzTTcws)y=Y%*&& zxDY)?(&`6k=-^OBuxaSJSU)xIG~~L+$>;}dhFNp=o9Ml+MKY=5@~f2%Mfpu}dAVBX2}aY;O#ng@`EqUQvn7xbM2_^`+gj2zkcrSY;A@)d+sRe3Is(x?wZ2Z&G2xdYXeJhfNP(Zcae9VVz>FB%+YpR zwvM8?MN@`RFL^^k`sw*-Y9{x(m{OL-i|Zdu zown4qRw$^!hFf_dI?Vc!l_4^aI_kM&&8aiV{(?LMrIm>*CD5`v6J}HWxH+ey0xhn^ zS$l3Bj9e|+1t~!{tnHFG6B>M&^ruuA@twGgP8T8`R_dG7O7qz|($zx={m?bEIgxTe zPJh(plUq0ap;c4OtQ}t1Cwx@ssgHpQDbSEMVsm9Q@g_P|IktCB1$*ba#pav_XbL>X z93zVd0#pb@=8E*;IpvR^&39|T8eEyJx$$V539 zl~q;4FzDc$?la?=eyoSvlhypT6p1Du)lsbW%{dxs%8|TZcW?gg?c0t&5d?BxDnabn zXs^t>7hV)nj*H1^Yvs~NN|ElFr?oI74HDtFa4gK}&H3S;_y-th2yyn1*nf6*W#c&l z^0Lp*$%zW&1eJQml{+fOW1B`B{@QM7IEB;mx6R9IaW7%8t{2)pyp{K6xC*n+NiNtv zPtff2A&Z-w-$dG0Bx*z6dn?KQe0l{NpMLEcA-0f}at22F%oFMY{Bx$$Wlja5V~p7UGnijrm#*H2Q-P1k~K8u~VtNR#8-7I%D^g|3Z?t6&YkQt3t0qVU-1cck&piYHA8$2O9l7|NMM zHF?y^Y@(?E&g=BIT8YGwBc+9S+nwJGux2_Ce3N^883=!M2E+^-`J3~9)I#ifjdFSC z^vhY~ilTD3>5|;_r%^J8lA?d(4ld`qzQo?7CN!OpJiU9G6)5l~XPZ@vqAaZ5HZQiE zE%0U`N=Buc+2}y6*Mle|1>g$8+r7m%A|Gf&obh+p{;KE-ZlAUxhu+z}AyQSA;Wbv; z`I&F+kJg(&YQ-F&CH_TZ`3(qA@MtHkx?JnzVi0KCe|jJPiP&w3EaunT%f#y3(8Sw- zMX{e?FdZzXC8Ths{gS&!vyJut&*_&86~ihh#PwR_PlINIE{&%Q7>(jRNEdIxYyKML zP*0()2><^IK~w&2s@%5*gsk?!*w;^^f-dFt{lPz~6bYYO>UK#yW#F1#q^l*fl=<%S zNnePfzF%BrfiuRQ<<=ylpp{l}^KDmT19QA5y{@SXL1>wfSKg=jN`?5^aP;py(;s;S zHd9TxZ4#7`8W6q+sKrz;91z`8_3P8!1PyE$&sp2OzJOC}g*j@kS1V@QN6;DKPvQ0D z3DfO2SC4(NX|5Hv3Tl*O;8JrdUg_?D%hCS!*OKo$$Y=_Uw)(T`;~wtWvjN4PZMTdBaju7LrrnMy-Qz|1v)HU??5n4E;wDDlr;BOq_b$g$4p$(*U{VcS z(fLKnnGLp6~sI5d9a^5=Wb^=e?Q}l{RX^qVD?#;I|YYYrhq0ViL_-M-XSw~ zXO`m@AK-l`B}?17O!G+n=>)w<(Adyho)<=sw8B=0^HSq_J~@yN6Z8yEvOg0@B81@V zilF^v@ofndo5+(h@R>6`lU?|f2Ot+wQCf7L0+eBw+BQTD%+Vg+oW|BsmK-~~-gdOc zPh=Tage9IC%IL(2>d_*F7)PWfN=EY3p(GDjqAFL;(LAzB(!hx_mIDJ6PYlzz2Lv-8 z4ZB}LD27&H5>l(^vTNZh!9+LKBL9gHz$Z$Gk1qskG>=rZ_j^Nq&jDghbaW#iO362U zDalmi6I+oMuxjlZzXPn;*680ULYLYVs1MGAQ0ugF0QPzG`txB=ed^8ym}%S7YjRqq zXM_;HyJBA=)C(Rb`C#*yJ+9ukA6m?%<8*x>qV`)iXZY@htBi8A;cb z-b734jU&!+$9aj<5sQ>y{tX0fEqiay5YYA5G`OpS2bo&!5N#HxfLP2AS5QAz%=U7tMEC${=TLqoNa{Apr-vf zS=$zv8h(^Lrv{{<0Od*k@nwJG@3;m&-wU7*etUfVx5pm_N~{$&YltD>1lCP?&^3N< z(Dwo&{dp;Dfp4{n7jH&Lzu+eRwL9dOXMH2Ny5fs`U@o_3dwN>u4^zU*Yup6Z#-G+S zxK(N9?T_v0v(eJAtt*gsf+)Kp9O3H)kJ0~5{msj+B-((=J6<0I2#@t|O0RJ@f){AmN0qXJpG6*}{F?7zX=gokj1D-B^Jyxg`YRPZd7Dz1=;_S&g{K@2Z}sYx2g}$W0c}@MED8RH#di=xd=U^U$QSjsjF?RZg&^$Cs}r%w-?M)N?Q`a$|G#dO zj{LULCIn%|`kqi^Gm@YF(Df-TvAv>car?m)1(+!a%l)MPn;dhU9ks%L!oNWDHXU>= zkp2`FiuqfcF=5p2d$`;`26z*J(j!=BJKQTJ#Kn7NXA2{TBxha;HZO-0VlRow=|)Wq zOha$1DEwR}=x|VUwn3)$pESSO6?lf7et)a-i^%5Rbx6eWb8r(HdV)~KOSJM`1Sx)p z3f!}TJ7?q{*(phGM35gSPRwpjJZ`GO{y+$NmZZ!ABAd>`f0f4B7F8a1Os_K3(W z6teKf&MHIdP9&(XX!UZJi?Gkq<)?)g4VK^S@z8HSYjrXsJPF&Ry?K_D9*zkgvUj8W z%8TKx!L;L5ynCLQ%q0jzwS`IuQpRJ}{WdL}F(*WdqLvUzH6#b#Z5y?Y9IF$jih`L^ zGP*J0NP2as3{GvT;hpfK^`sF#>(v1)oA{jHj|d)0|1%bYb#=m;sSH+mI4inI4${nk zAGiJy?HGuE9!f-oCaATm@E2)~6gq1l`&yyjrv+aM6+D4tl@BPR$M1m2Eh>ARb^LvN zqV&gjfsDMk8*Pf$e0sFDBM%O1Z*MDJgK<6`Oh9j^;98;E@`&Q>H08~B7-g}t34Y@+ zg57)gjfZ9ILJ`RD{sZWcDCaU9wzBeVbV~319d>lxOKXgzs;#^}+I^%9kpTBW_oZPG z`t1saoHwY;?&UHP(cPeOq^<@ep1?jSC_@?5bv5gKmB>m%UOaYtB21{#a9UkC4U-x0 zEcMEq|4AQ?Q*6HGXGEk);E}bso9Gspa_*U92jCVexN|M{=#*PO+F3hr_wnUh<@Eu@ zyhl%PGAA^MUNO^yILx2SxSw}(wa)T$%8<+#M>K* z^&!UIgpWn4rO&mkD2@4o)JF8;{F)Q~im#kr(Urka#-8G4V(t^11KbslT*!Gkfvk9&JvH|N1OdjA3=rL@s>Bg!CIMXT5T z%9$&sE z{2v(X_4r2mdEWy({=v6b##oi;ZADeaGm$uT_(|Xy^R=lPd)>A&w=8HVx(fWk$jhgj|_baBjZOW!Z$4Ddj@Qg$ zcMR!z-$WiXy+h^?{6x(j7jN7!O;GS#+&-c4b_3bcGFdB-ocs7EOa8o$m-W8yl~I5L z_Wh==E`Zv%z1#F%1uZ3utYxz-P74Daz}50!>hfA@C3`grv|Z<9$hN%ogT9Bn`&AoA z77vQgYPg`0cxBhsKQ+kZ&hv>#>NS;{TDB#^(5=t1Atb0wNaY5QR9&H}&)uGzvF)~f zttK$5*AiRt`~vdQ@K~^$;g+gaZ)j)Ws~>78e5dQ|Z2(SZj>jGS_Hqui{Gq-Ee$_n2 zL(Khn{U4Ic`=1G(`(ZvlinWKgeGKUzAE*E0*}Hx1m#0_F_tgFOEeK46l4J|a&>iGaH-vE0kDV>k51(FSxFI99;NnjwN(e zgx~r5b+_LWX4xUG6&V2ThjFYo=K%^$7-06Nd8*zOO$ z2yEc08XB_;e;!fR(6C|Y6vQr`cdLE6`2Dl__Dc>8u7 zB?Jhl2Q~b2fxPYM0}nq3tD9g!GBwXzhtPj5P|wqmPC~9qS7Wgyjg5}rKmAw51o(kC zYWa|p+^dyg6SvO^U{LaWkZ);yl$!YD`!ss@JS z$_4=3*p1H<2Y}WyXvMGpr0el{4{eJ&SUR-;FK?vS59tO>{q7V=R|OQ8%7ei_r6B65 z+MY6NudZcQdG?+7*JbjD_&;Vk(^-vC8*l23-;5^@$#X&g`X$Es0l1dj`x^*`UI#;1 zM+%6NhlCm@gWCYC50HbE2iUCO4O5wydIeJ{4%5N##8K0M1h5AO=+#aQ!Bp(Bv;isf z&>pR}AHj*|X9EOh4_5&f43LJNH-v0Ht}iJpC@=(_BP&Ix(-(e4OjziR7R5L2FDolc zR+$X0@g;kU-0p1D4+6XHv&_t3AZ#Asw@nwQTI+JYOhoz@6~{+r(6CT%$Rfh z&l;Zn9*_`9^MHWk<|&$Zb%q{D_yq2;rWm%>`#zVqcliMsIAVP~RQ2rH->!fs+B;n7 zQSCi^7AOpZa}Hn@XKMsp0C9=rmtZ!`g3f9UrvR-|fO?gLARB63*GH=1T1Zwcz`6nn z@`fp!@7=`LoUnaq?;Bs50|r=8aw72o3_aG;MfR6=$l4JZ(;N$+I}9EpuT}M?^}ho4 zD0pOyF@ZWf9txDfUtEWcomsOtvUeTBYDq~*$WKT~{P^fY`}jY89bP`jha>OUUAN1=<`!X)C?y~&^xrWTxI@z|JyGA3jG%j%#O z1i+J}lC%@S1OxXm4|+0U>Fuu6%g2QOv$G03gX*fPS=I)Fw<|<2ivg~=Dqz}xC-NQ& zgy*G@UtA0;LV*A^00!f@oULl-x7z_tRng}4xpguM4@3mPQuq=K5)KDB9=$$pR|R_v zb`~p)LlIDrHf#c7$Y4hRh+E;9A1m|1&wqo@Ot7Hs6BAA#AW;*&6>_B)tX$O*Ks@sl zl%|Ov6mo%6{qps=q4H?DMcc%GXlvbTH|yETb>f1eCqLvR=@t8Hd|v3CYyoL>GU!4; ztj$#OF$3kzz~>5SN{^*tWG7;45Pym}g21IgHBR)MgjIEDRa;SX{9u-)g(5z1~$vjf2 z&u9(sPS5rine%3qx2-AKo?T~WR@DEyHvLC?&u#niz?R6Wj!hVZZ~1;SI>oa4wqn1D zT}}fJs_V-F4a{Tk2Bhtqlcbv>L3F9GkK4cydTqm3v-940Fh$(XiW7B2;U0@&>|_wF zi@iT>?{Y%V`d=j55eYL?K7$dX5n1p`h>Y2ngkv)?>CNhf%-A~ zj)tJm%5?QpjsCGnodW^EKI2y~4Yh*jQ^1nLG{&zQZ%&Ef3kz~0i~xNc?}qjGu~Ri? z-KD76muO3(Tq<}TmWM9JpnJqp4Cz_kn}$TP;j zPMu>;L)+pr&!!SXn?H5*-=78Y$bmvUak#$8p&{%BuoCSW!YclbIouXk z1r`*baD$;6g0kYR`_88|@;w}YIdf8d<*TXH);BZ+d|i5ALiLhJ1>kJ^ZF^SsGT=pm z0O=kW6`{(MLSCWPzJ2wXGQg+`9GeaOv4rtqyW>S}8yXsdP;l|3-zGt4KDm4>7EQGP z-?K-Z@%4LHtE;QBsYZa-n*wHVPL9-%uK@;Ga*9boYUd0u?Bu&cXBXHk31|ouF!Xsg zs-s%dE(9qk`fJ)C7U*@#|NI}=Bv7-&Xu9;|>Vvp+FE5wg@mt?JA3HEi^KD24>}jwL z0z~znldr+-20w#$q^$1_FyM+Y7%Q-y1B`j^+-j8$BX#lZSU^eB4s*+Y88-5lBO~jP zGuB9ba3f%ZBc_xjUzy4AmO1Uvg?=b!1{#=tg!iq@rGfwtYg;OzA0F&I97NPzpT*QK1cr`>jEs&3Q@X?( z8Qt37Xx#3trJ}dDJ$Lx`fvY{l_-kvw{_)>(run~2-<`$X*8XX-aQ#N?5U&re=$l-^ JTyVboKLC5>ajO6T literal 1914 zcmV-=2Zi{FP)T!fKg>)W!z8`)Fc_Hi z@tm_+zq9t*YyI~E)@;pgZd1!$C;$VXR{*)G{`hf#1)v+{Z>f$*09=l*PlVXtYGJ1P zO4)bjBTj(*zXDzmNmWet_X*)%3v963e>#)PWp5PpiY)IAd?e@gzmSa$Zk|t(#qwQN zDRpQGk)?d9?=~&iYMFbK2z#LSdJ5xbiiylEhV)Z2s2$l@D%BP&wTneuW)Hh8XE&Cb z5)J?qTsN#tXrocISAdOv%Re3nICmJ5`+AGx$Np>0=FP!cxxTFdVTW|N6yfpVk&)&C za7#<5G_(pSvD*?IYq#xD$DyxBg??XG)(IFIu(0p=#Gi~11>0gHAW}-ufY7CuvM=}M zCoazKV5iWul5%z!w*-bU(ws~VemKbZkqEVj>F#b;sxB5S-#?*<_WDc_2BiRLFr+F1 zvR0Cc_@}QIN56SL(CQR=*}wuQ0!%L5|A`>Wh z>SDd61v6ELY*)l#1#sP(vsK@F#IsTh5pStO0!gjcmr3sIYRtR{0N?%qU|uTh&*xyX zslgK|txwcMOhc@(1ont_wn1Bj^&=sr_k%bp);^YC)}Gk174t?=>0@t}#=q1h)qW%P zCnaO@>zv>{Id|X?0agILnpI*pvdO{EyN-UQWUXfbO#ormn@O=!RqKy5eD9&Y^1wO5 zc`ut9_?iZP2SiSU7}lCsYsNd?Tb_KS6koR?qQj4t;16aBV+ZDatQdIyP~=@VW;r^g ziP;lj0vI4zh~Leu+t&WQVyhotUo4K#)o&)ik* zLVGgayD>AJyYxXEyp;MUfNog50anf@NomY>FA<1|&BBgO+3MaoSWUCd!3dzz#fj5T zMed%rS3&LKWrPgnn(b^9O6Oy@312Rxm2Iwrv8(*3uE;hbuR=`p8n_Y2WJ zAw&d#61hC>n|(v&@wd+a`X0c)I`j7bl*dNc5kaa5LMkCHz+cOaNefa~kCaY*3*s zVrKmISy=PytJ~>3Y~IamV>VA)D}Q2Eo8mffq;AZqbaC`h)*bkCPaybJ&CU@3_*RE3 zxNH9#fC6bJ(z;_F7|46zxar!O5*$LP`0yLFMMUCk1G31w8 z>4y_eU`MIle5qCRj*cb1jx;0f7LDruNg@bS8;{A7&QUmu+#WK6V_-sh2Jr42kjMsQ_tT=Xm zl)ASMg+qT8P}sB5jwQn^7Ow-qna+26Y1e!L`Ti*9h39Lh) zUJ8&^LmDR9&H&&cs5M>H1Xda%opTN~4QanN_)Q%*(%t zSmw@%6Zmah>)w(zVtoGzFh9(Y3IrvFyeC9i0VN1{APSC^8RB#YDA^rCwOIW}ezf@D zFsA>qlzE0;D)8I^WSW_L^P=nC3P1V;6CL#kQAN}P;vQdQ0+3As;zW!UTAE-(8oeP! z^|oJ_9xp$4IY0X3?LcX%!E3sgcQadk*f_&^Ak6xRPjD5076csN3MEUI{*Lx07*qoM6N<$f-Lf? A0{{R3 From 9046e91def6ee1106cc1760ca01c080e4ddd78a1 Mon Sep 17 00:00:00 2001 From: Sameersribot Date: Thu, 16 Jul 2026 01:01:38 +0530 Subject: [PATCH 7/8] docs: regenerate auto-generated docs with npm run docs --- docs/llms-full.txt | 26791 ++++++++-------- docs/llms.txt | 202 +- .../generated/attio-mcp/PreBuiltUseCases.mdx | 0 .../generated/humaans-io/PreBuiltTooling.mdx | 40 + .../generated/humaans-io/PreBuiltUseCases.mdx | 2 +- .../generated/veed/PreBuiltTooling.mdx | 40 + .../generated/veed/PreBuiltUseCases.mdx | 2 +- 7 files changed, 13856 insertions(+), 13221 deletions(-) delete mode 100644 docs/snippets/generated/attio-mcp/PreBuiltUseCases.mdx create mode 100644 docs/snippets/generated/humaans-io/PreBuiltTooling.mdx create mode 100644 docs/snippets/generated/veed/PreBuiltTooling.mdx diff --git a/docs/llms-full.txt b/docs/llms-full.txt index a62a71d383..6001ae7522 100644 --- a/docs/llms-full.txt +++ b/docs/llms-full.txt @@ -2,1361 +2,7232 @@ > Curated full-text context for Nango core docs. Provider-specific API pages are excluded to keep this file focused; use the API catalog section at the end to discover supported provider slugs. -## Introduction +## Intro To Nango Source: https://nango.dev/docs/getting-started/intro-to-nango.md -Description: Build product integrations with AI, using code you control and infrastructure built for scale. -## What is Nango? - -Nango is the integration layer for AI-built, code-owned product integrations. - -Your users connect external APIs through Nango. You generate and customize TypeScript functions with your favorite coding agent. Your app, backend jobs, or agents then consume those functions through Nango's API, SDKs, or MCP server. - -Nango supports [800+ APIs](/integrations/overview) and handles auth, credentials, execution, retries, rate limits, observability, environments, and tenant isolation so you can ship integrations without rebuilding the same infrastructure for every provider. +--- +title: 'Introduction' +sidebarTitle: 'Introduction' +description: 'Build product integrations with AI, using code you control and infrastructure built for scale.' +--- + +## What is Nango? + +Nango is the integration layer for AI-built, code-owned product integrations. + +Your users connect external APIs through Nango. You generate and customize TypeScript functions with your favorite coding agent. Your app, backend jobs, or agents then consume those functions through Nango's API, SDKs, or MCP server. + +Nango supports [800+ APIs](/integrations/overview) and handles auth, credentials, execution, retries, rate limits, observability, environments, and tenant isolation so you can ship integrations without rebuilding the same infrastructure for every provider. + +## Why it matters + +Integration work used to mean choosing between slow custom builds and rigid pre-built connectors. + +With Nango, you can describe the integration you need, generate working code in seconds, extend coverage as customers ask for new APIs, and customize behavior per customer while keeping the implementation in code you can review, test, and version control. + +## How it works + + + + Embed Nango Auth in your product so users can connect accounts from external APIs. Nango handles OAuth, API keys, token refresh, scopes, permissions, and credential storage. + + + + Build the integration logic as Nango Functions: TypeScript functions that call provider APIs, transform data, sync records, process webhooks, or perform actions. Generate them with AI, then edit them like normal application code. + + + + Call functions from your backend, trigger them on schedules or webhooks, or expose selected action functions as tools for AI agents through schemas and MCP. + + + +Nango's two core primitives are **Auth** for connecting user accounts and **Functions** for running integration logic on production infrastructure. + +## What you can build + +Explore the main product integration use cases: + + + + Give agents scoped, observable access to external APIs through Nango action functions. + + + Keep external API data fresh for your product, RAG pipeline, or change-detection workflow. + + + Use Nango functions to read, write, and automate external APIs on demand. + + + Receive provider webhooks through Nango, then forward or process them with functions. + + + Normalize several external APIs behind your own stable product interface. + + + Adapt integration behavior for each customer without forking code. + + + +## What Nango handles + + + + OAuth flows, API keys, token refresh, scopes, provider quirks, and per-user access to external APIs. + + + Actions, syncs, webhooks, schedules, retries, rate-limit backoff, checkpoints, and resumable execution. + + + Tool schemas, MCP support, and scoped action functions your agents can call without handling provider credentials. + + + Logs, metrics, alerts, isolated environments, CI/CD workflows, tenant isolation, open-source deployment, and compliance controls. + + + +## Get started + + + + Connect your first API and make a request in minutes. + + -## Why it matters +## Quickstart -Integration work used to mean choosing between slow custom builds and rigid pre-built connectors. +Source: https://nango.dev/docs/getting-started/quickstart.md -With Nango, you can describe the integration you need, generate working code in seconds, extend coverage as customers ask for new APIs, and customize behavior per customer while keeping the implementation in code you can review, test, and version control. +--- +title: 'Quickstart' +sidebarTitle: 'πŸš€ Quickstart' +description: 'Authorize an API and run your first Nango function' +--- + +## AI-assisted quickstart + +Copy this prompt into Claude, Cursor, or another coding agent to get guided through signup, API key setup, connection authorization, and your first function call. + +

+ + +
+ +For skills, the docs MCP server, and other agent setup options, see [Coding agent setup](/getting-started/coding-agent-setup). + +## Manual quickstart + +The steps below show the flow end to end. This quickstart uses the GitHub API as an example, but you can choose any of the [800+ APIs](/integrations/overview). + + + + [Sign up](https://app.nango.dev/signup) for free. This quickstart uses GitHub (User OAuth), which is pre-created with integration ID `github-getting-started`. + + If you want to test another API, go to the Integrations tab > Set up new integration > pick an API. + + + + + Go to the Connections tab > Add Test Connection > pick your integration, and complete the auth flow. For the GitHub example, pick `github-getting-started`. + + Copy the connection ID and your [Nango API key](/reference/backend/http-api/api-keys) from the Environment settings tab > API Keys. For the GitHub example, the integration ID is `github-getting-started`. You will use these values in the next steps. + + + + + The fastest way to enable a function is to use a template. + + Go to the Integrations tab > open the `github-getting-started` integration > Functions sub-tab. In the functions table, turn on the toggle in the Enable column for `get-repository`. + + This is a Nango Function: it runs provider-specific code with the connected account's credentials, without exposing those credentials to your app or agent. + + + You can also [build a custom function](/guides/functions/functions-guide#build-locally-with-the-cli) in your codebase, or use the [Functions API](/guides/functions/functions-guide#build-with-the-functions-api) to let an agent turn text-defined behavior into deployed function code. + + + + + + Trigger the function from your backend: + + + + Install the SDK with `npm i @nangohq/node`, then run: + + ```typescript + import { Nango } from '@nangohq/node'; + + const nango = new Nango({ secretKey: process.env.NANGO_API_KEY! }); + + const result = await nango.triggerAction( + 'github-getting-started', + '', + 'get-repository', + { + owner: 'NangoHQ', + repo: 'nango' + } + ); + + console.log(result); + ``` + + + + ```bash + curl --request POST \ + --url https://api.nango.dev/action/trigger \ + --header 'Authorization: Bearer ' \ + --header 'Connection-Id: ' \ + --header 'Provider-Config-Key: github-getting-started' \ + --header 'Content-Type: application/json' \ + --data '{ + "action_name": "get-repository", + "input": { + "owner": "NangoHQ", + "repo": "nango" + } + }' + ``` + + + + You should receive GitHub repository details such as the repository ID, full name, visibility, default branch, and owner. + + + + + Open the Logs tab to inspect the function execution, provider request, response, and any errors. + + πŸŽ‰ You connected an API and ran your first integration function. + + + + + + + Let users connect external APIs from your product. + + + Generate, test, customize, and deploy integration code. + + + Keep external API data fresh for your product or RAG pipeline. + + + Use action functions through tool calling and MCP. + + + + + +**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). -## How it works +## Coding Agent Setup - - - Embed Nango Auth in your product so users can connect accounts from external APIs. Nango handles OAuth, API keys, token refresh, scopes, permissions, and credential storage. - +Source: https://nango.dev/docs/getting-started/coding-agent-setup.md - - Build the integration logic as Nango Functions: TypeScript functions that call provider APIs, transform data, sync records, process webhooks, or perform actions. Generate them with AI, then edit them like normal application code. - +--- +title: 'Coding agent setup' +sidebarTitle: '✨ Coding agent setup' +description: 'Give coding agents the Nango docs, core skill, and MCP tools.' +--- + +Coding agents can speed up Nango integration work in two places: wiring Nango into your product and building [Nango Functions](/guides/functions/functions-guide). + + +Getting started with Nango and want to use a coding agent? Check out the [AI-assisted quickstart](/getting-started/quickstart). + + +This page is about generating integrations with AI. To expose Nango integrations to your product's agents, see [Tool calling & MCP](/guides/functions/tool-calling). + + +## Docs MCP server + +Add Nango's documentation MCP server to your coding agent to allow it to research docs & examples: + +```text +https://nango.dev/docs/mcp +``` + +It is public and does not require authentication. + +## Skills + +Nango's public skills live in [NangoHQ/skills](https://github.com/NangoHQ/skills). + +Install the core skill to implement Nango integration functions: + +```bash +npx skills add NangoHQ/skills -s building-nango-functions +``` + +See the [functions guide](/guides/functions/functions-guide) for more details. + +## Just-in-time integrations + +Nango integrations are defined as code. Usually, you or your coding agent write functions in a Git repo, review them like application code, and deploy them to Nango. + +Nango also exposes a Functions API for creating integrations just in time, without asking the user to interact with a codebase. A user can describe the integration behavior in text, and an agent can turn that into function code, compile it, dry run it against a connection, and deploy it directly to Nango. + +This is useful for faster onboarding, prototypes, and dynamic product experiences where integration behavior depends on what the user needs at that moment. It blurs the line between creating and consuming integrations: at consumption time, an agent can define the behavior, validate it, and make it available through Nango. See [build with the Functions API](/guides/functions/functions-guide#build-with-the-functions-api) for the workflow and API references. + +## Other agent tools + +These resources help agents discover Nango docs, provider slugs, API shapes, and runtime tool-calling paths. + +| Tool | URL | Use it for | +| --- | --- | --- | +| Docs MCP server | `https://nango.dev/docs/mcp` | Live docs context inside coding agents. | +| `llms.txt` | `https://nango.dev/docs/llms.txt` | Compact index of core Nango docs for LLM context windows. | +| `llms-full.txt` | `https://nango.dev/docs/llms-full.txt` | Full generated docs text for deeper offline context. | +| `api-catalog.txt` | `https://nango.dev/docs/api-catalog.txt` | Provider and integration slug discovery. | +| OpenAPI spec | `https://nango.dev/docs/spec.yaml` | Exact HTTP API schemas for code generation or typed clients. | - - Call functions from your backend, trigger them on schedules or webhooks, or expose selected action functions as tools for AI agents through schemas and MCP. - - +## Tool Calling -Nango's two core primitives are **Auth** for connecting user accounts and **Functions** for running integration logic on production infrastructure. - -## What you can build - -Explore the main product integration use cases: - - - - Give agents scoped, observable access to external APIs through Nango action functions. - - - Keep external API data fresh for your product, RAG pipeline, or change-detection workflow. - - - Use Nango functions to read, write, and automate external APIs on demand. - - - Receive provider webhooks through Nango, then forward or process them with functions. - - - Normalize several external APIs behind your own stable product interface. - - - Adapt integration behavior for each customer without forking code. - - +Source: https://nango.dev/docs/getting-started/use-cases/tool-calling.md -## What Nango handles - - - - OAuth flows, API keys, token refresh, scopes, provider quirks, and per-user access to external APIs. - - - Actions, syncs, webhooks, schedules, retries, rate-limit backoff, checkpoints, and resumable execution. - - - Tool schemas, MCP support, and scoped action functions your agents can call without handling provider credentials. - - - Logs, metrics, alerts, isolated environments, CI/CD workflows, tenant isolation, open-source deployment, and compliance controls. - - +--- +title: 'Tool calling for AI agents' +sidebarTitle: 'Tool calling for AI agents' +description: 'Give agents scoped, observable access to external APIs through Nango action functions.' +--- + +AI agents become useful when they can act in the systems your users already use: HubSpot, Gmail, Slack, Linear, Notion, Salesforce, and the rest. The hard part is not just calling an API. It is OAuth, token refresh, per-user permissions, rate limits, logging, and keeping credentials out of the model loop. + +Nango handles that plumbing. Users authorize integrations through Nango, you expose selected action functions as tools, and agents call those action functions through the Nango API or the built-in MCP server. + +## When this fits + +Use Nango for AI tool calling when: + +- Your agent needs to fetch or change data in external APIs. +- Tool calls must run with each user's own credentials. +- You want logs, retries, rate-limit handling, and a deployable runtime. +- You need template action functions now, with room for custom action functions later. +- You want one MCP server URL for Nango-hosted tools. + +For RAG-style workflows where data should be replicated before the agent needs it, use [Sync external API data](/getting-started/use-cases/syncs). + +## How Nango fits in + +1. Your user authorizes an integration with Nango. +2. You enable template action functions or deploy custom action functions for allowed operations. +3. Your agent lists or receives those action functions as tools. +4. The agent asks Nango to execute an action function for the right connection. +5. Nango runs the external API call with the user's credentials and logs the execution. + +This keeps provider credentials in Nango and gives you a stable tool surface across frameworks. + +## Technical setup + +Nango supports both direct action function execution and MCP-based tool discovery. Use the technical [Tool calling & MCP](/guides/functions/tool-calling) guide for headers, transports, tool discovery, action execution, and client setup. + +## What to read next + +- [Tool calling & MCP](/guides/functions/tool-calling) - connect Nango action functions to agents, LLM SDKs, and MCP clients. +- [Action functions](/guides/functions/action-functions) - build the action functions agents can call. +- [Get integration functions config](/reference/backend/http-api/scripts/config) - list enabled action functions programmatically. +- [Functions guide](/guides/functions/functions-guide) - create, test, deploy, and trigger functions. +- [Auth guide](/guides/auth/auth-guide) - let users authorize external APIs. -## Get started +## Syncs - - - Connect your first API and make a request in minutes. - - +Source: https://nango.dev/docs/getting-started/use-cases/syncs.md -## Quickstart +--- +title: 'Sync external API data' +sidebarTitle: 'Sync external API data' +description: 'Keep external API data fresh for your product, RAG pipeline, or change-detection workflow.' +--- + +Many products need a local copy of customer data from CRMs, file stores, ticketing tools, billing systems, calendars, or communication apps. Doing this reliably means handling OAuth, polling, pagination, rate limits, retries, deletions, and missed webhooks for every provider. + +Nango gives you a function runtime for this pattern. A sync function fetches data from the external API, writes records into Nango's cache, and notifies your app when records change. Your app then reads the changed records by cursor. + +## When this fits + +Use Nango to sync external API data when you need to: + +- Keep a local database or search index updated from customer tools. +- Feed RAG pipelines with fresh external data. +- Detect changes from APIs that do not offer reliable webhooks. +- Combine polling with provider webhooks for near real-time updates. +- Sync large datasets without restarting from scratch after failures. + +For one-off reads or writes, use [Run external API operations](/getting-started/use-cases/actions). + +## How Nango fits in + +1. Your user authorizes an integration with Nango. +2. You enable a template sync function or deploy your own. +3. Nango runs the sync function on its schedule, or when a provider webhook arrives. +4. The function saves records into Nango's records cache. +5. Nango sends your app a webhook when records change. +6. Your app reads changed records with a cursor and stores them in your system. + +The same foundation works for classic data sync, indexing, RAG ingestion, and trigger-style workflows. + +## What to read next + +- [Sync functions](/guides/functions/syncs/sync-functions) - build, run, and consume sync functions end to end. +- [Records cache](/guides/functions/syncs/records-cache) - understand records, change metadata, and cursors. +- [Checkpoints](/guides/functions/syncs/checkpoints) - make long-running functions resumable and incremental. +- [Deletion detection](/guides/functions/syncs/deletion-detection) - surface deletes from external APIs. +- [Real-time syncs](/guides/functions/syncs/realtime-syncs) - combine provider webhooks with polling. +- [Sync partitioning](/guides/functions/syncs/sync-partitioning) - fan out one connection into multiple sync variants. + + + You can also pair sync functions with Action functions for two-way sync: sync reads from the external API, then call a function on demand to write changes back. + -Source: https://nango.dev/docs/getting-started/quickstart.md -Description: Authorize an API and run your first Nango function +## Actions -## AI-assisted quickstart +Source: https://nango.dev/docs/getting-started/use-cases/actions.md -Copy this prompt into Claude, Cursor, or another coding agent to get guided through signup, API key setup, connection authorization, and your first function call. +--- +title: 'Run external API operations' +sidebarTitle: 'Run external API operations' +description: 'Use Nango functions to read, write, and automate external APIs on demand.' +--- + +Some integration work needs to happen immediately: create a CRM contact, send a Slack message, fetch the latest account settings, or run a multi-step workflow after a user clicks a button. + +Nango handles these on-demand operations with Action functions. You write the API logic once, Nango runs it with the right connection credentials, and your app calls the function from any backend or agent framework. + +## When this fits + +Use Action functions when you need to: + +- Run reads or writes against an external API on demand. +- Hide multi-step provider workflows behind one stable interface. +- Normalize the same operation across several APIs. +- Execute bulk or rate-limited work in the background. +- Expose selected operations as tools for AI agents. + +For continuously replicated data, use [Sync external API data](/getting-started/use-cases/syncs) instead. + +## How Nango fits in + +1. Your user authorizes an integration with Nango. +2. You enable a template function or deploy your own. +3. Your app calls the function with an input payload. +4. Nango executes the provider API calls with the user's credentials. +5. Your app receives the result, or polls/listens for completion if the function runs asynchronously. + +These functions are the technical foundation behind on-demand API operations, unified APIs, and AI tool calls. + +## What to read next + +- [Functions guide](/guides/functions/functions-guide) - create, test, deploy, and trigger functions end to end. +- [Action functions](/guides/functions/action-functions) - synchronous calls, async execution, retries, and workflows. +- [Tool calling for AI agents](/getting-started/use-cases/tool-calling) - use functions as AI tools. +- [Build a unified API](/getting-started/use-cases/unified-apis) - use functions behind a normalized product API. +- [Functions SDK reference](/reference/functions/functions-sdk) - runtime methods available inside function code. + + + You can enable template functions from the [template catalog](https://www.nango.dev/templates) and skip writing code until you need custom behavior. + -
- - -
+## Webhooks From External Apis -For skills, the docs MCP server, and other agent setup options, see [Coding agent setup](/getting-started/coding-agent-setup). +Source: https://nango.dev/docs/getting-started/use-cases/webhooks-from-external-apis.md -## Manual quickstart +--- +title: 'Process external webhooks' +sidebarTitle: 'Process external webhooks' +description: 'Receive provider webhooks through Nango, then forward or process them with functions.' +--- + +Many APIs can notify you when something changes, but each provider has its own webhook registration flow, payload shape, retries, and connection mapping. Nango gives external APIs one integration-specific webhook URL and attributes incoming events to the right connection. + +You can forward those webhooks to your app, process them in Nango functions, or combine them with sync functions for reliable near real-time data. + +## When this fits + +Use Nango for external webhooks when: + +- A provider can notify you about changes faster than polling alone. +- You need to map incoming provider webhooks to Nango connections. +- Webhooks should trigger follow-up API requests with the user's credentials. +- You want webhook events and related API calls visible in Nango logs. +- You need real-time sync behavior without relying only on provider webhooks. + +For outgoing webhooks from Nango to your app, see [Receive webhooks from Nango](/guides/platform/webhooks-from-nango). + +## How Nango fits in + +1. You register the Nango webhook URL in the provider's developer portal. +2. The provider sends events to Nango. +3. Nango attributes each event to the right integration and connection when possible. +4. Nango forwards the event to your app or routes it into a function. +5. If the event updates synced data, the function writes records to Nango's cache. + +## Common patterns + +- Forward the provider webhook payload to your app for custom handling. +- Use a webhook function to fetch the changed object and update the records cache. +- Keep a periodic sync function as reconciliation in case provider webhooks are missed. +- Register per-connection provider webhooks in an event function after authorization. + +## What to read next + +- [Webhook functions](/guides/functions/webhook-functions) - set up provider webhooks and process them in functions. +- [Webhook forwarding](/guides/platform/webhook-forwarding) - forward external API webhooks through Nango to your app. +- [Real-time syncs](/guides/functions/syncs/realtime-syncs) - combine provider webhooks with sync functions. +- [Event functions](/guides/functions/event-functions) - register provider webhooks after connection creation. +- [Receive webhooks from Nango](/guides/platform/webhooks-from-nango) - configure your app's webhook URL and verify signatures. +- [Sync functions](/guides/functions/syncs/sync-functions) - write changed records into Nango's cache. -The steps below show the flow end to end. This quickstart uses the GitHub API as an example, but you can choose any of the [800+ APIs](/integrations/overview). +## Unified Apis - - - [Sign up](https://app.nango.dev/signup) for free. This quickstart uses GitHub (User OAuth), which is pre-created with integration ID `github-getting-started`. +Source: https://nango.dev/docs/getting-started/use-cases/unified-apis.md - If you want to test another API, go to the Integrations tab > Set up new integration > pick an API. +--- +title: 'Build a unified API' +sidebarTitle: 'Build a unified API' +description: 'Normalize several external APIs behind your own stable product interface.' +--- + +API unification means turning several provider-specific APIs into one interface your product can use consistently. For example, your app might expose one `create-contact` operation even though Salesforce, HubSpot, Attio, and Pipedrive each model contacts differently. + +Nango helps you build unified APIs with functions you control. You define the model that fits your product, then implement provider-specific functions that map to and from that model. + +## When this fits + +Use Nango for API unification when: + +- Your customers use different tools for the same business object. +- Your product wants one internal model for reads and writes. +- You need provider-specific logic without leaking it into your app. +- A pre-built unified API is too rigid for your schema, customers, or edge cases. + +Unification does not need to cover every provider feature. Often the useful path is a stable common model with explicit provider-specific extensions where needed. + +## Where unification is hard + +Some APIs expose concepts that do not map neatly to other providers. Notion's block model, customizable ATS hiring stages, or provider-specific accounting workflows may need special handling. + +Design the unified model around your product's needs, not around an abstract lowest common denominator. Expect optional fields, explicit fallbacks, and customer-specific configuration for custom fields or statuses. + +## How Nango fits in + +1. You define the model your product wants to use. +2. Each provider gets functions that translate between the provider API and that model. +3. Sync functions read external data into your model. +4. Action functions write changes back through provider-specific logic. +5. Your app calls the stable Nango function interface instead of branching across providers. + +Use [data validation](/guides/functions/data-validation) to keep provider mappings honest and catch drift close to the external API. + +## What to read next + +- [Unified APIs with functions](/guides/functions/unified-apis) - technical implementation guide for building unified models and functions. +- [Action functions](/guides/functions/action-functions) - implement unified write operations and on-demand reads. +- [Sync functions](/guides/functions/syncs/sync-functions) - read provider data into your unified model. +- [Data validation](/guides/functions/data-validation) - validate models and generate schemas. +- [Storage](/guides/functions/storage#customer-configuration-pattern) - handle custom fields and per-customer mapping. +- [Functions SDK reference](/reference/functions/functions-sdk) - runtime methods available inside provider-specific functions. - +## Customer Configuration - - Go to the Connections tab > Add Test Connection > pick your integration, and complete the auth flow. For the GitHub example, pick `github-getting-started`. +Source: https://nango.dev/docs/getting-started/use-cases/customer-configuration.md - Copy the connection ID and your [Nango API key](/reference/backend/http-api/api-keys) from the Environment settings tab > API Keys. For the GitHub example, the integration ID is `github-getting-started`. You will use these values in the next steps. +--- +title: 'Customize per customer' +sidebarTitle: 'Customize per customer' +description: 'Adapt integration behavior for each customer without forking code.' +--- + +Many integrations need customer-specific behavior: custom field mappings, record filters, account IDs, feature flags, or provider-specific options. Large customers often have custom schemas in CRMs, ERPs, ticketing tools, and productivity apps, so one fixed integration path is rarely enough. + +Nango stores this configuration as metadata on each connection. Your functions read the metadata at runtime and adjust API requests, validation, transformations, or sync function schedules for that customer. + +## When this fits + +Use per-customer configuration when: + +- Customers need to map external custom fields to your product model. +- Different customers should sync different objects, folders, projects, or account scopes. +- A function needs provider-specific account context after authorization. +- You want one integration implementation with customer-specific behavior. + +Avoid adding configuration before you need it. Start with a default path, then add typed metadata when repeated customer needs appear. + +## How Nango fits in + +1. Your app collects the customer's choices during onboarding or settings. +2. Your app stores those choices on the Nango connection as metadata. +3. Nango functions read metadata while running for that connection. +4. The same function code adapts requests and transformations for each customer. + +Metadata is available to Action functions, sync functions, and event functions. + +## Common patterns + +- Fetch available custom fields with an action function, then store the customer's mapping. +- Store provider account IDs or workspace IDs discovered after authorization. +- Use metadata to filter which records a sync function should fetch. +- Start a sync function schedule only after required customer configuration exists. + +## What to read next + +- [Storage](/guides/functions/storage) - set, update, and read connection metadata from your app and functions. +- [Sync functions](/guides/functions/syncs/sync-functions) - use metadata to filter synced data. +- [Action functions](/guides/functions/action-functions) - fetch provider configuration options on demand. +- [Event functions](/guides/functions/event-functions) - initialize metadata when a connection is created. +- [Connection metadata API](/reference/backend/http-api/connections/set-metadata) - API reference. - +## Implement Event Handler - - The fastest way to enable a function is to use a template. +Source: https://nango.dev/docs/getting-started/use-cases/implement-event-handler.md - Go to the Integrations tab > open the `github-getting-started` integration > Functions sub-tab. In the functions table, turn on the toggle in the Enable column for `get-repository`. +--- +title: 'React to connection lifecycle events' +sidebarTitle: 'Connection lifecycle events' +description: 'Run integration logic when a connection is validated, created, or deleted.' +--- + +Some integration work should happen around the connection lifecycle rather than from a user action or schedule. For example, you may need to verify credentials before accepting a connection, register provider webhooks after authorization, or clean up subscriptions before a customer disconnects. + +Nango supports this with event functions. They run automatically for a specific integration and connection event. + +## When this fits + +Use event functions when you need to: + +- Validate credentials or provider permissions during connection creation. +- Register external webhook subscriptions after a connection is created. +- Fetch account context and store it as connection metadata. +- Clean up provider resources before a connection is deleted. + +These functions are not called by your app directly. Nango runs them when the configured lifecycle event occurs. + +## How Nango fits in + +1. Your user creates or deletes a connection. +2. Nango detects the lifecycle event. +3. Nango runs the event function with that connection's credentials. +4. The function validates, initializes, registers, or cleans up provider-side resources. +5. The execution appears in Nango logs. + +## What to read next + +- [Event functions](/guides/functions/event-functions) - supported events, function syntax, testing, and deployment. +- [Webhook functions](/guides/functions/webhook-functions) - register and process external webhooks. +- [Storage](/guides/functions/storage) - store account context on the connection. +- [Functions SDK reference](/reference/functions/functions-sdk#createonevent) - `createOnEvent()` reference. - This is a Nango Function: it runs provider-specific code with the connected account's credentials, without exposing those credentials to your app or agent. +## Sample App - - You can also [build a custom function](/guides/functions/functions-guide#build-locally-with-the-cli) in your codebase, or use the [Functions API](/guides/functions/functions-guide#build-with-the-functions-api) to let an agent turn text-defined behavior into deployed function code. - +Source: https://nango.dev/docs/getting-started/use-cases/sample-app.md - +--- +title: 'Sample app' +sidebarTitle: 'Sample app' +description: 'A practical demonstration of integrating Nango in your codebase.' +--- + +The sample app contains: +- **A frontend**: lets users connect an integration using the Nango frontend SDK. +- **A backend**: listens to Nango webhooks and consumes the Nango API to read & write data. + + + + + +The sample app uses Slack, Google Drive, OneDrive for Business, and OneDrive Personal as example integrations and is showcased in this [demo video](https://youtu.be/oTpWlmnv7dM). + +### Access the repository + + + + + +
NangoHQ/sample-app
+
+ + +### Run the sample app + + + + - Go to [nango.dev](https://app.nango.dev?source=sample-app) and create an account (free). + + + - Go to [Integrations](https://app.nango.dev/dev/integrations?source=sample-app) and create a Slack integration. + - Set up a Slack app: + 1. Go to [Slack Dev Center](https://api.slack.com/apps) and click **Create New App**. + 2. Select **From scratch** for a simpler flow. + 3. Enter your **App Name** and select a workspace to develop your app in, then click **Create App**. + 4. In the **Basic Information** tab, copy your **Client ID** and **Client Secret**. + 5. Go to **OAuth & Permissions** in the left sidebar. + 6. Under **Redirect URLs**, add `https://api.nango.dev/oauth/callback` and click **Save URLs**. + 7. Under **Scopes** > **Bot Token Scopes**, add: + - `users:read` + - `chat:write` + - Go back to Nango. In the _Authorization_ tab, add: + - `client_id`: from step 4 + - `client_secret`: from step 4 + - In the _Endpoints_ tab, activate `GET /users` and `POST /send-message`. + + + - Go to [Integrations](https://app.nango.dev/dev/integrations?source=sample-app) and create a Google Drive integration. + - Set up a Google Cloud project: + 1. Go to the [Google Cloud Console](https://console.cloud.google.com/) and create a new project (or select an existing one). + 2. Go to the [API Library](https://console.cloud.google.com/apis/library), search for **Google Drive API**, and click **Enable**. + 3. Go to **APIs & Services** > **OAuth consent screen** and configure it: + - Select **External** user type (or **Internal** for users within your Google Workspace organization). + - Fill in the required app information and contact information. + - Add the scope: `https://www.googleapis.com/auth/drive.readonly`. + - Add test users if using External user type. + 4. Go to **APIs & Services** > **Credentials** > **Create Credentials** > **OAuth client ID**. + 5. Select **Web application**, enter a name, and add `https://api.nango.dev/oauth/callback` under **Authorized redirect URIs**. + 6. Click **Create** and copy the **Client ID** and **Client Secret**. + 7. Copy the **Project Number** from the Google Cloud console under **IAM & Admin** > **Settings** > **Project Number**. + - Go back to the Google Drive integration in Nango. In the _Authorization_ tab, add: + - `client_id`: from step 6 + - `client_secret`: from step 6 + - `scopes`: `https://www.googleapis.com/auth/drive.readonly` + - In the _Endpoints_ tab, activate `GET /documents` endpoint. + + + - Go to [Integrations](https://app.nango.dev/dev/integrations?source=sample-app) and create a OneDrive for Business integration. + - Register an application in [Microsoft Entra admin center](https://entra.microsoft.com): + 1. Sign in to the Microsoft Entra admin center and search for **App registrations** > **New registration**. + 2. Enter a name (e.g., "Nango OneDrive Integration"). + 3. Under **Supported account types**, select **Accounts in any organizational directory** for multitenant apps. + 4. Click **Register** and note the **Application (client) ID** from the Overview page. + 5. Go to **Authentication** > **Add a platform** > **Web** and add `https://api.nango.dev/oauth/callback` as the Redirect URI. + 6. Go to **API permissions** > **Add a permission** > **Microsoft Graph** > **Delegated permissions** and add `Files.Read.All`. + 7. Go to **Certificates & secrets** > **New client secret**, create a secret, and copy the value immediately (you won't see it again). + - Go back to the OneDrive for Business integration in Nango. In the _Authorization_ tab, add: + - `client_id`: Application (client) ID from step 4 + - `client_secret`: Client secret value from step 7 + - `scopes`: Add `offline_access` and `.default` + - In the _Endpoints_ tab, activate `GET /user-files/selected` endpoint. + + + - Go to [Integrations](https://app.nango.dev/dev/integrations?source=sample-app) and create a OneDrive Personal integration. + - Register an application in [Microsoft Entra admin center](https://entra.microsoft.com): + 1. Sign in to the Microsoft Entra admin center and search for **App registrations** > **New registration**. + 2. Enter a name (e.g., "Nango OneDrive Personal Integration"). + 3. Under **Supported account types**, select **Accounts in any organizational directory and personal Microsoft accounts**. + 4. Click **Register** and note the **Application (client) ID** from the Overview page. + 5. Go to **Authentication** > **Add a platform** > **Web** and add `https://api.nango.dev/oauth/callback` as the Redirect URI. + 6. Go to **Certificates & secrets** > **New client secret**, create a secret, and copy the value immediately (you won't see it again). + - Go back to the OneDrive Personal integration in Nango. In the _Authorization_ tab, add: + - `client_id`: Application (client) ID from step 4 + - `client_secret`: Client secret value from step 6 + - `scopes`: Add `offline_access` and `onedrive.readonly` + - In the _Endpoints_ tab, activate `GET /user-files/selected` endpoint. + + + - Install: `NodeJS`, `Docker`. Then run: + + ```sh + git clone https://github.com/NangoHQ/sample-app.git + + cd sample-app + + nvm use + npm i + ``` + - Copy your Nango Secret Key, found in [Environment Settings > API Keys](https://app.nango.dev/dev/environment-settings#api-keys?source=sample-app). + - Create a file to store environment variables and fill in the Nango Secret Key: + ```sh + cp .env.example .env + ``` + - Paste the **Project Number** you copied in step 7 of the Google Drive integration setup into the .env file as `GOOGLE_PROJECT_NUMBER=your_project_number_here`: + ``` + cd front-end + cp .env.example .env + ``` + + + - This command should be running at all time: + + ```sh + npm run webhooks-proxy + ``` + + - Copy the URL the command gave you and go to [Environment Settings](https://app.nango.dev/dev/environment-settings?source=sample-app). Set Webhook URL to `${URL}/webhooks-from-nango`, e.g: `https://tame-socks-warn.loca.lt/webhooks-from-nango`. + + + - Run: + ```sh + npm run start + ``` + - Go to: [http://localhost:3011](http://localhost:3011) + + + The above sample app uses template functions, but you can also use custom ones. + + - Set up the Nango CLI: + ```sh + npm install -g nango + cd nango-integrations/ + nango init + ``` + - Add your Nango Secret Key in NANGO_SECRET_KEY_PROD in `./nango-integrations/.env`. + - Optionally customize the functions using [this guide](/guides/functions/functions-guide). + - Deploy the custom functions: + ```sh + nango deploy prod + ``` + + + +## File Integration Guide + +The sample app includes a complete implementation for integrating file storage providers (Google Drive, OneDrive) with your application. This guide walks you through using and understanding the file integration features. + +### Overview + +Nango's template file functions allow you to: + +1. **OAuth Flow**: Handle authentication using Nango's SDK +2. **File Picker**: Let users select specific files and folders to sync +3. **Document Sync**: Sync metadata for selected files and folders +4. **Document Fetching**: Download individual file contents as needed + +### Requirements + +- Docker (desktop) installed & running +- NodeJS & NPM installed +- A Nango account (sign up at [nango.dev](https://nango.dev)) +- Integration setup completed (see steps above) + +### Using the File Integration + +After setting up and running the sample app (see steps above), follow these instructions to test the file integration: + +1. **Access the sample app**: + - Open [http://localhost:3011](http://localhost:3011/) + - Click _Files_ to start the file integration + + Sample app home page with Files section highlighted + +2. **Connect your account** (Google Drive, OneDrive, etc.): + - Click the _Connect_ button on the provider's card + - In the connection popup, click the _Connect_ button + - Select your account and authorize the app + - Click the _Finish_ button to close the modal + + Connect popup with file provider account options + + Successfully connected to file provider + +3. **Select files and folders to sync**: + - Click the _Select Files from [Provider]_ button + - A file picker modal will appear - **note that each provider has its own native file picker**: + - **Google Drive**: Uses Google's Drive Picker UI + - **OneDrive for Business**: Uses Microsoft's file picker for organizational accounts + - **OneDrive Personal**: Uses Microsoft's file picker for personal accounts + - Select the files and folders you want to sync using the provider's file picker + - Click the _Select_ button to confirm your selection + + Select files and folders from provider + Select files and folders from provider + +4. **View synced files**: + - The files and folders will be synced to your Nango account and displayed in the UI + + Synced files and folders in the UI + +5. **Download a file**: + - Click the _Download_ button to download the file to your computer + +6. **Disconnect your account**: + - Click the _Disconnect_ button to disconnect your account and delete your connection from your Nango account + + Disconnect button + +### What Happens Under the Hood + +The sample app uses Nango to: + +1. **Authentication** + - Authenticate users with file storage providers + - Show the file picker + - Handle OAuth flow automatically + +2. **File Syncing** + - Sync selected files & folders + - Initial sync on selection + - Periodic updates + + Nango dashboard showing sync status and file list + +3. **File Download** + - Download raw file content + - Handle different file types + - Use Nango's proxy for reliable downloads + +### Key Components + +#### Frontend Implementation + +1. **Authorization Flow** + The authorization process is implemented in [`front-end/src/api.ts`](https://github.com/NangoHQ/sample-app/blob/main/front-end/src/api.ts): + - `postConnectSession`: Initiates the OAuth connection + - `getNangoCredentials`: Retrieves credentials after successful authorization + + The flow works as follows: + 1. Frontend initiates connection via `postConnectSession` + 2. Backend creates a Nango connection session + 3. User is redirected to provider OAuth consent screen + 4. After authorization, user is redirected back to the app + 5. User is shown the provider-specific file picker (Google Drive Picker, OneDrive for Business picker, or OneDrive Personal picker) + 6. Frontend can fetch credentials using `getNangoCredentials` + +#### Backend Implementation + +1. **Webhook Handler & Data Sync** + The webhook handling and data sync logic is implemented in [`back-end/src/routes/postWebhooks.ts`](https://github.com/NangoHQ/sample-app/blob/main/back-end/src/routes/postWebhooks.ts): + + Key components: + - Main webhook handler that verifies signatures and routes requests + - `handleNewConnectionWebhook`: Processes new file provider connections + - `handleSyncWebhook`: Handles sync completion and data processing + + The sync process: + 1. Nango syncs files from the provider + 2. Webhook notifies backend of sync completion + 3. Backend fetches records using `nango.listRecords` + 4. File metadata is stored in the database + 5. Deletions are tracked and handled appropriately + +2. **File Download with Proxy** + File download functionality is implemented in [`back-end/src/routes/downloadFile.ts`](https://github.com/NangoHQ/sample-app/blob/main/back-end/src/routes/downloadFile.ts): + + The download process: + 1. Frontend requests file download with file ID and connection ID + 2. Backend uses Nango proxy to fetch file from provider + 3. File is streamed to client with proper headers + 4. Error handling ensures graceful failure + + Key features: + - Uses Nango proxy for secure file access + - Proper content type and disposition headers + - Streaming response for efficient file transfer + - Comprehensive error handling + +### Nango Dashboard + +Explore these sections in your Nango account: + +1. **Integration Settings** + - [View Integrations](https://app.nango.dev/dev/integrations) + - Configure sync settings + - View integration status + +2. **Connections** + - [View Connections](https://app.nango.dev/dev/connections) + - Monitor sync status + - Check connection health + +3. **Logs** + - [View Logs](https://app.nango.dev/dev/logs) + - Track sync operations + - Debug issues + +### Common Issues and Solutions + +1. **Connection Issues** + - Check Docker is running + - Verify webhook URL is correct + - Ensure provider credentials are valid + +2. **Sync Problems** + - Check Nango logs + - Verify file permissions + - Monitor sync status + +### File Type Support + +The sample app supports all file types through Nango's proxy: + +- **Regular files** (PDFs, images, documents, etc.) +- **Google Workspace files** (Docs, Sheets, Slides) +- **Microsoft Office files** (Word, Excel, PowerPoint) +- **Other cloud storage file types** + + + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + + +## Next steps + +- [Auth guide](/guides/auth/auth-guide) - understand the authorization flow used by the sample app. +- [Sync functions](/guides/functions/syncs/sync-functions) - customize the data sync logic. +- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - process sync and auth notifications. - - Trigger the function from your backend: +## Auth Guide - - - Install the SDK with `npm i @nangohq/node`, then run: +Source: https://nango.dev/docs/guides/auth/auth-guide.md - ```typescript - import { Nango } from '@nangohq/node'; +--- +title: 'Auth guide' +sidebarTitle: 'Auth guide' +description: 'Let your users connect external APIs to your agents & apps.' +--- + +## Overview + +Nango Auth lets your users connect 800+ external APIs to your product. You embed a Nango-managed auth flow in your application, and Nango handles authorization, credential storage, refresh, and validation. + +A **Connection** is created after each successful authorization. It stores one user's credentials for one external API and keeps them valid over time. Credentials can be retrieved at scale or used directly by other Nango primitives β€” without ever passing through your codebase. + +## How it works + +The end-to-end flow has four steps: + +1. **Backend** β€” your server asks Nango for a short-lived **session token**. +2. **Frontend** β€” your app opens the Nango **Connect UI** with that token. +3. **User** β€” authorizes the API. Nango stores the credentials. +4. **Backend** β€” Nango sends an **auth webhook** with the **connection ID**. You persist it alongside your user/org/project. + +Once you have the connection ID, fetch credentials whenever you need them: + + + + ```ts + await nango.getConnection(integrationId, connectionId); + ``` + + + ```bash + curl "https://api.nango.dev/connections/{connectionId}?provider_config_key={integrationId}" \ + -H "Authorization: Bearer {nangoSecretKey}" + ``` + + + +## Capabilities + +- **Auth schemes** β€” OAuth 2.0, OAuth 1.0a, API keys, basic auth, custom. 800+ APIs supported; new ones [added on demand](/integrations/contribute-or-request-api) within days, by request or self-contributed. +- **Pre-built UI** β€” Embedded Connect UI with API-specific guidance, input validation, and your branding. Or [customize Connect UI or build a custom UI](/guides/auth/customize-connect-ui). +- **Credential management** β€” Encrypted storage, automatic refresh, retrieval at scale. Combine with [Proxy](/guides/platform/proxy-requests) or [Functions](/guides/functions/functions-guide) to avoid handling credentials directly. +- **Observability** β€” Failure detection, reconnect flow, and per-connection logs. + +## Guide + + + **Using a coding agent?** Set up the [docs MCP](/getting-started/coding-agent-setup#docs-mcp-server) and [skills](/getting-started/coding-agent-setup#skills), then copy this page as prompt. + + + + + Sign up for free (no credit card): [![Try Nango Cloud](/images/nango-deploy-button.svg)](https://app.nango.dev/signup) + + + Signup cannot be automated. Ask the user to sign up at [app.nango.dev/signup](https://app.nango.dev/signup) and provide their Nango API key from the Environment settings tab > API Keys. Use it as `Authorization: Bearer ` in API requests. + + The default API key created on signup has full access and is the simplest option. + + If the user creates a scoped API key instead, this guide needs `environment:integrations:create` (step 2) and `environment:connect_sessions:write` (steps 5 and 8). See [API keys](/reference/backend/http-api/api-keys). + + + + + In the dashboard, open the [Integrations](https://app.nango.dev/dev/integrations) tab, click **Configure New Integration**, and pick the API. + + Each API has a dedicated [Nango documentation page](/integrations/overview) with setup notes and gotchas. + + + OAuth APIs require an OAuth developer app registered with the provider. Register one on the provider's developer portal, use the `Callback URL` shown in your Nango integration settings, then paste the `Client ID` and `Client Secret` back into Nango. Register any required scopes too. + + If this integration will be used in production, complete the optional custom callback URL step below before real users connect. Retrofitting a callback URL later requires updating the provider app and can break new authorization or reconnect flows until the provider and Nango settings match. + + For OAuth 2.0 providers, Nango shows **suggested scopes** β€” auto-discovered and refreshed at least monthly. They're suggestions; you can use any scope the provider supports. + + + For popular APIs, Nango ships a built-in shared developer app so you can test connections with zero setup. We strongly recommend registering your own OAuth app before going live β€” see [OAuth developer apps](#oauth-developer-apps) below. + + + + + Create the integration with the API. If you need the provider slug first, list providers and use the matching provider's `name` field: + + ```bash + curl --request GET \ + --url https://api.nango.dev/providers \ + --header 'Authorization: Bearer ' + ``` + + For OAuth providers, walk the user through registering an OAuth developer app on the provider's portal: link them to the provider's OAuth-app creation page, tell them which `Callback URL` to paste (visible in the Nango integration settings after creation), and ask them to send back the `client_id` and `client_secret` so you can pass them in the request body. + + + + ```bash + curl --request POST \ + --url https://api.nango.dev/integrations \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "unique_key": "", + "provider": "", + "credentials": { + "type": "OAUTH2", + "client_id": "", + "client_secret": "", + "scopes": "," + } + }' + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/integrations \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "unique_key": "", + "provider": "" + }' + ``` + + + + For all fields and response shapes, see the [List all providers API](/reference/backend/http-api/providers/list), [Create an integration API](/reference/backend/http-api/integration/create), and [Update an integration API](/reference/backend/http-api/integration/update). + + + + + In the [Connections](https://app.nango.dev/dev/connections) tab, click **Add Test Connection**, pick your integration, and authorize using a test account. The new connection's credentials appear in its *Authorization* tab β€” securely stored and automatically refreshed. + + + Skip the dashboard. Create a connect session and share the returned `connect_link` with the user β€” they authorize using their test account in the browser, no UI needed on your side: + + ```bash + curl --request POST \ + --url https://api.nango.dev/connect/sessions \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "tags": { + "end_user_id": "" + }, + "allowed_integrations": [""] + }' + ``` + + The response contains a `connect_link` (valid 30 minutes). Send it to the user; once they complete authorization, confirm with `GET /connections`. See [Share a connect link](/guides/auth/share-connect-link). + + + + + For production OAuth apps, a callback URL on your own domain is recommended. Some providers show the callback domain to users. + + + + To configure a custom callback URL: + 1. Add an endpoint on your domain (e.g. `https://example.com/oauth-callback`) that **308-redirects** to `https://api.nango.dev/oauth/callback`, preserving all query parameters. + 2. Update the registered callback URL with each API provider β€” otherwise they'll reject new authorization flows. + 3. After confirming steps 1 and 2, update the callback URL in Nango's **Environment Settings**. Settings are per-environment, so repeat for every environment. + + + Ask the user what production callback URL they want to use, then have them add a 308 redirect from that URL to `https://api.nango.dev/oauth/callback` before they register provider OAuth apps. The Nango environment setting is dashboard-only β€” ask the user to paste the final callback URL into **Environment Settings > Backend**. + + + + + Set up a backend endpoint that your frontend will call before each authorization attempt to retrieve a session token from Nango ([API](/reference/backend/http-api/connect/sessions/create) / [Node SDK](/reference/backend/backend-sdk/node#create-a-connect-session)). + + You'll need an [API key](/reference/backend/http-api/api-keys) with the `environment:connect_sessions:write` scope (find it in **Environment Settings > API Keys**). + + + + ```ts + import { Nango } from '@nangohq/node'; + + const nango = new Nango({ secretKey: process.env.NANGO_API_KEY! }); + + api.post('/sessionToken', async (req, res) => { + const { data } = await nango.createConnectSession({ + tags: { + end_user_id: '', + end_user_email: '', + organization_id: '' + }, + allowed_integrations: [''] + }); + + res.status(200).send({ sessionToken: data.token }); + }); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/connect/sessions \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "tags": { + "end_user_id": "", + "end_user_email": "", + "organization_id": "" + }, + "allowed_integrations": [""] + }' + ``` + + + + + Tags reconcile Nango's auth-success webhook with the right user, org, or entity in your system. Most apps start with: `end_user_id`, `end_user_email`, `organization_id`. + + Tags are also useful for filtering connections via the API and are displayed in the Nango UI. Set the reserved UI tag keys `end_user_display_name` and `end_user_email` to populate the connections list and connection detail page. + + See [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) for more. + + + `allowed_integrations` controls what the user sees: + - **Multiple integrations** β€” Connect UI shows a picker. + - **Single integration** β€” Connect UI sends the user straight to its auth flow. + + + + Load the Nango frontend SDK, fetch the session token from your backend, and open Connect UI: + + + ![](/images/screenshots/connect-ui.gif) + + + ```js + import Nango from '@nangohq/frontend'; + + const nango = new Nango(); + const connect = nango.openConnectUI({ + onEvent: (event) => { + if (event.type === 'close') { + // Modal closed. + } else if (event.type === 'connect') { + // Auth flow successful. + } + }, + }); + + const res = await fetch('/sessionToken', { method: 'POST' }); + connect.setSessionToken(res.sessionToken); // A loading indicator shows until this is set. + ``` + + See the [Frontend SDK reference](/reference/frontend/frontend-sdk#connect-using-nango-connect-ui) for more options. + + The pre-built Connect UI is recommended but optional β€” if you need full UX control, follow [Customize Connect UI](/guides/auth/customize-connect-ui). For email/cross-device flows, see [Share a connect link](/guides/auth/share-connect-link). + + + + When authorization succeeds, Nango generates a unique **connection ID**. You use this ID to manage the connection and retrieve its credentials. **You must store it on your side**, attached to the user/org/project that owns the connection β€” Nango doesn't model that ownership. + + Set up the webhook in **Environment Settings**: + 1. Specify a **Webhook URL** in the Nango UI. + 2. Enable **Send New Connection Creation Webhooks**. + 3. Handle `POST` requests on that route in your backend. + + + Webhook URL configuration is dashboard-only β€” there is no public API for environment settings. Ask the user to paste the webhook URL into **Environment Settings** and enable **Send New Connection Creation Webhooks**. + + + Webhook payload: + + ```json + { + "type": "auth", + "operation": "creation", + "success": true, + "connectionId": "", + "tags": { + "end_user_id": "", + "end_user_email": "", + "organization_id": "" + } + } + ``` + + Persist `connectionId` against whichever entity owns the connection in your app. + + + + Credentials can become invalid when users revoke access, providers rotate refresh tokens, scopes change, or an app moves from testing to production. Re-authorization updates an existing connection's credentials while preserving its data and config. Deleting and re-creating the connection wipes that data β€” prefer re-authorization. + + Before showing integration settings, check the connection with `GET /connections/{connectionId}`: + + + + ```ts + import { Nango } from '@nangohq/node'; + + const nango = new Nango({ secretKey: process.env.NANGO_API_KEY! }); + + try { + await nango.getConnection('', ''); + // Connection is valid. + } catch (error) { + if (error.response?.data?.error?.code === 'invalid_credentials') { + // Connection is invalid β€” show a Reconnect button. + displayReconnectUI(); + } + } + ``` + + + ```bash + curl --request GET \ + --url 'https://api.nango.dev/connections/?provider_config_key=' \ + --header 'Authorization: Bearer ' + ``` + + + + An `invalid_credentials` error means the connection failed credential refresh or validation β€” show an error state with a **Reconnect** button. + + To trigger re-authorization, use the same frontend flow as a new connection, but generate a reconnect session token on the backend. Pass the returned token to the Frontend SDK exactly like a normal session token. On success you'll receive an `auth` webhook with `operation = override`. + + + + ```ts + import { Nango } from '@nangohq/node'; + + const nango = new Nango({ secretKey: process.env.NANGO_API_KEY! }); + + api.post('/sessionToken', async (req, res) => { + const { data } = await nango.createReconnectSession({ + connection_id: '', + integration_id: '' + }); + + res.status(200).send({ sessionToken: data.token }); + }); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/connect/sessions/reconnect \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "connection_id": "", + "integration_id": "" + }' + ``` + + + + + + Test the auth flow from your app and verify a connection appears in the [Connections](https://app.nango.dev/dev/connections) tab. Failed attempts are inspectable in the **Logs** tab. + + + After the user runs the flow, confirm the connection was created with [`GET /connections`](/reference/backend/http-api/connections/list) β€” filter by the tags you set in step 5: + + ```bash + curl --request GET \ + --url 'https://api.nango.dev/connections?tags[end_user_id]=' \ + --header 'Authorization: Bearer ' + ``` + + Auth logs are dashboard-only β€” if the call returns no connection, ask the user to check the **Logs** tab for the failure reason. + + + πŸŽ‰ **You are connected!** Next: + - View connections and credentials in the **Connections** tab. + - Retrieve credentials via the [API](/reference/backend/http-api/connections/get) or [Node SDK](/reference/backend/backend-sdk/node#get-a-connection-with-credentials). + - Build with [sync functions](/guides/functions/syncs/sync-functions), [Action functions](/guides/functions/action-functions), [webhook functions](/guides/functions/webhook-functions), or any other Nango function type. + + + + + **Questions, problems, feedback?** Reach out in the [Slack community](https://nango.dev/slack). + + +## OAuth developer apps + +Nango ships built-in shared developer apps for some OAuth 2.0 APIs so you can test connections with zero setup. + +They work in production too, but we strongly recommend registering your own before going live. Most OAuth APIs have a step-by-step setup guide in [APIs & Integrations](/integrations/overview) β€” for example, [Gmail](/api-integrations/google-mail/how-to-register-your-own-gmail-api-oauth-app). + +Reasons to register your own: +- **Whitelabel auth** β€” with Nango's app, users authorize Nango instead of your product. +- **Scopes** β€” Nango developer apps have fixed scopes. Your own app supports any scope the provider exposes. +- **Callback URL** β€” Nango developer apps use Nango's callback. Your own app supports a [custom callback URL](#custom-oauth-callback-url-optional) on your domain. +- **Marketplace listings** β€” provider marketplaces require your own developer app. +- **Advanced API features** β€” some provider features are only available to first-party apps. +- **Revocation risk** β€” most providers don't allow shared credentials. Nango developer apps may be revoked by the provider at any time. +- **Portability** β€” only your own developer app lets you export access and refresh tokens and move off Nango without users re-authorizing. + +The same tradeoffs apply to shared OAuth apps provided by other auth platforms. + +## Related guides + +- [Share a connect link](/guides/auth/share-connect-link) - send authorization links by email, support tools, or cross-device flows. +- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - store the right connection-level data in the right field. +- [Customize Connect UI](/guides/auth/customize-connect-ui) - customize branding or build your own authorization UI. +- [Token refreshing and validity](/guides/auth/token-refreshing) - handle revoked or expired credentials. - const nango = new Nango({ secretKey: process.env.NANGO_API_KEY! }); +## Share Connect Link - const result = await nango.triggerAction( - 'github-getting-started', - '', - 'get-repository', - { - owner: 'NangoHQ', - repo: 'nango' - } - ); +Source: https://nango.dev/docs/guides/auth/share-connect-link.md - console.log(result); - ``` - +--- +title: 'Share a connect link' +sidebarTitle: 'Share a connect link' +description: 'Generate a short-lived connect link and share it with your end user.' +--- + +Use a connect link when you want to trigger authorization without opening Connect UI immediately in your app (for example: email-based onboarding, support-assisted setup, or cross-device flows). + +## Option 1: Generate a link from your backend + +Create a connect session and return the `connect_link` to your frontend or internal tools: + + + + ```ts + import { Nango } from '@nangohq/node'; + + const nango = new Nango({ secretKey: process.env[''] }); + + api.post('/connectLink', async (req, res) => { + const { data } = await nango.createConnectSession({ + tags: { + end_user_id: '', + end_user_email: '', + organization_id: '' + }, + allowed_integrations: [''] + }); + + res.status(200).send({ + connectLink: data.connect_link, + expiresAt: data.expires_at + }); + }); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/connect/sessions \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "tags": { + "end_user_id": "", + "end_user_email": "", + "organization_id": "" + }, + "allowed_integrations": [ + "" + ] + }' + ``` + + + +The returned `connect_link` expires after 30 minutes. + +## Option 2: Generate a link from the dashboard + +In the Nango dashboard, open the Connections page and use the **Share connect link** button. This generates a link that you can share directly with the end user. + +## Notes + +- For the API details, see [Create a connect session](/reference/backend/http-api/connect/sessions/create). + +## Related guides + +- [Auth guide](/guides/auth/auth-guide) - embed the standard Connect UI flow. +- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - reconcile completed links with users and orgs. +- [Create a connect session API](/reference/backend/http-api/connect/sessions/create) - API details for generated links. - - ```bash - curl --request POST \ - --url https://api.nango.dev/action/trigger \ - --header 'Authorization: Bearer ' \ - --header 'Connection-Id: ' \ - --header 'Provider-Config-Key: github-getting-started' \ - --header 'Content-Type: application/json' \ - --data '{ - "action_name": "get-repository", - "input": { - "owner": "NangoHQ", - "repo": "nango" - } - }' - ``` - - +## Connection tags, configuration, and metadata - You should receive GitHub repository details such as the repository ID, full name, visibility, default branch, and owner. +Source: https://nango.dev/docs/guides/auth/connection-tags-configuration-metadata.md +Description: Use tags, connection configuration, and metadata for the right connection-level data. - + + Pre-requisite: complete the [Set up an integration](/guides/auth/auth-guide#guide) section of the Auth guide. + - - Open the Logs tab to inspect the function execution, provider request, response, and any errors. +A Nango connection can store several kinds of information besides credentials. Use the right field depending on what the data does. - πŸŽ‰ You connected an API and ran your first integration function. +| Field | Use it for | Example | +| --- | --- | --- | +| `tags` | Attribution, filtering, routing, and webhook reconciliation. | `end_user_id`, `organization_id`, `workspace_id` | +| `connection_config` | Provider-specific information required for the connection to be valid or usable. | `subdomain`, `tenantId`, `region`, API base URL | +| `metadata` | Your own application or function configuration stored on the connection. | field mappings, selected folder IDs, feature flags | - +## Connection tags - - - - Let users connect external APIs from your product. - - - Generate, test, customize, and deploy integration code. - - - Keep external API data fresh for your product or RAG pipeline. - - - Use action functions through tool calling and MCP. - - - -
+Tags are small key/value strings you attach to a Connect session. Nango copies them to the resulting connection and includes them in auth webhooks. -**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). +Their primary purpose is **attribution**. Nango uses random UUIDs as connection IDs, so tags are the bridge between a Nango connection and the user, organization, workspace, or other entity in your system. -## Coding agent setup +Most apps start with these tags: -Source: https://nango.dev/docs/getting-started/coding-agent-setup.md -Description: Give coding agents the Nango docs, core skill, and MCP tools. +- `end_user_id` +- `end_user_email` +- `organization_id` -Coding agents can speed up Nango integration work in two places: wiring Nango into your product and building [Nango Functions](/guides/functions/functions-guide). +Then add whatever additional routing identifiers you need, such as `workspace_id`, `project_id`, or `plan`. -Getting started with Nango and want to use a coding agent? Check out the [AI-assisted quickstart](/getting-started/quickstart). + To make connections easier to identify in the Nango dashboard, set `end_user_display_name` and `end_user_email`. Nango uses these reserved UI tag keys to populate the connections list and connection detail page. - -This page is about generating integrations with AI. To expose Nango integrations to your product's agents, see [Tool calling & MCP](/guides/functions/tool-calling). - -## Docs MCP server + + Tags are designed for identifiers and routing metadata. Avoid putting secrets or large/free-form payloads in tags. + -Add Nango's documentation MCP server to your coding agent to allow it to research docs & examples: +### Add tags when creating a Connect session -```text -https://nango.dev/docs/mcp -``` +When requesting a new Connect session token from Nango, pass a `tags` object: -It is public and does not require authentication. + + + ```ts + import { Nango } from '@nangohq/node'; -## Skills + const nango = new Nango({ secretKey: process.env[''] }); -Nango's public skills live in [NangoHQ/skills](https://github.com/NangoHQ/skills). + api.post('/sessionToken', async (req, res) => { + const { data } = await nango.createConnectSession({ + tags: { + end_user_id: '', + end_user_email: '', + organization_id: '' + }, + allowed_integrations: [''] + }); -Install the core skill to implement Nango integration functions: + res.status(200).send({ sessionToken: data.token }); + }); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/connect/sessions \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "tags": { + "end_user_id": "", + "end_user_email": "", + "organization_id": "" + }, + "allowed_integrations": [ + "" + ] + }' + ``` + + -```bash -npx skills add NangoHQ/skills -s building-nango-functions -``` +### Read tags from the auth webhook -See the [functions guide](/guides/functions/functions-guide) for more details. +These tags appear in successful auth webhooks sent by Nango: -## Just-in-time integrations +```json +{ + "type": "auth", + "operation": "creation", + "success": true, + "connectionId": "", + "tags": { + "end_user_id": "", + "end_user_email": "", + "organization_id": "" + } +} +``` -Nango integrations are defined as code. Usually, you or your coding agent write functions in a Git repo, review them like application code, and deploy them to Nango. +Use these values to reconcile the generated `connectionId` with the user, organization, or workspace that initiated the flow in your application. -Nango also exposes a Functions API for creating integrations just in time, without asking the user to interact with a codebase. A user can describe the integration behavior in text, and an agent can turn that into function code, compile it, dry run it against a connection, and deploy it directly to Nango. +### Read and filter connections by tags -This is useful for faster onboarding, prototypes, and dynamic product experiences where integration behavior depends on what the user needs at that moment. It blurs the line between creating and consuming integrations: at consumption time, an agent can define the behavior, validate it, and make it available through Nango. See [build with the Functions API](/guides/functions/functions-guide#build-with-the-functions-api) for the workflow and API references. +Nango stores tags on the connection itself. -## Other agent tools + + + ```ts + import { Nango } from '@nangohq/node'; -These resources help agents discover Nango docs, provider slugs, API shapes, and runtime tool-calling paths. + const nango = new Nango({ secretKey: '' }); + const connection = await nango.getConnection('', ''); -| Tool | URL | Use it for | -| --- | --- | --- | -| Docs MCP server | `https://nango.dev/docs/mcp` | Live docs context inside coding agents. | -| `llms.txt` | `https://nango.dev/docs/llms.txt` | Compact index of core Nango docs for LLM context windows. | -| `llms-full.txt` | `https://nango.dev/docs/llms-full.txt` | Full generated docs text for deeper offline context. | -| `api-catalog.txt` | `https://nango.dev/docs/api-catalog.txt` | Provider and integration slug discovery. | -| OpenAPI spec | `https://nango.dev/docs/spec.yaml` | Exact HTTP API schemas for code generation or typed clients. | + console.log(connection.tags); + ``` + + + ```ts + import { Nango } from '@nangohq/node'; -## Tool calling for AI agents + const nango = new Nango({ secretKey: '' }); -Source: https://nango.dev/docs/getting-started/use-cases/tool-calling.md -Description: Give agents scoped, observable access to external APIs through Nango action functions. + const { connections } = await nango.listConnections({ + tags: { + end_user_id: '', + organization_id: '' + }, + limit: 100 + }); -AI agents become useful when they can act in the systems your users already use: HubSpot, Gmail, Slack, Linear, Notion, Salesforce, and the rest. The hard part is not just calling an API. It is OAuth, token refresh, per-user permissions, rate limits, logging, and keeping credentials out of the model loop. + console.log(connections); + ``` + + + ```bash + curl --request GET \ + --url 'https://api.nango.dev/connections?tags[end_user_id]=&tags[organization_id]=' \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' + ``` + + -Nango handles that plumbing. Users authorize integrations through Nango, you expose selected action functions as tools, and agents call those action functions through the Nango API or the built-in MCP server. +Filtering uses an AND match: a connection must contain all provided tag keys and values. -## When this fits +### Update tags on an existing connection -Use Nango for AI tool calling when: +If you need to update tags after a connection is created, patch the connection: -- Your agent needs to fetch or change data in external APIs. -- Tool calls must run with each user's own credentials. -- You want logs, retries, rate-limit handling, and a deployable runtime. -- You need template action functions now, with room for custom action functions later. -- You want one MCP server URL for Nango-hosted tools. + + + ```ts + import { Nango } from '@nangohq/node'; -For RAG-style workflows where data should be replicated before the agent needs it, use [Sync external API data](/getting-started/use-cases/syncs). + const nango = new Nango({ secretKey: '' }); -## How Nango fits in + await nango.patchConnection( + { + connectionId: '', + provider_config_key: '' + }, + { + tags: { + end_user_id: '', + end_user_email: '', + organization_id: '', + environment: '' + } + } + ); + ``` + + + ```bash + curl --request PATCH \ + --url 'https://api.nango.dev/connections/?provider_config_key=' \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "tags": { + "end_user_id": "", + "end_user_email": "", + "organization_id": "", + "environment": "" + } + }' + ``` + + -1. Your user authorizes an integration with Nango. -2. You enable template action functions or deploy custom action functions for allowed operations. -3. Your agent lists or receives those action functions as tools. -4. The agent asks Nango to execute an action function for the right connection. -5. Nango runs the external API call with the user's credentials and logs the execution. + + Updating tags replaces the whole tag object. If you want to add or remove a single tag, fetch the current connection first, merge locally, then patch. + -This keeps provider credentials in Nango and gives you a stable tool surface across frameworks. +### Reserved UI tag keys -## Technical setup +Two tag keys are reserved for improving the Nango dashboard UI: -Nango supports both direct action function execution and MCP-based tool discovery. Use the technical [Tool calling & MCP](/guides/functions/tool-calling) guide for headers, transports, tool discovery, action execution, and client setup. +- `end_user_display_name` - shown instead of the connection ID in the connections list, making it easier to identify who a connection belongs to. +- `end_user_email` - shown alongside `end_user_display_name` in the connections list. The domain from the email address is also used to display the end user's company logo on the connection detail page. -## What to read next + + ![](/images/screenshots/connection-tags-1.png) + -- [Tool calling & MCP](/guides/functions/tool-calling) - connect Nango action functions to agents, LLM SDKs, and MCP clients. -- [Action functions](/guides/functions/action-functions) - build the action functions agents can call. -- [Get integration functions config](/reference/backend/http-api/scripts/config) - list enabled action functions programmatically. -- [Functions guide](/guides/functions/functions-guide) - create, test, deploy, and trigger functions. -- [Auth guide](/guides/auth/auth-guide) - let users authorize external APIs. + + ![](/images/screenshots/connection-tags-2.png) + -## Sync external API data +### Tag rules -Source: https://nango.dev/docs/getting-started/use-cases/syncs.md -Description: Keep external API data fresh for your product, RAG pipeline, or change-detection workflow. +- `end_user_email` must be a valid email address, for example `user@example.com`. +- Tag keys are lowercased, so `End_User_Email` and `end_user_email` are treated as the same key. +- Keys are case-insensitive, and duplicate keys after normalization are rejected. +- Keys must start with a letter and contain only alphanumerics, underscores, hyphens, periods, or slashes. +- Keys can be up to 64 characters long. +- A connection can have up to 10 tag keys. +- Values must be non-empty strings up to 255 characters long. -Many products need a local copy of customer data from CRMs, file stores, ticketing tools, billing systems, calendars, or communication apps. Doing this reliably means handling OAuth, polling, pagination, rate limits, retries, deletions, and missed webhooks for every provider. +## Connection configuration -Nango gives you a function runtime for this pattern. A sync function fetches data from the external API, writes records into Nango's cache, and notifies your app when records change. Your app then reads the changed records by cursor. +Connection configuration is provider-specific information stored on a connection because the connection needs it to work. -## When this fits +It can be required to: -Use Nango to sync external API data when you need to: +- build an OAuth authorization URL, such as a Zendesk subdomain +- choose the correct API base URL, such as a region or account-specific host +- call API endpoints later, such as a tenant ID, account ID, portal ID, or workspace ID +- store values Nango discovers during authorization, such as an API instance URL or provider account ID -- Keep a local database or search index updated from customer tools. -- Feed RAG pipelines with fresh external data. -- Detect changes from APIs that do not offer reliable webhooks. -- Combine polling with provider webhooks for near real-time updates. -- Sync large datasets without restarting from scratch after failures. +Use connection configuration when the value is part of the connection's validity. If the value is missing, the connection may fail to authorize, fail credential checks, or be unusable for API requests. -For one-off reads or writes, use [Run external API operations](/getting-started/use-cases/actions). +When you use the pre-built [Connect UI](/guides/auth/auth-guide), Nango generates the required forms for the integration and stores the submitted values as connection configuration. -## How Nango fits in +When you use [headless auth with a custom UI](/guides/auth/customize-connect-ui#build-your-own-auth-ui), you must collect required connection configuration in your own UI and pass it to `nango.auth()`: -1. Your user authorizes an integration with Nango. -2. You enable a template sync function or deploy your own. -3. Nango runs the sync function on its schedule, or when a provider webhook arrives. -4. The function saves records into Nango's records cache. -5. Nango sends your app a webhook when records change. -6. Your app reads changed records with a cursor and stores them in your system. +```js +nango.auth('zendesk', { + params: { subdomain: '' } +}); +``` -The same foundation works for classic data sync, indexing, RAG ingestion, and trigger-style workflows. +You can also set defaults when creating a Connect session: -## What to read next + + + ```ts + const { data } = await nango.createConnectSession({ + allowed_integrations: [''], + integrations_config_defaults: { + '': { + connection_config: { + '': '' + } + } + } + }); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/connect/sessions \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "allowed_integrations": [""], + "integrations_config_defaults": { + "": { + "connection_config": { + "": "" + } + } + } + }' + ``` + + -- [Sync functions](/guides/functions/syncs/sync-functions) - build, run, and consume sync functions end to end. -- [Records cache](/guides/functions/syncs/records-cache) - understand records, change metadata, and cursors. -- [Checkpoints](/guides/functions/syncs/checkpoints) - make long-running functions resumable and incremental. -- [Deletion detection](/guides/functions/syncs/deletion-detection) - surface deletes from external APIs. -- [Real-time syncs](/guides/functions/syncs/realtime-syncs) - combine provider webhooks with polling. -- [Sync partitioning](/guides/functions/syncs/sync-partitioning) - fan out one connection into multiple sync variants. +Read connection configuration from the connection: - - You can also pair sync functions with Action functions for two-way sync: sync reads from the external API, then call a function on demand to write changes back. - +```ts +const connection = await nango.getConnection('', ''); -## Run external API operations +console.log(connection.connection_config); +``` -Source: https://nango.dev/docs/getting-started/use-cases/actions.md -Description: Use Nango functions to read, write, and automate external APIs on demand. +For the REST API response shape, see [Get a connection](/reference/backend/http-api/connections/get). For the Node SDK method, see [Get a connection with credentials](/reference/backend/backend-sdk/node#get-a-connection-with-credentials). -Some integration work needs to happen immediately: create a CRM contact, send a Slack message, fetch the latest account settings, or run a multi-step workflow after a user clicks a button. +## Connection metadata -Nango handles these on-demand operations with Action functions. You write the API logic once, Nango runs it with the right connection credentials, and your app calls the function from any backend or agent framework. +Metadata is arbitrary JSON storage on the connection. Use it for information your app or Nango functions need, but that is not a condition for the connection itself to exist. -## When this fits +Good metadata examples: -Use Action functions when you need to: +- field mappings chosen by a customer +- folder, project, board, or object IDs selected during onboarding +- filters and feature flags used by sync functions +- tenant-specific identifiers discovered by your setup flow +- provider webhook subscription IDs used by webhook functions -- Run reads or writes against an external API on demand. -- Hide multi-step provider workflows behind one stable interface. -- Normalize the same operation across several APIs. -- Execute bulk or rate-limited work in the background. -- Expose selected operations as tools for AI agents. +Do not use metadata for credentials or values required to make the provider connection valid. Use connection configuration for that. Do not use metadata for synced datasets or large lists of records; use the [records cache](/guides/functions/syncs/records-cache) for sync output. -For continuously replicated data, use [Sync external API data](/getting-started/use-cases/syncs) instead. +Set metadata after a connection is created: -## How Nango fits in + + + ```ts + await nango.setMetadata( + '', + '', + { + syncArchived: false, + fieldMapping: { + companyName: 'Account_Name__c' + } + } + ); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/connections/metadata \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "connection_id": "", + "provider_config_key": "", + "metadata": { + "syncArchived": false, + "fieldMapping": { + "companyName": "Account_Name__c" + } + } + }' + ``` + + -1. Your user authorizes an integration with Nango. -2. You enable a template function or deploy your own. -3. Your app calls the function with an input payload. -4. Nango executes the provider API calls with the user's credentials. -5. Your app receives the result, or polls/listens for completion if the function runs asynchronously. +Functions can read metadata for the connection they run for: -These functions are the technical foundation behind on-demand API operations, unified APIs, and AI tool calls. +```ts +const metadata = await nango.getMetadata(); +``` -## What to read next +For deeper function patterns, see [Storage](/guides/functions/storage). -- [Functions guide](/guides/functions/functions-guide) - create, test, deploy, and trigger functions end to end. -- [Action functions](/guides/functions/action-functions) - synchronous calls, async execution, retries, and workflows. -- [Tool calling for AI agents](/getting-started/use-cases/tool-calling) - use functions as AI tools. -- [Build a unified API](/getting-started/use-cases/unified-apis) - use functions behind a normalized product API. -- [Functions SDK reference](/reference/functions/functions-sdk) - runtime methods available inside function code. +**Related guides** - - You can enable template functions from the [template catalog](https://www.nango.dev/templates) and skip writing code until you need custom behavior. - +- [Auth guide](/guides/auth/auth-guide) - create connections with Connect UI. +- [Customize Connect UI](/guides/auth/customize-connect-ui) - customize branding or pass connection configuration without Connect UI. +- [Share a connect link](/guides/auth/share-connect-link) - include tags in link-based flows. +- [Storage](/guides/functions/storage) - use metadata inside functions. +- [List connections API](/reference/backend/http-api/connections/list) - filter connections by tags. -## Process external webhooks +## Customize Connect Ui -Source: https://nango.dev/docs/getting-started/use-cases/webhooks-from-external-apis.md -Description: Receive provider webhooks through Nango, then forward or process them with functions. +Source: https://nango.dev/docs/guides/auth/customize-connect-ui.md -Many APIs can notify you when something changes, but each provider has its own webhook registration flow, payload shape, retries, and connection mapping. Nango gives external APIs one integration-specific webhook URL and attributes incoming events to the right connection. +--- +title: 'Customize Connect UI' +sidebarTitle: 'Customize Connect UI' +description: 'Guide to branding Nango Connect UI, overriding setup links, or building a headless auth flow with your own UI.' +--- + + +Pre-requisites: +- complete the [Set up an integration](/guides/auth/auth-guide#guide) section of the Auth guide +- generate a [Connect session token](/guides/auth/auth-guide#guide) + + +Nango's pre-built [Connect UI](/guides/auth/auth-guide) is the recommended way to let users authorize integrations. It generates the right form for each API, validates required inputs, tests credentials when supported, and shows users where to find API keys or other required values. + +You can customize that pre-built UI with your own branding. If you need full control over every screen, you can also skip Connect UI and use Nango in a **headless auth** mode. + +## Customize the pre-built Connect UI + +You can customize the Connect UI theme from the Nango dashboard: + +1. Open **Environment Settings**. +2. Go to the **Connect UI** tab. +3. Choose the theme: light, dark, or system. +4. Set the primary color for the light theme. +5. Set the primary color for the dark theme. +6. Optionally remove the **Secured by Nango** mention. + +These settings apply to the pre-built Connect UI that you open with [`nango.openConnectUI()`](/reference/frontend/frontend-sdk#connect-using-nango-connect-ui). + +Connect UI branding customization is available on the [Growth plan](https://www.nango.dev/pricing). + +## Override documentation links + +By default, the Connect UI displays info icons that link to the Nango documentation. If you are embedding Connect UI in a customer-facing application and want these links to point to your own documentation instead, override them per integration using the `overrides` parameter when [creating a Connect session](/reference/backend/http-api/connect/sessions/create). + +This feature is available on the [Growth plan](https://www.nango.dev/pricing). + + + + +See the full [SDK reference](/reference/backend/backend-sdk/node#create-a-connect-session) for all available parameters. + +```js +const { data } = await nango.createConnectSession({ + // Recommended: copied onto the connection and included in auth webhooks. + tags: { + end_user_id: '', + end_user_email: '', + organization_id: '' + }, + + allowed_integrations: ['', ''], + integrations_config_defaults: { + '': { + connection_config: { + '': '' + } + } + }, + overrides: { + '': { + docs_connect: 'https://your-docs.com/how-to-connect' + } + } +}); +``` + + + +See the full [API reference](/reference/backend/http-api/connect/sessions/create) for all available parameters. + +```bash +curl --request POST \ + --url https://api.nango.dev/connect/sessions \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "tags": { + "end_user_id": "", + "end_user_email": "" + }, + "overrides": { + "": { + "docs_connect": "https://your-docs.com/how-to-connect" + } + } +}' +``` + + + + +Replace `` with the unique name of the integration, for example `jira` or `slack`, and set `docs_connect` to the URL you want the info icons to link to. + +## Build your own auth UI + +Headless auth means you build the user-facing setup UI yourself and use the frontend SDK to pass the required values to Nango. + +Headless auth still uses Nango for the backend parts of auth: Nango stores credentials, refreshes OAuth tokens, manages connection records, sends auth webhooks, and lets you call APIs through the proxy or from functions. What changes is the setup experience your user sees before the connection is created. + +## What changes with headless auth + +For OAuth APIs, calling `nango.auth()` opens the external API's login popup directly. Your user skips the Nango pre-authorization screen. This is useful when you want a shorter flow, but it also means you must collect any provider-specific inputs that the Nango Connect UI would normally ask for first. + +For API key, Basic Auth, and other non-OAuth flows, there is no external login popup. You must build the form that collects the user's credentials, validate field formats in your own UI, and pass the credentials to `nango.auth()`. Nango can still reject invalid credentials when the integration supports credential checks, but your UI owns the input fields, error messages, and setup guidance. + +Some APIs also require **connection configuration** in addition to credentials. For example, an API might need a subdomain, domain, tenant ID, region, or account-specific base URL to build the authorization URL or make future API requests. Connect UI collects these fields automatically. With headless auth, your UI must collect them and pass them programmatically. + +See [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) for the difference between connection configuration, metadata, and tags. + +## Use the frontend SDK for headless auth + +In your frontend, initiate Nango ([reference](/reference/frontend/frontend-sdk#instantiate-the-frontend-sdk)): + +```ts +import Nango from '@nangohq/frontend'; + +const nango = new Nango({ connectSessionToken: '' }); +``` + +Then create the connection with `nango.auth()` ([reference](/reference/frontend/frontend-sdk#connect-using-the-headless-client)): + + + + + +For OAuth, `nango.auth()` opens the external API's login popup directly. + +```js +nango + .auth('') + .then((result) => { + // Show success UI. + }) + .catch((error) => { + // Show failure UI. + }); +``` + + + + + +For API key auth, collect the API key in your own UI, then pass it to Nango. + +```js +nango + .auth('', { + credentials: { + apiKey: '' + } + }) + .then((result) => { + // Show success UI. + }) + .catch((error) => { + // Show failure UI. + }); +``` + + + + + +For Basic Auth, collect the username and password in your own UI, then pass them to Nango. + +```js +nango + .auth('', { + credentials: { + username: '', + password: '' + } + }) + .then((result) => { + // Show success UI. + }) + .catch((error) => { + // Show failure UI. + }); +``` + + + + +## Pass connection configuration + +Some APIs require connection-specific configuration to authorize or make API requests later. Zendesk is a common example: the OAuth authorization URL includes the user's Zendesk subdomain: + +`https://.zendesk.com/oauth/authorizations/new` + +With Connect UI, Nango asks for this value in an automatically generated form. With headless auth, collect it in your own UI and pass it as `params`: + +```js +nango.auth('zendesk', { + params: { subdomain: '' } +}); +``` + +You can also set default connection configuration when you create the Connect session. This is useful when your backend already knows a required value: + + + + + +```js +const { data } = await nango.createConnectSession({ + allowed_integrations: [''], + integrations_config_defaults: { + '': { + connection_config: { + '': '' + } + } + } +}); +``` + + + + +```bash +curl --request POST \ + --url https://api.nango.dev/connect/sessions \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "allowed_integrations": [""], + "integrations_config_defaults": { + "": { + "connection_config": { + "": "" + } + } + } + }' +``` + + + + +In some cases, you might want to override scopes at the connection level. Pass the scopes to `nango.auth()`: + +```js +nango.auth('', { + params: { oauth_scopes_override: 'custom-connection-scope' } +}); +``` + +Nango stores this connection configuration on the connection. You can retrieve it with the SDK ([reference](/reference/backend/backend-sdk/node#get-a-connection-with-credentials)) or API ([reference](/reference/backend/http-api/connections/get)), or see it in connection details in the Nango UI. + +## Next + +Once authorization succeeds, [_save the connection ID_](/guides/auth/auth-guide#guide). + + + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + + +## Related guides + +- [Auth guide](/guides/auth/auth-guide) - compare the managed Connect UI flow. +- [Frontend SDK reference](/reference/frontend/frontend-sdk#connect-using-the-headless-client) - headless authorization methods and parameters. +- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - understand connection-level storage. -You can forward those webhooks to your app, process them in Nango functions, or combine them with sync functions for reliable near real-time data. +## Token Refreshing -## When this fits +Source: https://nango.dev/docs/guides/auth/token-refreshing.md -Use Nango for external webhooks when: +--- +title: "Token refreshing & validity" +sidebarTitle: "Token refreshing & validity" +description: "How Nango handles OAuth token refresh and what to do when tokens are revoked." +--- + +## Automatic token refresh + +Nango automatically refreshes OAuth access tokens before they expire. You don't need to implement any refresh logic in your application. + +To prevent token revocation due to inactivity (some APIs revoke unused refresh tokens), Nango refreshes each access token at least once every 24 hours. + +## Handling refresh failures + +Token refresh can fail for various reasons: +- The user revoked access in the external application +- The external API revoked the refresh token +- The external API experienced an outage + +When a refresh fails, Nango can [notify your app via webhook](/guides/platform/webhooks-from-nango) so you can prompt the user to reconnect. + +## Best practices + +Revoked access tokens and refresh failures happen to all integrations. To handle them gracefully: + +1. **Monitor for failures**: Set up [webhooks from Nango](/guides/platform/webhooks-from-nango) to receive notifications when token refresh fails +2. **Handle revoked tokens**: Follow our [guide on handling revoked access tokens](/guides/platform/common-issues#token-refresh-error-from-the-external-api) +3. **Implement re-authorization**: Make sure you have the [re-authorization flow](/guides/auth/auth-guide#re-authorize-an-existing-connection) in place so users can easily reconnect broken connections + +## Related guides + +- [Auth guide](/guides/auth/auth-guide#re-authorize-an-existing-connection) - implement reconnect sessions for invalid credentials. +- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - receive refresh failure notifications. +- [Common issues](/guides/platform/common-issues#token-refresh-error-from-the-external-api) - troubleshoot revoked tokens. + + +**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + -- A provider can notify you about changes faster than polling alone. -- You need to map incoming provider webhooks to Nango connections. -- Webhooks should trigger follow-up API requests with the user's credentials. -- You want webhook events and related API calls visible in Nango logs. -- You need real-time sync behavior without relying only on provider webhooks. +## Functions guide -For outgoing webhooks from Nango to your app, see [Receive webhooks from Nango](/guides/platform/webhooks-from-nango). +Source: https://nango.dev/docs/guides/functions/functions-guide.md +Description: Understand Nango Functions and choose the right way to start using them. -## How Nango fits in +## Overview -1. You register the Nango webhook URL in the provider's developer portal. -2. The provider sends events to Nango. -3. Nango attributes each event to the right integration and connection when possible. -4. Nango forwards the event to your app or routes it into a function. -5. If the event updates synced data, the function writes records to Nango's cache. +**Functions** are Nango's runtime for custom integration logic. -## Common patterns +When you build integrations directly, every provider forces you to solve the same hard problems: OAuth credentials, token refresh, per-customer permissions, retries, rate limits, data freshness, observability, and safe execution. Nango handles that infrastructure, and functions let you write the provider-specific logic that is unique to your product. -- Forward the provider webhook payload to your app for custom handling. -- Use a webhook function to fetch the changed object and update the records cache. -- Keep a periodic sync function as reconciliation in case provider webhooks are missed. -- Register per-connection provider webhooks in an event function after authorization. +You write functions in TypeScript and deploy them to Nango. Your app can call them from any language, framework, backend job, or agent workflow. Each execution runs for a specific integration and connection, so the function has scoped access to the right customer's credentials without exposing those credentials to your app or agent. -## What to read next +## How functions fit -- [Webhook functions](/guides/functions/webhook-functions) - set up provider webhooks and process them in functions. -- [Webhook forwarding](/guides/platform/webhook-forwarding) - forward external API webhooks through Nango to your app. -- [Real-time syncs](/guides/functions/syncs/realtime-syncs) - combine provider webhooks with sync functions. -- [Event functions](/guides/functions/event-functions) - register provider webhooks after connection creation. -- [Receive webhooks from Nango](/guides/platform/webhooks-from-nango) - configure your app's webhook URL and verify signatures. -- [Sync functions](/guides/functions/syncs/sync-functions) - write changed records into Nango's cache. +1. Your user authorizes an external API through [Nango Auth](/guides/auth/auth-guide). +2. Your app stores the resulting `connectionId`. +3. You enable or deploy functions for the integration. +4. Nango runs the function on demand, on a schedule, from an external webhook, or after a connection lifecycle event. +5. Your app receives the function result, sync records, or webhooks from Nango. -## Build a unified API +Functions are the right layer when you need custom API logic, data syncing, webhook processing, AI tools, or per-customer integration behavior. -Source: https://nango.dev/docs/getting-started/use-cases/unified-apis.md -Description: Normalize several external APIs behind your own stable product interface. +## Capabilities -API unification means turning several provider-specific APIs into one interface your product can use consistently. For example, your app might expose one `create-contact` operation even though Salesforce, HubSpot, Attio, and Pipedrive each model contacts differently. +- **Scoped external API access** β€” run API calls with the credentials and scopes of one connection. +- **Any app stack** β€” trigger functions through HTTP APIs or SDKs from any backend language. +- **Multiple trigger types** β€” call functions on demand, run them on a schedule, route external webhooks into them, or react to connection lifecycle events. +- **Agent-ready tools** β€” expose selected functions to agents through the API or Nango's MCP server while keeping provider credentials out of the model loop. +- **Built-in integration infrastructure** β€” retries, rate-limit handling, logs, OpenTelemetry export, records storage, checkpoints, and per-connection metadata. +- **Flexible development workflows** β€” enable a template, build headlessly through the Functions API, or keep function code in a local CLI project. -Nango helps you build unified APIs with functions you control. You define the model that fits your product, then implement provider-specific functions that map to and from that model. + +## Guide -## When this fits +### Ways to enable functions -Use Nango for API unification when: +There are three ways to enable or develop Nango functions. Start with the path that matches how much control and dynamism you need. -- Your customers use different tools for the same business object. -- Your product wants one internal model for reads and writes. -- You need provider-specific logic without leaking it into your app. -- A pre-built unified API is too rigid for your schema, customers, or edge cases. +| Path | Best for | How it works | +| --- | --- | --- | +| [Option 1: Use function templates](#use-function-templates) | Getting started quickly when Nango already has the provider operation in the catalog. | Enable a pre-built function on an integration, then call it from your app, backend job, or agent workflow. | +| [Option 2: Build locally with the CLI](#build-locally-with-the-cli) | Serious production use cases where you want reviewable diffs, tests, CI/CD, and source control. | Write TypeScript functions in your repo, dry run them against real connections, and deploy with the Nango CLI. | +| [Option 3: Build with the Functions API](#build-with-the-functions-api) | Prototypes, provider operations not covered by templates, and just-in-time integrations where an agent creates behavior dynamically. | Send generated TypeScript source to Nango, compile it, dry run it, and deploy it without a local functions project. | -Unification does not need to cover every provider feature. Often the useful path is a stable common model with explicit provider-specific extensions where needed. + + + +### Option 1: Use function templates -## Where unification is hard +Function templates are pre-built Nango functions for common provider operations. Use them when the catalog already covers what you need and you want the shortest path to a working integration. -Some APIs expose concepts that do not map neatly to other providers. Notion's block model, customizable ATS hiring stages, or provider-specific accounting workflows may need special handling. +You can find templates in the [template catalog](https://www.nango.dev/templates), in the integration page of the Nango dashboard, and in the [Nango integration templates repository](https://github.com/NangoHQ/integration-templates). -Design the unified model around your product's needs, not around an abstract lowest common denominator. Expect optional fields, explicit fallbacks, and customer-specific configuration for custom fields or statuses. +When a template matches your use case, enable it on the integration and call it from your app. If it is close but not exact, [pull it into a local functions project and customize it](#extend-a-template). -## How Nango fits in + +#### Extend a template -1. You define the model your product wants to use. -2. Each provider gets functions that translate between the provider API and that model. -3. Sync functions read external data into your model. -4. Action functions write changes back through provider-specific logic. -5. Your app calls the stable Nango function interface instead of branching across providers. +Use the CLI to pull a template's code into your local functions project from the public catalog: -Use [data validation](/guides/functions/data-validation) to keep provider mappings honest and catch drift close to the external API. +```bash +nango pull github list-repos --catalog +``` -## What to read next +`nango pull` writes a single function and its dependencies. After pulling, review the source and schemas, import the function from `index.ts` if needed, adjust inputs, outputs, record models, metadata, or provider mapping logic, then run `nango dryrun` and deploy with `nango deploy`. -- [Unified APIs with functions](/guides/functions/unified-apis) - technical implementation guide for building unified models and functions. -- [Action functions](/guides/functions/action-functions) - implement unified write operations and on-demand reads. -- [Sync functions](/guides/functions/syncs/sync-functions) - read provider data into your unified model. -- [Data validation](/guides/functions/data-validation) - validate models and generate schemas. -- [Storage](/guides/functions/storage#customer-configuration-pattern) - handle custom fields and per-customer mapping. -- [Functions SDK reference](/reference/functions/functions-sdk) - runtime methods available inside provider-specific functions. + + Pull template code when you need custom fields, a smaller output shape, customer-specific filtering, different retry behavior, or a provider workflow that is close to a template function but not identical. + -## Customize per customer + +### Option 2: Build locally with the CLI -Source: https://nango.dev/docs/getting-started/use-cases/customer-configuration.md -Description: Adapt integration behavior for each customer without forking code. +Local development is the default path for production integrations. Use it when your engineering team wants function code in source control, reviewable diffs, local tests, CI/CD, and a stable project layout. -Many integrations need customer-specific behavior: custom field mappings, record filters, account IDs, feature flags, or provider-specific options. Large customers often have custom schemas in CRMs, ERPs, ticketing tools, and productivity apps, so one fixed integration path is rarely enough. +
+ +
-Nango stores this configuration as metadata on each connection. Your functions read the metadata at runtime and adjust API requests, validation, transformations, or sync function schedules for that customer. + + + Install the Nango CLI globally: -## When this fits + ```bash + npm install -g nango + ``` -Use per-customer configuration when: + Initialize your integrations folder at the root of your repo and commit it to source control: -- Customers need to map external custom fields to your product model. -- Different customers should sync different objects, folders, projects, or account scopes. -- A function needs provider-specific account context after authorization. -- You want one integration implementation with customer-specific behavior. + ```bash + nango init nango-integrations + ``` -Avoid adding configuration before you need it. Start with a default path, then add typed metadata when repeated customer needs appear. + This creates a `nango-integrations/` folder with example configuration. The `.nango` subdirectory must be committed because the CLI uses it to track deployed state. + -## How Nango fits in + + Add your [API keys](/reference/backend/http-api/api-keys) to a `.env` file inside `nango-integrations/`. The CLI currently reads these API keys from `NANGO_SECRET_KEY_` variables: -1. Your app collects the customer's choices during onboarding or settings. -2. Your app stores those choices on the Nango connection as metadata. -3. Nango functions read metadata while running for that connection. -4. The same function code adapts requests and transformations for each customer. + ```bash + NANGO_SECRET_KEY_PROD='' + NANGO_SECRET_KEY_DEV='' + ``` -Metadata is available to Action functions, sync functions, and event functions. + Get your [API keys](/reference/backend/http-api/api-keys) from **Environment Settings > API Keys**. Despite the variable name, each value stores a [Nango API key](/reference/backend/http-api/api-keys). The CLI picks up the matching key for whichever environment you deploy to. -## Common patterns + `nango init` creates `nango-integrations/.gitignore` with `.env` ignored. Keep the `.env` file untracked so [Nango API keys](/reference/backend/http-api/api-keys) are not committed. -- Fetch available custom fields with an action function, then store the customer's mapping. -- Store provider account IDs or workspace IDs discovered after authorization. -- Use metadata to filter which records a sync function should fetch. -- Start a sync function schedule only after required customer configuration exists. + + Keys are matched by environment name: `NANGO_SECRET_KEY_`. If you rename an environment in the UI, update the variable name in `.env` to match. -## What to read next + For example, an environment named `staging` needs: -- [Storage](/guides/functions/storage) - set, update, and read connection metadata from your app and functions. -- [Sync functions](/guides/functions/syncs/sync-functions) - use metadata to filter synced data. -- [Action functions](/guides/functions/action-functions) - fetch provider configuration options on demand. -- [Event functions](/guides/functions/event-functions) - initialize metadata when a connection is created. -- [Connection metadata API](/reference/backend/http-api/connections/set-metadata) - API reference. + ```bash + NANGO_SECRET_KEY_STAGING='' + ``` + -## React to connection lifecycle events + + Use a shared environment (usually `dev`) for day-to-day collaboration. Create personal test connections with [per-connection webhook URL overrides](/guides/platform/webhooks-from-nango#override-webhook-urls-per-connection) pointing at your local webhook endpoint, and deploy functions granularly (`nango deploy --sync` / `--action` / `--integration`) so teammates don't overwrite each other. See [Engineering collaboration](/guides/platform/environments#engineering-collaboration). + Use CI to do full deploys across stable environments (like `staging` or `prod`). See the [CI/CD guide](/guides/functions/ci-cd). + -Source: https://nango.dev/docs/getting-started/use-cases/implement-event-handler.md -Description: Run integration logic when a connection is validated, created, or deleted. + + Run `nango init nango-integrations` to scaffold the folder. Ask the user for their [Nango API key](/reference/backend/http-api/api-keys) from **Environment Settings > API Keys** and write it to the matching `NANGO_SECRET_KEY_` variable in `nango-integrations/.env`. Confirm that `nango-integrations/.gitignore` ignores `.env`. -Some integration work should happen around the connection lifecycle rather than from a user action or schedule. For example, you may need to verify credentials before accepting a connection, register provider webhooks after authorization, or clean up subscriptions before a customer disconnects. + For additional context while building, add Nango's documentation MCP server (`https://nango.dev/docs/mcp`) and install the local builder skill: -Nango supports this with event functions. They run automatically for a specific integration and connection event. + ```bash + npx skills add NangoHQ/skills -s building-nango-functions-locally + ``` + + -## When this fits + + A Nango integrations folder is a small TypeScript project. The root contains shared project files, and each integration gets its own folder named after the integration ID. -Use event functions when you need to: + Inside each integration folder, keep function files grouped by type. Sync functions live in `syncs/`, action functions in `actions/`, and event functions in `on-events/`. This keeps the trigger model visible from the file path and matches how the CLI discovers function code. -- Validate credentials or provider permissions during connection creation. -- Register external webhook subscriptions after a connection is created. -- Fetch account context and store it as connection metadata. -- Clean up provider resources before a connection is deleted. + The root `index.ts` is the deployment entry point. It should import every function file you want Nango to compile and deploy, for example `import './github/syncs/github-issues';`. Files that are not imported from `index.ts` are not part of the deployed function set. -These functions are not called by your app directly. Nango runs them when the configured lifecycle event occurs. + The `.nango/` folder stores CLI-managed project state, including deployment tracking. Commit it so teammates and CI deploy from the same baseline. -## How Nango fits in + ``` + nango-integrations/ + β”œβ”€β”€ .nango/ # auto-managed state, commit it + β”œβ”€β”€ .env # API keys per environment + β”œβ”€β”€ .gitignore # keeps .env and dist untracked + β”œβ”€β”€ index.ts # imports every function file + β”œβ”€β”€ package.json + └── / # one folder per integration, e.g. github + β”œβ”€β”€ syncs/ + β”‚ └── github-issues.ts + β”œβ”€β”€ actions/ + β”‚ └── github-create-issue.ts + └── on-events/ + └── post-connection-creation.ts + ``` + -1. Your user creates or deletes a connection. -2. Nango detects the lifecycle event. -3. Nango runs the event function with that connection's credentials. -4. The function validates, initializes, registers, or cleans up provider-side resources. -5. The execution appears in Nango logs. + + Keep dev mode running while you write code: -## What to read next + ```bash + nango dev + ``` -- [Event functions](/guides/functions/event-functions) - supported events, function syntax, testing, and deployment. -- [Webhook functions](/guides/functions/webhook-functions) - register and process external webhooks. -- [Storage](/guides/functions/storage) - store account context on the connection. -- [Functions SDK reference](/reference/functions/functions-sdk#createonevent) - `createOnEvent()` reference. + `nango dev` continuously type-checks and compiles your function files, surfacing errors immediately. + -## Sample app + + Choose the right function type for your integration use case: -Source: https://nango.dev/docs/getting-started/use-cases/sample-app.md -Description: A practical demonstration of integrating Nango in your codebase. - -The sample app contains: -- **A frontend**: lets users connect an integration using the Nango frontend SDK. -- **A backend**: listens to Nango webhooks and consumes the Nango API to read & write data. - - - - - -The sample app uses Slack, Google Drive, OneDrive for Business, and OneDrive Personal as example integrations and is showcased in this [demo video](https://youtu.be/oTpWlmnv7dM). - -### Access the repository - - - - - -
NangoHQ/sample-app
-
+ -### Run the sample app + | If you need to... | Use | Common trigger | Guide | + | --- | --- | --- | --- | + | Keep external API data fresh, replicate records, or reconcile changes | Sync function | Schedule, manual sync trigger, or external webhook reconciliation | [Sync functions](/guides/functions/syncs/sync-functions) | + | Run an operation when your app, backend job, or agent asks for it | Action function | HTTP API, SDK, async action queue, or MCP/tool call | [Action functions](/guides/functions/action-functions) | + | Process an external provider webhook inside Nango | Webhook function | External API webhook | [Webhook functions](/guides/functions/webhook-functions) | + | React to Nango connection lifecycle events | Event function | Connection creation, validation, or deletion | [Event functions](/guides/functions/event-functions) | - - - - Go to [nango.dev](https://app.nango.dev?source=sample-app) and create an account (free). - - - - Go to [Integrations](https://app.nango.dev/dev/integrations?source=sample-app) and create a Slack integration. - - Set up a Slack app: - 1. Go to [Slack Dev Center](https://api.slack.com/apps) and click **Create New App**. - 2. Select **From scratch** for a simpler flow. - 3. Enter your **App Name** and select a workspace to develop your app in, then click **Create App**. - 4. In the **Basic Information** tab, copy your **Client ID** and **Client Secret**. - 5. Go to **OAuth & Permissions** in the left sidebar. - 6. Under **Redirect URLs**, add `https://api.nango.dev/oauth/callback` and click **Save URLs**. - 7. Under **Scopes** > **Bot Token Scopes**, add: - - `users:read` - - `chat:write` - - Go back to Nango. In the _Authorization_ tab, add: - - `client_id`: from step 4 - - `client_secret`: from step 4 - - In the _Endpoints_ tab, activate `GET /users` and `POST /send-message`. - - - - Go to [Integrations](https://app.nango.dev/dev/integrations?source=sample-app) and create a Google Drive integration. - - Set up a Google Cloud project: - 1. Go to the [Google Cloud Console](https://console.cloud.google.com/) and create a new project (or select an existing one). - 2. Go to the [API Library](https://console.cloud.google.com/apis/library), search for **Google Drive API**, and click **Enable**. - 3. Go to **APIs & Services** > **OAuth consent screen** and configure it: - - Select **External** user type (or **Internal** for users within your Google Workspace organization). - - Fill in the required app information and contact information. - - Add the scope: `https://www.googleapis.com/auth/drive.readonly`. - - Add test users if using External user type. - 4. Go to **APIs & Services** > **Credentials** > **Create Credentials** > **OAuth client ID**. - 5. Select **Web application**, enter a name, and add `https://api.nango.dev/oauth/callback` under **Authorized redirect URIs**. - 6. Click **Create** and copy the **Client ID** and **Client Secret**. - 7. Copy the **Project Number** from the Google Cloud console under **IAM & Admin** > **Settings** > **Project Number**. - - Go back to the Google Drive integration in Nango. In the _Authorization_ tab, add: - - `client_id`: from step 6 - - `client_secret`: from step 6 - - `scopes`: `https://www.googleapis.com/auth/drive.readonly` - - In the _Endpoints_ tab, activate `GET /documents` endpoint. - - - - Go to [Integrations](https://app.nango.dev/dev/integrations?source=sample-app) and create a OneDrive for Business integration. - - Register an application in [Microsoft Entra admin center](https://entra.microsoft.com): - 1. Sign in to the Microsoft Entra admin center and search for **App registrations** > **New registration**. - 2. Enter a name (e.g., "Nango OneDrive Integration"). - 3. Under **Supported account types**, select **Accounts in any organizational directory** for multitenant apps. - 4. Click **Register** and note the **Application (client) ID** from the Overview page. - 5. Go to **Authentication** > **Add a platform** > **Web** and add `https://api.nango.dev/oauth/callback` as the Redirect URI. - 6. Go to **API permissions** > **Add a permission** > **Microsoft Graph** > **Delegated permissions** and add `Files.Read.All`. - 7. Go to **Certificates & secrets** > **New client secret**, create a secret, and copy the value immediately (you won't see it again). - - Go back to the OneDrive for Business integration in Nango. In the _Authorization_ tab, add: - - `client_id`: Application (client) ID from step 4 - - `client_secret`: Client secret value from step 7 - - `scopes`: Add `offline_access` and `.default` - - In the _Endpoints_ tab, activate `GET /user-files/selected` endpoint. - - - - Go to [Integrations](https://app.nango.dev/dev/integrations?source=sample-app) and create a OneDrive Personal integration. - - Register an application in [Microsoft Entra admin center](https://entra.microsoft.com): - 1. Sign in to the Microsoft Entra admin center and search for **App registrations** > **New registration**. - 2. Enter a name (e.g., "Nango OneDrive Personal Integration"). - 3. Under **Supported account types**, select **Accounts in any organizational directory and personal Microsoft accounts**. - 4. Click **Register** and note the **Application (client) ID** from the Overview page. - 5. Go to **Authentication** > **Add a platform** > **Web** and add `https://api.nango.dev/oauth/callback` as the Redirect URI. - 6. Go to **Certificates & secrets** > **New client secret**, create a secret, and copy the value immediately (you won't see it again). - - Go back to the OneDrive Personal integration in Nango. In the _Authorization_ tab, add: - - `client_id`: Application (client) ID from step 4 - - `client_secret`: Client secret value from step 6 - - `scopes`: Add `offline_access` and `onedrive.readonly` - - In the _Endpoints_ tab, activate `GET /user-files/selected` endpoint. + For shared primitives, use [Storage](/guides/functions/storage) for connection metadata and [Data validation](/guides/functions/data-validation) for function input, output, and provider response validation. - - - Install: `NodeJS`, `Docker`. Then run: - ```sh - git clone https://github.com/NangoHQ/sample-app.git - - cd sample-app + + Dry run a function against a real connection: - nvm use - npm i - ``` - - Copy your Nango Secret Key, found in [Environment Settings > API Keys](https://app.nango.dev/dev/environment-settings#api-keys?source=sample-app). - - Create a file to store environment variables and fill in the Nango Secret Key: - ```sh - cp .env.example .env - ``` - - Paste the **Project Number** you copied in step 7 of the Google Drive integration setup into the .env file as `GOOGLE_PROJECT_NUMBER=your_project_number_here`: - ``` - cd front-end - cp .env.example .env + ```bash + nango dryrun '' -e dev ``` - - - - This command should be running at all time: - ```sh - npm run webhooks-proxy - ``` + If the function reads connection metadata, pass test metadata: - - Copy the URL the command gave you and go to [Environment Settings](https://app.nango.dev/dev/environment-settings?source=sample-app). Set Webhook URL to `${URL}/webhooks-from-nango`, e.g: `https://tame-socks-warn.loca.lt/webhooks-from-nango`. - - - - Run: - ```sh - npm run start + ```bash + nango dryrun '' -e dev --metadata '{"accountRegion":"eu"}' ``` - - Go to: [http://localhost:3011](http://localhost:3011) - - - The above sample app uses template functions, but you can also use custom ones. - - Set up the Nango CLI: - ```sh - npm install -g nango - cd nango-integrations/ - nango init - ``` - - Add your Nango Secret Key in NANGO_SECRET_KEY_PROD in `./nango-integrations/.env`. - - Optionally customize the functions using [this guide](/guides/functions/functions-guide). - - Deploy the custom functions: - ```sh - nango deploy prod + Deploy the function you changed: + + ```bash + nango deploy --sync dev + # or + nango deploy --action dev + # or + nango deploy --integration dev ``` + + A bare `nango deploy` reconciles every function in the environment and can overwrite teammates' work on a shared collaborative environment. See [Engineering collaboration](/guides/platform/environments#engineering-collaboration). + + For function-type-specific commands, see the [Sync function guide](/guides/functions/syncs/sync-functions#test-and-deploy), [Action function guide](/guides/functions/action-functions#test-and-deploy), and [Testing](/guides/functions/testing). -## File Integration Guide + + +### Option 3: Build with the Functions API -The sample app includes a complete implementation for integrating file storage providers (Google Drive, OneDrive) with your application. This guide walks you through using and understanding the file integration features. +Use the Functions API when an agent should create or change an integration without the user working in a codebase. The agent might be Codex, Claude Code, Cursor, or a product agent running inside your app or sandbox. -### Overview +This is useful for prototypes, onboarding flows, provider operations not covered by templates, and just-in-time integrations where users describe behavior in text and an agent publishes the matching function to Nango. -Nango's template file functions allow you to: +
+ +
-1. **OAuth Flow**: Handle authentication using Nango's SDK -2. **File Picker**: Let users select specific files and folders to sync -3. **Document Sync**: Sync metadata for selected files and folders -4. **Document Fetching**: Download individual file contents as needed +At a high level, the flow is: -### Requirements +1. Give the agent the integration ID, a connection ID for validation, the intended behavior, input and output shape, and any provider API context. +2. The agent generates a self-contained TypeScript function using the right function type. +3. Compile the source with `POST /functions/compile`. Send the TypeScript source as `code` and use compiler errors to improve it. +4. Start a dry run with `POST /functions/dryruns`. Send the integration ID, function type, source `code`, connection ID, and any action input, sync metadata, or checkpoint payload needed for the run. +5. Poll `GET /functions/dryruns/{id}` until the dry run reaches `success` or `failed`, then inspect the result, logs, records, or error. +6. Deploy it with `POST /functions/deployments`. Send `type: "function"`, the integration ID, function name, function type, and final source `code`. After deployment, your app can call or trigger the function like any other Nango function. -- Docker (desktop) installed & running -- NodeJS & NPM installed -- A Nango account (sign up at [nango.dev](https://nango.dev)) -- Integration setup completed (see steps above) +Resolve these endpoints against `NANGO_SERVER_URL`, or `https://api.nango.dev` by default. Send `Authorization: Bearer ` and `Content-Type: application/json`. Scoped API keys need `environment:functions:compile` for compile, `environment:functions:dryrun` for dry run creation and polling, and `environment:deploy` for deployment. -### Using the File Integration +The Functions API is powerful, but it intentionally skips a local Git workflow. For production integrations that need code review, tests, ownership, and CI/CD, prefer [local development with the CLI](#build-locally-with-the-cli). -After setting up and running the sample app (see steps above), follow these instructions to test the file integration: + +### Take ownership of a deployed function -1. **Access the sample app**: - - Open [http://localhost:3011](http://localhost:3011/) - - Click _Files_ to start the file integration +Pull the source of a function that is already deployed to an environment so you can manage it in your own repository: - Sample app home page with Files section highlighted +```bash +nango pull github list-repos --env dev +``` -2. **Connect your account** (Google Drive, OneDrive, etc.): - - Click the _Connect_ button on the provider's card - - In the connection popup, click the _Connect_ button - - Select your account and authorize the app - - Click the _Finish_ button to close the modal +This works for any deployed function β€” a template you enabled from the dashboard, or code deployed through [`POST /functions/deployments`](/reference/backend/http-api/functions/deployments). The CLI writes the function's TypeScript source locally; from there, `nango deploy` redeploys it as a repo-managed function, so it lives in your Git workflow with code review, tests, and CI/CD. - Connect popup with file provider account options +## Related guides - Successfully connected to file provider +- [Function tool calling](/guides/functions/tool-calling) β€” expose action functions to agents, LLM SDKs, and MCP clients. +- [Unified APIs](/guides/functions/unified-apis) β€” build provider-specific functions behind one stable model. +- [Logging](/guides/functions/logging) β€” control custom function logs locally and in cloud environments. +- [Storage](/guides/functions/storage) β€” store per-connection metadata and read it inside functions. +- [Data validation](/guides/functions/data-validation) β€” validate function input, output, and provider API responses. +- [Testing](/guides/functions/testing) β€” dry runs, mocks, and snapshot tests. +- [Rate limits](/guides/functions/rate-limits) β€” handle provider `429` responses and long-running retries. +- [CI/CD](/guides/functions/ci-cd) β€” deploy functions with your application pipeline. -3. **Select files and folders to sync**: - - Click the _Select Files from [Provider]_ button - - A file picker modal will appear - **note that each provider has its own native file picker**: - - **Google Drive**: Uses Google's Drive Picker UI - - **OneDrive for Business**: Uses Microsoft's file picker for organizational accounts - - **OneDrive Personal**: Uses Microsoft's file picker for personal accounts - - Select the files and folders you want to sync using the provider's file picker - - Click the _Select_ button to confirm your selection +## Sync Functions - Select files and folders from provider - Select files and folders from provider +Source: https://nango.dev/docs/guides/functions/syncs/sync-functions.md -4. **View synced files**: - - The files and folders will be synced to your Nango account and displayed in the UI +--- +title: 'Sync function guide' +sidebarTitle: 'Sync function guide' +description: 'Build sync functions that keep external API data fresh and consumable by your app.' +--- + +Sync functions keep external API data fresh in your app. They run on a recurring cadence, write records to Nango's records cache, and let your app consume changes reliably. + +Use sync functions when your app needs to replicate a dataset from an external system for sync, indexing, RAG, reporting, or change-detection workflows. + +## Create the function + +Add a file under the integration's `syncs/` folder: + +```typescript crm/syncs/contacts.ts +import { createSync } from 'nango'; +import * as z from 'zod'; + +const Contact = z.object({ + id: z.string(), + email: z.string().email().optional(), + updatedAt: z.string() +}); + +const Metadata = z.object({ + accountRegion: z.string().optional() +}); + +const Checkpoint = z.object({ + lastUpdatedAt: z.string() +}); + +export default createSync({ + description: 'Syncs contacts', + version: '1.0.0', + frequency: 'every hour', + autoStart: true, + models: { Contact }, + metadata: Metadata, + checkpoint: Checkpoint, + exec: async (nango) => { + const metadata = await nango.getMetadata(); + const checkpoint = await nango.getCheckpoint(); + const since = checkpoint?.lastUpdatedAt; + + for await (const page of nango.paginate({ + endpoint: '/contacts', + params: { + ...(since ? { updated_after: since } : {}), + ...(metadata?.accountRegion ? { region: metadata.accountRegion } : {}) + }, + paginate: { + type: 'cursor', + cursor_path_in_response: 'pagination.next_cursor', + cursor_name_in_request: 'cursor', + response_path: 'contacts', + limit_name_in_request: 'limit', + limit: 100 + } + })) { + const contacts = page.map((contact) => ({ + id: contact.id, + email: contact.email, + updatedAt: contact.updated_at + })); + + await nango.batchSave(contacts, 'Contact'); + + const lastContact = contacts[contacts.length - 1]; + if (lastContact) { + await nango.saveCheckpoint({ lastUpdatedAt: lastContact.updatedAt }); + } + } + } +}); +``` + +Import the function from `index.ts`: + +```typescript index.ts +import './crm/syncs/contacts'; +``` + + + Sync implementation quality matters. Suboptimal syncs can consume far more API calls, compute, memory, and storage than needed; they can also become expensive, crash, behave unreliably, or hit provider rate limits. Before deploying a sync to production, review the [Sync efficiency guide](/guides/functions/syncs/sync-efficiency). + + + + Before generating a sync, collect the integration ID, connection ID for testing, target records, provider pagination style, incremental filter, deletion strategy, required metadata, and expected sync frequency. + + Prefer incremental syncs when the provider supports them. Save records page by page, checkpoint after successful writes, and keep the record model limited to fields the app actually needs. + + +## Pass parameters with metadata + +Use [connection metadata](/guides/functions/storage#connection-metadata) for any value the sync needs on scheduled runs: + +- Customer configuration, such as selected folders, projects, accounts, regions, or custom field mappings. +- Provider context discovered after authorization. +- Feature flags or filters that change what the sync fetches. + +If the sync should not run before configuration exists, set `autoStart: false`, save the required metadata from your app, then start the schedule after configuration is complete. + +From your app, call the Node SDK [`nango.startSync()` method](/reference/backend/backend-sdk/node#start-schedule-for-syncs): + +```ts +await nango.startSync('crm', ['contacts'], ''); +``` + +Or call the [Start sync API](/reference/backend/http-api/sync/start) from any backend. Starting a sync schedule also triggers an immediate first run. + +## Test and deploy + +Dry run the function against a real connection: + +```bash +nango dryrun contacts '' -e dev +``` + +If the sync reads connection metadata, pass test metadata to the dry run: + +```bash +nango dryrun contacts '' -e dev --metadata '{"accountRegion":"eu"}' +``` + +Or load metadata from a file: + +```bash +nango dryrun contacts '' -e dev --metadata @fixtures/metadata.json +``` + +Simulate resuming from a checkpoint: + +```bash +nango dryrun contacts '' -e dev --checkpoint '{"lastUpdatedAt":"2026-01-01T00:00:00.000Z"}' +``` + +Print local diagnostics for memory and CPU behavior: + +```bash +nango dryrun contacts '' -e dev --diagnostics +``` + +Deploy your functions: + +```bash +nango deploy +``` + +To deploy only this sync function: + +```bash +nango deploy --sync contacts dev +``` + +## Start or trigger runs + +If `autoStart: true`, Nango starts the schedule for new connections automatically. Otherwise, start it after the connection is ready and required metadata is saved: + +```typescript +await nango.startSync('crm', ['contacts'], ''); +``` + +`nango.startSync()` is a [Node SDK method](/reference/backend/backend-sdk/node#start-schedule-for-syncs). Use the [Start sync API](/reference/backend/http-api/sync/start) if you are starting schedules from another backend language. + +Trigger a run immediately: + +```typescript +await nango.triggerSync('crm', ['contacts'], ''); +``` + +`nango.triggerSync()` is a [Node SDK method](/reference/backend/backend-sdk/node#trigger-syncs). Use the [Trigger sync API](/reference/backend/http-api/sync/trigger) for one-off sync runs from another backend language. + +## Consume records + +Configure your app's Nango webhook URL in **Environment Settings > Webhook URLs**. After a run, Nango sends a sync webhook with the connection, integration, sync name, model, and change counts. Your app should then read records by cursor: + + + + ```typescript + import { Nango } from '@nangohq/node'; + + const nango = new Nango({ secretKey: process.env.NANGO_SECRET_KEY! }); + + const result = await nango.listRecords({ + providerConfigKey: 'crm', + connectionId: '', + model: 'Contact', + cursor: '' + }); + ``` + + + ```bash + curl -G https://api.nango.dev/records \ + --header 'Authorization: Bearer ' \ + --header 'Provider-Config-Key: crm' \ + --header 'Connection-Id: ' \ + --data-urlencode 'model=Contact' \ + --data-urlencode 'cursor=' + ``` + + + +The consumer loop is: receive a sync webhook from Nango, look up the last cursor processed for that connection and model, fetch records with that cursor, process them, then store the cursor from the last record fetched. + +## Two-way syncs + +You can implement two-way syncs by combining sync functions with [action functions](/guides/functions/action-functions): + +- Use a sync function to replicate external data into your app and keep your local state fresh. +- Use action functions for writes back to the external API, such as creating, updating, or deleting records. +- After a write action succeeds, update your local state optimistically or trigger the relevant sync so the records cache catches up with the external source of truth. + +This keeps the read path and write path explicit. The sync owns ongoing data freshness, checkpoints, record storage, and change delivery. Actions own user-initiated writes and provider-specific validation or side effects. + +For unified models, use the same schema for synced records and write action input where possible. This keeps your app from branching on each provider while still letting each provider implementation handle API-specific fields and edge cases. + +## Deep dives + +- [Sync efficiency](/guides/functions/syncs/sync-efficiency) +- [Checkpoints](/guides/functions/syncs/checkpoints) +- [Records cache](/guides/functions/syncs/records-cache) +- [Deletion detection](/guides/functions/syncs/deletion-detection) +- [Real-time syncs](/guides/functions/syncs/realtime-syncs) +- [Sync partitioning](/guides/functions/syncs/sync-partitioning) - Synced files and folders in the UI +## Sync Efficiency -5. **Download a file**: - - Click the _Download_ button to download the file to your computer +Source: https://nango.dev/docs/guides/functions/syncs/sync-efficiency.md -6. **Disconnect your account**: - - Click the _Disconnect_ button to disconnect your account and delete your connection from your Nango account +--- +title: 'Sync efficiency' +sidebarTitle: 'Sync efficiency' +description: 'Build sync functions that replicate external datasets without wasting API calls, memory, or compute.' +--- + +Sync functions are often used to replicate external datasets into your app or to notify your app when external data changes. Efficient syncs fetch only what changed, save records in batches, and let your app consume changes promptly. + +## Prefer incremental syncs + +An **incremental sync** fetches only records that changed since the previous run. The function stores progress in a [checkpoint](/guides/functions/syncs/checkpoints), then passes that progress back to the external API on the next run. + +A **full sync** fetches the whole dataset every run, then saves or compares the complete result. + +Incremental syncs are usually an order of magnitude more efficient than full syncs. They reduce provider API calls, function runtime, memory usage, Nango compute, records churn, and downstream writes in your app. + +Full syncs can be acceptable for small datasets or low-frequency jobs. For large datasets, they can become plainly unrealistic: expensive to run, slow to finish, more likely to crash, more likely to hit provider rate limits, and less reliable when a run needs to process thousands or millions of records every time. + +| Approach | Best for | Tradeoff | +| --- | --- | --- | +| Incremental sync | Large datasets, frequent polling, APIs with `updated_after`, cursor, or sequence filters | Requires checkpoint logic and provider support | +| Full refresh | Small datasets or APIs without incremental filters | Simpler, but uses more API calls, memory, and compute as data grows | + +This choice is constrained by the external API shape. To benefit from incremental syncing, the provider usually needs a parameter such as `updated_at`, `updated_since`, `modified_after`, a cursor, a sequence ID, or an event stream that lets you ask for only changed records. + +The hardest case is a large dataset where the API does not support incremental filters. Often, that happens because the provider expects you to use webhooks instead. In Nango, use [webhook functions](/guides/functions/webhook-functions), [webhook forwarding](/guides/platform/webhook-forwarding), or [real-time syncs](/guides/functions/syncs/realtime-syncs) to process provider events and avoid polling the entire dataset. + +The risky combination is: **large dataset + no incremental API + high freshness requirement**. If you need to run a full sync frequently to keep data fresh, the design is usually unrealistic in terms of cost, runtime, reliability, and rate limits. Look for a webhook strategy, reduce freshness requirements, partition the dataset, or narrow the scope of synced data. + +## Save page by page + +Do not accumulate the full dataset in memory before calling `batchSave()`. Save each page as soon as it is mapped, then checkpoint after the save succeeds. + +```typescript +const checkpoint = await nango.getCheckpoint(); + +for await (const page of nango.paginate({ + endpoint: '/contacts', + params: checkpoint ? { updated_after: checkpoint.lastModifiedISO } : {}, + paginate: { + type: 'cursor', + cursor_path_in_response: '', + cursor_name_in_request: 'cursor', + response_path: '', + limit_name_in_request: 'limit', + limit: 100 + } +})) { + const contacts = page.map(mapContact); + + await nango.batchSave(contacts, 'Contact'); + + const lastContact = contacts[contacts.length - 1]; + if (lastContact) { + await nango.saveCheckpoint({ lastModifiedISO: lastContact.updatedAt }); + } +} +``` + +This pattern keeps memory bounded and lets the next run resume from the last saved page if the function stops midway. + +## Keep records small + +Only fetch and save fields your app needs. Smaller records reduce external API usage, Nango compute, cache size, downstream processing, and cost. + +Keep records steady too. During full syncs, Nango can process unchanged records faster when the saved record payload stays identical between runs. Avoid adding fields that change on every fetch even when the underlying external record did not change, such as `lastFetchedAt`, request timestamps, random IDs, or transient API metadata. Volatile fields make the record look changed every run, which forces extra processing and downstream updates. + +## Filter unnecessary data early + +Filter data as early as possible, either by using filters provided by the external API or by discarding records before calling `batchSave()`. This keeps the external system as the source of truth while reducing provider API usage, Nango compute, cache size, and downstream processing. + +Prefer provider-side filters such as selected folders, projects, accounts, regions, statuses, or `updated_after` parameters. If the provider cannot filter server-side, map and filter each page before saving so Nango and your app only process records that matter. + +Use [connection metadata](/guides/functions/storage#connection-metadata) for per-customer filters. For example, store selected project IDs, folder IDs, regions, pipelines, or custom field mappings on the connection, then read that metadata inside the sync and pass it to the provider API. + +```typescript +const metadata = await nango.getMetadata(); +const checkpoint = await nango.getCheckpoint(); + +for await (const page of nango.paginate({ + endpoint: '/tasks', + params: { + project_id: metadata?.projectId, + updated_after: checkpoint?.lastModifiedISO + }, + paginate: { + type: 'cursor', + cursor_path_in_response: 'next_cursor', + cursor_name_in_request: 'cursor', + response_path: 'tasks' + } +})) { + const tasks = page.filter((task) => !metadata?.status || task.status === metadata.status).map(mapTask); + + await nango.batchSave(tasks, 'Task'); +} +``` + +If you need additional data later, update the sync function and trigger a run with `reset: true` to backfill historical data with the new shape or broader filter. + +## Consume changes promptly + +Nango's records cache is a delivery mechanism, not your app's long-term data store. Configure [webhooks from Nango](/guides/platform/webhooks-from-nango), fetch changed records from the [records API](/reference/backend/http-api/sync/records-list), store them in your system, and persist the last processed cursor. + +When reading records from Nango, keep page sizes modest. A page size around `100` records is a good default: it keeps payloads quick to transfer, reduces memory spikes in your worker, and makes retries less expensive when a downstream write fails. + +Read [Records cache](/guides/functions/syncs/records-cache) for cursor behavior, payload shape, and retention details. + +## Related guides + +- [Functions guide](/guides/functions/syncs/sync-functions) +- [Checkpoints](/guides/functions/syncs/checkpoints) +- [Records cache](/guides/functions/syncs/records-cache) +- [Real-time syncs](/guides/functions/syncs/realtime-syncs) +- [Sync partitioning](/guides/functions/syncs/sync-partitioning) - Disconnect button +## Checkpoints -### What Happens Under the Hood +Source: https://nango.dev/docs/guides/functions/syncs/checkpoints.md -The sample app uses Nango to: +--- +title: 'Checkpoints' +sidebarTitle: 'Checkpoints' +description: 'Save progress mid-run, resume after failures, and turn full syncs into incremental ones.' +--- + +Checkpoints let sync functions save their progress and resume from where they left off. This enables a function to fetch only new or changed data instead of re-fetching everything on each run. Checkpoints are what make sync functions **resilient to failures** and enable **incremental syncing**, the recommended approach for any non-trivial dataset. + +Define a `checkpoint` schema in your sync function to enable checkpoint support. If you are migrating from `nango.lastSyncDate`, see the [migration guide](/guides/platform/migrations/migrate-to-checkpoints). + +## Why checkpointing matters + +Without checkpoints, every sync run fetches the entire dataset from the external API. This works for small datasets, but quickly becomes unsustainable as data grows. Consider a Salesforce account with 500,000 contacts syncing every 15 minutes: without checkpoints, each run re-fetches all 500,000 records even if only a handful changed β€” consuming orders of magnitude more API calls, compute time, and memory than necessary. + +Checkpoints solve this by tracking how far your sync has progressed. The benefits compound: + +- **Performance** β€” Only fetch what changed. A 15-minute incremental sync processes minutes of changes, not years of history. +- **Resilience** β€” If a sync fails mid-execution, the next run resumes from the last checkpoint instead of restarting from scratch. +- **Lower costs** β€” Less compute time on Nango, fewer API calls against the external API's rate limits, and lower bandwidth consumption. +- **Higher freshness** β€” Faster syncs mean you can run them more frequently, keeping your data closer to real-time. + +## Function interruption and resumption + +Nango reserves the right to cap the duration of a function execution. When an execution reaches the limit, Nango interrupts it gracefully and schedules the next execution to start immediately. + +Checkpoints are what make this seamless: the next execution should call `getCheckpoint()` and resumes from where the previous one stopped. **Without checkpoints, each execution starts from scratch**, meaning any function that takes longer than the execution cap will loop indefinitely without ever completing. + + +If your sync processes a large dataset, you must call `saveCheckpoint()` after every `batchSave`. A sync without checkpoints that exceeds the execution duration will restart from the beginning on every run and never finish. + + +The interrupt-and-resume flow: + +1. Sync runs, processes records, saves a checkpoint after each page. +2. Nango interrupts the sync gracefully when the execution cap is reached (ie: after the current `saveCheckpoint()` call completes). +3. The next execution starts immediately, calls `getCheckpoint()`, and continues from that point. +4. This repeats until the sync finishes naturally. + +## How checkpoints work + +A checkpoint is a small payload, defined by a schema you control, that your sync saves after processing each batch of data. On the next execution, the sync reads the checkpoint to know where it left off. + +The typical flow is: + +1. Read the current checkpoint with `nango.getCheckpoint()` (returns `null` on first run). +2. Fetch a page of data from the external API, starting from the checkpoint. +3. Save the records to Nango's cache with `nango.batchSave()`. +4. Save a new checkpoint with `nango.saveCheckpoint()`. +5. Repeat until there is no more data. + +## Defining a checkpoint schema + +You define your checkpoint schema in the `createSync()` declaration using [Zod](https://zod.dev), just like your data models. The schema describes the shape of the progress marker your sync will save. + +Most commonly, the checkpoint is a timestamp indicating how far you've synced: + +```ts +import { createSync } from 'nango'; +import * as z from 'zod'; + +export default createSync({ + description: 'Sync contacts from Salesforce', + frequency: 'every hour', + checkpoint: z.object({ + lastModifiedISO: z.string(), + }), + models: { Contact: ContactSchema }, + exec: async (nango) => { + // Implementation below + }, +}); +``` + +The checkpoint payload can be anything the external API gives you to track progress: a timestamp, a cursor, a page token, or any combination. You control the schema. + +```ts +// Timestamp-based checkpoint +checkpoint: z.object({ lastModifiedISO: z.string() }) + +// Cursor-based checkpoint +checkpoint: z.object({ nextCursor: z.string() }) + +// Composite checkpoint +checkpoint: z.object({ lastModifiedISO: z.string(), pageToken: z.string().optional() }) +``` + +## Implementing an incremental sync with checkpoints + +Here is a complete example syncing Salesforce contacts incrementally: + +```ts +import { createSync } from 'nango'; +import * as z from 'zod'; + +const ContactSchema = z.object({ + id: z.string(), + first_name: z.string(), + last_name: z.string(), + email: z.string(), + last_modified_date: z.string(), +}); + +export default createSync({ + description: 'Sync contacts from Salesforce', + frequency: 'every hour', + checkpoint: z.object({ + lastModifiedISO: z.string(), + }), + models: { Contact: ContactSchema }, + + exec: async (nango) => { + // 1. Read the checkpoint (null on first run) + const checkpoint = await nango.getCheckpoint(); + + let query = 'SELECT Id, FirstName, LastName, Email, LastModifiedDate FROM Contact'; + if (checkpoint) { + // Only fetch records modified since the last checkpoint + query += ` WHERE LastModifiedDate > ${checkpoint.lastModifiedISO}`; + } + query += ' ORDER BY LastModifiedDate ASC'; + + for await (const records of nango.paginate({ + endpoint: '/services/data/v53.0/query', + params: { q: query }, + paginate: { + type: 'link', + response_path: 'records', + link_path_in_response_body: 'nextRecordsUrl', + }, + })) { + const contacts = mapContacts(records); + + // 2. Save records to the cache + await nango.batchSave(contacts, 'Contact'); + + // 3. Save checkpoint after each page + const lastContact = contacts[contacts.length - 1]; + await nango.saveCheckpoint({ + lastModifiedISO: lastContact.last_modified_date, + }); + } + }, +}); +``` + +The key pattern: **save records and checkpoint after every page**. This ensures that if the sync fails on page 50 of 100, the next run resumes from page 50 β€” not page 1. + +## The first sync run + +Even with checkpoints, the very first execution has no previous progress to resume from β€” `getCheckpoint()` returns `null`. This initial run fetches the entire historical dataset and is inherently more resource-intensive than subsequent runs. + +One strategy to manage this is to limit the backfill window. For example, if you are syncing a Notion workspace, you might only fetch pages modified in the last three months, assuming older pages are less relevant: + +```ts +const checkpoint = await nango.getCheckpoint(); +const since = checkpoint?.lastModifiedISO ?? threeMonthsAgo(); +``` + +After the initial run completes, subsequent runs are fast and incremental β€” only processing changes since the last checkpoint. + +## Implementing a full sync with checkpoints + +Not every sync can be incremental. Some APIs don't support filtering by modification date, so you must fetch all records on every run. Such syncs can still benefit from checkpoints for resilience: if a run is interrupted mid-dataset, the next run resumes from the last page instead of starting over. + +Call `clearCheckpoint()` at the end of a successful run so the next scheduled run starts from the first page. + +```ts +export default createSync({ + description: 'Sync all contacts', + frequency: 'every hour', + checkpoint: z.object({ + nextCursor: z.string(), + }), + models: { Contact: ContactSchema }, + + exec: async (nango) => { + // Resume from the last page if this run was interrupted + const checkpoint = await nango.getCheckpoint(); + let nextCursor: string | undefined = checkpoint?.nextCursor; + + do { + const res = await nango.get({ + endpoint: '/contacts', + params: { cursor: nextCursor }, + }); + + const contacts = mapContacts(res.data.records); + await nango.batchSave(contacts, 'Contact'); + + nextCursor = res.data.nextCursor; + + if (nextCursor) { + await nango.saveCheckpoint({ nextCursor }); + } + } while (nextCursor); + + // All pages fetched, clear checkpoint so the next run starts from the first page + await nango.clearCheckpoint(); + }, +}); +``` + +## When to sync without checkpoints + +For small datasets (e.g., a list of Slack users for an organization with fewer than 100 employees), a sync without checkpoint can be perfectly fine. + +As datasets grow, full syncs become unscalable β€” taking longer to run, triggering rate limits, and consuming more compute and memory. If your dataset has more than a few thousand records and the API supports pagination and/or filtering by date or cursor, use checkpoints. + + +`deleteRecordsFromPreviousExecutions()` is incompatible with checkpoints because it requires comparing the full dataset between consecutive runs. Use `trackDeletesStart`/`trackDeletesEnd` instead β€” see [Deletion detection](/guides/functions/syncs/deletion-detection). + + +## Checkpoints vs. cursors + +Both checkpoints and [cursors](/guides/functions/syncs/records-cache#cursors-and-sync-progress) are markers of sync progress, but they track different relationships: + +| | Checkpoint | Cursor | +| --- | --- | --- | +| **Direction** | Nango β†’ external API | Your app β†’ Nango | +| **What it tracks** | How far Nango has synced from the external API | How far your app has fetched from Nango's records cache | +| **Who manages it** | Your sync function, via `saveCheckpoint()` | Your application, via the `cursor` parameter on [GET /records](/reference/backend/http-api/sync/records-list) | +| **Typical payload** | A timestamp or API cursor from the external system | An opaque string returned by Nango | + +Both are important: checkpoints keep your sync efficient, and cursors keep your application's data consumption efficient. + +## Re-syncing: resetting checkpoints and the cache + +When you [trigger a sync](/reference/backend/http-api/sync/trigger) manually (from the UI or API), you can control whether to preserve or reset progress: + +| Option | Default | What it does | +| --- | --- | --- | +| `reset` | `false` | When `true`, clears the checkpoint and re-fetches the full dataset from the external API. The cache is preserved, so Nango can still distinguish new records from updated ones. | +| `emptyCache` | `false` | When `true`, deletes all cached records before the sync runs. Must be used with `reset: true`. The sync starts completely fresh. | + +**Leave both off** for a standard incremental sync. + +**Use `reset: true`** when you want to re-fetch everything from the external API but preserve the cache for accurate change detection. This is useful when you suspect data may have been missed. + +**Use `reset: true` with `emptyCache: true`** when you need to start from scratch β€” for example, after a breaking change to your data model. + + +Resetting the checkpoint triggers a full re-sync from the external API, which takes longer and may incur higher compute costs. Clearing the cache additionally means every record will be reported as `ADDED`, your previously persisted [cursors](/guides/functions/syncs/records-cache#cursors-and-sync-progress) become invalid, and you will need to reprocess the entire dataset on your side. + + +```ts +// Preserve checkpoint (standard incremental sync) +await nango.triggerSync('', ['contacts'], ''); + +// Reset checkpoint, re-fetch everything, preserve cache for change detection +await nango.triggerSync('', ['contacts'], '', { reset: true }); + +// Full reset β€” re-fetch everything and clear the cache +await nango.triggerSync('', ['contacts'], '', { reset: true, emptyCache: true }); +``` + +## Observability + +Checkpoints are exposed in several places to help you monitor sync progress: + +- **Sync webhooks** β€” The [sync completion webhook](/guides/platform/webhooks-from-nango) includes checkpoint information, so your application knows how far the sync has progressed. +- **Sync status API** β€” The [GET /sync/status](/reference/backend/http-api/sync/status) endpoint returns the current checkpoint for each sync, letting you check progress programmatically. +- **Logs** β€” Checkpoint-related details are visible in the Nango dashboard logs. *(We are actively improving checkpoint visibility in the dashboard.)* + +## Testing checkpoints locally + +When developing locally with the Nango CLI, you can pass a checkpoint value to `dryrun` to simulate resuming from a previous run: + +```bash +nango dryrun salesforce-contacts '' --checkpoint '{"lastModifiedISO": "2024-01-15T00:00:00Z"}' +``` + +This lets you test that your sync correctly resumes from a checkpoint without needing to run a full initial sync first. See the [testing guide](/guides/functions/testing) for more details, including how to write unit tests for checkpoint logic. + + +**Migrating from `nango.lastSyncDate`?** Checkpoints replace it with a schema you control, mid-run granularity, and failure-resumption. Follow the [migration guide](/guides/platform/migrations/migrate-to-checkpoints) for step-by-step instructions. + + +## Reference + +| Function | Description | +| --- | --- | +| [`nango.getCheckpoint()`](/reference/functions/functions-sdk#getcheckpoint) | Retrieves the current checkpoint. Returns `null` on first run or after a reset. | +| [`nango.saveCheckpoint()`](/reference/functions/functions-sdk#savecheckpoint) | Saves progress. Call after each batch of data. | +| [`nango.clearCheckpoint()`](/reference/functions/functions-sdk#clearcheckpoint) | Clears the checkpoint. Use at the end of a full sync so the next run starts from the first page. Checkpoints are also automatically cleared when triggering a sync with `reset: true`. | -1. **Authentication** - - Authenticate users with file storage providers - - Show the file picker - - Handle OAuth flow automatically +## Records Cache -2. **File Syncing** - - Sync selected files & folders - - Initial sync on selection - - Periodic updates +Source: https://nango.dev/docs/guides/functions/syncs/records-cache.md - Nango dashboard showing sync status and file list +--- +title: 'Records cache' +sidebarTitle: 'Records cache' +description: 'How Nango stores synced records, detects changes, and lets your app fetch deltas via cursors.' +--- + +Sync functions replicate records from an external API to your system continuously. To do this reliably, Nango uses a **records cache** β€” an intermediate store that sits between the external API and your application. + +Every time you call [`nango.batchSave()`](/reference/functions/functions-sdk#save-records) or [`nango.batchDelete()`](/reference/functions/functions-sdk#delete-records) inside a sync function, you are writing to this cache. Your application then reads from the cache using the [GET /records](/reference/backend/http-api/sync/records-list) endpoint or the [Node SDK](/reference/backend/backend-sdk/node#get-records). + +## What the cache does + +The records cache fulfils three roles: + +**Change detection** β€” By tracking every record that has been synced, Nango can tell you which records are new, which have been updated, and which have been deleted. Your application only needs to fetch the delta, reducing bandwidth and processing on your side. + +**Reliable data availability** β€” Fetching from external APIs is inherently unreliable: rate limits, timeouts, and transient errors are common. The cache decouples this unreliable step from your application. Once data lands in the cache, you can fetch it quickly and reliably. + +**Observability** β€” The cache gives you visibility into the state of synced data directly from the Nango dashboard and API, including record counts, last sync times, and change history. + +## How records are identified and compared + +Each record in the cache is uniquely identified by two things: + +- **Record ID** β€” The `id` field you set on each record in your sync function. This should match the unique identifier of the record in the external system (e.g. the external API's primary key). +- **Payload hash** β€” Nango computes a hash of the full record payload. When a record with the same ID is saved again, Nango compares hashes to determine whether the record has actually changed. + +If the ID already exists and the hash is identical, the record is considered unchanged and no update is emitted. If the hash differs, Nango marks it as updated. + + +Be careful with fields that change on every fetch but don't represent a meaningful change to the record, such as a `fetched_at` timestamp. Including such fields in the payload will cause Nango to report spurious updates on every sync run. If possible, exclude or normalize these fields before calling `batchSave()`. + + +## How records are stored + +The cache only keeps the **latest version** of each record β€” there is no versioning or history of payloads. When you call `batchSave()` with an existing ID, the previous payload is overwritten. + +When you call `batchDelete()`, you only need to pass the record's `id`. This does **not** remove the record from the cache. Instead, it marks the record as deleted (a soft delete), so your application can react to the deletion event. The last-known payload is preserved. + +```ts +// Saving records to the cache +await nango.batchSave(contacts, 'Contact'); + +// Marking records as deleted (soft delete) +const toDelete = [{ id: 'record-123' }, { id: 'record-456' }]; +await nango.batchDelete(toDelete, 'Contact'); +``` + +## Fetching records: the change stream + +The [GET /records](/reference/backend/http-api/sync/records-list) endpoint returns a **chronologically ordered stream of record changes**. Each entry in the stream includes: + +- The full record payload +- Metadata indicating whether the record was `ADDED`, `UPDATED`, or `DELETED` +- A cursor for tracking your sync progress + +```json +{ + "records": [ + { + "id": "contact-1", + "name": "Alice", + "_nango_metadata": { + "first_seen_at": "2024-01-15T10:00:00.000Z", + "last_modified_at": "2024-01-15T10:00:00.000Z", + "last_action": "ADDED", + "deleted_at": null, + "cursor": "MjAyNC0wMS0xNVQxMDowMDowMC..." + } + }, + { + "id": "contact-2", + "name": "Bob (updated)", + "_nango_metadata": { + "first_seen_at": "2024-01-10T08:00:00.000Z", + "last_modified_at": "2024-01-15T10:05:00.000Z", + "last_action": "UPDATED", + "deleted_at": null, + "cursor": "MjAyNC0wMS0xNVQxMDowNTowMC..." + } + } + ], + "next_cursor": "MjAyNC0wMS0xNVQxMDowNTowMC..." +} +``` + +You can filter the stream to only return records with a specific `last_action` (`added`, `updated`, or `deleted`) using the `filter` query parameter. + +## Cursors and sync progress + +Every record change in the cache has a **cursor** attached to it. Cursors are opaque, ordered strings that let you: + +1. **Track how far you've synced** β€” After fetching records, persist the cursor of the last record you processed. On the next fetch, pass it back to only receive changes that happened after that point. +2. **Paginate through large result sets** β€” The same cursor is used for pagination when there are more records than the page `limit`. + + +You must persist the cursor on your side for each combination of **connection** and **sync function**. This is how you keep track of your sync progress and avoid reprocessing records. + + + + +```ts +import { Nango } from '@nangohq/node'; + +const nango = new Nango({ secretKey: '' }); + +// Fetch only records that changed since your last cursor +const result = await nango.listRecords({ + providerConfigKey: '', + connectionId: '', + model: 'Contact', + cursor: '' +}); + +// Process records... + +// Persist the cursor of the last record for next time +if (result.records.length > 0) { + const lastCursor = result.records[result.records.length - 1]._nango_metadata.cursor; + await saveToDatabase(connectionId, syncName, lastCursor); +} +``` + + +```bash +curl -G https://api.nango.dev/records \ + --header 'Authorization: Bearer ' \ + --header 'Provider-Config-Key: ' \ + --header 'Connection-Id: ' \ + --data-urlencode 'model=Contact' \ + --data-urlencode 'cursor=' +``` + + + +## Re-syncing: preserve vs. clear the cache + +See [Re-syncing: resetting checkpoints and the cache](/guides/functions/syncs/checkpoints#re-syncing-resetting-checkpoints-and-the-cache) in the Checkpoints guide for the `reset` / `emptyCache` options and their implications. + +## Cache summary + +| Concept | Details | +| --- | --- | +| **Writing to the cache** | `nango.batchSave()` and `nango.batchDelete()` in sync functions | +| **Reading from the cache** | `GET /records` endpoint or `nango.listRecords()` SDK method | +| **Record identity** | Determined by the `id` field you set on each record | +| **Change detection** | Based on comparing payload hashes for the same `id` | +| **Versioning** | None β€” only the latest payload is kept | +| **Deletions** | Soft delete β€” record is marked as deleted, payload is preserved | +| **Cursor** | Opaque ordered string for tracking sync progress and pagination | +| **Payload TTL** | 30 days without update β†’ payload pruned | +| **Full record TTL** | 60 days without sync execution β†’ all records hard-deleted | + +## Related guides + +- [Sync functions](/guides/functions/syncs/sync-functions) - write records into the cache. +- [Sync efficiency](/guides/functions/syncs/sync-efficiency) - keep records small and consume changes promptly. +- [Deletion detection](/guides/functions/syncs/deletion-detection) - mark records deleted in the cache. +- [Get records API](/reference/backend/http-api/sync/records-list) - fetch changed records from your app. -3. **File Download** - - Download raw file content - - Handle different file types - - Use Nango's proxy for reliable downloads +## Deletion Detection -### Key Components +Source: https://nango.dev/docs/guides/functions/syncs/deletion-detection.md -#### Frontend Implementation +--- +title: 'Deletion detection' +sidebarTitle: 'Deletion detection' +description: 'Surface deletes from the external API β€” even when the API itself doesn''t expose them cleanly.' +--- + +Sometimes you need to know when a record you are syncing has been deleted in the external system. Deletion detection works differently depending on whether your sync function is incremental or full β€” pick the strategy that matches your sync approach. + +For incremental syncs, you must actively tell Nango which IDs have been removed. For full syncs (which fetch all records on every run), Nango can compute deletes for you automatically. + +## Detecting deletes in incremental syncs + +When your sync only fetches changed data since the previous run, Nango has no built-in way to know which records disappeared on the provider side. + +You must actively tell Nango which IDs have been removed by calling `nango.batchDelete()` ([full reference](/reference/functions/functions-sdk#delete-records)) inside the sync function. + +### When can you use this? + +You can use `nango.batchDelete()` if the external API supports one of the following: + +- A dedicated "recently deleted" endpoint (e.g. `GET /entities/deleted?since=...`) +- The ability to filter or sort by a deletion timestamp +- The ability to filter or sort by last-modified timestamp and records include a flag like `is_deleted`, `archived`, etc. + +If none of these are available, you cannot detect deletes in an incremental sync. You'll either need to switch to a full sync or skip deletion detection. + +### Example + +```ts +import { createSync } from 'nango'; +import * as z from 'zod'; + +const AccountSchema = z.object({ + id: z.string(), + name: z.string() +}); + +export default createSync({ + description: 'Sync Accounts incrementally and handle deletions', + frequency: 'every 2 hours', + endpoints: [{ method: 'GET', path: '/accounts', group: 'Accounts' }], + models: { Account: AccountSchema }, + checkpoint: z.object({ + lastSyncedISO: z.string(), + }), + + exec: async (nango) => { + const checkpoint = await nango.getCheckpoint(); + const now = new Date().toISOString(); + + // (1) Fetch newly created / updated accounts + const res = await nango.get({ + endpoint: '/accounts', + params: { ...(checkpoint && { since: checkpoint.lastSyncedISO }) } + }); + await nango.batchSave(res.data, 'Account'); + + // (2) Fetch deletions since the last run (if this is not the first run) + if (checkpoint) { + const deletedRes = await nango.get({ + endpoint: '/accounts/deleted', + params: { since: checkpoint.lastSyncedISO } + }); + + // (3) Tell Nango which IDs have been deleted in the external system + const toDelete = deletedRes.data.map((row: any) => ({ id: row.id })); + if (toDelete.length) { + await nango.batchDelete(toDelete, 'Account'); + } + } + + // (4) Save checkpoint for next run + await nango.saveCheckpoint({ lastSyncedISO: now }); + } +}); +``` + +## Detecting deletes in full syncs + +Sync functions that fetch all records on every run can automatically detect deletions. + +Nango detects removals by computing the diff between what existed before `trackDeletesStart` and what was saved between `trackDeletesStart` and `trackDeletesEnd` ([full reference](/reference/functions/functions-sdk#detect-deletions-automatically)). + +This works whether your full sync uses checkpoints for resilience or not. If it does, `trackDeletesStart` should be called before fetching any data and `trackDeletesEnd` after all records are saved and the checkpoint is cleared. + +### Example + +```ts +import { createSync } from 'nango'; +import * as z from 'zod'; + +const TicketSchema = z.object({ + id: z.string(), + subject: z.string(), + status: z.string() +}); + +export default createSync({ + description: 'Fetch all help-desk tickets', + frequency: 'every day', + endpoints: [{ method: 'GET', path: '/tickets', group: 'Tickets' }], + models: { Ticket: TicketSchema }, + + exec: async (nango) => { + // Mark the start of deletion tracking + await nango.trackDeletesStart('Ticket'); + + const tickets = nango.paginate<{ id: string; subject: string; status: string }>({ + endpoint: '/tickets', + paginate: { type: 'cursor', cursor_path_in_response: 'next', cursor_name_in_request: 'cursor', response_path: 'tickets' } + }); + + for await (const page of tickets) { + await nango.batchSave(page, 'Ticket'); + } + + // Detect and mark deleted records + await nango.trackDeletesEnd('Ticket'); + } +}); +``` + +### How the algorithm works + +1. When `trackDeletesStart` is called, Nango marks the beginning of the deletion tracking window for the model. +2. Records saved with `batchSave` between `trackDeletesStart` and `trackDeletesEnd` are tracked. +3. When `trackDeletesEnd` is called, Nango compares what existed before `trackDeletesStart` with what was saved in the window. +4. Any records missing from the new dataset are marked as deleted (soft delete). They remain accessible from the Nango cache, but with `record._metadata.deleted === true`. + + +**Be careful with exception handling when using** `trackDeletesStart`/`trackDeletesEnd` + +Nango only performs deletion detection (the "diff") if a sync run completes successfully without any uncaught exceptions. + +Exception handling is critical: +- If your sync doesn't fetch the full dataset between the two calls (e.g. you catch and swallow an exception), Nango will attempt the diff on an incomplete dataset. +- This leads to false positives, where valid records are mistakenly considered deleted. + +**What You Should Do** + +If a failure prevents full data retrieval, make sure the sync run fails and `trackDeletesEnd` is not being called: +- Let exceptions bubble up and interrupt the run. +- If you're using `try/catch`, re-throw exceptions that indicate incomplete data. + + + +**How to use** `trackDeletesStart`/`trackDeletesEnd` **safely** + +If some records are incorrectly marked as deleted, you can trigger a full resync (via the UI or API) to restore the correct data state. + +We strongly recommend not performing irreversible destructive actions (like hard-deleting records in your system) based solely on deletions reported by Nango. A full resync should always be able to recover from issues. + + +## Troubleshooting deletion detection issues + +| Symptom | Likely cause | +| --- | --- | +| Records that still exist in the source API are shown as `deleted` in Nango | Sync didn't save all records (silent failures) between `trackDeletesStart` and `trackDeletesEnd` | +| You never see deleted records | Check if deletion detection is implemented for the sync. | + +## Related guides + +- [Sync functions](/guides/functions/syncs/sync-functions) - implement full and incremental syncs. +- [Records cache](/guides/functions/syncs/records-cache) - understand how deleted records are exposed to your app. +- [Sync efficiency](/guides/functions/syncs/sync-efficiency) - reduce API work during delete detection. +- [Functions SDK reference](/reference/functions/functions-sdk#delete-records) - deletion helper methods. -1. **Authorization Flow** - The authorization process is implemented in [`front-end/src/api.ts`](https://github.com/NangoHQ/sample-app/blob/main/front-end/src/api.ts): - - `postConnectSession`: Initiates the OAuth connection - - `getNangoCredentials`: Retrieves credentials after successful authorization +## Realtime Syncs - The flow works as follows: - 1. Frontend initiates connection via `postConnectSession` - 2. Backend creates a Nango connection session - 3. User is redirected to provider OAuth consent screen - 4. After authorization, user is redirected back to the app - 5. User is shown the provider-specific file picker (Google Drive Picker, OneDrive for Business picker, or OneDrive Personal picker) - 6. Frontend can fetch credentials using `getNangoCredentials` +Source: https://nango.dev/docs/guides/functions/syncs/realtime-syncs.md -#### Backend Implementation +--- +title: 'Real-time syncs with webhooks' +sidebarTitle: 'Real-time syncs' +description: 'Combine webhooks from external APIs with periodic polling for a reliable, real-time stream of changes.' +--- + +Nango supports real-time syncs using [webhook functions](/guides/functions/webhook-functions). You can rely entirely on webhooks or combine them with polling to ensure you never miss data. + +## What is a real-time sync + +Real-time sync involves receiving webhooks from external APIs and processing them inside a sync function. By default, sync functions poll data at a set frequency, but they can also be configured to handle webhooks for real-time updates. + +When processed in a sync: +- The webhook triggers the execution of a Nango sync script +- The script extracts data from the webhook and optionally fetches additional data from the external API +- The modified data is stored in the Nango cache + +Whenever the cache is updated, Nango sends a [sync completion webhook](/guides/platform/webhooks-from-nango#sync-webhooks) to notify your application of new data. This entire process happens in real-time. + +### Webhooks & periodic polling + +Webhooks can fail due to external API outages or unordered events. Periodic polling ensures data consistency by reconciling any missed updates. + +If you use webhooks for real-time syncs, we recommend always combining them with a polling sync function. + +### Near real-time syncing + +As an alternative to real-time syncing, consider **near**-real-time syncing by polling at a higher frequency, which is simpler. Sync functions can run as frequently as every 30 seconds. + +This is more resource intensive, but can be a good compromise if you are only syncing data for a handful of [Connections](/guides/auth/auth-guide#overview). + +## Implement a real-time sync + +### Step 1 β€” Setup prerequisites + +To create a real-time sync, you need: +- Webhooks from the external API enabled. Follow [Webhook functions](/guides/functions/webhook-functions). +- A sync function for the object you want to sync. See [Sync functions](/guides/functions/syncs/sync-functions). + +### Step 2 β€” Enable webhooks processing + +To enable the real-time sync, define `webhookSubscriptions` and `onWebhook` in your sync function: + +```typescript +export default createSync({ + exec: async (nango) => { + // Use for periodic polling. + }, + + webhookSubscriptions: ['contact.propertyChange'], // Webhook event type to listen to + + // Webhook handler + onWebhook: async (nango, payload) => { + if (payload.subscriptionType === 'contact.propertyChange') { + const updatedObject = { + id: payload.objectId, + [payload.propertyName]: payload.propertyValue + }; + + // Use nango.batchSave() or nango.batchUpdate() to save/update records. + } + } +}); +``` + +To check if a sync supports webhooks, navigate to the _Integrations_ tab > select an integration > _Endpoints_ sub-tab > check the function settings for webhook subscriptions. + +## Sync concurrency considerations + +When a polling run and a webhook race to update the same record, the later write wins by default β€” which can clobber a fresher webhook update with stale polled data. To prevent that, set a merging strategy at the start of your function: + +```typescript +export default createSync({ + exec: async (nango) => { + // Don't overwrite records that were modified after this batch was fetched + await nango.setMergingStrategy({ strategy: 'ignore_if_modified_after' }, 'Contact'); + + const contacts: Contact[] = []; + await nango.batchSave(contacts, 'Contact'); + } +}); +``` + +Two strategies are available: + +- **`override`** (default) β€” applies updates regardless of last modification time. May overwrite real-time webhook updates with older polled data. +- **`ignore_if_modified_after`** β€” preserves records that were modified after the current batch was fetched. **Recommended** when you combine polling with webhooks. + +Run `batchSave` / `batchUpdate` / `batchDelete` calls sequentially (not in parallel), and persist data promptly after fetching β€” concurrent batch operations can race against each other. + +## Related guides + +- [Webhook functions](/guides/functions/webhook-functions) - process external API webhooks in Nango. +- [Webhook forwarding](/guides/platform/webhook-forwarding) - forward provider webhooks to your app. +- [Sync functions](/guides/functions/syncs/sync-functions) - keep a polling sync as reconciliation. +- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - consume sync completion notifications. -1. **Webhook Handler & Data Sync** - The webhook handling and data sync logic is implemented in [`back-end/src/routes/postWebhooks.ts`](https://github.com/NangoHQ/sample-app/blob/main/back-end/src/routes/postWebhooks.ts): +## Sync Partitioning - Key components: - - Main webhook handler that verifies signatures and routes requests - - `handleNewConnectionWebhook`: Processes new file provider connections - - `handleSyncWebhook`: Handles sync completion and data processing +Source: https://nango.dev/docs/guides/functions/syncs/sync-partitioning.md - The sync process: - 1. Nango syncs files from the provider - 2. Webhook notifies backend of sync completion - 3. Backend fetches records using `nango.listRecords` - 4. File metadata is stored in the database - 5. Deletions are tracked and handled appropriately +--- +title: 'Sync partitioning' +sidebarTitle: 'Sync partitioning' +description: 'Spawn multiple independent sync processes inside a single connection β€” one per mailbox, drive folder, Slack channel, repo, or any other partition.' +--- + +Sync variants let you spawn multiple independent sync processes **inside a single connection** β€” one per mailbox, file folder, Slack channel, repo, or any other sub-resource the end-user has access to. Each variant runs on its own schedule, with its own checkpoint and records cache, so a slow partition doesn't block a fast one. + +Nango is already multi-tenant by default β€” every sync function executes in the context of an end-user [Connection](/guides/auth/auth-guide#overview), and runs independently for each connection. Variants are for the next level down: fan-out *within* one connection. + +## Overview + +Traditionally, a sync function is defined once and executed once per connection. With variants, you can create multiple instances of the same function that share the base configuration but run independently. Each variant has its own execution schedule, checkpoint, and data storage. + +Key benefits: +- **Parallel execution** β€” variants run independently, so a slow mailbox or folder doesn't block the others. +- **Custom filtering** β€” each variant can target a different sub-resource (e.g., a specific Gmail label, a specific Drive folder). +- **Per-partition state** β€” each variant has its own checkpoint and cache, so failures and re-syncs are isolated. +- **Dynamic scale** β€” create or delete variants programmatically as the end-user adds/removes sub-resources. + +## How sync variants work + +- By default, a sync is associated with a base variant. +- You can create additional sync variants programmatically using the API or SDK. +- Each variant is treated as a separate sync in the Nango UI. +- Sync webhooks include a variant field to identify which variant was executed. +- External webhooks (e.g., from Airtable) are always processed by the base variant. +- If a sync variant needs additional context (e.g., filtering parameters), store/retrieve it using the connection metadata, namespaced with the variant ID. + +## Creating a sync variant + + +Each sync can have a maximum of **100 variants** per connection. For heavier workloads, reach out to increase this limit. + + +To create a sync variant, use the Nango API or SDK. The variant must have a unique name and cannot be "base" (reserved). + + + + ```ts + // Create a sync variant + await nango.createSyncVariant({ + provider_config_key: 'my-integration', + connection_id: 'customer-123', + name: 'sync-orders', + variant: 'high-value-orders' + }); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/sync/sync-orders/variant/high-value-orders \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "provider_config_key": "my-integration", + "connection_id": "customer-123" + }' + ``` + + + +This creates a new variant named `high-value-orders` for the `sync-orders` sync. It will run separately from the base variant. + +## Running & managing sync variants + +Once created, a variant can be managed just like a regular sync. All sync operations (triggering, pausing, resuming, etc.) support the variant parameter. + +Check out the [HTTP API reference](/reference/backend/http-api/sync/trigger) or [Node SDK reference](/reference/backend/backend-sdk/node#trigger-syncs) for details. + +## Accessing the variant in a sync script + +When a sync script runs, the variant name is available via `nango.variant`. You can use this to customize the behavior of your sync. + +```ts example-partitioned-sync-script.ts +export default createSync({ + exec: async (nango) => { + await nango.log(`Running sync with variant: ${nango.variant}`); + + // Use the variant name to namespace the metadata and/or customize API calls. + const res = await nango.get({ + endpoint: `/orders?filter=${nango.variant}` + }); + + // Records are saved in the context of this specific variant. + await nango.batchSave(res.data.orders, 'Order'); + }, +}); +``` + +## Fetching data for a variant + +Use the `variant` query parameter when retrieving records from the Nango API. + + + + ```ts + const records = await nango.listRecords({ + providerConfigKey: 'my-integration', + connectionId: 'customer-123', + model: 'Order', + variant: 'high-value-orders' + }); + ``` + + + ```bash + curl --request GET \ + --url "https://api.nango.dev/records?model=Order&variant=high-value-orders" \ + --header 'Authorization: Bearer ' + ``` + + + +This fetches only the records for the `high-value-orders` variant. + +## Storing variant-specific context + +If a sync variant requires custom parameters (e.g., a filtering threshold), store them in the connection metadata, namespaced by the variant ID. + +Storing metadata: + + + + ```ts + await nango.setMetadata('my-integration', 'customer-123', { + 'high-value-orders.threshold': 500 + }); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/metadata \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "connection_id": "customer-123", + "metadata": { + "high-value-orders.threshold": 500 + } + }' + ``` + + + +Retrieving metadata in a sync script: + +```ts example-partitioned-sync-script.ts +const metadata = await nango.getMetadata(); +const threshold = metadata[`${nango.variant}.threshold`] || 100; + +await nango.log(`Filtering orders above ${threshold}`); +``` + +Keep variants non-overlapping in data scope (unless intentional), store variant-specific settings in connection metadata rather than hardcoding them, and avoid creating one variant per row of data β€” variants are best for partitioning, not row-level fan-out. + +## Related guides + +- [Sync functions](/guides/functions/syncs/sync-functions) - build the base sync before adding variants. +- [Checkpoints](/guides/functions/syncs/checkpoints) - track progress per variant. +- [Records cache](/guides/functions/syncs/records-cache) - fetch data for each variant. +- [Create sync variant API](/reference/backend/http-api/sync/create-variant) - manage variants programmatically. -2. **File Download with Proxy** - File download functionality is implemented in [`back-end/src/routes/downloadFile.ts`](https://github.com/NangoHQ/sample-app/blob/main/back-end/src/routes/downloadFile.ts): +## Action Functions - The download process: - 1. Frontend requests file download with file ID and connection ID - 2. Backend uses Nango proxy to fetch file from provider - 3. File is streamed to client with proper headers - 4. Error handling ensures graceful failure +Source: https://nango.dev/docs/guides/functions/action-functions.md - Key features: - - Uses Nango proxy for secure file access - - Proper content type and disposition headers - - Streaming response for efficient file transfer - - Comprehensive error handling +--- +title: 'Action functions' +sidebarTitle: 'Action functions' +description: 'Build Action functions that your app, backend jobs, or agents can call on demand.' +--- + +Action functions run when your app, backend job, or agent explicitly calls them. In SDK and API names, this function type is often called an **action** because it receives an input and returns an output. + +Use action functions for reads, writes, multi-step provider workflows, unified API operations, and AI tools. + +## Create the function + +Add a file under the integration's `actions/` folder: + +```typescript github/actions/create-issue.ts +import { createAction } from 'nango'; +import * as z from 'zod'; + +export default createAction({ + description: 'Creates a GitHub issue', + version: '1.0.0', + input: z.object({ + owner: z.string(), + repo: z.string(), + title: z.string(), + body: z.string().optional() + }), + output: z.object({ + id: z.number(), + url: z.string().url() + }), + exec: async (nango, input) => { + const response = await nango.post({ + endpoint: `/repos/${input.owner}/${input.repo}/issues`, + data: { + title: input.title, + body: input.body + } + }); + + return { + id: response.data.id, + url: response.data.html_url + }; + } +}); +``` + +Import it from `index.ts`: + +```typescript index.ts +import './github/actions/create-issue'; +``` + + + The output of an action function cannot exceed 2 MB. Return only the fields your app needs. For larger payloads, use the [requests proxy](/guides/platform/proxy-requests) to fetch data directly from your app. + + + + Before generating an action function, collect the integration ID, connection ID for testing, provider endpoint, required input fields, expected output shape, and whether the operation is safe to retry. + + Prefer explicit Zod schemas and short provider response mapping. If the action performs writes, make the logic idempotent before using async execution or retries. + + +## Test and deploy + +Dry run the function with realistic input: + +```bash +nango dryrun create-issue '' -e dev --input '{"owner":"NangoHQ","repo":"interactive-demo","title":"Bug report","body":"Created from a Nango action"}' +``` + +Deploy your functions: + +```bash +nango deploy +``` + +To deploy only this action function: + +```bash +nango deploy --action create-issue dev +``` + +For broader test coverage, see the [testing guide](/guides/functions/testing). To deploy from CI, see [CI/CD](/guides/functions/ci-cd). + +## Trigger synchronously + +Synchronous execution is the default. The API or SDK call returns the function output. + + + + ```typescript + import { Nango } from '@nangohq/node'; + + const nango = new Nango({ secretKey: process.env.NANGO_SECRET_KEY! }); + + const result = await nango.triggerAction( + 'github', + '', + 'create-issue', + { + owner: 'NangoHQ', + repo: 'interactive-demo', + title: 'Bug report', + body: 'Created from a Nango action' + } + ); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/action/trigger \ + --header 'Authorization: Bearer ' \ + --header 'Connection-Id: ' \ + --header 'Provider-Config-Key: github' \ + --header 'Content-Type: application/json' \ + --data '{ + "action_name": "create-issue", + "input": { + "owner": "NangoHQ", + "repo": "interactive-demo", + "title": "Bug report", + "body": "Created from a Nango action" + } + }' + ``` + + + +## Trigger asynchronously + +Use async execution for bulk writes, bursty work, or provider endpoints with tight rate limits. Nango queues the execution, applies retries, and lets you poll or receive a webhook when it completes. + + + Execution timing for asynchronous actions is not guaranteed. Async actions are currently processed sequentially per environment, so completion time depends on how many actions are queued and how long each one runs. Design callers to handle delays by polling the result endpoint or listening for the completion webhook. + + + + + ```typescript + const { id, statusUrl } = await nango.triggerActionAsync( + 'github', + '', + 'create-issue', + { + owner: 'NangoHQ', + repo: 'interactive-demo', + title: 'Bug report', + body: 'Created from an async Nango action' + } + ); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/action/trigger \ + --header 'Authorization: Bearer ' \ + --header 'Connection-Id: ' \ + --header 'Provider-Config-Key: github' \ + --header 'X-Async: true' \ + --header 'X-Max-Retries: 3' \ + --header 'Content-Type: application/json' \ + --data '{ + "action_name": "create-issue", + "input": { + "owner": "NangoHQ", + "repo": "interactive-demo", + "title": "Bug report", + "body": "Created from an async Nango action" + } + }' + ``` + + + +Poll the result: + +```typescript +const result = await nango.getAsyncActionResult({ id }); +``` + +The async trigger response includes a `statusUrl` and `id`. Poll `GET /action/` for the result: `404` means the execution is still running, `200` returns the function output, and `500` returns the execution error. + +To receive completion events instead of polling, configure [webhooks from Nango to your app](/guides/platform/webhooks-from-nango) and enable the `Async action completed` webhook. + + + Use retries only for idempotent function logic. Retried writes can otherwise create duplicate side effects in the external API. + + +## Related guides + +- [Function tool calling](/guides/functions/tool-calling) +- [Data validation](/guides/functions/data-validation) +- [Rate limits](/guides/functions/rate-limits) +- [Trigger action API](/reference/backend/http-api/action/trigger) +- [Functions SDK reference](/reference/functions/functions-sdk) -### Nango Dashboard +## Webhook Functions -Explore these sections in your Nango account: +Source: https://nango.dev/docs/guides/functions/webhook-functions.md -1. **Integration Settings** - - [View Integrations](https://app.nango.dev/dev/integrations) - - Configure sync settings - - View integration status +--- +title: 'Webhook functions' +sidebarTitle: 'Webhook functions' +description: 'Process external API webhooks inside Nango functions.' +--- + +Webhook functions run when an external API sends a webhook to Nango. Use them when the webhook should execute Nango-hosted logic, update records, normalize events, or mark data for later reconciliation. + +If your app should handle the webhook directly, use [webhook forwarding](/guides/platform/webhook-forwarding) instead. + +## Processing or forwarding + +Webhook functions and webhook forwarding both start with the same external event: a provider sends a webhook to Nango. + +Use a webhook function when: + +- Nango should run function code as soon as the provider webhook arrives. +- The webhook should update the records cache. +- The webhook payload needs normalization before your app sees it. +- The event should trigger reconciliation logic inside a sync function. + +Use [webhook forwarding](/guides/platform/webhook-forwarding) when: + +- Your app already has webhook handling logic. +- You want Nango to attribute the event to a connection and forward it. +- The event should not run Nango function code. + +## How routing works + +External APIs send webhooks to the integration's Nango webhook URL. Find it in **Integrations > [Integration] > Webhooks**. + +When the provider has a webhook routing script, Nango reads the incoming payload, headers, or allowed query parameters and tries to map the event to one or more Nango connections. Provider-specific guides explain the exact routing fields when extra setup is required. + +If Nango can map the webhook to a connection, the webhook function runs in that connection context. If Nango cannot map the event, the event cannot safely run connection-scoped function logic; use provider-specific setup or webhook forwarding for that case. + +Some providers require one global webhook registration. Others require one webhook subscription per connected account, which you can automate with an [event function](/guides/functions/event-functions). + + + Before implementing a webhook function, inspect the provider-specific Nango docs for webhook routing requirements. Some providers need the Nango connection ID embedded in the provider webhook payload, while others route automatically from account, team, tenant, or installation identifiers. + + Do not assume an external webhook payload is already trusted or complete. Keep `onWebhook` short, idempotent, and resilient to duplicates or out-of-order delivery. + + +## Create the function + +Webhook function logic usually lives on a sync function with `webhookSubscriptions` and `onWebhook`: + +```typescript crm/syncs/contacts.ts +import { createSync } from 'nango'; +import * as z from 'zod'; + +const Contact = z.object({ + id: z.string(), + email: z.string().email().optional(), + updatedAt: z.string().optional() +}); + +export default createSync({ + description: 'Sync contacts and process contact webhooks', + version: '1.0.0', + frequency: 'every hour', + webhookSubscriptions: ['contact.updated', 'contact.deleted'], + models: { Contact }, + exec: async (nango) => { + // Periodic reconciliation logic. Keep this as the source of truth + // when provider webhooks can be missed, delayed, or partial. + }, + onWebhook: async (nango, payload) => { + if (payload.body.event === 'contact.deleted') { + await nango.batchDelete([{ id: payload.body.contactId }], 'Contact'); + return; + } + + if (payload.body.event === 'contact.updated' && payload.body.contact) { + await nango.batchSave( + [ + { + id: payload.body.contact.id, + email: payload.body.contact.email, + updatedAt: payload.body.contact.updated_at + } + ], + 'Contact' + ); + } + } +}); +``` + +Import it from `index.ts`: + +```typescript index.ts +import './crm/syncs/contacts'; +``` + +## Register the provider webhook URL + +Register the integration's Nango webhook URL in the external API's developer portal. If the provider requires per-connection registration, use an event function after connection creation. + +For example, an event function can call the provider's webhook subscription API with the connection's credentials and store the provider webhook subscription ID in connection metadata for cleanup later. + +## Test and deploy + +Dry run the sync function's `exec` logic: + +```bash +nango dryrun contacts '' -e dev +``` + +Deploy your functions: + +```bash +nango deploy +``` + +To deploy only this webhook-backed sync function: + +```bash +nango deploy --sync contacts dev +``` + +Then send a test webhook from the provider dashboard, CLI, or webhook testing tool to the Nango webhook URL. Check Nango logs for the incoming webhook, routing result, and function execution. + +## Keep webhook processing lightweight + +Avoid making slow provider API calls directly from `onWebhook` unless the provider's webhook is explicitly designed for that flow. Webhooks can arrive in bursts, be retried, or arrive out of order. + +Prefer lightweight, idempotent handling in `onWebhook`, and let the sync function's `exec` reconcile full state. + +## Related guides + +- [Webhook forwarding](/guides/platform/webhook-forwarding) +- [Process external webhooks](/getting-started/use-cases/webhooks-from-external-apis) +- [Real-time syncs](/guides/functions/syncs/realtime-syncs) +- [Event functions](/guides/functions/event-functions) +- [Records cache](/guides/functions/syncs/records-cache) -2. **Connections** - - [View Connections](https://app.nango.dev/dev/connections) - - Monitor sync status - - Check connection health +## Event Functions -3. **Logs** - - [View Logs](https://app.nango.dev/dev/logs) - - Track sync operations - - Debug issues +Source: https://nango.dev/docs/guides/functions/event-functions.md -### Common Issues and Solutions +--- +title: 'Event functions' +sidebarTitle: 'Event functions' +description: 'Run function logic automatically when Nango connection lifecycle events happen.' +--- + +Event functions run automatically when Nango reaches a connection lifecycle event. They are defined with `createOnEvent()`. + +Use them to validate credentials, register provider webhooks, seed connection-specific metadata, or clean up external resources before a connection is deleted. + +## Choose the lifecycle event + +Supported events: + +| Event | When it runs | Common use | +| --- | --- | --- | +| `post-connection-creation` | Immediately after a connection is created | Register provider webhooks, seed metadata, run setup checks | +| `validate-connection` | During connection creation and reconnect | Reject invalid credentials, missing provider permissions, or policy violations (e.g. same-account enforcement) | +| `pre-connection-deletion` | Before a connection is deleted | Delete provider webhook subscriptions or external resources | + + + Before generating an event function, identify the lifecycle event, provider endpoint, required metadata, and desired failure behavior. + + For `validate-connection`, throwing rejects the auth attempt. On first connect, the connection is deleted. On reconnect, the connection is marked as an auth error (`refresh_exhausted`) and the user must reconnect explicitly. For cleanup functions, make the provider call idempotent because the external resource may already be gone. + + For same-account enforcement on reconnect, store the provider account identifier in **connection metadata** during `post-connection-creation`, then compare it to a live identity API call in `validate-connection`. Do not compare `connection_config` fields: reconnect upserts new credentials before validation runs, so config values already reflect the newly authenticated account. + + +## Create a setup function + +Add a file under the integration's `on-events/` folder: + +```typescript salesforce/on-events/post-connection-setup.ts +import { createOnEvent } from 'nango'; +import * as z from 'zod'; + +const Metadata = z.object({ + organization_id: z.string().optional(), + webhookId: z.string().optional() +}); + +export default createOnEvent({ + description: 'Register a Salesforce webhook after a successful connection', + event: 'post-connection-creation', + metadata: Metadata, + exec: async (nango) => { + const response = await nango.post({ + endpoint: '/webhooks', + data: { + url: 'https://api.myapp.com/webhooks/salesforce', + events: ['contact.updated'] + } + }); + + await nango.setMetadata({ + webhookId: response.data.id + }); + } +}); +``` + +Import it from `index.ts`: + +```typescript index.ts +import './salesforce/on-events/post-connection-setup'; +``` + +## Create a connection validation function + +Add a file under the integration's `on-events/` folder: + +```typescript salesforce/on-events/validate-connection.ts +import { createOnEvent } from 'nango'; +import * as z from 'zod'; + +const Metadata = z.object({ + organizationId: z.string().optional(), + webhookId: z.string().optional() +}); + +export default createOnEvent({ + description: 'Validate connection against saved organization id to prevent changing account on reconnect', + event: 'validate-connection', + metadata: Metadata, + exec: async (nango) => { + const metadata = await nango.getMetadata(); + const lockedOrganizationId = metadata?.organizationId; + + const response = await nango.get<{organization_id: string}>({ + endpoint: '/services/oauth2/userinfo' + }); + const organizationId = response.data?.organization_id; + if (!organizationId) { + throw new nango.ActionError('Salesforce connection missing organization_id from /services/oauth2/userinfo'); + } + + // On initial connection, save organization id to connection metadata + if (!lockedOrganizationId) { + await nango.setMetadata({organizationId}); + return; + } + + // On subsequent connections, check if new organization id matches stored value + if (lockedOrganizationId !== organizationId) { + throw new nango.ActionError( + `Salesforce org mismatch: expected ${lockedOrganizationId}, got ${organizationId}` + ); + } + } +}); +``` + +Import it from `index.ts`: + +```typescript index.ts +import './salesforce/on-events/validate-connection'; +``` + +On first connect, validation passes when metadata has no locked org yet; the setup function records `organization_id` after auth succeeds. On reconnect, validation compares the new credentials against the saved org ID and rejects the attempt if they differ. + + +Compare the locked value in **metadata** to a live value from the provider API. Do not compare `connection_config` fields: on reconnect, Nango upserts the new credentials and overwrites `connection_config` **before** `validate-connection` runs, so config already reflects the account the user just authenticated with. + + +## Create a cleanup function + +If the provider webhook is registered per connection, clean it up before the Nango connection is deleted: + +```typescript salesforce/on-events/pre-connection-cleanup.ts +import { createOnEvent } from 'nango'; +import * as z from 'zod'; + +const Metadata = z.object({ + organization_id: z.string().optional(), + webhookId: z.string().optional() +}); + +export default createOnEvent({ + description: 'Delete the Salesforce webhook before connection deletion', + event: 'pre-connection-deletion', + metadata: Metadata, + exec: async (nango) => { + const metadata = await nango.getMetadata(); + if (!metadata?.webhookId) { + return; + } + + await nango.delete({ + endpoint: `/webhooks/${metadata.webhookId}` + }); + } +}); +``` + +Import it from `index.ts`: + +```typescript index.ts +import './salesforce/on-events/pre-connection-cleanup'; +``` + +## Test and deploy + +Dry run an event function against an existing connection: + +```bash +nango dryrun post-connection-setup '' -e dev +``` + +Deploy your functions: + +```bash +nango deploy +``` + +Event functions run automatically when their configured event occurs. Your app does not trigger them directly. + +## Related guides + +- [Webhook functions](/guides/functions/webhook-functions) +- [Webhook forwarding](/guides/platform/webhook-forwarding) +- [Storage](/guides/functions/storage) +- [Functions SDK reference](/reference/functions/functions-sdk) -1. **Connection Issues** - - Check Docker is running - - Verify webhook URL is correct - - Ensure provider credentials are valid +## Tool Calling -2. **Sync Problems** - - Check Nango logs - - Verify file permissions - - Monitor sync status +Source: https://nango.dev/docs/guides/functions/tool-calling.md -### File Type Support +--- +title: 'Tool calling & MCP' +sidebarTitle: 'Tool calling & MCP' +description: 'Expose Nango action functions to agents, LLM SDKs, and MCP clients.' +--- + +Tool calling in Nango happens through [action functions](/guides/functions/action-functions). Each tool is an action function that an agent, LLM SDK, or MCP client can call on demand for a specific connection. + +The agent chooses a tool, your application asks Nango to execute the action function for that connection, and Nango handles the external API credentials, retries, rate limits, and logs. + +## Prerequisites + +- A Nango integration configured for the external API. +- A connection for the user whose credentials should be used. +- One or more enabled action functions for the operations the agent may call. + +Build custom tools with [action functions](/guides/functions/action-functions), or enable template action functions from the [template catalog](/guides/functions/functions-guide#template-catalog). + +## Common auth and execution + +Keep provider credentials out of the agent runtime. Your app should resolve the Nango connection for the current user, then pass only the connection ID and selected tool to Nango. + +```ts +import { Nango } from '@nangohq/node'; + +const nango = new Nango({ secretKey: process.env.NANGO_SECRET_KEY! }); + +const integrationId = 'hubspot'; + +async function getConnectionIdForUser(userId: string) { + const connections = await nango.listConnections({ + integrationId, + tags: { end_user_id: userId } + }); + + let connectionId = connections.connections[0]?.connection_id; + + if (!connectionId) { + const session = await nango.createConnectSession({ + allowed_integrations: [integrationId], + tags: { end_user_id: userId } + }); + + // Send this URL to the user in your app, then wait for authorization. + console.log(session.data.connect_link); + + const connection = await nango.waitForConnection(integrationId, userId); + connectionId = connection!.connection_id; + } + + return connectionId; +} + +async function executeNangoTool(actionName: string, input?: unknown) { + const connectionId = await getConnectionIdForUser('user_123'); + + return await nango.triggerAction(integrationId, connectionId, actionName, input); +} +``` + +The examples below focus on framework-specific tool syntax and call the shared `executeNangoTool()` helper. + +## Framework examples + +These examples expose a HubSpot `whoami` action function as a `who_am_i` tool. + + + + ```ts + import OpenAI from 'openai'; + + const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY! }); + + const tools = [ + { + type: 'function' as const, + name: 'who_am_i', + description: 'Get the current HubSpot user information.', + strict: true, + parameters: { + type: 'object', + properties: {}, + required: [], + additionalProperties: false + } + } + ]; + + const input: any[] = [ + { + role: 'user', + content: 'Use who_am_i and summarize the current HubSpot user.' + } + ]; + + const response = await client.responses.create({ + model: 'gpt-5', + input, + tools + }); + + for (const item of response.output) { + if (item.type !== 'function_call' || item.name !== 'who_am_i') { + continue; + } + + const result = await executeNangoTool('whoami', JSON.parse(item.arguments || '{}')); + + input.push(item); + input.push({ + type: 'function_call_output', + call_id: item.call_id, + output: JSON.stringify(result) + }); + } + + const finalResponse = await client.responses.create({ + model: 'gpt-5', + input, + tools + }); + + console.log(finalResponse.output_text); + ``` + + + ```ts + import Anthropic from '@anthropic-ai/sdk'; + + const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY! }); + + const tools = [ + { + name: 'who_am_i', + description: 'Get the current HubSpot user information.', + input_schema: { + type: 'object', + properties: {}, + required: [] + } + } + ]; + + const messages: Anthropic.MessageParam[] = [ + { + role: 'user', + content: 'Use who_am_i and summarize the current HubSpot user.' + } + ]; + + const message = await client.messages.create({ + model: 'claude-sonnet-4-5', + max_tokens: 1024, + messages, + tools + }); + + const toolUse = message.content.find((block) => block.type === 'tool_use'); + + if (toolUse?.type === 'tool_use' && toolUse.name === 'who_am_i') { + const result = await executeNangoTool('whoami', toolUse.input); + + messages.push({ role: 'assistant', content: message.content }); + messages.push({ + role: 'user', + content: [ + { + type: 'tool_result', + tool_use_id: toolUse.id, + content: JSON.stringify(result) + } + ] + }); + + const finalMessage = await client.messages.create({ + model: 'claude-sonnet-4-5', + max_tokens: 1024, + messages, + tools + }); + + console.log(finalMessage.content); + } + ``` + + + ```ts + import { generateText, stepCountIs, tool } from 'ai'; + import { openai } from '@ai-sdk/openai'; + import { z } from 'zod'; + + const { text, toolResults } = await generateText({ + model: openai('gpt-4o'), + prompt: 'Use who_am_i and summarize the current HubSpot user.', + tools: { + who_am_i: tool({ + description: 'Get the current HubSpot user information.', + inputSchema: z.object({}), + execute: async () => { + return await executeNangoTool('whoami'); + } + }) + }, + stopWhen: stepCountIs(5) + }); + + console.log(text); + console.log(toolResults); + ``` + + + ```ts + import { createAgent, tool } from 'langchain'; + import { z } from 'zod'; + + const whoAmI = tool( + async () => { + const result = await executeNangoTool('whoami'); + return JSON.stringify(result); + }, + { + name: 'who_am_i', + description: 'Get the current HubSpot user information.', + schema: z.object({}) + } + ); + + const agent = createAgent({ + model: 'openai:gpt-5.4', + tools: [whoAmI] + }); + + const result = await agent.invoke({ + messages: [ + { + role: 'user', + content: 'Use who_am_i and summarize the current HubSpot user.' + } + ] + }); + + console.log(result.messages.at(-1)?.content); + ``` + + + ```ts + import { openai } from '@ai-sdk/openai'; + import { Agent } from '@mastra/core/agent'; + import { createTool } from '@mastra/core/tools'; + import { z } from 'zod'; + + const whoAmI = createTool({ + id: 'who_am_i', + description: 'Get the current HubSpot user information.', + inputSchema: z.object({}), + execute: async () => { + return await executeNangoTool('whoami'); + } + }); + + const agent = new Agent({ + name: 'HubSpot Agent', + instructions: 'Use available tools to answer HubSpot account questions.', + model: openai('gpt-4o'), + tools: { + who_am_i: whoAmI + } + }); + + const response = await agent.generate('Use who_am_i and summarize the current HubSpot user.'); + + console.log(response.text); + ``` + + + +## Programmatic tool discovery + +The [Get integration functions config API](/reference/backend/http-api/scripts/config) returns enabled action function definitions. Use it when an agent or orchestration layer should discover available tools at runtime. + +```bash +curl --request GET \ + --url 'https://api.nango.dev/scripts/config?provider_config_key=&format=openai' \ + --header 'Authorization: Bearer ' +``` + +Use `format=nango` for Nango's native configuration shape, or `format=openai` when you want OpenAI-compatible function definitions. + +## Direct tool execution + +For SDKs that let you provide your own tool executor, define the tool schema in your app and call Nango from the executor. + +```ts +import { Nango } from '@nangohq/node'; + +const nango = new Nango({ secretKey: process.env.NANGO_SECRET_KEY! }); + +async function executeTool(connectionId: string, input: { owner: string; repo: string; title: string }) { + return await nango.triggerAction('github', connectionId, 'create-issue', input); +} +``` + +Keep these values explicit: + +- `providerConfigKey` / integration ID - which integration owns the action function. +- `connectionId` - which user's credentials the call uses. +- Action function name - the enabled action function to execute. +- Input payload - validated by the action function schema when configured. + +## MCP server + +Nango exposes enabled action functions through a hosted MCP server: + +```text +https://api.nango.dev/mcp +``` + +The server supports Streamable HTTP transport. Requests must include: + +| Header | Value | +| --- | --- | +| `Authorization` | `Bearer ` | +| `connection-id` | The connection whose credentials should be used | +| `provider-config-key` | The integration ID | + +Example client setup with the MCP TypeScript SDK: + +```ts +import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'; + +const transport = new StreamableHTTPClientTransport(new URL('https://api.nango.dev/mcp'), { + requestInit: { + headers: { + Authorization: `Bearer ${process.env.NANGO_SECRET_KEY}`, + 'connection-id': '', + 'provider-config-key': '' + } + } +}); +``` + +For desktop clients that only support stdio, use a bridge such as `mcp-remote` and pass the same headers. Keep the header spacing exactly as required by the bridge you choose. + +## Auth flow for agents + +Agents should not receive provider credentials. Your app should: + +1. Check whether the user already has a Nango connection. +2. Create a Connect session if they need to authorize. +3. Store the resulting `connectionId` in your app. +4. Use that `connectionId` for future tool calls. + +See the [Auth guide](/guides/auth/auth-guide) and [Create Connect Session API](/reference/backend/http-api/connect/sessions/create) for the end-to-end auth flow. + + + If you are implementing this flow programmatically, first list or create the user's connection, then call `GET /scripts/config` to discover enabled action functions, and finally execute tools with `POST /action/trigger` or the MCP server. + + Required values for every execution are the Nango secret key, integration ID, connection ID, action function name, and input payload. + + +## Observability and safety + +Every action function execution appears in Nango logs. Use logs to debug failed tool calls, inspect provider requests, and review agent behavior. + +Keep tool names and descriptions specific. Expose only action functions the agent is allowed to call for the current user and workflow. For write operations, make action function logic idempotent before using async execution or retries. + +## Related references + +- [Action functions](/guides/functions/action-functions) +- [Template catalog](/guides/functions/functions-guide#template-catalog) +- [Get integration functions config API](/reference/backend/http-api/scripts/config) +- [Trigger action API](/reference/backend/http-api/action/trigger) +- [Functions SDK reference](/reference/functions/functions-sdk) +- [Observability](/guides/platform/observability) -The sample app supports all file types through Nango's proxy: +## Storage -- **Regular files** (PDFs, images, documents, etc.) -- **Google Workspace files** (Docs, Sheets, Slides) -- **Microsoft Office files** (Word, Excel, PowerPoint) -- **Other cloud storage file types** +Source: https://nango.dev/docs/guides/functions/storage.md - - **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - +--- +title: 'Storage' +sidebarTitle: 'Storage' +description: 'Use connection metadata as the default storage for function parameters and per-customer configuration.' +--- + +Functions have access to storage that is scoped to the connection they run for. Use it to keep integration behavior tied to the customer, account, workspace, or tenant that authorized the connection. + +For the product-level workflow, see [Customize per customer](/getting-started/use-cases/customer-configuration). + +## Connection metadata + +Connection metadata is the default blob storage for Nango Functions. It is a JSON object stored on a Nango connection and available to action functions, sync functions, webhook functions, and event functions. + +Use metadata for: + +- Customer-specific settings, such as field mappings, filters, folders, projects, account IDs, or feature flags. +- Function configuration values that should persist across executions. +- Values discovered during setup, such as provider webhook subscription IDs or tenant-specific identifiers. +- Configuration shared across multiple functions for the same connection. + +Do not use metadata for synced datasets or large lists of records. For data replicated by sync functions, use the [records cache](/guides/functions/syncs/records-cache). + +## Set and update metadata from your app + +Set metadata after the customer chooses integration settings during onboarding or in your app's settings UI. + + + + ```ts + await nango.setMetadata( + '', + '', + { + accountRegion: 'eu', + syncArchived: false, + fieldMapping: { + companyName: 'Account_Name__c' + } + } + ); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/connection//metadata \ + --header 'Authorization: Bearer ' \ + --header 'Provider-Config-Key: ' \ + --header 'Content-Type: application/json' \ + --data '{ + "accountRegion": "eu", + "syncArchived": false, + "fieldMapping": { + "companyName": "Account_Name__c" + } + }' + ``` + + + ```ts + await nango.updateMetadata( + '', + '', + { syncArchived: true } + ); + ``` + + + ```bash + curl --request PATCH \ + --url https://api.nango.dev/connection//metadata \ + --header 'Authorization: Bearer ' \ + --header 'Provider-Config-Key: ' \ + --header 'Content-Type: application/json' \ + --data '{ "syncArchived": true }' + ``` + + + +`setMetadata` replaces the metadata object. `updateMetadata` merges the provided fields into the existing object. + +For exact parameters and response shapes, see the [set metadata API](/reference/backend/http-api/connections/set-metadata), [update metadata API](/reference/backend/http-api/connections/update-metadata), [Node SDK set metadata method](/reference/backend/backend-sdk/node#set-connection-metadata), and [Node SDK edit metadata method](/reference/backend/backend-sdk/node#edit-connection-metadata). + +## Read metadata from your app + +Read metadata from your app when you need to render saved settings, pre-fill a configuration UI, or decide whether a connection is ready for syncs: + +```ts +const metadata = await nango.getMetadata('', ''); +``` + +You can also fetch the connection with the REST API: + +```bash +curl --request GET \ + --url 'https://api.nango.dev/connection/?provider_config_key=' \ + --header 'Authorization: Bearer ' +``` + +## Read metadata inside a function + +Define a metadata schema on the function, then call `nango.getMetadata()`: + +```ts crm/syncs/contacts.ts +import { createSync } from 'nango'; +import * as z from 'zod'; + +const Metadata = z.object({ + accountRegion: z.string().optional(), + syncArchived: z.boolean().default(false) +}); + +export default createSync({ + description: 'Sync contacts', + frequency: 'every hour', + metadata: Metadata, + exec: async (nango) => { + const metadata = await nango.getMetadata(); + + await nango.get({ + endpoint: '/contacts', + params: { + region: metadata.accountRegion, + archived: metadata.syncArchived + } + }); + } +}); +``` + +Inside a function, `nango.getMetadata()` automatically reads metadata for the connection being executed. + + + When a sync function reads metadata with `nango.getMetadata()`, metadata can be cached for up to 60 seconds during that execution. The next execution always reads the latest metadata. + + +## Customer configuration pattern + +A common customer configuration pattern is to ask the customer how their external custom fields map to your product model, then store that mapping as connection metadata. + +```json +{ + "fieldMapping": { + "internal_customer_id": "External_Customer_ID__c", + "plan": "Plan__c" + } +} +``` + +Use an action function to fetch available custom fields from the provider, save the customer's choices as metadata, then read the mapping inside the sync function that fetches records. + +If a sync function should start only after the required configuration exists, start it after saving metadata: + +```ts +await nango.startSync('', ['contacts'], ''); +``` + +## Records cache + +The records cache is the storage layer for sync output. Sync functions write records with `nango.batchSave()`, `nango.batchUpdate()`, and `nango.batchDelete()`. Your app reads changed records through the records API or SDK. + +Use the records cache for synced external data, not for function configuration. See [Records cache](/guides/functions/syncs/records-cache). + +## Related guides + +- [Customize per customer](/getting-started/use-cases/customer-configuration) - design the product workflow for customer-specific integration settings. +- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - distinguish tags, connection configuration, and runtime metadata. +- [Set connection metadata API](/reference/backend/http-api/connections/set-metadata) - replace metadata from your app. +- [Update connection metadata API](/reference/backend/http-api/connections/update-metadata) - patch metadata from your app. -## Next steps +## Logging -- [Auth guide](/guides/auth/auth-guide) - understand the authorization flow used by the sample app. -- [Sync functions](/guides/functions/syncs/sync-functions) - customize the data sync logic. -- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - process sync and auth notifications. +Source: https://nango.dev/docs/guides/functions/logging.md -## Auth guide +--- +title: 'Function logging' +sidebarTitle: 'Logging' +description: 'Use function logs for local debugging, cloud observability, and production troubleshooting.' +--- + +Nango records function executions in the Logs tab. You can also add custom logs from action, sync, webhook, and event functions with `nango.log()`. + +Use custom logs for information that helps you understand function behavior: selected filters, page counts, checkpoint values, provider identifiers, branch decisions, and recoverable errors. + +## Add custom logs + +```ts +await nango.log('Starting contacts sync'); +await nango.log('Applying region filter', { level: 'debug' }); +await nango.log('Provider returned a partial response', { level: 'warn' }); +await nango.log('Failed to map contact', { level: 'error' }); +``` + +If you do not pass a level, `nango.log()` uses `info`. + +## Log levels + +Nango supports these levels, from most to least verbose: + +| Level | Use for | +| --- | --- | +| `debug` | Local diagnostics, pagination details, temporary investigation logs | +| `info` | Normal execution milestones you may want during development | +| `warn` | Unexpected but recoverable behavior | +| `error` | Failed operations, invalid provider responses, or errors you catch and continue from | +| `off` | Disable custom logs | + +Only logs at or above the configured logger level are ingested into the Nango UI Logs tab. + +For example, when the logger level is `warn`, only `warn` and `error` custom logs are visible in the cloud logs. + +## Cloud vs local behavior + +| Runtime | Default custom log level | Where custom logs appear | +| --- | --- | --- | +| Cloud environments | `warn` | Nango UI Logs tab for logs at `warn` or `error` | +| `nango dryrun` | `debug` | Local console for all custom log levels | + +This means `await nango.log('message')` is visible during local dry runs, because local dry runs default to `debug`. The same call defaults to `info`, so it is not visible in cloud logs unless you lower the configured logger level to `info` or `debug`. + + + Cloud custom logs can affect log volume and billing. Prefer `debug` and `info` for local investigation, and use `warn` or `error` for production signals you want retained by default. + + +## Configure the logger + +Set the default logger level for an environment with `NANGO_LOGGER_LEVEL` in **Environment Settings > Environment Variables**: + +```bash +NANGO_LOGGER_LEVEL=info +``` + +Valid values are `debug`, `info`, `warn`, `error`, and `off`. + +You can also change the logger level inside a function. This applies to `nango.log()` calls after the setting is changed: + +```ts +nango.setLogger({ level: 'debug' }); + +await nango.log('Detailed investigation log'); + +nango.setLogger({ level: 'warn' }); +``` + +Use function-level configuration when one run or one branch needs additional visibility. Use the environment variable when all functions in that environment should share the same threshold. + +## What to log + +Good function logs are specific and bounded: + +- Log the connection-specific configuration that changes behavior, such as selected folder IDs, regions, or pipeline IDs. +- Log provider pagination progress with counts, cursors, or checkpoints, but avoid logging every record. +- Log warnings when the provider omits optional data or returns a shape you can recover from. +- Log errors when you catch an exception and continue, so the run is still inspectable. + +Avoid logging secrets, access tokens, refresh tokens, full request headers, or raw payloads that may contain sensitive customer data. + +## Related guides + +- [Observability](/guides/platform/observability) +- [Functions SDK reference](/reference/functions/functions-sdk#logging) +- [Testing](/guides/functions/testing) +- [Sync efficiency](/guides/functions/syncs/sync-efficiency) -Source: https://nango.dev/docs/guides/auth/auth-guide.md -Description: Let your users connect external APIs to your agents & apps. +## Rate Limits -## Overview +Source: https://nango.dev/docs/guides/functions/rate-limits.md -Nango Auth lets your users connect 800+ external APIs to your product. You embed a Nango-managed auth flow in your application, and Nango handles authorization, credential storage, refresh, and validation. +--- +title: 'Rate limits' +sidebarTitle: 'Rate limits' +description: 'Guide on how to handle API rate limits from external APIs.' +--- + +External APIs often enforce rate limits to prevent excessive use. When these limits are reached, you'll start receiving HTTP `429 Too Many Requests` errors, blocking further requests until the limit resets. + +To maintain data freshness and avoid disruptions in your integration functions, it's crucial to manage your API call volume and handle rate limits effectively. Nango simplifies this process significantly. + +## Strategy 1: Retry with exponential backoff + +The simplest strategy involves retrying failed requests after waiting: + +When you configure HTTP requests using Nango's helper ([reference](/reference/functions/functions-sdk#http-requests)), you can specify the number of retries: + +```ts +await nango.get({ endpoint: '/some-endpoint', retries: 10 }); +``` + +This configuration enables automatic retries on receiving a `429` status code, with the retries spaced out using exponential backoff. This method is efficient because: + +- It uses exponential backoff to wait out the rate-limit period +- Nango [sync functions](/guides/functions/syncs/sync-functions) can run for up to 24 hours, allowing retries to occur within this window (note that action functions and webhook functions have shorter lifespans; see [Resource limits](/guides/platform/limits)) +- It works for APIs without requiring any API-specific configurations + +Find details about HTTP request retries in the [reference](/reference/functions/functions-sdk#http-request-retries). + +## Strategy 2: Leverage rate-limit headers + +Most of the time, the first strategy is sufficient to handle rate limits. + +For APIs with stringent limits, Nango provides a more refined and customized approach by automatically parsing API-specific rate-limit headers from responses and scheduling retries only after the rate limit period has reset: + +This is set up in the same way as the first strategy: + +```ts +await nango.get({ endpoint: '/some-endpoint', retryHeader: { at: "x-ratelimit-reset" } }); +``` + + +If rate-limit headers are not already configured for an API you are using, you can request their inclusion by reaching out to the Nango team via the [community](https://nango.dev/slack)β€”typically within 24 hours. + +## Related guides + +- [Sync efficiency](/guides/functions/syncs/sync-efficiency) - avoid unnecessary provider requests. +- [Action functions](/guides/functions/action-functions) - design retries for idempotent actions. +- [Resource limits](/guides/platform/limits) - understand runtime constraints. +- [Functions SDK reference](/reference/functions/functions-sdk#http-request-retries) - configure request retries. + + +**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + -A **Connection** is created after each successful authorization. It stores one user's credentials for one external API and keeps them valid over time. Credentials can be retrieved at scale or used directly by other Nango primitives β€” without ever passing through your codebase. +## Data Validation -## How it works +Source: https://nango.dev/docs/guides/functions/data-validation.md -The end-to-end flow has four steps: +--- +title: 'Data validation' +sidebarTitle: 'Data validation' +description: 'How to validate data in your functions and in your app' +--- + +Nango offers data validation at two levels: inside your [Nango functions](/guides/functions/functions-guide) (when calling external APIs) and in your application code (when consuming function responses). + +## Validate API responses in Nango functions + +Use Zod to validate data you receive from and send to external APIs. The CLI will also surface *type* errors during dry runs when using the `--validation` option. + +```typescript +import * as z from 'zod'; + +const dataFromAPI = z.object({ + ticketId: z.string(), +}); + +export default createSync({ + exec: async (nango) => { + const response = await nango.get({ endpoint: '/tickets' }); + const isValid = dataFromAPI.parse(response.json); + if (isValid) { + [...] + } + }, +}); +``` + +## Validate Nango function responses in your app + +### TypeScript types (compile-time) + +Use `z.infer` to derive TypeScript types from your Zod schemas and export them from your sync/action files: + +```ts +// In: github/syncs/fetchIssues.ts (Nango function) +export type GithubIssue = z.infer; +``` + +Then import the types in your application code: + +```ts +import type { GithubIssue } from './nango-integrations/github/syncs/fetchIssues'; + +const issues = await nango.listRecords({ ... }); +``` + +### JSON Schema (runtime, language-agnostic) + +When you run `nango compile` or `nango deploy`, Nango generates a `nango.json` file in the `.nango` folder. Each sync/action entry includes a `json_schema` property with the JSON Schema for its models: + +```json +// .nango/nango.json (simplified) +[ + { + "providerConfigKey": "github", + "syncs": [ + { + "name": "fetchIssues", + "output": ["GithubIssue"], + "json_schema": { + "definitions": { + "GithubIssue": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "title": { "type": "string" }, + "state": { "type": "string" } + }, + "required": ["id", "title", "state"], + "additionalProperties": false + } + } + } + } + ] + } +] +``` + +You can extract the `json_schema` object for a given sync or action and use it with any JSON Schema validator in your language of choice (e.g., `ajv` in TypeScript, `jsonschema` in Python, `jsonschema` in Rust, `santhosh-tekuri/jsonschema` in Go). + +Alternatively, Zod v4 supports JSON Schema conversion natively with [`z.toJSONSchema()`](https://zod.dev/json-schema?id=ztojsonschema): + +```ts +import { z } from 'zod'; +import { issueSchema } from './nango-integrations/github/syncs/fetchIssues'; + +const jsonSchema = z.toJSONSchema(issueSchema); +``` + +## Related guides + +- [Action functions](/guides/functions/action-functions) - validate action inputs and outputs. +- [Sync functions](/guides/functions/syncs/sync-functions) - validate synced record models. +- [Unified APIs](/guides/functions/unified-apis) - normalize provider data behind stable schemas. +- [Testing](/guides/functions/testing) - cover validation behavior in tests. -1. **Backend** β€” your server asks Nango for a short-lived **session token**. -2. **Frontend** β€” your app opens the Nango **Connect UI** with that token. -3. **User** β€” authorizes the API. Nango stores the credentials. -4. **Backend** β€” Nango sends an **auth webhook** with the **connection ID**. You persist it alongside your user/org/project. +## Testing -Once you have the connection ID, fetch credentials whenever you need them: +Source: https://nango.dev/docs/guides/functions/testing.md - - - ```ts - await nango.getConnection(integrationId, connectionId); - ``` - - - ```bash - curl "https://api.nango.dev/connections/{connectionId}?provider_config_key={integrationId}" \ - -H "Authorization: Bearer {nangoSecretKey}" - ``` - - +--- +title: 'Testing integrations' +sidebarTitle: 'Testing' +description: 'How to test your Nango integrations using dry runs, mocks, and snapshots' +--- + +Nango provides a comprehensive testing framework that combines dry runs with mock-based snapshot testing. This guide will walk you through testing your integrations effectively. + +## Testing approach + +Nango's testing framework is built on three core concepts: + +1. **Dry runs**: Test your integrations against live API connections without affecting production data +2. **Mocks**: Save API responses during dry runs to create reproducible test fixtures +3. **Snapshot testing**: Automatically compare integration outputs against saved snapshots using Vitest + +This approach ensures your integrations work correctly while providing fast, reliable tests that don't depend on external APIs. + +## Dry run testing + +Dry runs allow you to execute your sync functions and action functions against real API connections without saving data to your database. This is essential for: + +- Testing integration logic before deployment +- Debugging issues with live data +- Generating test fixtures (mocks) +- Validating data transformations + +### Basic dry run + +Execute a sync or action against an existing connection: + +```bash +nango dryrun +``` + +**Example:** +```bash +nango dryrun fetch-tickets abc-123-connection +``` + +### Dry run options + +Common options for testing: + +```bash +# Specify environment (dev or prod) +nango dryrun fetch-tickets abc-123 -e prod + +# For action functions: pass input data +nango dryrun create-ticket abc-123 --input '{"title": "Test ticket"}' + +# For sync functions: specify an initial checkpoint +nango dryrun fetch-tickets abc-123 --checkpoint '{ "lastModifiedAt": "2026-02-01T01:00:00.000Z" }' + +# Use a specific integration when sync names overlap +nango dryrun fetch-tickets abc-123 --integration-id github + +# Execute a specific variant +nango dryrun fetch-tickets abc-123 --variant premium +``` + +## Data validation + +Validation ensures your integration inputs and outputs match your defined schemas. This catches data transformation errors early. + +### Enable validation during dry runs + +Use the `--validate` flag to enforce validation: + +```bash +nango dryrun fetch-tickets abc-123 --validate +``` + +When validation is enabled: +- **Action inputs** are validated before execution +- **Action outputs** are validated after execution +- **Sync records** are validated before they would be saved +- **Validation failures** halt execution and display detailed error messages + +### Validation with Zod + +You can also validate data directly in your integration code using Zod: + +```typescript +import { z } from 'zod'; + +const TicketSchema = z.object({ + id: z.string(), + title: z.string(), + status: z.enum(['open', 'closed']), + createdAt: z.string().datetime(), +}); + +export default createSync({ + exec: async (nango) => { + const response = await nango.get({ endpoint: '/tickets' }); + + // Validate the API response + const tickets = response.data.map(ticket => { + return TicketSchema.parse(ticket); // Throws if validation fails + }); + + await nango.batchSave(tickets, 'Ticket'); + }, +}); +``` + +### Validation error output + +When validation fails, you'll see detailed error information: + +``` +Invalid sync record. Use `--validate` option to see the details (invalid_sync_record) +{ + "validation": [ + { + "path": "createdAt", + "message": "Invalid datetime string! Must be UTC.", + "code": "invalid_string" + } + ], + "model": "Ticket" +} +``` + +## Saving mocks for tests + +Mocks are saved API responses that allow you to run tests without hitting external APIs. This makes tests faster and more reliable. + +### Generate mocks with dry run + +Use the `--save` flag to save all API responses: + +```bash +nango dryrun fetch-tickets abc-123 --save +``` + +**Important**: When using `--save`, validation is automatically enabled. Mocks are only saved if validation passes, ensuring your test fixtures contain valid data. + +### Mock file structure + +Mocks are saved in a single `.test.json` file that can be used alongside your test file: + +``` +github/ +β”œβ”€β”€ tests/ +β”‚ β”œβ”€β”€ fetch-tickets.test.ts +β”‚ └── fetch-tickets.test.json +``` + +The `test.json` file contains all the necessary mock data for a given test: + +```json +{ + "input": { "title": "Test ticket" }, + "output": { "id": "TKT-123", "status": "created" }, + "nango": { + "getConnection": { "connectionId": "abc-123", "provider": "github" }, + "getMetadata": { "accountId": "test-123" }, + "batchSave": { + "Ticket": [{ "id": "TKT-123", "title": "Test ticket" }] + }, + "batchDelete": { + "Ticket": [{ "_nango_id": "del-456" }] + } + }, + "api": { + "GET": { + "/tickets": { + "response": [{ "id": "TKT-123", "title": "Test ticket" }] + } + }, + "POST": { + "/issues": { + "response": { "id": "ISS-789" } + } + } + } +} +``` + +### Using stubbed metadata + +For sync functions that rely on connection metadata, you can provide test metadata: + +```bash +nango dryrun fetch-tickets abc-123 --save --metadata '{"accountId": "test-123"}' +``` + +Or load from a file: + +```bash +nango dryrun fetch-tickets abc-123 --save --metadata @fixtures/metadata.json +``` + +## Testing with Vitest + +Nango uses [Vitest](https://vitest.dev/) as its testing framework. Vitest is fast, has a great developer experience, and provides snapshot testing out of the box. + +### Setup + +Install Vitest as a dev dependency: + +```bash +npm install -D vitest +``` + +Generate tests for your integrations: + +```bash +nango generate:tests +``` + +You can also generate tests for specific integrations, sync functions, or action functions: + +```bash +# Generate tests for a specific integration +nango generate:tests -i github + +# Generate tests for a specific sync function +nango generate:tests -s fetch-tickets + +# Generate tests for a specific action function +nango generate:tests -a create-ticket + +# Combine flags for more specific targeting +nango generate:tests -i github -s fetch-tickets +``` + +Run your tests: + +```bash +npm test +``` + +### Auto-generated tests + +When you run `nango generate:tests`, Nango creates test files for all your integrations: + +**Sync test example:** +```typescript +import { vi, expect, it, describe, beforeAll } from 'vitest'; +import createSync from '../syncs/fetch-tickets.js'; + +describe('github fetch-tickets tests', () => { + let nangoMock; + + beforeAll(async () => { + nangoMock = new global.vitest.NangoSyncMock({ + dirname: __dirname, + name: "fetch-tickets", + Model: "Ticket" + }); + }); + + const models = 'Ticket'.split(','); + const batchSaveSpy = vi.spyOn(nangoMock, 'batchSave'); + + it('should get, map correctly the data and batchSave the result', async () => { + await createSync.exec(nangoMock); + + for (const model of models) { + const expectedBatchSaveData = await nangoMock.getBatchSaveData(model); + const spiedData = batchSaveSpy.mock.calls.flatMap(call => { + if (call[1] === model) { + return call[0]; + } + return []; + }); + + const spied = JSON.parse(JSON.stringify(spiedData)); + expect(spied).toStrictEqual(expectedBatchSaveData); + } + }); + + it('should get, map correctly the data and batchDelete the result', async () => { + await createSync.exec(nangoMock); + + for (const model of models) { + const batchDeleteData = await nangoMock.getBatchDeleteData(model); + if (batchDeleteData && batchDeleteData.length > 0) { + expect(nangoMock.batchDelete).toHaveBeenCalledWith(batchDeleteData, model); + } + } + }); +}); +``` + +**Action test example:** +```typescript +import { vi, expect, it, describe, beforeAll } from 'vitest'; +import createAction from '../actions/create-ticket.js'; + +describe('github create-ticket tests', () => { + let nangoMock; + + beforeAll(async () => { + nangoMock = new global.vitest.NangoActionMock({ + dirname: __dirname, + name: "create-ticket", + Model: "Ticket" + }); + }); + + it('should output the action output that is expected', async () => { + const input = await nangoMock.getInput(); + const response = await createAction.exec(nangoMock, input); + const output = await nangoMock.getOutput(); + + expect(response).toEqual(output); + }); +}); +``` + +### How mocks work in tests + +The `NangoSyncMock` and `NangoActionMock` classes automatically load your saved mocks from the `.test.json` file: + +1. **API requests** are intercepted and return saved mock responses from the `api` section. +2. **Input data** is loaded from the `input` property for action functions. +3. **Expected outputs** are loaded from the `output` property. +4. **Tests compare** actual outputs against expected outputs. + +This means: +- Tests run **instantly** (no API calls) +- Tests are **deterministic** (same input = same output) +- Tests work **offline** + +### Migrating from the old format + +If you have tests using the old multi-file mock format, you can automatically migrate them to the new unified format. + +Set the `MIGRATE_MOCKS` environment variable to `2026-01` and run your tests: + +```bash +MIGRATE_MOCKS=2026-01 npm test +``` + +This will: +1. Run your tests using the old mock files. +2. Intercept all mock data accessed during the test run. +3. Save the data into a new `.test.json` file. +4. The old mock directory (`mocks` and `fixtures`) can then be safely deleted once a clean green test run is achieved. + +> **Note:** This migration tool works by intercepting the mock data loaded by your existing tests. It requires that your tests are using the standard Nango mock utilities (`NangoSyncMock` or `NangoActionMock`) imported from `nango/test`. + + +**Pagination Bug in Legacy Test Utilities** + +The legacy test utilities had a bug where pagination would sometimes stop after the first page. This means: + +1. **Tests appeared to pass** but were only testing the first page of results +2. **Mock files may exist** for subsequent pages, but might be incorrect (hashes or params were never checked) +3. **Some mock files may be missing entirely** if they were never recorded + +**How the migration handles this:** + +The migration tool performs a **best-effort recovery**: +- It first tries to match mock files by their exact request hash +- If that fails, it scans all available mock files and matches by comparing the actual request parameters (endpoint, query params, headers) +- This handles cases where the hash in the filename is wrong but the request data inside the file is correct + +**What to do if tests fail after migration:** + +If your tests fail after running the migration, it means one of: +- The mock file for a paginated request doesn't exist at all (it was never recorded due to the bug) +- The request parameters stored in the mock file don't match what Nango's pagination now sends + +**To fix failing tests, re-record your mocks:** + +```bash +nango dryrun --save +``` + +This will generate a complete `.test.json` file with all paginated responses using Nango's actual pagination implementation. + + +### Running tests + +```bash +# Run all tests +npm test + +# Run tests in watch mode +npm test -- --watch + +# Run tests for a specific integration +npm test github + +# Run a specific test file +npm test github-fetch-tickets.test.ts + +# Run with coverage +npm test -- --coverage +``` + +### Test configuration + +Vitest is configured via `vite.config.ts` in your project root: + +```typescript +import { defineConfig } from 'vite'; + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + setupFiles: ['./vitest.setup.ts'], + }, +}); +``` + +The `vitest.setup.ts` file makes Nango mocks available globally: + +```typescript +import { NangoActionMock, NangoSyncMock } from "nango/test"; + +globalThis.vitest = { + NangoActionMock, + NangoSyncMock, +}; +``` + +## Customizing tests with business logic + +While auto-generated tests validate basic data flow, you often need custom tests for business logic. + +### Adding custom assertions + +Extend the generated tests with additional assertions: + +```typescript +import { vi, expect, it, describe, beforeAll } from 'vitest'; +import createSync from '../syncs/fetch-tickets.js'; + +describe('github fetch-tickets tests', () => { + let nangoMock; + + beforeAll(async () => { + nangoMock = new global.vitest.NangoSyncMock({ + dirname: __dirname, + name: "fetch-tickets", + Model: "Ticket" + }); + }); + + it('should correctly transform ticket priorities', async () => { + await createSync.exec(nangoMock); + + const savedTickets = await nangoMock.getBatchSaveData('Ticket'); + + // Custom business logic validation + savedTickets.forEach(ticket => { + // Ensure priority is normalized + expect(['low', 'medium', 'high', 'critical']).toContain(ticket.priority); + + // Ensure dates are ISO 8601 + expect(ticket.createdAt).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/); + + // Ensure ticket numbers are prefixed correctly + if (ticket.source === 'github') { + expect(ticket.id).toMatch(/^GH-\d+$/); + } + }); + }); + + it('should filter out spam tickets', async () => { + await createSync.exec(nangoMock); + + const savedTickets = await nangoMock.getBatchSaveData('Ticket'); + + // Verify spam filtering logic + const spamTickets = savedTickets.filter(t => + t.title.toLowerCase().includes('spam') + ); + expect(spamTickets).toHaveLength(0); + }); +}); +``` + +### Testing error handling + +Test how your integration handles errors: + +```typescript +it('should handle API errors gracefully', async () => { + // Create a mock that will throw an error + const errorMock = new global.vitest.NangoSyncMock({ + dirname: __dirname, + name: "fetch-tickets-error", + Model: "Ticket" + }); + + // Mock the get method to throw + vi.spyOn(errorMock, 'get').mockRejectedValue( + new Error('API rate limit exceeded') + ); + + // Verify error is logged + const logSpy = vi.spyOn(errorMock, 'log'); + + await expect(async () => { + await createSync.exec(errorMock); + }).rejects.toThrow('API rate limit exceeded'); + + expect(logSpy).toHaveBeenCalledWith( + expect.stringContaining('rate limit'), + { level: 'error' } + ); +}); +``` + +### Testing pagination + +Verify pagination logic works correctly: + +```typescript +it('should fetch all pages of results', async () => { + await createSync.exec(nangoMock); + + const savedTickets = await nangoMock.getBatchSaveData('Ticket'); + + // Verify we got results from multiple pages + // (based on your pagination implementation) + expect(savedTickets.length).toBeGreaterThan(100); // Assuming page size is 100 +}); +``` + +### Testing sync functions with checkpoints + +Test that checkpoint logic works: + +```typescript +it('should only fetch tickets after checkpoint date', async () => { + const getSpy = vi.spyOn(nangoMock, 'get'); + const saveCheckpointSpy = vi.spyOn(nangoMock, 'saveCheckpoint'); + + // Mock getCheckpoint to return a previous checkpoint + vi.spyOn(nangoMock, 'getCheckpoint').mockResolvedValue({ + lastModifiedISO: '2024-01-01T00:00:00Z' + }); + + await createSync.exec(nangoMock); + + // Verify the API request used the checkpoint value + expect(getSpy).toHaveBeenCalledWith( + expect.objectContaining({ + params: expect.objectContaining({ + since: '2024-01-01T00:00:00Z' + }) + }) + ); + + // Verify checkpoint was saved + expect(saveCheckpointSpy).toHaveBeenCalled(); +}); +``` + +### Parameterized tests + +Test multiple scenarios with different inputs: + +```typescript +import { it, describe, expect, beforeAll } from 'vitest'; + +describe.each([ + { priority: 'P0', expected: 'critical' }, + { priority: 'P1', expected: 'high' }, + { priority: 'P2', expected: 'medium' }, + { priority: 'P3', expected: 'low' }, +])('priority mapping for $priority', ({ priority, expected }) => { + let nangoMock; + + beforeAll(async () => { + nangoMock = new global.vitest.NangoSyncMock({ + dirname: __dirname, + name: `fetch-tickets-${priority}`, + Model: "Ticket" + }); + }); + + it(`should map ${priority} to ${expected}`, async () => { + await createSync.exec(nangoMock); + + const savedTickets = await nangoMock.getBatchSaveData('Ticket'); + const ticket = savedTickets.find(t => t.rawPriority === priority); + + expect(ticket?.priority).toBe(expected); + }); +}); +``` + +## Related resources + +- [Data Validation](/guides/functions/data-validation) - Learn more about schema validation +- [Vitest Documentation](https://vitest.dev/) - Official Vitest docs +- [Action functions](/guides/functions/action-functions) - Building and testing on-demand functions +- [Sync functions](/guides/functions/syncs/sync-functions) - Building and testing sync functions -## Capabilities +## Ci Cd -- **Auth schemes** β€” OAuth 2.0, OAuth 1.0a, API keys, basic auth, custom. 800+ APIs supported; new ones [added on demand](/integrations/contribute-or-request-api) within days, by request or self-contributed. -- **Pre-built UI** β€” Embedded Connect UI with API-specific guidance, input validation, and your branding. Or [customize Connect UI or build a custom UI](/guides/auth/customize-connect-ui). -- **Credential management** β€” Encrypted storage, automatic refresh, retrieval at scale. Combine with [Proxy](/guides/platform/proxy-requests) or [Functions](/guides/functions/functions-guide) to avoid handling credentials directly. -- **Observability** β€” Failure detection, reconnect flow, and per-connection logs. +Source: https://nango.dev/docs/guides/functions/ci-cd.md -## Guide +--- +title: 'CI/CD for Nango Functions' +sidebarTitle: 'CI/CD' +description: 'How to integrate Nango Function deployments into your CI/CD pipeline.' +--- + +CI/CD for Nango is about keeping your [Functions](/guides/functions/functions-guide) β€” sync functions, action functions, webhook functions, and event functions β€” in sync with your application across environments. + +The core principle: **deploy to Nango as part of the same pipeline step as your application**. Deploying them separately risks your app and your Functions going out of sync, which can cause subtle bugs that are hard to trace. + +## Authentication + +To deploy from CI, you need a scoped API key for each Nango environment. + +1. **Create API keys**: In the Nango UI, go to **Environment Settings > API Keys** and create a key for each environment (e.g., `dev` and `prod`). For CI/CD pipelines, use a key scoped to `environment:deploy` only β€” see the [CI/CD Deploy profile](/reference/backend/http-api/api-keys#cicd-deploy). +2. **Store the keys**: Add them as secrets in your CI/CD provider. The Nango CLI reads them from these environment variables: + - `NANGO_SECRET_KEY_DEV` + - `NANGO_SECRET_KEY_PROD` + +## Recommended pipeline + +Treat Nango Functions like application code: validate on every PR, deploy to each environment in the same step as your application. + +| Pipeline stage | What to do | +|---|---| +| **Pull request** | Run `nango compile` and `npm test` as required checks. Block merge on failure. | +| **Merge to main** | Deploy to your dev/staging Nango environment alongside your app. | +| **Release to production** | Deploy to your prod Nango environment in the same step as your app release. | + +The Nango CLI `deploy` command targets a specific environment: + +```bash +nango deploy +``` + +If you don't specify an environment, it defaults to `dev`. + +**If you don't have a staging environment**, wire the prod Nango deploy directly to your production release step β€” use a `workflow_dispatch` trigger or equivalent manual approval. This keeps production deploys intentional, and ensures they always happen through CI using the prod API key rather than from a local machine. + + +Add the `dist/` folder inside your `nango-integrations` directory to `.gitignore`. The CLI writes compiled JS artifacts there, and committing them creates noisy diffs and risks deploying stale bundles. + + +## Example: GitHub Actions + +Two workflow files implement the pipeline above. + + + +```yaml +name: Validate Nango Functions + +on: + pull_request: + branches: + - main + +jobs: + validate: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: npm ci + + - name: Compile + run: npx nango@latest compile --no-dependency-update + + - name: Test + run: npm test +``` + + + +```yaml +name: Deploy Nango Functions + +on: + # Manual trigger to deploy to a specific environment + workflow_dispatch: + inputs: + stage: + type: choice + description: 'Environment to deploy to' + required: true + default: 'dev' + options: + - dev + - prod + allowDestructive: + type: boolean + description: 'Allow destructive changes' + required: true + default: false + + # Automatic deploy to dev on merge to main + push: + branches: + - main + +jobs: + deploy: + runs-on: ubuntu-latest + env: + NANGO_SECRET_KEY_DEV: ${{ secrets.NANGO_SECRET_KEY_DEV }} + NANGO_SECRET_KEY_PROD: ${{ secrets.NANGO_SECRET_KEY_PROD }} + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: npm ci + + - name: Deploy to Nango + run: | + if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then + stage="${{ inputs.stage }}" + else + stage="dev" + fi + + secret_key_var="NANGO_SECRET_KEY_$(echo "$stage" | tr '[:lower:]' '[:upper:]')" + secret_key="${!secret_key_var}" + + if [ -z "$secret_key" ]; then + echo "Error: ${secret_key_var} is not set" + exit 1 + fi + + destructive_flag="" + if [ "${{ github.event_name }}" == "workflow_dispatch" ] && [ "${{ inputs.allowDestructive }}" == "true" ]; then + destructive_flag="--allow-destructive" + fi + + npx nango@latest deploy "$stage" --secret-key "$secret_key" --no-dependency-update $destructive_flag +``` + + + + + **Destructive Changes** + + A destructive change removes an integration, sync function, or action function. To prevent accidental deletions, `nango deploy` will prompt for confirmation when it detects one. + + In CI, use `--auto-confirm` or `--allow-destructive` to bypass the prompt. We recommend only doing this on a manual trigger, as shown above. + + +## Testing in CI + +Run your test suite in CI before every deployment. Nango's testing framework uses dry runs and snapshot testing to validate your Functions without affecting live data: + +```bash +npm test +``` + +See the [Testing integrations guide](/guides/functions/testing) for details. + +## Ephemeral preview environments (e.g. Vercel) + +If you use ephemeral preview environments β€” such as Vercel preview deployments β€” as your staging layer, you'll run into a challenge: each preview has a unique URL, but Nango webhook URLs must be registered in advance and point to a stable destination. + + +Nango doesn't currently support creating environments programmatically. This is on the roadmap and will make ephemeral environment setups much cleaner when available. + + +For now, the simplest approach is to designate a fixed, long-lived Nango environment (e.g., `dev`) specifically for Nango-related changes, and use that consistently across preview deployments rather than trying to create a new Nango environment per preview. + +If you need previews to receive live webhook events, a proxy server is the current workaround: register a stable URL in Nango, and have the proxy forward incoming webhooks to the correct preview URL. + +## Dependency-safe CI and monorepos + +When running Nango in CI or monorepos, you often want to avoid modifying `package.json` or running extra installs from within Nango commands. Use `--no-dependency-update` on CLI commands, or set `NANGO_CLI_DEPENDENCY_UPDATE=false` as an environment variable: + +```bash +npx nango@latest deploy dev --no-dependency-update +``` + + +With `--no-dependency-update`, Nango will not install dependencies. Make sure your pipeline does so first (e.g. `npm ci`, `pnpm install --frozen-lockfile`, `yarn install --immutable`, or `bun install --frozen-lockfile`). + + + +In CI environments, Nango automatically disables dependency updates to prevent modifying `package.json`. Passing `--no-dependency-update` explicitly silences the related warning. + + +## Related resources + +- [Testing integrations](/guides/functions/testing) - A comprehensive guide to testing your Nango Functions. +- [API Keys reference](/reference/backend/http-api/api-keys) - Available scopes and advised profiles for CI/CD and other use cases. - - **Using a coding agent?** Set up the [docs MCP](/getting-started/coding-agent-setup#docs-mcp-server) and [skills](/getting-started/coding-agent-setup#skills), then copy this page as prompt. - +## Unified Apis - - - Sign up for free (no credit card): [![Try Nango Cloud](/images/nango-deploy-button.svg)](https://app.nango.dev/signup) +Source: https://nango.dev/docs/guides/functions/unified-apis.md - - Signup cannot be automated. Ask the user to sign up at [app.nango.dev/signup](https://app.nango.dev/signup) and provide their Nango API key from the Environment settings tab > API Keys. Use it as `Authorization: Bearer ` in API requests. +--- +title: 'Unified APIs with functions' +sidebarTitle: 'Unified APIs' +description: 'Build provider-specific functions behind one stable model and operation surface.' +--- + +API unification is the process of standardizing multiple provider APIs behind one interface that your product can use consistently. + +In Nango, unification is optional and code-first. You define the models and operations that fit your product, then implement provider-specific functions that translate to and from each external API. + +## When to unify + +Unification is useful when your customers use different systems for the same business object: + +- CRMs with contacts, companies, deals, and custom fields. +- ATS platforms with candidates, jobs, stages, and applications. +- Accounting systems with invoices, customers, transactions, and accounts. +- Support tools with tickets, comments, users, and organizations. + +It is less useful when the provider exposes concepts that are deeply unique. For example, Notion's block model can be partially normalized for simple document export, but advanced block behavior usually needs provider-specific logic. + +Unification does not need to be perfect to be valuable. A stable common model with explicit provider extensions is often better than trying to force every API into a lowest-common-denominator shape. + +## Design principles + +Design the unified model around your product, not around the external APIs. + +If your app already has a `Contact`, `Invoice`, or `Candidate` model, use that as the starting point. Keep the fields your workflows actually need, and resist carrying every provider field into the common model. + +Expect optional fields. Providers rarely expose the same data with the same semantics, and some customers may rely on custom fields or custom statuses. Model those gaps intentionally with nullable fields, fallbacks, metadata, or provider-specific extensions. + +Use the same model for reads and writes when possible. If a sync writes `UnifiedContact` records into your app, the corresponding create or update action should accept the same shape unless the write operation truly needs a different contract. + +Validate close to the external API. Use [data validation](/guides/functions/data-validation) in your functions so mapping drift, malformed provider responses, and invalid write inputs fail at the integration boundary. + +## Define the model + +Put shared schemas in a common file and import them from each provider implementation: + +```ts models.ts +import * as z from 'zod'; + +export const UnifiedUser = z.object({ + id: z.string().optional(), + name: z.string().optional(), + email: z.string().email().optional(), + externalUrl: z.string().url().optional(), + raw: z.unknown().optional() +}); + +export const CreateUnifiedUser = z.object({ + name: z.string(), + email: z.string().email() +}); + +export type UnifiedUser = z.infer; +``` + +Keep provider-specific fields explicit: + +```ts models.ts +export const JiraUser = UnifiedUser.extend({ + accountType: z.string().optional() +}); +``` + +## Implement unified actions + +Each provider gets an action with the same input and output contract: + + + + ```ts jira/actions/create-user.ts + import { createAction } from 'nango'; + import { CreateUnifiedUser, UnifiedUser } from '../../models'; + + export default createAction({ + description: 'Creates a user in Jira', + input: CreateUnifiedUser, + output: UnifiedUser, + exec: async (nango, input) => { + const response = await nango.post({ + endpoint: '/rest/api/3/user', + data: { + emailAddress: input.email, + displayName: input.name + } + }); + + return { + id: response.data.accountId, + name: response.data.displayName ?? input.name, + email: input.email, + raw: response.data + }; + } + }); + ``` + + + ```ts zendesk/actions/create-user.ts + import { createAction } from 'nango'; + import { CreateUnifiedUser, UnifiedUser } from '../../models'; + + export default createAction({ + description: 'Creates a user in Zendesk', + input: CreateUnifiedUser, + output: UnifiedUser, + exec: async (nango, input) => { + const response = await nango.post({ + endpoint: '/api/v2/users.json', + data: { + user: { + name: input.name, + email: input.email + } + } + }); + + return { + id: String(response.data.user.id), + name: response.data.user.name, + email: response.data.user.email, + externalUrl: response.data.user.url, + raw: response.data.user + }; + } + }); + ``` + + + +Your app can choose the integration ID at runtime and call the same action name for each provider: + +```ts +await nango.triggerAction(integrationId, connectionId, 'create-user', { + name: 'Ada Lovelace', + email: 'ada@example.com' +}); +``` + +## Implement unified syncs + +Sync functions are where read-side unification usually lives. Fetch provider records, map each page into your unified model, then save those records to Nango's records cache: + +```ts hubspot/syncs/users.ts +import { createSync } from 'nango'; +import { UnifiedUser } from '../../models'; + +export default createSync({ + description: 'Syncs users into the unified user model', + frequency: 'every hour', + models: { UnifiedUser }, + exec: async (nango) => { + for await (const page of nango.paginate({ + endpoint: '/crm/v3/objects/contacts', + params: { properties: 'email,firstname,lastname' }, + paginate: { + type: 'cursor', + cursor_path_in_response: 'paging.next.after', + cursor_name_in_request: 'after', + response_path: 'results', + limit_name_in_request: 'limit', + limit: 100 + } + })) { + const users = page.map((contact) => ({ + id: contact.id, + name: [contact.properties.firstname, contact.properties.lastname].filter(Boolean).join(' '), + email: contact.properties.email, + raw: contact + })); + + await nango.batchSave(users, 'UnifiedUser'); + } + } +}); +``` + +## Handle provider-specific behavior + +Use one of these patterns when the common model is not enough: + +- Extend the common model with provider-specific fields for integrations that need them. +- Store raw provider data under a `raw` field for debugging or advanced workflows. +- Use connection metadata for customer-specific mappings, such as custom fields, custom statuses, or selected pipelines. +- Create provider-specific actions for operations that do not map cleanly to the unified interface. + +## Related guides + +- [Action functions](/guides/functions/action-functions) +- [Sync functions](/guides/functions/syncs/sync-functions) +- [Data validation](/guides/functions/data-validation) +- [Storage](/guides/functions/storage) - The default API key created on signup has full access and is the simplest option. +## Observability - If the user creates a scoped API key instead, this guide needs `environment:integrations:create` (step 2) and `environment:connect_sessions:write` (steps 5 and 8). See [API keys](/reference/backend/http-api/api-keys). - - +Source: https://nango.dev/docs/guides/platform/observability.md - - In the dashboard, open the [Integrations](https://app.nango.dev/dev/integrations) tab, click **Configure New Integration**, and pick the API. +--- +title: 'Observability' +sidebarTitle: 'Observability' +description: 'How Nango helps you with observability for your integrations' +--- + +Nango's logs are comprehensive and give you a detailed picture of what happens in your integrations. + +## Our approach + +Since integrations rely on third-party APIs, production issues are bound to happen. + +When you encounter a problem, great observability is the difference between a week-long needle-in-a-haystack hunt and a timely resolution. + +We built Nango's logs based on three principles: + +- **Comprehensive**: Everything that happens in Nango for your integrations produces an "operation" in the logs +- **Detailed**: Every operation and every log message contains detailed information about the integration, [connection](/guides/auth/auth-guide#overview), and [function](/guides/functions/functions-guide). Error messages are as detailed as the external APIs allow. +- **Customizable**: You can easily log your own messages from functions you write ([learn more](/reference/functions/functions-sdk#logging)). To consume logs, you can either use our built-in interface or export them with our [OpenTelemetry exporter](#opentelemetry-export) + +## Overview of Nango logs + + + ![](/images/screenshots/nango-logs-overview.png) + + +Logs are structured into: +- Operations: High-level actions happening in your Nango account (e.g., sync executed, connection created, webhook processed) +- Log messages: Nested in operations, these provide details on what happened (e.g., HTTP request executed, data validation warning, custom log message) + +Nango provides detailed filtering and searching of log messages by integration, connection, operation type, status, etc. + +We recommend exploring the logs in your own Nango account under **Logs**. + +## OpenTelemetry export + +Nango supports exporting OpenTelemetry traces so you can monitor and analyze integration activity in your own observability stack. + +Use this for: +- Advanced custom metrics +- Advanced alerting and escalation paths (e.g., segment sync errors by customer account for customized escalation paths) + +### Supported operations + +The following operations are exported as traces: +- Sync executions +- Action executions +- Third-party API webhook executions +- Proxied requests + + + If you need support for other operations please reach out. We can enable support for them. + + +### Configuration + + + + Log into the Nango dashboard and navigate to the Environment settings page. + + + In the Environment Settings, provide the following information: + - OpenTelemetry endpoint: The endpoint URL of your OpenTelemetry collector. Ex: https://my.otlp.collector:4318 + - Headers (Optional): Any authorization headers or additional headers required to access your collector. + + + +## Related guides + +- [Function logging](/guides/functions/logging) - add custom logs from function code. +- [Webhooks from Nango](/guides/platform/webhooks-from-nango#webhook-retries-debugging) - debug webhook delivery. +- [Common issues](/guides/platform/common-issues) - troubleshoot failed auth, sync, and proxy operations. - Each API has a dedicated [Nango documentation page](/integrations/overview) with setup notes and gotchas. +## Environments - - OAuth APIs require an OAuth developer app registered with the provider. Register one on the provider's developer portal, use the `Callback URL` shown in your Nango integration settings, then paste the `Client ID` and `Client Secret` back into Nango. Register any required scopes too. +Source: https://nango.dev/docs/guides/platform/environments.md +Description: Organize your integrations & data with environments - If this integration will be used in production, complete the optional custom callback URL step below before real users connect. Retrofitting a callback URL later requires updating the provider app and can break new authorization or reconnect flows until the provider and Nango settings match. +Environments help you segment your integration configuration and customer data across different stages of your development lifecycle. - For OAuth 2.0 providers, Nango shows **suggested scopes** β€” auto-discovered and refreshed at least monthly. They're suggestions; you can use any scope the provider supports. +## Overview - - For popular APIs, Nango ships a built-in shared developer app so you can test connections with zero setup. We strongly recommend registering your own OAuth app before going live β€” see [OAuth developer apps](#oauth-developer-apps) below. - - +Each environment in your Nango account is completely isolated with its own: - - Create the integration with the API. If you need the provider slug first, list providers and use the matching provider's `name` field: +- Integration configurations +- [Functions](/guides/functions/functions-guide) +- [Connections](/guides/auth/auth-guide) +- Environment-specific settings - ```bash - curl --request GET \ - --url https://api.nango.dev/providers \ - --header 'Authorization: Bearer ' - ``` + +Each Nango account comes with **dev** and **prod** environments by default. Additional environments are available depending on your [pricing plan](https://www.nango.dev/pricing). + - For OAuth providers, walk the user through registering an OAuth developer app on the provider's portal: link them to the provider's OAuth-app creation page, tell them which `Callback URL` to paste (visible in the Nango integration settings after creation), and ask them to send back the `client_id` and `client_secret` so you can pass them in the request body. - - - - ```bash - curl --request POST \ - --url https://api.nango.dev/integrations \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "unique_key": "", - "provider": "", - "credentials": { - "type": "OAUTH2", - "client_id": "", - "client_secret": "", - "scopes": "," - } - }' - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/integrations \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "unique_key": "", - "provider": "" - }' - ``` - - - - For all fields and response shapes, see the [List all providers API](/reference/backend/http-api/providers/list), [Create an integration API](/reference/backend/http-api/integration/create), and [Update an integration API](/reference/backend/http-api/integration/update). - - +## Production environments - - In the [Connections](https://app.nango.dev/dev/connections) tab, click **Add Test Connection**, pick your integration, and authorize using a test account. The new connection's credentials appear in its *Authorization* tab β€” securely stored and automatically refreshed. +Any environment can be designated as a production environment. This affects how team members interact with it based on their [role](/guides/platform/security#team-and-roles). - - Skip the dashboard. Create a connect session and share the returned `connect_link` with the user β€” they authorize using their test account in the browser, no UI needed on your side: +**To mark an environment as production:** - ```bash - curl --request POST \ - --url https://api.nango.dev/connect/sessions \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "tags": { - "end_user_id": "" - }, - "allowed_integrations": [""] - }' - ``` +1. Open the environment settings (gear icon in the top navigation) +2. Toggle the **Production environment** switch - The response contains a `connect_link` (valid 30 minutes). Send it to the user; once they complete authorization, confirm with `GET /connections`. See [Share a connect link](/guides/auth/share-connect-link). - - + +Only **Full Access** team members can toggle the production flag. Once an environment is marked as production, **Support** members get read-only access to it, and **Contributor** members lose access entirely. + - - For production OAuth apps, a callback URL on your own domain is recommended. Some providers show the callback domain to users. +By default, the `prod` environment created with your account is already marked as production. - +## Engineering collaboration - To configure a custom callback URL: - 1. Add an endpoint on your domain (e.g. `https://example.com/oauth-callback`) that **308-redirects** to `https://api.nango.dev/oauth/callback`, preserving all query parameters. - 2. Update the registered callback URL with each API provider β€” otherwise they'll reject new authorization flows. - 3. After confirming steps 1 and 2, update the callback URL in Nango's **Environment Settings**. Settings are per-environment, so repeat for every environment. +Use a **shared non-production environment** (usually `dev`) for day-to-day engineering work. The team shares integrations and the baseline function set. For local webhook testing, each engineer creates their own connections with a webhook URL override (see below). - - Ask the user what production callback URL they want to use, then have them add a 308 redirect from that URL to `https://api.nango.dev/oauth/callback` before they register provider OAuth apps. The Nango environment setting is dashboard-only β€” ask the user to paste the final callback URL into **Environment Settings > Backend**. - - +### Local webhooks on a shared environment - - Set up a backend endpoint that your frontend will call before each authorization attempt to retrieve a session token from Nango ([API](/reference/backend/http-api/connect/sessions/create) / [Node SDK](/reference/backend/backend-sdk/node#create-a-connect-session)). +Keep the environment webhook URL pointed at your shared app (or staging backend). To receive webhooks from Nango locally, create connections with a [per-connection `webhook_url` override](/guides/platform/webhooks-from-nango#override-webhook-urls-per-connection) pointing at your local webhook endpoint (for example via [ngrok](https://ngrok.com/)). - You'll need an [API key](/reference/backend/http-api/api-keys) with the `environment:connect_sessions:write` scope (find it in **Environment Settings > API Keys**). +One convenient pattern is to read the override from an optional env var, so the same connect-session code works locally and when the var is unset. For example, set `NANGO_CONNECTION_WEBHOOK_URL` in your local `.env` to that URL and leave it unset elsewhere: - - - ```ts - import { Nango } from '@nangohq/node'; +```ts +const webhookUrl = process.env.NANGO_CONNECTION_WEBHOOK_URL; // e.g. https://.ngrok.app/webhooks-from-nango - const nango = new Nango({ secretKey: process.env.NANGO_API_KEY! }); +const session = await nango.createConnectSession({ + tags: { + end_user_id: '' + }, + allowed_integrations: [''], + ...(webhookUrl && { + integrations_config_defaults: { + '': { + connection_config: { webhook_url: webhookUrl } + } + } + }) +}); +``` - api.post('/sessionToken', async (req, res) => { - const { data } = await nango.createConnectSession({ - tags: { - end_user_id: '', - end_user_email: '', - organization_id: '' - }, - allowed_integrations: [''] - }); - - res.status(200).send({ sessionToken: data.token }); - }); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/connect/sessions \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "" - }, - "allowed_integrations": [""] - }' - ``` - - +When the var is set, new connections from that session route webhooks to your machine without changing the environment webhook URLs. - - Tags reconcile Nango's auth-success webhook with the right user, org, or entity in your system. Most apps start with: `end_user_id`, `end_user_email`, `organization_id`. +### Local function deploys on a shared environment - Tags are also useful for filtering connections via the API and are displayed in the Nango UI. Set the reserved UI tag keys `end_user_display_name` and `end_user_email` to populate the connections list and connection detail page. +A full `nango deploy` reconciles every function in the environment. On a shared collaborative environment, that can overwrite teammates' deploys. Deploy only what you changed: - See [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) for more. - +```bash +nango deploy --sync +nango deploy --action +nango deploy --integration # all functions for one integration, including event functions +``` - `allowed_integrations` controls what the user sees: - - **Multiple integrations** β€” Connect UI shows a picker. - - **Single integration** β€” Connect UI sends the user straight to its auth flow. - +Reserve full deploys for environments where the repo is the sole source of truth (for example staging or prod). See the [CI/CD guide](/guides/functions/ci-cd). - - Load the Nango frontend SDK, fetch the session token from your backend, and open Connect UI: +### One environment per engineer - - ![](/images/screenshots/connect-ui.gif) - +You can give each engineer their own environment for full isolation. You then need to recreate integrations, connections, and settings in each environment yourself; that also means more API keys to manage and config that tends to drift over time. A shared `dev` environment avoids that overhead for most teams. - ```js - import Nango from '@nangohq/frontend'; - - const nango = new Nango(); - const connect = nango.openConnectUI({ - onEvent: (event) => { - if (event.type === 'close') { - // Modal closed. - } else if (event.type === 'connect') { - // Auth flow successful. - } - }, - }); +## Best practices - const res = await fetch('/sessionToken', { method: 'POST' }); - connect.setSessionToken(res.sessionToken); // A loading indicator shows until this is set. - ``` +**Mirror your application environments** - See the [Frontend SDK reference](/reference/frontend/frontend-sdk#connect-using-nango-connect-ui) for more options. +We recommend creating Nango environments that match your application's deployment stages. For example: +- Development / local β†’ dev environment +- Staging β†’ staging environment +- Production β†’ prod environment +- Demo β†’ demo environment - The pre-built Connect UI is recommended but optional β€” if you need full UX control, follow [Customize Connect UI](/guides/auth/customize-connect-ui). For email/cross-device flows, see [Share a connect link](/guides/auth/share-connect-link). - +**Deploy to specific environments** - - When authorization succeeds, Nango generates a unique **connection ID**. You use this ID to manage the connection and retrieve its credentials. **You must store it on your side**, attached to the user/org/project that owns the connection β€” Nango doesn't model that ownership. +When you deploy [Functions](/guides/functions/functions-guide), you always target a specific environment. This ensures changes are tested before reaching production. - Set up the webhook in **Environment Settings**: - 1. Specify a **Webhook URL** in the Nango UI. - 2. Enable **Send New Connection Creation Webhooks**. - 3. Handle `POST` requests on that route in your backend. +## Related guides - - Webhook URL configuration is dashboard-only β€” there is no public API for environment settings. Ask the user to paste the webhook URL into **Environment Settings** and enable **Send New Connection Creation Webhooks**. - +- [API keys](/reference/backend/http-api/api-keys) - scope keys per environment. +- [CI/CD](/guides/functions/ci-cd) - deploy functions safely across environments. +- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - environment and per-connection webhook URLs. +- [Self-host Nango](/guides/platform/self-hosting) - plan environments for self-hosted deployments. - Webhook payload: +## Limits - ```json - { - "type": "auth", - "operation": "creation", - "success": true, - "connectionId": "", - "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "" - } - } - ``` +Source: https://nango.dev/docs/guides/platform/limits.md - Persist `connectionId` against whichever entity owns the connection in your app. - +--- +title: 'Limits' +sidebarTitle: 'Limits' +description: 'Overview of resource limits on Nango Cloud.' +--- + +Nango Cloud has several resource limits to ensure platform stability and fair usage across all customers. + + +For plan-specific limits, refer to the [pricing page](https://www.nango.dev/pricing) and the Usage & Billing page in your account. + + +## API rate limits + +Rate limits apply to API requests from your application to Nango: + +| Plan | Requests per Minute | +| - | - | +| Free tier | 200 | +| Starter | 1,000 | +| Growth | 2,000 | +| Enterprise | Custom | + + +If you exceed the rate limit, use the standard rate-limit headers to determine when to resume requests. + + +## Function execution limits + +Different function types have varying execution and enqueuing time limits: + +| Function Type | Max Execution Time | +| - | - | +| [Sync functions](/guides/functions/syncs/sync-functions) | 24 hours | +| [Action functions](/guides/functions/action-functions) | 15 minutes | +| [Webhook functions](/guides/functions/webhook-functions) | 1 hour | + +### Minimum sync frequency + +For polling syncs, the minimum frequency is **30 seconds**, available on all plans. You can set the frequency in the sync definition or override it per connection using the [SDK](/reference/backend/backend-sdk/node#override-sync-connection-frequency) or [API](/reference/backend/http-api/sync/update-connection-frequency). + +For real-time updates, use [real-time syncs](/guides/functions/syncs/realtime-syncs) which trigger from external API webhooks instead of polling. + +### Sync variant limits + +Each sync can have a maximum of **100 variants** per connection. For heavier workloads, reach out to increase this limit. See the [sync partitioning guide](/guides/functions/syncs/sync-partitioning) for more details. + +### Action function output limits + +Action functions have a maximum output payload size of **2MB**. For large payloads, use the [Proxy](/guides/platform/proxy-requests) instead. + +## Data retention policies + +Nango automatically manages data retention for records in the sync cache: + +### Payload pruning (30 days) + +If a record hasn't been updated for **30 days**, Nango automatically prunes its payload while preserving: +- Record ID +- Sync state +- Payload hash (for change detection) + +The record still exists and Nango can detect future changes, but the data fields are no longer retrievable from the cache. + +### Hard deletion (60 days) + +If a sync hasn't executed for **60 days**, all associated records (payload + metadata) are permanently deleted. + + +These policies ensure sensitive data isn't stored indefinitely. If you need to access record payloads long after updates (30+ days), please reach out in the [Slack community](https://nango.dev/slack). + + +## Webhook limits + +Webhooks sent from Nango to your application have the following limits: + +- **Timeout**: 20 seconds +- **Retries**: 2 attempts + +These limits apply to all webhook types: auth, sync function completion, async action function completion, and webhook forwards. + +## Related guides + +- [Rate limits](/guides/functions/rate-limits) - handle provider throttling in functions. +- [Sync efficiency](/guides/functions/syncs/sync-efficiency) - stay within payload and runtime limits. +- [Security](/guides/platform/security) - review retention and access constraints. + + +**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + - - Credentials can become invalid when users revoke access, providers rotate refresh tokens, scopes change, or an app moves from testing to production. Re-authorization updates an existing connection's credentials while preserving its data and config. Deleting and re-creating the connection wipes that data β€” prefer re-authorization. +## Security - Before showing integration settings, check the connection with `GET /connections/{connectionId}`: - - - - ```ts - import { Nango } from '@nangohq/node'; - - const nango = new Nango({ secretKey: process.env.NANGO_API_KEY! }); - - try { - await nango.getConnection('', ''); - // Connection is valid. - } catch (error) { - if (error.response?.data?.error?.code === 'invalid_credentials') { - // Connection is invalid β€” show a Reconnect button. - displayReconnectUI(); - } - } - ``` - - - ```bash - curl --request GET \ - --url 'https://api.nango.dev/connections/?provider_config_key=' \ - --header 'Authorization: Bearer ' - ``` - - - - An `invalid_credentials` error means the connection failed credential refresh or validation β€” show an error state with a **Reconnect** button. - - To trigger re-authorization, use the same frontend flow as a new connection, but generate a reconnect session token on the backend. Pass the returned token to the Frontend SDK exactly like a normal session token. On success you'll receive an `auth` webhook with `operation = override`. - - - - ```ts - import { Nango } from '@nangohq/node'; +Source: https://nango.dev/docs/guides/platform/security.md - const nango = new Nango({ secretKey: process.env.NANGO_API_KEY! }); +--- +title: 'Security' +sidebarTitle: 'Security' +description: 'How Nango secures your API credentials and customer data.' +--- + +Nango is designed with security as a core principle. This page provides technical details about how Nango stores, encrypts, and manages API credentials. + +## Compliance + +Nango is **SOC 2 Type II** certified, **GDPR** compliant, and **HIPAA** compliant. + +| Certification | Details | +| - | - | +| SOC 2 Type II | Annual audit covering security, availability, and confidentiality. [View report β†’](https://trust.nango.dev) | +| GDPR | Data Processing Agreement (DPA) automatically applies to all cloud accounts. [View DPA β†’](https://nango.dev/terms#dpa) | +| HIPAA | Business Associate Agreement (BAA) available on request. [Contact us β†’](https://nango.dev/demo) | + +Our security practices include: + +- Regular security assessments and penetration testing +- Secure development lifecycle +- Incident response procedures +- Continuous monitoring and alerting + +Visit our [Trust Center](https://trust.nango.dev) for the latest compliance documentation, security policies, and audit reports. + +## Credential storage + +### What credentials are stored + +Nango stores the following credential types depending on your API integrations: + +- **OAuth tokens**: Access tokens, refresh tokens, and associated metadata +- **API keys**: For APIs using key-based authentication +- **Client credentials**: OAuth client IDs and secrets for your integrations +- **Connection configuration**: OAuth scopes, authorization parameters, and provider-specific settings + +### Storage infrastructure + +Nango Cloud stores all data in **AWS Aurora PostgreSQL** databases hosted in AWS. The database infrastructure includes: + +- Encryption at rest using AWS-managed keys +- Automated backups with point-in-time recovery +- Multi-AZ deployment for high availability +- Network isolation within a private VPC + +For self-hosted deployments, you control the database infrastructure and can apply your own security policies. + +## Encryption + +### Encryption at rest + +All sensitive credentials are encrypted before being stored in the database using **AES-256-GCM** (Advanced Encryption Standard with Galois/Counter Mode). + +| Property | Value | +| - | - | +| Algorithm | AES-256-GCM | +| Key size | 256 bits (32 bytes) | +| IV size | 12 bytes (generated per encryption) | +| Auth tag size | 16 bytes | + +### What is encrypted + +The following data types are encrypted at rest: + +- Connection credentials (OAuth tokens, API keys, etc.) +- OAuth client secrets (your integration credentials) +- Environment secret keys +- Environment variables + +### Key management + +- **Nango Cloud**: Encryption keys are securely managed by Nango. All credentials are encrypted at rest. +- **Self-hosted**: You must provide your own encryption key to enable encryption at rest. + +### Encryption in transit + +All data transmitted to and from Nango is encrypted using TLS 1.2+. This includes: + +- API requests between your application and Nango +- Requests from Nango to external APIs (using each provider's TLS configuration) +- Dashboard access + +## Data retention + +### Active connections + +Credentials are stored for as long as the connection exists. You have full control over connection lifecycle: + +- Create connections when users authorize integrations +- Delete connections at any time via the API or dashboard +- Connections can be programmatically managed through your application + +#### Retention after deletion + +When a connection is deleted: + +1. **Immediate soft delete**: Connection is marked as deleted and becomes inaccessible +2. **Associated data cleanup**: Sync functions are stopped, and scheduled tasks are cancelled +3. **Hard delete after retention period**: Credentials and associated data are permanently removed from the database + +The default retention period is **31 days**. For self-hosted deployments, this is configurable. + +This retention period allows for: +- Recovery from accidental deletions +- Compliance with audit requirements +- Graceful handling of in-flight operations + +#### What is deleted + +When a connection is permanently deleted, the following data is removed: + +- All stored credentials (tokens, keys, secrets) +- Connection metadata and configuration +- Sync records associated with the connection +- Related job history and logs + +### Synced records retention + + +This section only applies if you are using Functions of type Sync, e.g. for replicating data or receiving trigger notifications from an external API. + + +Nango automatically manages data retention for records stored in the Nango records cache to ensure that sensitive user data is not stored indefinitely when it's no longer needed. + +#### Automated payload pruning (30 days) + +If a record has not been updated for **30 days**, Nango will automatically empty its payload. + +**Impact:** +After pruning, the record's data fields are no longer retrievable from the Nango cache via the API or SDK. However, Nango retains the metadata needed for change detection (record ID and payload hash). Your sync functions will continue to work normally. This pruning does not impact sync execution or delta-detection capabilities. + +#### Automated hard deletion (60 days) + +If a sync has not executed for **60 days**, all records belonging to that sync will be permanently deleted. + +**Impact:** +Complete removal of all records from the inactive sync, including metadata and payload hashes used for delta-detection. The sync itself remains configured but starts fresh on the next execution. Nango will no longer be able to detect changes against previously synced records. + +#### When do retention policies apply? + +- **30-day pruning countdown**: Starts from the last time a specific record was updated. +- **60-day deletion countdown**: Starts from the last time a sync successfully executed. + +#### Best practices + +To work optimally with Nango's retention policies: + +**1. Fetch records promptly** + +Set up [webhooks from Nango](/guides/platform/webhooks-from-nango) to be notified when new data is available. Fetch the updated records immediately after receiving a sync webhook. + +**2. Use cursor-based synchronization** + +Track your sync progress using cursors to ensure you never miss records, even if webhooks are occasionally missed. Store the cursor of the last-fetched record and use it on subsequent fetches. + +**3. Store data in your own system** + +Don't use Nango's cache as your primary data store. Instead: +- Store synced records in your own database +- Use Nango as a synchronization pipeline +- Keep your own copy of all critical data + +#### Longer retention requirements + +If your use case requires accessing record payloads from Nango's cache beyond the 30-day window, please reach out to the Nango team. We can work with you to ensure you don't experience breaking changes. + +## Deletion procedures + +### User-initiated deletion + +You can delete connections through: + +- **Dashboard**: Navigate to the connection and click "Delete" +- **API**: Call the [delete connection endpoint](/reference/backend/http-api/connections/delete) +- **SDK**: Use the `deleteConnection` method in any of our backend SDKs + +### Automatic cleanup + +Nango automatically cleans up: + +- Expired OAuth sessions +- Expired connect session tokens +- Orphaned data from deleted integrations + +### Data purge requests + +For compliance requirements (e.g., GDPR), contact Nango support to request immediate data purges. We can expedite the deletion process when required by regulation. + +## Access controls + +### API authentication + +Nango supports multiple authentication methods: + +| Method | Use case | Token lifetime | +| - | - | - | +| Secret key | Server-to-server API access | Long-lived (until rotated) | +| Connect session token | Frontend auth flows | 30 minutes | +| Session cookie | Dashboard access | Session-based | + +### Secret key security + +- Secret keys are environment-specific (dev, prod, etc.) +- Keys can be rotated via the dashboard +- All API requests require a valid secret key in the `Authorization` header + +### Environment isolation + +Each [environment](/guides/platform/environments) in your Nango account is completely isolated: + +- Separate credentials and connections +- Separate integration configurations +- Separate secret keys + +This ensures your production data is never accessible from development environments. + +### Audit logging + +All credential access and modifications are logged: + +- Connection creation and deletion +- Credential refresh operations +- API requests using credentials + +Logs are available in the Nango dashboard and can be exported via [OpenTelemetry](/guides/platform/observability#opentelemetry-export). + + +## Team & roles + +Nango supports multiple team members per account with role-based access control (RBAC). Roles determine what each member can view and modify, particularly in production environments. + +### Role overview + +There are three roles: + +| | **Full Access** | **Support** | **Contributor** | +| - | - | - | - | +| **Summary** | Unrestricted access across all environments. The only role that can manage account settings, billing, and the team. | Designed for monitoring production without being able to change it. Full access in non-production environments. | Designed for developers who work exclusively in non-production environments. No production access at all. | + +**Full Access is the default role** for just-in-time (JIT) provisioning when using SSO. When inviting members manually, you choose their role during the invitation flow. + + +At least one Full Access member is required per account. + + +### Permissions + +| | **Full Access** | **Support** | **Contributor** | +| - | - | - | - | +| Non-production: read (integrations, connections, syncs, logs) | βœ“ | βœ“ | βœ“ | +| Non-production: write / delete | βœ“ | βœ“ | βœ“ | +| Production: read (integrations, connections, syncs, logs) | βœ“ | βœ“ | β€” | +| Production: trigger syncs | βœ“ | βœ“ | β€” | +| Production: write / delete | βœ“ | β€” | β€” | +| Production: view secret key | βœ“ | β€” | β€” | +| Production: view integration credentials | βœ“ | β€” | β€” | +| Production: view connection credentials | βœ“ | β€” | β€” | +| Invite / update / remove team members | βœ“ | β€” | β€” | +| Manage billing & plan | βœ“ | β€” | β€” | +| Configure Connect UI | βœ“ | β€” | β€” | +| Create environments / toggle production flag | βœ“ | β€” | β€” | + + +All environments appear in the dashboard switcher regardless of role, but access is enforced server-side β€” users are blocked from entering environments their role does not permit. Permissions cannot be bypassed by manipulating URLs or API parameters. + + +### Production environment flag + +Whether an environment is considered production is configured in **Environment Settings β†’ General**. The production status of the current environment is also visible in the environment dropdown at the top left of the dashboard. + +The flag can be set on any environment regardless of its name β€” not just `prod`. This lets you protect environments like `prod-eu`, `production`, or `live` the same way. + +Only **Full Access** members can toggle this flag. Once set, Support members get read-only access (without sensitive credentials) and Contributor members lose access entirely. + + +The production flag currently governs role-based access. In the future it may also control additional environment traits to differentiate production-grade environments from development or staging ones. + + + +These roles apply to dashboard access only. They do not affect API authentication β€” any caller with a valid secret key retains full API access regardless of their dashboard role. + + + +## Single sign-on (SSO) + +Nango Cloud uses [WorkOS](https://workos.com) to power SSO. + +### Availability + +| Plan | SSO support | +| - | - | +| Free / Starter | Google SSO only | +| Growth | SSO with 20+ identity providers (add-on) | +| Enterprise (Cloud) | SSO with 20+ identity providers (included) | +| Enterprise (Self-hosted) | Not yet available (planned) | + +### Supported providers + +Through WorkOS, Nango supports the main SSO providers, including **Okta**, **Entra ID**, **OneLogin** and 20+ other identity providers. + +### How to enable SSO + +1. To enable SSO for your account, contact the Nango team (on our shared Slack channel or the [community](https://nango.dev/slack)). +2. If you are on the Growth plan, we will subscribe your workspace to the SSO add-on. +3. We will invite an admin from your company to complete the SSO setup flow. + +### Setup flow + +During setup, your company admin can configure the **domains allowed to sign in**. User accounts are created automatically through just-in-time (JIT) provisioning. + +### How users log in + +Once SSO is configured, users sign in through your company's identity provider (IdP). Nango currently does not provide a dedicated SSO button on the login page β€” login must be initiated from the IdP side. + +## IP Allowlist + +Some integrations require network-level access controls that only allow inbound traffic from known IP addresses. +This page lists the **public IP addresses used by Nango services** when making outbound requests. + + +### When is IP allowlisting required? + +IP allowlisting is only required if **your customers' systems** restrict inbound network traffic. + +Common examples include: +- Private or self-hosted APIs behind a firewall +- Enterprise systems that only accept traffic from approved IPs +- Third-party services with IP-based access controls + +If a system is publicly accessible without IP restrictions, **no allowlist configuration is needed**. + + +### Nango public IP addresses + +Allowlist the following IP addresses to permit inbound traffic from Nango: + +- `52.34.139.153` +- `54.69.127.183` +- `44.247.133.183` +- `52.26.211.56` + + +### IP address changes + +While we aim to keep IP addresses stable, they **may change over time** as we scale or improve reliability. + +To minimize disruption: +- Ensure all listed IPs are allowlisted +- Periodically review this page for updates + +We will make reasonable efforts to communicate breaking changes in advance. + +## API Key Scoping + +Nango supports scoped API keys, allowing you to follow the principle of least privilege when granting programmatic access to your environments. Each API key can be restricted to specific operations β€” for example, a CI/CD pipeline key that can only deploy, or a backend service key that can read connections but not manage integrations. + +For details on available scopes, advised profiles, and key management, see the [API Keys reference](/reference/backend/http-api/api-keys). + + +**Questions about security?** Please reach out in the [Slack community](https://nango.dev/slack) or contact security@nango.dev. + + +## Related guides + +- [API keys](/reference/backend/http-api/api-keys) - create scoped keys for production access. +- [Auth guide](/guides/auth/auth-guide) - keep provider credentials out of your app. +- [Token refreshing and validity](/guides/auth/token-refreshing) - handle revoked OAuth credentials. +- [Self-host Nango](/guides/platform/self-hosting) - review deployment and data ownership options. - api.post('/sessionToken', async (req, res) => { - const { data } = await nango.createReconnectSession({ - connection_id: '', - integration_id: '' - }); +## Self Hosting - res.status(200).send({ sessionToken: data.token }); - }); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/connect/sessions/reconnect \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "connection_id": "", - "integration_id": "" - }' - ``` - - - +Source: https://nango.dev/docs/guides/platform/self-hosting.md - - Test the auth flow from your app and verify a connection appears in the [Connections](https://app.nango.dev/dev/connections) tab. Failed attempts are inspectable in the **Logs** tab. +--- +title: 'Self-host Nango' +sidebarTitle: 'Self-hosting' +description: 'Overview of self-hosted deployments.' +--- + +Nango offers a self-hosted deployment option for Enterprise customers. This guide covers deployment, scaling, updates, and other key operational details. + +## Architecture overview + + + + + +## Architecture components + +Nango consists of several core services, each handling specific responsibilities: + +- **Server (Node service)**: Powers the dashboard, API, proxy requests, and incoming/outgoing webhooks. +- **Orchestrator (Node service)**: Manages task scheduling and state tracking. +- **Jobs (Node service)**: Processes tasks and dispatches them to the Runner. +- **Runner (Node service)**: Executes integration code and interacts with external APIs. +- **Persist (Node service)**: Stores synced records and logs. +- **Postgres**: Stores data for the control plane, API credentials, scheduled tasks, and synced records. +- **Object Storage (e.g. S3)**: Stores compiled integration code for execution by the Runner. +- **ElasticSearch**: Stores execution data. +- **Redis**: Caches system data, including socket information, token refresh locks, and rate limits. + +## Cloud vs. self-hosted architecture + +The Nango architecture is largely the same for both Cloud and Enterprise self-hosting. This ensures self-hosted instances benefit from continuous dogfooding and load testing. + +The primary differences are: +- In the Cloud version, the Runner service runs as isolated instances per customer. +- The Postgres database is segmented by use case (control plane, task scheduling, synced records). + +## Features + +All paid features available on Nango Cloud are also included in the Enterprise self-hosted edition. + +## Plan requirement + +An [Enterprise plan](https://www.nango.dev/pricing) subscription is required. + +Enterprise Self-Hosted pricing contain a fixed annual license and maintenance fee, plus a fraction of the cloud usage-based fees since infrastructure is on the customer side. + +## Intended users + +Inteded for large and/or regulated enterprises. + +## Deployment + +By default, Nango is deployed using [Helm charts](https://github.com/NangoHQ/nango-helm-charts). Custom deployments (e.g., ECS) are possible with our guidance. + +## Updates + +Managed image updates are published on a **two-month cadence**, with occasional **hotfixes** as needed. Notifications about new releases will be posted to your dedicated Nango Slack channel. + +You can also subscribe to release notifications on the [`NangoHQ/managed-image-releases`](https://github.com/NangoHQ/managed-image-releases) repository: + +- **GitHub:** watch the repository, select **Custom**, and enable **Releases**. +- **RSS/Atom:** subscribe to `https://github.com/NangoHQ/managed-image-releases/releases.atom`, which can be wired into Slack, Microsoft Teams, RSS readers, or internal automation. + +Each release includes the managed image tag, application version, source commit hash, release date, Docker pull reference, a GitHub compare link to the previous managed release, and a generated changelog of changes since the previous managed release. + +### Image tags + +Managed image tags follow this format: + +``` +nangohq/nango:managed-{managed-release-version}-{application-version}-{commit-sha} +``` + +* `managed-release-version`: Semantic version for the managed image lifecycle (major = breaking, minor/patch = features/fixes) +* `application-version`: Semantic version of the Nango application baked into the image +* `commit-sha`: Full Git commit hash of the released source + +For example, pull a release from Docker Hub with: + +```bash +docker pull nangohq/nango:managed-1.5.4-0.70.4-0fe07a6d83aea0becc4cea382c5cead2f555718d +``` + +Customers should **pin their CLI version to the `application-version`** specified in the tag for compatibility. + +### Versions and policy + +You can find the latest version in [`managed-manifest.json`](https://github.com/NangoHQ/managed-image-releases/blob/main/managed-manifest.json) on `managed-image-releases` (mirrored from [`NangoHQ/nango`](https://github.com/NangoHQ/nango/blob/master/managed-manifest.json) on each release). The in-repo [`CHANGELOG.md`](https://github.com/NangoHQ/managed-image-releases/blob/main/CHANGELOG.md) tracks release history. + +Each managed release maps to a specific source commit, and published image tags are never changed after release. Customers are encouraged to stay reasonably current with managed image releases. + +See the full [changelog](/updates/changelog) for details on each release. + +## Cloud provider support + +Supports all major cloud providers (AWS, GCP, Azure). + +## Recommended configuration + +- **5 Node services** (Server, Persist, Runner, Jobs, Orchestrator): 1 CPU, 2GB RAM per service +- **Postgres database**: 2 CPU, 8GB RAM, 128GB storage +- **Redis data store**: 128MB +- **ElasticSearch data store**: 2 vCPU, 1GB RAM, 30GB storage +- **Object storage (e.g. S3)**: less than 500MB of storage + +## Scaling + +The default configuration supports 1M+ sync/action executions per day (assuming ~2s execution time per action/sync). + +Auto-scaling is not provided out-of-the-box yet, but the default configuration scales far. We can guide you on configuring auto-scaling when needed. + +Bottlenecks mostly depend on: +- **Action/sync execution time**: solved by scaling the Runner service vertically, then horizontally. +- **Cached records & size (for sync functions only)**: solved by scaling Postgres vertically. + +## Data storage + +- **Postgres**: Stores data for the control plane, API credentials, scheduled tasks, and synced records. +- **Object Storage (e.g. S3)**: Stores compiled integration code for execution by the Runner. +- **ElasticSearch**: Stores execution data. +- **Redis**: Caches system data, including socket information, token refresh locks, and rate limits. + +## Using existing data stores + +Yes, Nango is flexible with data store setups. However, we recommend a separate instance for independent scaling. + +## Internet access requirements + +- **Server:** Required for proxy requests, credential management, and incoming/outgoing webhooks (inbound & outbound traffic). +- **Runner:** Required for reading/writing data from external APIs during sync and action executions (outbound traffic only). + +## Exporting metrics & logs + +Yes, metrics and logs can be exported to any monitoring tool using our OpenTelemetry Export add-on. Additional metrics and logs can be added upon request. + +## Email service + +Nango uses emails for account verification, password reset, and sending invitations, etc... + +Any SMTP server can be configured to be used by Nango for these email communications. + +## Encryption key + +You must provide your own encryption key via the `NANGO_ENCRYPTION_KEY` environment variable to enable encryption at rest. It encrypts credentials in the control-plane database as well as data in the records cache. Without this key, credentials are stored unencrypted. + +The records cache always requires this key. If you run sync functions that persist records, the persist and records services fail to store or retrieve records when `NANGO_ENCRYPTION_KEY` is not setβ€”they do not fall back to plaintext. + + +The encryption key must be a base64-encoded 256-bit (32-byte) key. Key rotation is not supported yetβ€”changing the key after initial setup will cause decryption failures. Plan your key management accordingly. + + +## Data retention configuration + +The default retention period for deleted connections is 31 days. You can configure this via the `CRON_DELETE_OLD_CONNECTIONS_MAX_DAYS` environment variable. + +## Free self-hosting + +A limited free self-hosting option is available for hobby projects. It is intended for lightweight deployments that need Auth and Proxy, without the managed features and support included with Enterprise self-hosting or Nango Cloud. + +For more details, see the [pricing page](https://nango.dev/pricing) or [schedule a call](https://nango.dev/demo) to discuss the Enterprise self-hosted version. + +### Feature availability + +| Feature | Free self-hosted | Enterprise self-hosted / Nango Cloud | +| --- | --- | --- | +| Auth | Yes | Yes | +| Proxy | Yes | Yes | +| Observability | Auth + proxy only | Full | +| OpenTelemetry export | No | Yes | +| Functions | No | Yes | +| Webhooks | No | Yes | +| MCP server | No | Yes | +| Customize auth branding | No | Yes | +| Role-based permissions | No | Yes | +| SAML SSO | No | On the roadmap | +| Support SLA | No | Yes | + +### Server URL, callback URL, and custom domains + +Add server environment variables for the instance URL and port in the `.env` file or directly in your hosting provider: + +```sh +NANGO_SERVER_URL= +SERVER_PORT= +``` + +The resulting OAuth callback URL is `/oauth/callback`. + +You can customize the callback URL by updating the "Callback URL" field in the "Environment Settings" tab in the Nango admin. + + +If you are using a custom domain, update `NANGO_SERVER_URL` to match it. + + +### Connect UI + +Nango Connect is available for self-hosted deployments in the main Docker image. + +```sh +FLAG_SERVE_CONNECT_UI=true +NANGO_CONNECT_UI_PORT=3009 +NANGO_PUBLIC_CONNECT_URL= +``` + +Nango Connect is available by default at `http://localhost:3009`. + + +If you are using a custom domain, update `NANGO_PUBLIC_CONNECT_URL` to match it. + + +See [Auth](/guides/auth/auth-guide) for the end-user connection flow. + +### Persistent storage + +If you deploy with Docker Compose, the bundled database uses local container storage. This is not appropriate for production. + +Connect Nango to an external Postgres database by setting the database environment variables: + +```sh +NANGO_DB_USER= +NANGO_DB_PASSWORD= +NANGO_DB_HOST= +NANGO_DB_PORT= +NANGO_DB_NAME= +NANGO_DB_SSL=true +``` + +You can also use a database URL: + +```sh +NANGO_DATABASE_URL=postgresql://user:password@host:port/dbname +``` + +Special characters in `NANGO_DATABASE_URL` must be URL encoded. + + +Nango is incompatible with connection poolers using `pool_mode=transaction`. Use a direct database connection or configure the pooler to use a different mode. + + +Records saved by sync functions can be persisted in a dedicated database. To use a dedicated records database, set `RECORDS_DATABASE_URL`: + +```sh +RECORDS_DATABASE_URL=postgresql://user:password@host:port/dbname +``` + +Special characters in `RECORDS_DATABASE_URL` must be URL encoded. If it is not specified, records are stored in the main database. + + +Deploying with Render or Heroku automatically generates a persistent database connected to your Nango instance. + + +### External Redis + +The bundled Redis is fine for local use but not for production. Connect Nango to an external Redis (or Valkey) with either a full URL or discrete variables: + +```sh +NANGO_REDIS_URL=rediss://:@: +# or +NANGO_REDIS_HOST= +NANGO_REDIS_PORT= +NANGO_REDIS_AUTH= +``` + +Use the `rediss://` scheme (or discrete variables, which default to TLS) to enable in-transit encryption. + +#### IAM / short-lived token authentication + +Managed Redis with IAM authentication (for example GCP Memorystore for Valkey) uses a short-lived token as the password and requires the token to be refreshed before it expires. Instead of a static `NANGO_REDIS_AUTH`, point Nango at a file that an external process (such as a sidecar) keeps up to date: + +```sh +NANGO_REDIS_HOST= +NANGO_REDIS_PORT= +NANGO_REDIS_AUTH_TOKEN_FILE=/path/to/token # re-read on every (re)connect +NANGO_REDIS_USERNAME= # optional; defaults to "default" +``` + +Nango reads the token file on every connection and reconnection, so a rotated token is always picked up without a restart. This is cloud-agnostic: anything that writes the current token to the file works. The writer must update the file atomically β€” write a temporary file and `rename()` it into place β€” so a reconnect never reads a half-written token and fails authentication. When `NANGO_REDIS_AUTH_TOKEN_FILE` is set, do not embed credentials in `NANGO_REDIS_URL`. + +The runner boundary has the same set of variables prefixed with `NANGO_CUSTOMER_REDIS_` (for example `NANGO_CUSTOMER_REDIS_AUTH_TOKEN_FILE`); it falls back to the system Redis when unset. + +### Securing your instance + +#### Proxy base URL override hardening + +The [proxy](/guides/platform/proxy-requests) can send authenticated requests to external APIs. Some proxy calls accept a **base URL override** (HTTP header `Base-Url-Override`, SDK `baseUrlOverride`, or an integration `custom.baseUrl`) to target a host that differs from the provider's default API base URL. + +Because the proxy makes outbound HTTP requests from your Nango server (and from the runner for sync and action scripts), a caller with permission to use the proxy could use an override to reach hosts that were not meant to be exposedβ€”such as cloud metadata services or `localhost` on the host making the request. This is a classic **SSRF** risk. + +By default, Nango keeps base URL override **enabled** and blocks override targets and redirect hops whose hostnames match a built-in denylist (cloud metadata and loopback addresses). Configure these environment variables and restart the **server** and **runners** after changes: + +```sh +NANGO_PROXY_BASE_URL_OVERRIDE_ENABLED=true +NANGO_PROXY_BASE_URL_OVERRIDE_DENYLIST='["169.254.169.254","metadata.google.internal","localhost","127.0.0.1","[::1]"]' +``` + +| Variable | Default | Purpose | +| - | - | - | +| `NANGO_PROXY_BASE_URL_OVERRIDE_ENABLED` | `true` | Set to `false` to reject all base URL overrides | +| `NANGO_PROXY_BASE_URL_OVERRIDE_DENYLIST` | Secure defaults when unset | JSON array of hostnames or URLs to block; custom entries are merged with defaults | +| `NANGO_OUTBOUND_URL_POLICY` | Secure defaults when unset | JSON object controlling SSRF protection for proxy, customer webhooks, and `uncontrolledFetch` | + +**Operator guidance:** + +- **Production:** keep the default denylist. Add environment-specific hosts if your deployment exposes additional internal endpoints. +- **Legitimate localhost overrides (dev only):** set `NANGO_PROXY_BASE_URL_OVERRIDE_DENYLIST='[]'` to restore fail-open behavior. +- **No overrides at all:** set `NANGO_PROXY_BASE_URL_OVERRIDE_ENABLED=false`. + +Denylist matching is hostname-based and applies to redirect hops as well as the initial override target. + +#### Outbound URL policy (DNS rebinding, private IPs, redirects) + +Beyond the hostname denylist, Nango routes every outbound connection on the **proxy**, **customer webhook delivery**, and **`uncontrolledFetch`** paths through DNS-pinning agents that re-validate the *resolved* IP address β€” closing DNS-rebinding and redirect-to-internal-address SSRF holes. The behavior is controlled by `NANGO_OUTBOUND_URL_POLICY`, a JSON object (applied on top of the denylist). It propagates automatically to runners. + +The `mode` field selects how hostnames are filtered: + +- **`denylist`** (default): every destination is reachable except hostnames on the denylist (plus the IP-based protections below). This is the out-of-the-box mode, since the denylist always carries the secure defaults. +- **`allowlist`**: only hostnames in `allowlist` are reachable (a leading `.` matches subdomains); everything else is rejected. The denylist and the IP-based protections still apply on top, so allowlist is strictly *more* restrictive β€” a listed hostname that resolves to a blocked IP is still rejected. +- **`permissive`**: no hostname-based filtering (the IP-based protections below still apply). You only reach this mode deliberately β€” either by emptying the server denylist with no explicit mode (see below), or by setting `mode: "permissive"`. + + +The IP-based protections apply in **every** mode, including `permissive`. Loopback (`127.0.0.0/8`, `::1`) and unspecified addresses are **always** blocked; private/RFC1918/CGNAT addresses (`blockPrivateIps`) and link-local addresses β€” including the cloud-metadata IP `169.254.169.254` (`blockLinkLocal`) β€” are blocked by default. + +The denylist is **never empty by default** β€” it is always seeded with the secure defaults (`localhost`, `metadata.google.internal`, `169.254.169.254`, …). It only becomes empty if you explicitly opt out: either `NANGO_PROXY_BASE_URL_OVERRIDE_DENYLIST='[]'` (server only, which then selects `permissive`) or `mode: "permissive"`. Even then, only hostname string matches such as `localhost` are dropped β€” literal or resolved internal IPs stay blocked unless you also set `blockPrivateIps`/`blockLinkLocal` to `false`. Runners re-apply the secure denylist defaults even when the server has emptied its denylist; note an explicit `mode: "permissive"` empties the denylist everywhere, runners included. + + +```sh +# Block private/link-local IPs (default) and cap redirects at 3 +NANGO_OUTBOUND_URL_POLICY='{"blockPrivateIps":true,"blockLinkLocal":true,"maxRedirects":3}' + +# Allowlist mode: only the listed hostnames (and their subdomains) are reachable +NANGO_OUTBOUND_URL_POLICY='{"mode":"allowlist","allowlist":[".hubspot.com","api.github.com"]}' +``` + +| Field | Default | Purpose | +| - | - | - | +| `mode` | `denylist` (auto-`permissive` only if you empty the denylist) | `denylist`, `allowlist`, or `permissive` (see above) | +| `allowlist` | `[]` | In `allowlist` mode, hostnames (a leading `.` matches subdomains) that may be reached | +| `blockPrivateIps` | `true` | Block RFC1918 / CGNAT addresses (all modes) | +| `blockLinkLocal` | `true` | Block link-local addresses incl. `169.254.169.254` (all modes) | +| `maxRedirects` | `5` | Maximum redirect hops followed | + +Each resolved address (including on every redirect hop) is validated; in `allowlist` mode, only listed hostnames are reachable regardless of IP. + +#### Securing the dashboard + +By default, the dashboard of your Nango instance is open to anyone who can access your instance URL. + +You can secure it with Basic Auth by setting the following environment variables and restarting the server: + +```bash +FLAG_AUTH_ENABLED=false +NANGO_DASHBOARD_USERNAME= +NANGO_DASHBOARD_PASSWORD= +``` + +#### Encrypting sensitive data + +You can enforce encryption of sensitive data, including tokens, secret keys, and app secrets, by setting a 256-bit base64-encoded key: + +```sh +openssl rand -base64 32 +``` + +Set the generated value as `NANGO_ENCRYPTION_KEY`: + +```sh +NANGO_ENCRYPTION_KEY= +``` + +After you restart the Nango server, database encryption happens automatically. The encryption key cannot currently be modified after it is set. + + +`NANGO_ENCRYPTION_KEY` is also required for Connect UI. It is used to generate sessions for [Connect UI](/reference/frontend/frontend-sdk#connect-using-nango-connect-ui). Without this key, Connect UI will not work. + + +#### Custom websockets path + +The Nango server serves websockets from `/` by default for use by `@nangohq/frontend` during the login flow. + +To isolate websockets from the dashboard, set `NANGO_SERVER_WEBSOCKETS_PATH`: + +```sh +NANGO_SERVER_WEBSOCKETS_PATH= +``` + +If you set a custom path, configure `websocketsPath` when initializing the `Nango` object in the `@nangohq/frontend` SDK: + +```js +import Nango from '@nangohq/frontend'; + +let nango = new Nango({ host: 'https://', websocketsPath: '' }); +``` + +### Telemetry + +Self-hosted instances do not automatically send telemetry back to Nango. Operational metrics and logs stay within your own infrastructure and are only exported if you configure the OpenTelemetry Export add-on described above. + +### Logs + +Nango stores execution logs and powers the logs UI with either Elasticsearch or OpenSearch. To keep free self-hosted deployments lighter, this stack is optional. + +To enable logs: + +- Host an Elasticsearch or OpenSearch cluster. +- Set `NANGO_LOGS_ENABLED=true`. +- Configure the relevant `NANGO_LOGS_ES_*` environment variables (these apply to both providers). + +Nango uses Elasticsearch by default. To use OpenSearch instead, set: + +```sh +NANGO_LOGS_PROVIDER=opensearch +``` + +Elasticsearch hosting options include: + +- Local: uncomment the service in [`docker-compose.yaml`](https://github.com/NangoHQ/nango/blob/master/docker-compose.yaml#L63) and run `docker-compose up`. +- Elastic Cloud: use [elastic.co](https://www.elastic.co/). +- Render: deploy an Elasticsearch instance with [Render](https://docs.render.com/deploy-elasticsearch). + +If `NANGO_LOGS_ENABLED` is `false`, logs are sent to stdout and can be viewed in your host logs. + +### Run and update Nango + +To install Nango on a VM: + +```bash +mkdir nango && cd nango +wget https://raw.githubusercontent.com/NangoHQ/nango/master/docker-compose.yaml +docker-compose up -d +``` + +To update Nango: + +```bash +docker-compose stop +docker-compose rm -f +docker-compose pull +docker-compose up -d +``` + + +If you are interested in the Enterprise self-hosting version, please get in touch with us in the [community](https://nango.dev/slack) or [book a demo](https://nango.dev/demo). + + +## Related guides + +- [Security](/guides/platform/security) - review data, encryption, and access controls. +- [Environments](/guides/platform/environments) - organize dev, staging, and production setups. +- [Changelog](/updates/changelog) - track changes that affect self-hosted upgrades. - - After the user runs the flow, confirm the connection was created with [`GET /connections`](/reference/backend/http-api/connections/list) β€” filter by the tags you set in step 5: +## Proxy Requests - ```bash - curl --request GET \ - --url 'https://api.nango.dev/connections?tags[end_user_id]=' \ - --header 'Authorization: Bearer ' - ``` +Source: https://nango.dev/docs/guides/platform/proxy-requests.md - Auth logs are dashboard-only β€” if the call returns no connection, ask the user to check the **Logs** tab for the failure reason. - +--- +title: 'Proxy requests' +sidebarTitle: 'Proxy requests' +description: 'How to use the requests proxy from Nango' +--- + +Use the requests proxy to make authenticated API requests to the external API. + +## How to use the proxy + +Make sure you have an [integration configured](/guides/auth/auth-guide#guide) in your environment, and at least one [connection](/guides/auth/auth-guide#overview) available for it. + +You can use the proxy with the [Node SDK](/reference/backend/backend-sdk/node#proxy) or [REST API](/reference/backend/http-api/proxy/get): + + + + ```typescript + try { + const res = await nango.proxy({ + method: 'POST', + baseUrlOverride: 'https://api.example.com', + endpoint: '/external-endpoint', + providerConfigKey: '', + connectionId: '', + retries: 5, // Retries with exponential backoff (optional, default 0) + data: { + id: 1, + colorId: 'blue', + selected: true + } + }); + + // Response was 200! + // See https://axios-http.com/docs/res_schema + console.log(res.data); + } catch (error) { + // Status of response != 200 + // See https://axios-http.com/docs/handling_errors + console.log(error.response.data); + console.log(error.response.status); + console.log(error.response.headers); + } + ``` + + + + ```bash + curl -X POST -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer ' \ + -H 'Provider-Config-Key: ' \ + -H 'Connection-Id: ' \ + -d '{"colorId: "blue"}' \ + 'https://api.nango.dev/proxy/' + ``` + + + +## Related guides + +- [Auth guide](/guides/auth/auth-guide) - create the connection used by proxy requests. +- [Node SDK reference](/reference/backend/backend-sdk/node#proxy) - proxy helper methods. +- [Proxy API reference](/reference/backend/http-api/proxy/get) - REST endpoints for proxied requests. +- [Rate limits](/guides/functions/rate-limits) - handle provider throttling. - πŸŽ‰ **You are connected!** Next: - - View connections and credentials in the **Connections** tab. - - Retrieve credentials via the [API](/reference/backend/http-api/connections/get) or [Node SDK](/reference/backend/backend-sdk/node#get-a-connection-with-credentials). - - Build with [sync functions](/guides/functions/syncs/sync-functions), [Action functions](/guides/functions/action-functions), [webhook functions](/guides/functions/webhook-functions), or any other Nango function type. - - +## Receive webhooks from Nango - - **Questions, problems, feedback?** Reach out in the [Slack community](https://nango.dev/slack). - +Source: https://nango.dev/docs/guides/platform/webhooks-from-nango.md +Description: Reference for the webhooks Nango sends to your app β€” setup, types, payloads, signature verification, and retries. -## OAuth developer apps +Nango POSTs webhooks to your app to notify it of important events: a new connection was created, a sync run finished, an async action completed, or an external webhook was forwarded. This page covers how to receive and verify webhooks from Nango, plus the payloads for auth, sync, and async action webhooks. -Nango ships built-in shared developer apps for some OAuth 2.0 APIs so you can test connections with zero setup. + +To process webhooks coming **from external APIs** (not from Nango), see [Process external webhooks](/getting-started/use-cases/webhooks-from-external-apis). To forward external API webhooks through Nango to your app, see [Webhook forwarding](/guides/platform/webhook-forwarding). + -They work in production too, but we strongly recommend registering your own before going live. Most OAuth APIs have a step-by-step setup guide in [APIs & Integrations](/integrations/overview) β€” for example, [Gmail](/api-integrations/google-mail/how-to-register-your-own-gmail-api-oauth-app). +## Set up webhooks from Nango -Reasons to register your own: -- **Whitelabel auth** β€” with Nango's app, users authorize Nango instead of your product. -- **Scopes** β€” Nango developer apps have fixed scopes. Your own app supports any scope the provider exposes. -- **Callback URL** β€” Nango developer apps use Nango's callback. Your own app supports a [custom callback URL](#custom-oauth-callback-url-optional) on your domain. -- **Marketplace listings** β€” provider marketplaces require your own developer app. -- **Advanced API features** β€” some provider features are only available to first-party apps. -- **Revocation risk** β€” most providers don't allow shared credentials. Nango developer apps may be revoked by the provider at any time. -- **Portability** β€” only your own developer app lets you export access and refresh tokens and move off Nango without users re-authorizing. + + Webhook settings in Nango are specific to each [environment](/guides/platform/environments). + -The same tradeoffs apply to shared OAuth apps provided by other auth platforms. +To subscribe to Nango webhooks: -## Related guides +1. Set up a `POST` endpoint in your app to receive the Nango webhooks +2. Input the endpoint's URL in your _Environment Settings_, under _Webhook URLs_ ([direct link for your dev environment](https://app.nango.dev/dev/environment-settings#notification)) +3. Implement [verify incoming webhooks](#verifying-webhooks-from-nango) to ensure sure only authentic Nango webhooks are processed +4. Implement processing logic for each [webhook type](#types-of-nango-webhooks) from Nango you want to handle + - Make sure your processing logic handles the webhooks you have enabled in the environment settings -- [Share a connect link](/guides/auth/share-connect-link) - send authorization links by email, support tools, or cross-device flows. -- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - store the right connection-level data in the right field. -- [Customize Connect UI](/guides/auth/customize-connect-ui) - customize branding or build your own authorization UI. -- [Token refreshing and validity](/guides/auth/token-refreshing) - handle revoked or expired credentials. +You can configure up to two webhook URLs per environment. Nango webhooks will be sent to both. A single connection can [override these with its own URL](#override-webhook-urls-per-connection). -## Share a connect link +To test webhooks locally, use a webhook forwarding service like [ngrok](https://dev.to/mmascioni/testing-and-debugging-webhooks-with-ngrok-4alp), or [webhook.site](https://webhook.site/). -Source: https://nango.dev/docs/guides/auth/share-connect-link.md -Description: Generate a short-lived connect link and share it with your end user. +## Override webhook URLs per connection -Use a connect link when you want to trigger authorization without opening Connect UI immediately in your app (for example: email-based onboarding, support-assisted setup, or cross-device flows). +A single connection can override the environment's webhook URLs with its own `webhook_url`. The connection still receives all the same [webhook types](#types-of-nango-webhooks), with the same signing, retries, and logs. -## Option 1: Generate a link from your backend +When a connection sets `webhook_url`, its webhooks are sent **only** to that URL β€” the environment's primary and secondary webhook URLs are both bypassed for that connection. It does not add a third destination. -Create a connect session and return the `connect_link` to your frontend or internal tools: +Set `webhook_url` when creating a [connect session](/reference/backend/http-api/connect/sessions/create), under `integrations_config_defaults..connection_config`: ```ts - import { Nango } from '@nangohq/node'; - - const nango = new Nango({ secretKey: process.env[''] }); - - api.post('/connectLink', async (req, res) => { - const { data } = await nango.createConnectSession({ - tags: { - end_user_id: '', - end_user_email: '', - organization_id: '' - }, - allowed_integrations: [''] - }); - - res.status(200).send({ - connectLink: data.connect_link, - expiresAt: data.expires_at - }); + const session = await nango.createConnectSession({ + allowed_integrations: [''], + integrations_config_defaults: { + '': { + connection_config: { + webhook_url: 'https://.ngrok.app/webhooks-from-nango' + } + } + } }); ``` @@ -1367,12934 +7238,7618 @@ Create a connect session and return the `connect_link` to your frontend or inter --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data '{ - "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "" - }, - "allowed_integrations": [ - "" - ] + "allowed_integrations": [""], + "integrations_config_defaults": { + "": { + "connection_config": { + "webhook_url": "https://.ngrok.app/webhooks-from-nango" + } + } + } }' ``` -The returned `connect_link` expires after 30 minutes. - -## Option 2: Generate a link from the dashboard - -In the Nango dashboard, open the Connections page and use the **Share connect link** button. This generates a link that you can share directly with the end user. - -## Notes +You can also set `webhook_url` from the **Create connection** flow in the Nango dashboard, under the connection's advanced configuration. -- For the API details, see [Create a connect session](/reference/backend/http-api/connect/sessions/create). + + `webhook_url` can only be set at connect-session creation time β€” the trusted actor that creates the session. The same key passed to `nango.auth()` `params` from the client is ignored. + -## Related guides + + **Local development:** create a connection with `webhook_url` pointing at your local webhook endpoint (for example via [ngrok](https://ngrok.com/) or [webhook.site](https://webhook.site/)) to receive that connection's webhooks on your machine β€” without changing the shared environment webhook URLs. See [Engineering collaboration](/guides/platform/environments#engineering-collaboration) for the shared-environment workflow. + -- [Auth guide](/guides/auth/auth-guide) - embed the standard Connect UI flow. -- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - reconcile completed links with users and orgs. -- [Create a connect session API](/reference/backend/http-api/connect/sessions/create) - API details for generated links. +## Verifying webhooks from Nango -## Connection tags, configuration, and metadata +Validate webhooks from Nango by looking at the `X-Nango-Hmac-Sha256` header. -Source: https://nango.dev/docs/guides/auth/connection-tags-configuration-metadata.md -Description: Use tags, connection configuration, and metadata for the right connection-level data. +It's an HMAC-SHA256 hash of the webhook payload, using the webhook signing key found in **Environment Settings > Webhooks > Signing key** in the Nango UI. - - Pre-requisite: complete the [Set up an integration](/guides/auth/auth-guide#guide) section of the Auth guide. - + +Nango webhook requests include an `X-Nango-Hmac-Sha256` header for secure verification. A legacy `X-Nango-Signature` header (using plain SHA-256) is also sent for backwards compatibility but should not be used. If you're currently using `X-Nango-Signature`, migrate to `X-Nango-Hmac-Sha256` for improved security. + -A Nango connection can store several kinds of information besides credentials. Use the right field depending on what the data does. +The webhook signature can be verified with the following code: -| Field | Use it for | Example | -| --- | --- | --- | -| `tags` | Attribution, filtering, routing, and webhook reconciliation. | `end_user_id`, `organization_id`, `workspace_id` | -| `connection_config` | Provider-specific information required for the connection to be valid or usable. | `subdomain`, `tenantId`, `region`, API base URL | -| `metadata` | Your own application or function configuration stored on the connection. | field mappings, selected folder IDs, feature flags | + +Verify the signature with the **webhook signing key** from **Environment Settings > Webhooks > Signing key** β€” not your API secret key. These are two distinct keys. With the Node SDK, pass it as `webhookSigningKey`; for raw HMAC verification, use it as the HMAC secret. Using the API secret key will cause verification to fail on any environment where the keys differ. + -## Connection tags + + + Pass the webhook signing key as `webhookSigningKey` so a single client can make API calls with the API key and verify webhooks with the signing key. `webhookSigningKey` falls back to `secretKey` when omitted. -Tags are small key/value strings you attach to a Connect session. Nango copies them to the resulting connection and includes them in auth webhooks. + ```typescript + const nango = new Nango({ + apiKey: process.env.NANGO_API_KEY, // used for API calls + webhookSigningKey: process.env.NANGO_WEBHOOK_SIGNING_KEY // used to verify webhooks + }); -Their primary purpose is **attribution**. Nango uses random UUIDs as connection IDs, so tags are the bridge between a Nango connection and the user, organization, workspace, or other entity in your system. + async (req, res) => { + const isValid = nango.verifyIncomingWebhookRequest(req.body, req.headers); + } + ``` + + + ```typescript + import crypto from 'crypto'; -Most apps start with these tags: + // From Environment Settings > Webhooks > Signing key + const webhookSigningKey = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'; + const body = // raw request body as string + const hash = crypto.createHmac('sha256', webhookSigningKey).update(body).digest('hex'); + ``` + + + ```python + import hmac + import hashlib -- `end_user_id` -- `end_user_email` -- `organization_id` + # From Environment Settings > Webhooks > Signing key + webhook_signing_key = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' + body = # raw request body as bytes + hash = hmac.new(webhook_signing_key.encode('utf-8'), body, hashlib.sha256).hexdigest() + ``` + + + ```java + import javax.crypto.Mac; + import javax.crypto.spec.SecretKeySpec; + import java.nio.charset.StandardCharsets; -Then add whatever additional routing identifiers you need, such as `workspace_id`, `project_id`, or `plan`. + public class Main { + public static void main(String[] args) throws Exception { + // From Environment Settings > Webhooks > Signing key + String webhookSigningKey = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; + String body = // raw request body as string - - To make connections easier to identify in the Nango dashboard, set `end_user_display_name` and `end_user_email`. Nango uses these reserved UI tag keys to populate the connections list and connection detail page. - + Mac mac = Mac.getInstance("HmacSHA256"); + SecretKeySpec secretKey = new SecretKeySpec(webhookSigningKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); + mac.init(secretKey); + byte[] hashBytes = mac.doFinal(body.getBytes(StandardCharsets.UTF_8)); - - Tags are designed for identifiers and routing metadata. Avoid putting secrets or large/free-form payloads in tags. - + StringBuilder hexString = new StringBuilder(); + for (byte b : hashBytes) { + hexString.append(String.format("%02x", b)); + } + String hash = hexString.toString(); + } + } + ``` + + + ```ruby + require 'openssl' -### Add tags when creating a Connect session + # From Environment Settings > Webhooks > Signing key + webhook_signing_key = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' + body = # raw request body + hash = OpenSSL::HMAC.hexdigest('SHA256', webhook_signing_key, body) + ``` + + + ```go + package main -When requesting a new Connect session token from Nango, pass a `tags` object: + import ( + "crypto/hmac" + "crypto/sha256" + "encoding/hex" + "io" + "net/http" + ) - - - ```ts - import { Nango } from '@nangohq/node'; + func main() { + // From Environment Settings > Webhooks > Signing key + webhookSigningKey := "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" + var body []byte // raw request body - const nango = new Nango({ secretKey: process.env[''] }); + h := hmac.New(sha256.New, []byte(webhookSigningKey)) + h.Write(body) + hash := hex.EncodeToString(h.Sum(nil)) + } + ``` + + + ```rust + use hmac::{Hmac, Mac}; + use sha2::Sha256; - api.post('/sessionToken', async (req, res) => { - const { data } = await nango.createConnectSession({ - tags: { - end_user_id: '', - end_user_email: '', - organization_id: '' - }, - allowed_integrations: [''] - }); + type HmacSha256 = Hmac; - res.status(200).send({ sessionToken: data.token }); - }); + // From Environment Settings > Webhooks > Signing key + let webhook_signing_key = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; + let body = // raw request body as string or bytes + let mut mac = HmacSha256::new_from_slice(webhook_signing_key.as_bytes()).unwrap(); + mac.update(body.as_bytes()); + let hash = format!("{:x}", mac.finalize().into_bytes()); ``` - - ```bash - curl --request POST \ - --url https://api.nango.dev/connect/sessions \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "" - }, - "allowed_integrations": [ - "" - ] - }' + + ```php + Webhooks > Signing key + $webhookSigningKey = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'; + $body = // raw request body as string + $hash = hash_hmac('sha256', $body, $webhookSigningKey); + ?> ``` -### Read tags from the auth webhook +Only accept a webhook if the `X-Nango-Hmac-Sha256` header value matches the webhook signature. -These tags appear in successful auth webhooks sent by Nango: +## Types of Nango webhooks + + + New Nango webhook types are added regularly, without considering this a breaking change. Your webhook handling logic should gracefully support receiving new types of webhooks by simply ignoring them. + + +All webhooks from Nango are POST requests. + +The exact webhook type definitions can be found [here](https://github.com/NangoHQ/nango/blob/master/packages/types/lib/webhooks/api.ts). + +### Auth webhooks + +New connection webhooks have `"type": "auth"` and `"operation": "creation"`. They are sent after a connection has been successfully created. + +Payload received following a connection creation: ```json { "type": "auth", "operation": "creation", + "connectionId": "", + "authMode": "OAUTH2 | BASIC | API_KEY | ...", + "providerConfigKey": "", + "provider": "", + "environment": "DEV | PROD | ...", "success": true, - "connectionId": "", "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "" + "end_user_id": "", + "end_user_email": "", + "organization_id": "" } } ``` -Use these values to reconcile the generated `connectionId` with the user, organization, or workspace that initiated the flow in your application. - -### Read and filter connections by tags - -Nango stores tags on the connection itself. - - - - ```ts - import { Nango } from '@nangohq/node'; - - const nango = new Nango({ secretKey: '' }); - const connection = await nango.getConnection('', ''); - - console.log(connection.tags); - ``` - - - ```ts - import { Nango } from '@nangohq/node'; - - const nango = new Nango({ secretKey: '' }); - - const { connections } = await nango.listConnections({ - tags: { - end_user_id: '', - organization_id: '' - }, - limit: 100 - }); - - console.log(connections); - ``` - - - ```bash - curl --request GET \ - --url 'https://api.nango.dev/connections?tags[end_user_id]=&tags[organization_id]=' \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' - ``` - - + + Processing webhooks with `"type": "auth"` and `"operation": "creation"` is **necessary**. After a connection is created, these webhooks give you the generated connection ID which lets you access the connection later on. -Filtering uses an AND match: a connection must contain all provided tag keys and values. + Use `tags` to reconcile and save the connection ID with the user/org/workspace that initiated the connection. + -### Update tags on an existing connection +All `authMode` values can be found [here](https://github.com/NangoHQ/nango/blob/master/packages/types/lib/auth/api.ts). The `authMode` value depends on the `provider` value. -If you need to update tags after a connection is created, patch the connection: +All `operation` values are: - - - ```ts - import { Nango } from '@nangohq/node'; +- `creation`: a new connection has been created +- `override`: a connection has been re-authorized +- `refresh`: an OAuth connection's access token has failed to refresh - const nango = new Nango({ secretKey: '' }); +Payload received following a refresh token error: - await nango.patchConnection( - { - connectionId: '', - provider_config_key: '' - }, - { - tags: { - end_user_id: '', - end_user_email: '', - organization_id: '', - environment: '' - } - } - ); - ``` - - - ```bash - curl --request PATCH \ - --url 'https://api.nango.dev/connections/?provider_config_key=' \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "", - "environment": "" - } - }' - ``` - - +```json +{ + "type": "auth", + "operation": "refresh", + "connectionId": "", + "authMode": "OAUTH2 | BASIC | API_KEY | ...", + "providerConfigKey": "", + "provider": "", + "environment": "DEV | PROD | ...", + "success": false, + "tags": { + "end_user_id": "", + "end_user_email": "", + "organization_id": "" + }, + "error": { + "type": "", + "description": "" + } +} +``` - Updating tags replaces the whole tag object. If you want to add or remove a single tag, fetch the current connection first, merge locally, then patch. + Webhooks are only sent for certain connection creation errors. For example, during the OAuth flow, some errors are reported locally in the OAuth modal by the external API. Since Nango does not receive these errors, it cannot trigger a webhook for them. -### Reserved UI tag keys - -Two tag keys are reserved for improving the Nango dashboard UI: - -- `end_user_display_name` - shown instead of the connection ID in the connections list, making it easier to identify who a connection belongs to. -- `end_user_email` - shown alongside `end_user_display_name` in the connections list. The domain from the email address is also used to display the end user's company logo on the connection detail page. - - - ![](/images/screenshots/connection-tags-1.png) - - - - ![](/images/screenshots/connection-tags-2.png) - - -### Tag rules +### Sync webhooks -- `end_user_email` must be a valid email address, for example `user@example.com`. -- Tag keys are lowercased, so `End_User_Email` and `end_user_email` are treated as the same key. -- Keys are case-insensitive, and duplicate keys after normalization are rejected. -- Keys must start with a letter and contain only alphanumerics, underscores, hyphens, periods, or slashes. -- Keys can be up to 64 characters long. -- A connection can have up to 10 tag keys. -- Values must be non-empty strings up to 255 characters long. +Sync webhooks are sent when a [sync function](/guides/functions/syncs/sync-functions) execution finishes, whether successful or not. -## Connection configuration +Payload received following a successful sync execution: -Connection configuration is provider-specific information stored on a connection because the connection needs it to work. +```json +{ + "type": "sync", + "connectionId": "", + "providerConfigKey": "", + "syncName": "", + "model": "", + "syncType": "INCREMENTAL | INITIAL | WEBHOOK", // DEPRECATED β€” use checkpoints instead + "success": true, + "modifiedAfter": "", + "responseResults": { + "added": number, + "updated": number, + "deleted": number + }, + // checkpoints itself may be missing or null if the sync doesn't use checkpoints β€” + // always guard against that before reading `from`/`to`. + "checkpoints": { + "from": { "": "" }, // or null if no prior checkpoint + "to": { "": "" } // or null if the sync didn't save one + } +} +``` -It can be required to: +`modifiedAfter` is an ISO-8601 timestamp marking the start of the last run. To read the changed records, use cursor-based fetching as described in [Records cache β†’ Cursors and sync progress](/guides/functions/syncs/records-cache#cursors-and-sync-progress). -- build an OAuth authorization URL, such as a Zendesk subdomain -- choose the correct API base URL, such as a region or account-specific host -- call API endpoints later, such as a tenant ID, account ID, portal ID, or workspace ID -- store values Nango discovers during authorization, such as an API instance URL or provider account ID +**Distinguishing full vs incremental syncs:** use `checkpoints` instead of the deprecated `syncType` field. `checkpoints.from`/`checkpoints.to` are checkpoint objects (`Record`) as saved by the sync function via `saveCheckpoint()` β€” not strings β€” and either can be `null`. The `checkpoints` field itself can also be missing or `null`, so guard against that before reading nested fields: -Use connection configuration when the value is part of the connection's validity. If the value is missing, the connection may fail to authorize, fail credential checks, or be unusable for API requests. +```javascript +const { checkpoints } = payload; +const isFullSync = !checkpoints || checkpoints.from === null; +``` -When you use the pre-built [Connect UI](/guides/auth/auth-guide), Nango generates the required forms for the integration and stores the submitted values as connection configuration. +- `checkpoints` is missing/`null`, or `checkpoints.from === null` β€” the run started with no prior state. This happens on the first run, after a manual reset, or when the sync explicitly cleared its checkpoint. Treat this as a full sync and overwrite your data. +- `checkpoints.from` is a non-null checkpoint object β€” the run continued from a previously saved checkpoint. This is an incremental sync; merge the new records into your existing data. +- **Webhook-triggered runs** (deprecated `syncType: "WEBHOOK"`): always treat these as incremental merges, regardless of `checkpoints.from`. A webhook-triggered run processes a single incoming external event on top of already-synced data β€” it never represents a full resync. -When you use [headless auth with a custom UI](/guides/auth/customize-connect-ui#build-your-own-auth-ui), you must collect required connection configuration in your own UI and pass it to `nango.auth()`: + +**Fetch records promptly**: Due to Nango's [data retention policies](/guides/platform/security#synced-records-retention), you should fetch and store synced records in your own system promptly after receiving webhook notifications. Records not updated for 30 days will have their payload pruned, and sync functions not executed for 60 days will have all records deleted. + -```js -nango.auth('zendesk', { - params: { subdomain: '' } -}); +By default, Nango sends a webhook even if no modified data was detected in the last sync execution (referred as an "empty" sync), but this is configurable in your _Environment Settings_. In case of an empty sync, the `responseResults` would be: +```json +{ + "added": 0, + "updated": 0, + "deleted": 0 +} ``` -You can also set defaults when creating a Connect session: +Payload received following a failed sync execution: - - - ```ts - const { data } = await nango.createConnectSession({ - allowed_integrations: [''], - integrations_config_defaults: { - '': { - connection_config: { - '': '' - } - } - } - }); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/connect/sessions \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "allowed_integrations": [""], - "integrations_config_defaults": { - "": { - "connection_config": { - "": "" - } - } - } - }' - ``` - - - -Read connection configuration from the connection: - -```ts -const connection = await nango.getConnection('', ''); - -console.log(connection.connection_config); +```json +{ + "type": "sync", + "connectionId": "", + "providerConfigKey": "", + "syncName": "", + "model": "", + "syncType": "INCREMENTAL | INITIAL | WEBHOOK", // DEPRECATED β€” use checkpoints instead + "success": false, + "error": { + "type": "", + "description": "" + }, + "startedAt": "", + "failedAt": "", + // checkpoints itself may be missing or null β€” see the note above. + "checkpoints": { + "from": { "": "" }, // or null + "to": { "": "" } // or null + } +} ``` -For the REST API response shape, see [Get a connection](/reference/backend/http-api/connections/get). For the Node SDK method, see [Get a connection with credentials](/reference/backend/backend-sdk/node#get-a-connection-with-credentials). - -## Connection metadata +### External webhook forwarding -Metadata is arbitrary JSON storage on the connection. Use it for information your app or Nango functions need, but that is not a condition for the connection itself to exist. +Forwarded external webhooks use the same webhook URLs, signing, retries, and logs as other Nango webhooks. See [Webhook forwarding](/guides/platform/webhook-forwarding) for setup, routing behavior, and payload shapes. -Good metadata examples: +## Webhook retries & debugging -- field mappings chosen by a customer -- folder, project, board, or object IDs selected during onboarding -- filters and feature flags used by sync functions -- tenant-specific identifiers discovered by your setup flow -- provider webhook subscription IDs used by webhook functions +Nango retries each webhook with non-2xx responses 2 times with exponential backoff (starting delay: 100ms, time multiple: 2, view details in the [code](https://github.com/NangoHQ/nango/blob/master/packages/webhooks/lib/utils.ts)). -Do not use metadata for credentials or values required to make the provider connection valid. Use connection configuration for that. Do not use metadata for synced datasets or large lists of records; use the [records cache](/guides/functions/syncs/records-cache) for sync output. +Webhooks time out after 20 seconds. -Set metadata after a connection is created: +Each webhook attempt is logged in Nango's [logs](/guides/platform/observability). - - - ```ts - await nango.setMetadata( - '', - '', - { - syncArchived: false, - fieldMapping: { - companyName: 'Account_Name__c' - } - } - ); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/connections/metadata \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "connection_id": "", - "provider_config_key": "", - "metadata": { - "syncArchived": false, - "fieldMapping": { - "companyName": "Account_Name__c" - } - } - }' - ``` - - +You can also use the [OpenTelemetry exporter](/guides/platform/observability#opentelemetry-export) to monitor Nango webhooks in your own observability stack. -Functions can read metadata for the connection they run for: + + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + -```ts -const metadata = await nango.getMetadata(); -``` +## Related guides -For deeper function patterns, see [Storage](/guides/functions/storage). +- [Webhook forwarding](/guides/platform/webhook-forwarding) - forward external provider webhooks through Nango. +- [Webhook functions](/guides/functions/webhook-functions) - process provider webhooks inside Nango. +- [Event functions](/guides/functions/event-functions) - react to connection lifecycle events. +- [Observability](/guides/platform/observability) - monitor webhook operations and retries. -**Related guides** +## Webhook Forwarding -- [Auth guide](/guides/auth/auth-guide) - create connections with Connect UI. -- [Customize Connect UI](/guides/auth/customize-connect-ui) - customize branding or pass connection configuration without Connect UI. -- [Share a connect link](/guides/auth/share-connect-link) - include tags in link-based flows. -- [Storage](/guides/functions/storage) - use metadata inside functions. -- [List connections API](/reference/backend/http-api/connections/list) - filter connections by tags. +Source: https://nango.dev/docs/guides/platform/webhook-forwarding.md -## Customize Connect UI +--- +title: 'External webhook forwarding' +sidebarTitle: 'External webhook forwarding' +description: 'Forward external API webhooks through Nango to your app, with connection attribution.' +--- + +Webhook forwarding lets Nango receive webhooks from external APIs and forward them to your app's webhook URL. Use it when your app should own the webhook handling logic, but you still want Nango to provide the provider-specific webhook URL, routing, signing, retries, and logs. + +For processing the webhook inside Nango function code, use [webhook functions](/guides/functions/webhook-functions). + +## How forwarding works + +1. You configure your app's webhook URL in **Environment Settings > Webhook URLs**. +2. You register the integration's Nango webhook URL in the provider's developer portal. Find it in **Integrations > [Integration] > Webhooks**. +3. The provider sends a webhook to Nango. +4. Nango runs the provider-specific routing logic and tries to map the event to one or more Nango connections. +5. Nango forwards the payload to your app's webhook URL and signs the request like other Nango webhooks. + +Nango forwards webhooks asynchronously after accepting the provider webhook, so slow app endpoints do not block the provider response. + +## Forwarded payloads + +When Nango can attribute the webhook to a connection, your app receives a Nango wrapper: + +```json +{ + "from": "hubspot", + "providerConfigKey": "", + "type": "forward", + "connectionId": "", + "payload": { + "...": "raw provider payload" + } +} +``` + +If a provider webhook maps to multiple connections, Nango sends one forwarded webhook per connection. + +If Nango cannot map the webhook to a connection, Nango forwards the raw provider payload without the wrapper. Your consumer should handle both shapes when the provider can emit unattributed events. + +## Headers and signatures + +Nango forwards safe provider headers when possible, excluding headers that should not be replayed such as `authorization`, `cookie`, `host`, `content-length`, `content-type`, `user-agent`, and similar transport-sensitive headers. + +Every forwarded webhook is signed with the same headers used by other Nango webhooks: + +- `X-Nango-Hmac-Sha256` +- `X-Nango-Signature` for backwards compatibility + +Verify forwarded webhooks the same way you verify other webhooks from Nango. See [Verifying webhooks from Nango](/guides/platform/webhooks-from-nango#verifying-webhooks-from-nango). + +## When to use forwarding + +Use forwarding when: + +- Your app already has webhook handling logic. +- You want app code to decide what to do with the provider event. +- You need Nango to attribute the event to a connection when possible. +- You want webhook delivery logs and retries without running Nango function code. + +Use [webhook functions](/guides/functions/webhook-functions) when Nango should update records, normalize the payload, or run connection-scoped integration logic immediately. + +## Configure forwarding + + + + In Nango, open **Environment Settings > Webhook URLs** and add your app's endpoint. + + Nango sends forwarded webhooks to the same URLs used for auth, sync, and async action webhooks. + + + + In the integration page, copy the Nango webhook URL from **Integrations > [Integration] > Webhooks** and register it in the provider's developer portal. + + Some providers use one global webhook registration. Others require one webhook registration per connected account. Provider-specific docs explain the required setup. + + + + If the payload has `"type": "forward"`, read `connectionId`, `providerConfigKey`, and `payload`. + + If the payload does not have `"type": "forward"`, handle it as the raw provider payload. This can happen when the provider event cannot be attributed to a Nango connection. + + + + + When implementing webhook forwarding, first find the provider-specific Nango webhook guide. Confirm whether the provider routes automatically or requires embedding the Nango connection ID, tenant ID, team ID, installation ID, or another identifier in the provider webhook subscription. + + Implement signature verification with `X-Nango-Hmac-Sha256`, then branch on whether the incoming body has `type: "forward"`. Store and use `connectionId` only when it is present. + + +## Retries and debugging + +Nango retries forwarded webhooks when your app returns a non-2xx response or has a network failure. Forwarded attempts appear in Nango logs as webhook forwarding operations. + +For retry behavior, timeout limits, and local testing tips, see [Webhook retries & debugging](/guides/platform/webhooks-from-nango#webhook-retries-debugging) and [Webhook limits](/guides/platform/limits#webhook-limits). + +## Related guides + +- [Webhook functions](/guides/functions/webhook-functions) +- [Process external webhooks](/getting-started/use-cases/webhooks-from-external-apis) +- [Receive webhooks from Nango](/guides/platform/webhooks-from-nango) +- [Observability](/guides/platform/observability) -Source: https://nango.dev/docs/guides/auth/customize-connect-ui.md -Description: Guide to branding Nango Connect UI, overriding setup links, or building a headless auth flow with your own UI. +## Common Issues - -Pre-requisites: -- complete the [Set up an integration](/guides/auth/auth-guide#guide) section of the Auth guide -- generate a [Connect session token](/guides/auth/auth-guide#guide) - +Source: https://nango.dev/docs/guides/platform/common-issues.md -Nango's pre-built [Connect UI](/guides/auth/auth-guide) is the recommended way to let users authorize integrations. It generates the right form for each API, validates required inputs, tests credentials when supported, and shows users where to find API keys or other required values. +--- +title: 'Common issues' +sidebarTitle: 'Common issues' +description: 'Troubleshooting guide for frequent errors and how to fix them.' +--- + +If you encounter an issue not documented here, reach out on the [Slack community](https://nango.dev/slack). + +## I just run `nango migrate-to-zero-yaml`, can I change the folder structure? + +Yes, you can change the folder structure. You can move files, zod definitions, types, rename files, folders, etc. +The results of the migration is just an example of how you can structure your project. + +## I'm getting `ZodXX is missing the following properties` errors + +If you are getting Zod errors, it's most likely because you are using a different version of Zod than the one we use in our CLI. We currently require zod `4.0.5`. + +If you have an overrides in your package.json or something that is changing the version of Zod, you will need to remove that. + +NB: `nango compile` will automatically update your dependencies to the version we use in our CLI. + +## Token refresh error from the external API + +Indications of the error: + +- Nango logs may show: + +```json +{ + "error": { + "message": "An error occurred during an HTTP call", + "payload": { + "error": { + "code": "invalid_credentials", + "payload": { [...] }, + "message": "The refresh limit has been reached for this connection." + } + } + } +} +``` + +- Or in `Token refresh` log operations: + +```json +{ + "payload": { + "dataMessage": { + "error_description": "Token has been expired or revoked.", + "error": "invalid_grant" + } + }, + "type": "refresh_token_external_error", + "status": 400 +} +``` + + +The `error` and `error_description` fields may differ by API, but typically include `invalid_grant` and mention the token being expired or revoked. + + +### How to debug + +- This error means the external API (e.g., Google, Salesforce) rejected the refresh token as expired or revoked. Nango retries several times, but if the error persists, the credentials are considered permanently broken. +- The only solution is to ask the user to re-authenticate. See: [How to trigger a re-authorization flow in Nango](/guides/auth/auth-guide#re-authorize-an-existing-connection) +- We recommend enabling [Nango's revoked token webhooks](/guides/platform/webhooks-from-nango#auth-webhooks) for real-time notifications. + +Revoked refresh tokens are a normal part of integrations. Ensure your app provides a good re-authorization experience for users. + +APIs may revoke tokens for unpredictable reasons. Only investigate if you observe an unusual increase of connection revocations for an API. Achieving a 0% revocation rate is not realistic. + +Known API-specific behaviors: +- Google: All tokens are revoked after 7 days if your OAuth app is in test mode ([detailed guide](https://www.nango.dev/blog/google-oauth-invalid-grant-token-has-been-expired-or-revoked)). To go to production, read our [guide for Google's OAuth app review](/api-integrations/google-shared/google-security-review). +- Salesforce: See [Salesforce refresh token issues](https://nango.dev/blog/salesforce-oauth-refresh-token-invalid-grant/). + + +## Connection not found (unknown_connection / 404) + +Indications of the error: + +- Request failed with status code `404` +- code `unknown_connection` +- error message: "No connection matching the provided params of 'connection_id' and 'provider_config_key'" + +```json +{ + "error": { + "message": "Request failed with status code 404", + "data": { + "error": { + "message": "No connection matching the provided params of 'connection_id' and 'provider_config_key'.Please make sure these values exist in the Nango dashboard [...]", + "code": "unknown_connection" + } + } + } +} +``` + +### How to debug + +1. Confirm the environment and secret key + - The `secretKey` in the API or SDK is specific to the environment. Make sure you pass the key that corresponds to the environment you are using (e.g., dev vs prod). + - Open [Environment Settings > API Keys](https://app.nango.dev/dev/environment-settings#api-keys) and verify the key matches. + +2. Verify the Integration ID (aka `providerConfigKey`) + - Go to [Integrations](https://app.nango.dev/dev/integrations), open the integration, and copy the `Integration ID` exactly. + - Ensure the value you send as `providerConfigKey` matches this ID. + +3. Verify the Connection ID + - Go to [Connections](https://app.nango.dev/dev/connections), find the connection, and copy its `Connection ID`. + - Ensure the value you send as `connectionId` (header `Connection-Id` when using HTTP, or `connectionId` in the SDK) matches exactly. + +## Related guides + +- [Observability](/guides/platform/observability) - inspect logs and exported traces. +- [Auth guide](/guides/auth/auth-guide#re-authorize-an-existing-connection) - repair broken connections with re-authorization. +- [Token refreshing and validity](/guides/auth/token-refreshing) - understand refresh failures. +- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - receive failure notifications. -You can customize that pre-built UI with your own branding. If you need full control over every screen, you can also skip Connect UI and use Nango in a **headless auth** mode. +## Migrate To Checkpoints -## Customize the pre-built Connect UI +Source: https://nango.dev/docs/guides/platform/migrations/migrate-to-checkpoints.md -You can customize the Connect UI theme from the Nango dashboard: +--- +title: 'Migrate to checkpoints' +sidebarTitle: 'Migrate to checkpoints' +description: 'Guide to migrate your sync functions from nango.lastSyncDate to the new checkpointing system.' +--- + +
+ +
+ +# Who is impacted + +If any of your sync functions read `nango.lastSyncDate` to determine where to resume syncing, you are impacted by this migration. + +To check, search your sync files for `lastSyncDate`. If you find references like `nango.lastSyncDate` or destructured equivalents, those syncs should be migrated to use checkpoints. + +If you want your syncs to be resilient to failures, ensuring that a failed run resumes from where it left off instead of starting over, you should also migrate any sync that paginates through large datasets, even if it doesn't currently use `lastSyncDate`. + +# What is changing + +`nango.lastSyncDate` is deprecated and replaced by checkpoints β€” a more flexible and resilient way to track sync progress. + +With `lastSyncDate`, Nango automatically tracked the timestamp of the last completed sync run. Your function could read it but not set it, and it was always a timestamp. With checkpoints, you define the schema, you control when it's saved, and you can store any type of progress marker β€” not just a date. + +| | `lastSyncDate` (deprecated) | Checkpoints | +| --- | --- | --- | +| **Type** | Always a `Date` | Any schema you define with Zod | +| **Control** | Managed by Nango, read-only | You set it explicitly with `saveCheckpoint()` | +| **Granularity** | Updated once per completed run | Updated mid-execution, after each batch | +| **Resilience** | If a run fails, no progress is saved | Progress is saved incrementally β€” the next run resumes from the last checkpoint | + + +Checkpoints also replace the `syncType: 'incremental'` field in your sync declaration. Whether the dataset is fetched from scratch or incrementally depends on how you use the checkpoint in your function code, not just whether you declared a checkpoint schema. + + +# Why this deprecation + +`lastSyncDate` had two significant limitations: + +1. **No mid-run resilience.** If a sync fetched 90% of its data and then failed, all progress was lost. The next run started over from the previous `lastSyncDate`, re-fetching everything. + +2. **Rigid type.** The value was always a timestamp managed by Nango. Some APIs use cursors, page tokens, or composite markers to track progress β€” `lastSyncDate` couldn't accommodate these. + +Checkpoints solve both problems. For a full overview, see the [checkpoints guide](/guides/functions/syncs/checkpoints). + +# Migration steps + + +## Migrate with the migrating-to-checkpoints skill + +You can migrate syncs to checkpoints with the **`migrating-to-checkpoints`** skill from [NangoHQ/skills](https://github.com/NangoHQ/skills). The skill guides a coding agent through converting `createSync()` implementations from `nango.lastSyncDate`, legacy `syncType: 'incremental'`, and non-resumable full refreshes to checkpoint-based syncs. + +Install it in your functions repo: + +```bash +npx skills add NangoHQ/skills -s migrating-to-checkpoints +``` + +Then ask your agent to migrate a specific sync using the `migrating-to-checkpoints` skill. The skill covers checkpoint schema selection, replacing `lastSyncDate` with `getCheckpoint()` and `saveCheckpoint()`, full-refresh recovery with `clearCheckpoint()`, and validating with `nango dryrun --checkpoint`. + +The manual steps below walk through the same migration if you prefer to do it by hand or want to review what the skill changes. + +## Step 1: Add a checkpoint schema to your sync declaration + +Add a `checkpoint` field to your `createSync()` call. In most cases, this is a single string field holding a timestamp: + +**Before:** +```typescript +export default createSync({ + description: 'Sync contacts from Salesforce', + frequency: 'every hour', + models: { Contact: ContactSchema }, + exec: async (nango) => { + // ... + }, +}); +``` + +**After:** +```typescript +export default createSync({ + description: 'Sync contacts from Salesforce', + frequency: 'every hour', + checkpoint: z.object({ + lastModifiedISO: z.string(), + }), + models: { Contact: ContactSchema }, + exec: async (nango) => { + // ... + }, +}); +``` + +If your sync previously declared `syncType: 'incremental'`, remove it β€” the presence of the `checkpoint` field replaces it. + +## Step 2: Replace `lastSyncDate` reads with `getCheckpoint()` + +Replace every reference to `nango.lastSyncDate` with a call to `nango.getCheckpoint()`. + +**Before:** +```typescript +exec: async (nango) => { + const lastSyncDate = nango.lastSyncDate; + + let query = 'SELECT Id, FirstName, LastName FROM Contact'; + if (lastSyncDate) { + query += ` WHERE LastModifiedDate > ${lastSyncDate.toISOString()}`; + } + query += ' ORDER BY LastModifiedDate ASC'; + + // ... fetch and save records +} +``` + +**After:** +```typescript +exec: async (nango) => { + const checkpoint = await nango.getCheckpoint(); + + let query = 'SELECT Id, FirstName, LastName FROM Contact'; + if (checkpoint) { + query += ` WHERE LastModifiedDate > ${checkpoint.lastModifiedISO}`; + } + query += ' ORDER BY LastModifiedDate ASC'; + + // ... fetch and save records +} +``` + +Note that `getCheckpoint()` is async and returns `null` on first run or after a reset, just like `lastSyncDate` was `null` on the first execution. + +## Step 3: Add `saveCheckpoint()` calls after each batch + +This is the most important change. With `lastSyncDate`, progress was saved automatically at the end of a run. With checkpoints, you save progress explicitly β€” and you should do it after every batch of records. + +**Before:** +```typescript +exec: async (nango) => { + const lastSyncDate = nango.lastSyncDate; + + while (nextPage) { + const res = await nango.get({ + endpoint: '/contacts', + params: { since: lastSyncDate?.toISOString(), cursor: nextPage }, + }); + + await nango.batchSave(mapContacts(res.data.records), 'Contact'); + nextPage = res.data.nextCursor; + } + // Progress saved automatically by Nango at run completion +} +``` + +**After:** +```typescript +exec: async (nango) => { + const checkpoint = await nango.getCheckpoint(); + + while (nextPage) { + const res = await nango.get({ + endpoint: '/contacts', + params: { since: checkpoint?.lastModifiedISO, cursor: nextPage }, + }); + + const contacts = mapContacts(res.data.records); + await nango.batchSave(contacts, 'Contact'); + + // Save progress after each page + const lastRecord = contacts[contacts.length - 1]; + await nango.saveCheckpoint({ lastModifiedISO: lastRecord.lastModified }); + + nextPage = res.data.nextCursor; + } +} +``` + +The pattern is: fetch a page, save records, save checkpoint. If the sync fails mid-way, the next run picks up from the last checkpoint instead of starting over. + +## Step 4: Test locally + +Use the CLI `dryrun` command with the `--checkpoint` flag to simulate resuming from a previous run: + +```bash +nango dryrun my-sync '' --checkpoint '{"lastModifiedISO": "2024-06-01T00:00:00Z"}' +``` + +Verify that your sync correctly filters data based on the checkpoint value. See the [testing guide](/guides/functions/testing) for how to write unit tests for checkpoint logic. + +## Step 5: Deploy + +Deploy as usual. On the first run after deployment, `getCheckpoint()` will return `null` (since no checkpoint has been saved yet), so the sync will perform a full initial fetch β€” just like it did on its first run with `lastSyncDate`. Subsequent runs will be incremental from the checkpoint. + +```bash +nango deploy +``` + + +Because the first post-migration run starts fresh, it may take longer than usual. This is expected and only happens once. + + + + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + + +## Related guides + +- [Checkpoints](/guides/functions/syncs/checkpoints) - understand the new checkpoint model. +- [Sync functions](/guides/functions/syncs/sync-functions) - update sync implementations. +- [Testing](/guides/functions/testing) - test checkpoint filtering. -1. Open **Environment Settings**. -2. Go to the **Connect UI** tab. -3. Choose the theme: light, dark, or system. -4. Set the primary color for the light theme. -5. Set the primary color for the dark theme. -6. Optionally remove the **Secured by Nango** mention. +## Migrate From End User -These settings apply to the pre-built Connect UI that you open with [`nango.openConnectUI()`](/reference/frontend/frontend-sdk#connect-using-nango-connect-ui). +Source: https://nango.dev/docs/guides/platform/migrations/migrate-from-end-user.md -Connect UI branding customization is available on the [Growth plan](https://www.nango.dev/pricing). +--- +title: 'Migrate from end user' +sidebarTitle: 'Migrate from end user' +description: 'Guide to migrate away from using end users in connections and connect sessions' +--- + +# Who is impacted + +You are impacted if you use any of the following to identify who a connection belongs to: + +- `end_user` / `organization` in `POST /connect/sessions` +- `end_user` / `organization` in auth webhooks (`endUser` payload) +- `end_user` fields in the Connections list or connection details for reconciliation + +# What is changing + +Connections now have a first-class `tags` object. Connect sessions accept a top-level `tags` object as well. + +The legacy `end_user` and `organization` fields are deprecated. Tags exist because the end-user fields were not flexible enough for many real-world attribution and routing use cases. + +When a connection is created via a Connect session: + +- the Connect session `tags` are copied onto the newly created connection +- the auth webhook includes those tags as top-level `tags` + + + Use `tags` as your source of truth for identifying who a connection belongs to. + The legacy `end_user` and `organization` fields are deprecated and will be removed in a future version. + + +# Migration steps + +## Step 1: Start sending tags for new connect sessions + +Add a `tags` object when creating a Connect session token in your backend: + + + + ```ts + import { Nango } from '@nangohq/node'; + + const nango = new Nango({ secretKey: process.env[''] }); + + const { data } = await nango.createConnectSession({ + // Recommended + tags: { + end_user_id: '', + end_user_email: '', + organization_id: '' + }, + + allowed_integrations: [''] + }); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/connect/sessions \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "tags": { + "end_user_id": "", + "end_user_email": "", + "organization_id": "" + }, + "allowed_integrations": [""] + }' + ``` + + + +For more details (including limitations and filtering), see [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata). + +## Step 2: Update webhook reconciliation to use `tags` + +Auth webhooks include connection tags as top-level `tags`. + +If you previously used `endUser.endUserId`, switch to using `tags` as your primary source of truth. For compatibility during rollout, handle both: + +```ts +function resolveOwnerFromWebhook(payload: any) { + // Preferred + if (payload.tags?.end_user_id) { + return { endUserId: payload.tags.end_user_id, endUserEmail: payload.tags.end_user_email, organizationId: payload.tags.organization_id }; + } + + // Legacy fallback + if (payload.endUser?.endUserId) { + return { endUserId: payload.endUser.endUserId, endUserEmail: payload.endUser.endUserEmail, organizationId: payload.endUser.organizationId }; + } + + return null; +} +``` + +## Step 3: Existing connections are already backfilled + +You do not need to patch anything. + +Nango has already backfilled standard tags (like `end_user_id`, `end_user_email`, `organization_id`) onto existing connections based on your legacy end-user fields. + +During the deprecation period, if you still create new connections using the deprecated `end_user` / `organization` fields, Nango will also populate connection tags automatically using the same translation logic: + +- `end_user.id` -> `tags.end_user_id` +- `end_user.email` (if present) -> `tags.end_user_email` +- `end_user.display_name` (if present) -> `tags.end_user_display_name` +- `organization.id` -> `tags.organization_id` +- `organization.display_name` (if present) -> `tags.organization_display_name` +- `end_user.tags` (if present) -> merged into `tags` (subject to the same validation and normalization rules) + +If you provide both deprecated end-user fields and a top-level `tags` object, the top-level `tags` values win. + +## Step 4: Stop using `end_user` + +Once your code relies on `tags`, stop sending or reading the deprecated `end_user` and `organization` fields. + + + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + + +## Related guides + +- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - use tags for connection attribution. +- [Auth guide](/guides/auth/auth-guide) - create connect sessions with tags. +- [Webhooks from Nango](/guides/platform/webhooks-from-nango#auth-webhooks) - reconcile auth webhooks with tags. -## Override documentation links +## Migrate From Public Key -By default, the Connect UI displays info icons that link to the Nango documentation. If you are embedding Connect UI in a customer-facing application and want these links to point to your own documentation instead, override them per integration using the `overrides` parameter when [creating a Connect session](/reference/backend/http-api/connect/sessions/create). +Source: https://nango.dev/docs/guides/platform/migrations/migrate-from-public-key.md -This feature is available on the [Growth plan](https://www.nango.dev/pricing). +--- +title: 'Migrate from public key' +sidebarTitle: 'Migrate from public key' +description: 'Guide to migrate from using the public key (and HMAC) to a Connect session.' +--- + +# Who is impacted + +If you use the Nango public key in your frontend, you are impacted by this migration. + +To check if you are using the public key, inspect your frontend code where the `Nango` object is instantiated. If the `config` parameter includes `publicKey`, you are affected. If it uses `connectSessionToken`, you are already up-to-date. + +# Changes summary + +1. The Nango public key is replaced with a short-lived Connect session token, fetched from your backend and passed to your frontend +2. The connection ID is now randomly generated by Nango instead of being specified manually +3. The connection ID is returned via backend webhooks instead of the frontend SDK + +# Migration timeline + +Public keys and HMAC signatures will be supported until **March 31, 2025** (announced on **January 31, 2025**). + +# Why this deprecation? + +For security reasons. + +If you were using the HMAC signature (strongly recommended in the docs), your authorization flow was already secure. However, not all users implemented HMAC, and we want to enforce best-in-class security practices by default. + +For those not using HMAC, the risk of attack was minimal but theoretically possible. We have no reports of such attacks, but feel free to reach out for more details. + +# Improvements with the Connect session + +1. The new Connect session flow is **secure by default** and replaces the HMAC signature. Randomly generated connection IDs further enhance security +2. Connection IDs are now **unique across integrations**, which will allow us to simplify API endpoints by transitioning from composite keys (`connection ID` + `integration ID`) to a single **unique connection ID** +3. The Connect session will let us provide additional API capabilities that can be called directly and securely from the frontend +4. The Connect session unlocks our [pre-built authorization UI](/guides/auth/auth-guide#guide), which simplifies collecting API keys, basic credentials, and OAuth flows with custom parameters. This UI also validates end-user inputs and provides guidance on required credentials + + +The Connect session works with both the pre-built authorization UI and custom authorization UIs. Custom authorization UIs are not being deprecated; they remain a critical feature and fully supported. + +The deprecated public key, however, was only compatible with custom authorization UIs and did not support the pre-built authorization UI. + + +# Migration steps + +This migration is split into 3 steps. You can migrate at your own pace, but we recommend doing it in this order. +During the migration, both connect session and public key authentication will work so you don't have to do all 3 steps at once. + + + Existing connections will keep the custom id you have used until now but new connections will have a random id. Your code will need to support both. + + +## Step 1: Attach tags to all existing connections + +Attach tags to all existing connections. +This step will allow you to use connect sessions with existing connections. +This will also be used to attribute webhooks to the correct end user. + + + + ```ts + import { Nango } from '@nangohq/node'; + +const nango = new Nango({ secretKey: process.env[''] }); + await nango.patchConnection({ + connectionId: '', + provider_config_key: '', + }, { + tags: { + end_user_id: '', + end_user_email: '', + organization_id: '' + } + }); +``` + + +```bash +curl -X PATCH https://api.nango.dev/v1/connections/ \ +-H "Authorization: Bearer " \ +-H "Content-Type: application/json" \ + -d '{ + "tags": { + "end_user_id": "", + "end_user_email": "", + "organization_id": "" + } + }' +``` + + + + +Check endpoint documentation [here](/reference/backend/http-api/connections/patch). + + +## Step 2: Implement the Connect and reconnect flows + +Follow the steps in this [guide](/guides/auth/auth-guide#guide), focusing on these key changes: + +Connect session token is now required to be passed to the frontend SDK. This improves security and allows you to pass additional information to the connection. + +### Step 3: Clean up + +Finally, remove all usage of the **public key and HMAC** from your frontend. + + + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + + +## Related guides + +- [Auth guide](/guides/auth/auth-guide) - implement Connect sessions. +- [Customize Connect UI](/guides/auth/customize-connect-ui) - migrate custom authorization UIs or customize the pre-built UI. +- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - add ownership attribution during migration. - +## Migrate To Zero Yaml - -See the full [SDK reference](/reference/backend/backend-sdk/node#create-a-connect-session) for all available parameters. +Source: https://nango.dev/docs/guides/platform/migrations/migrate-to-zero-yaml.md -```js -const { data } = await nango.createConnectSession({ - // Recommended: copied onto the connection and included in auth webhooks. - tags: { - end_user_id: '', - end_user_email: '', - organization_id: '' - }, +--- +title: 'Migrating to Zero YAML' +sidebarTitle: 'Migrating to Zero YAML' +description: 'Guide on how to migrate to Zero YAML in Nango.' +--- + +
+ +
+ +The `nango.yaml` configuration file is deprecated and should not be used for new integrations. If you are still using it, this guide will help you migrate your existing Nango integrations from the YAML-based approach to our new Zero YAML system, which uses pure TypeScript with modern tooling. + +## What is Zero YAML? + +Zero YAML is Nango's new approach to building integrations that eliminates the need for separate `nango.yaml` configuration files. Instead, everything is defined in TypeScript using a configuration-as-code approach with full type safety. + +Key benefits: +- **Type Safety**: Full TypeScript support with Zod schema validation +- **Better Developer Experience**: Modern tooling, enhanced CLI output, and better error messages +- **Portability**: Self-contained files that can be easily shared and version controlled +- **No Custom Syntax**: Pure TypeScriptβ€”no need to learn YAML-specific conventions and our previous custom model syntax + +Here's a quick example of the new syntax: + +```typescript +import { createSync } from 'nango'; +import * as z from 'zod'; + +const issueSchema = z.object({ + id: z.string(), + title: z.string(), + state: z.string() +}); + +const sync = createSync({ + description: 'Fetches GitHub issues', + frequency: 'every hour', + models: { GithubIssue: issueSchema }, + exec: async (nango) => { + await nango.batchSave([{ id: 'foobar' }], 'GithubIssue'); + } +}); +``` + +## How Zero YAML Works + +The new system is built around simplification + +### Simplified file Structure + +Like a regular TypeScript codebase + +```sh +β”œβ”€β”€ index.ts # Declare what's deployed +β”œβ”€β”€ package.json # Dependency management and types +β”œβ”€β”€ github/ # An integration + β”œβ”€β”€ syncs/ + β”‚ └── fetchIssues.ts # A sync + └── actions/ + └── createIssue.ts # An action +``` + +### Simplified configuration + +Three core functions that replace YAML configuration. You'll benefit from IntelliSense and type safety, directly in your IDE. No need to jump between files to find the right configuration. + +- **`createSync()`**: Defines data synchronization jobs +- **`createAction()`**: Defines one-off jobs +- **`createOnEvent()`**: Defines event-based jobs + + +---- + + +## Quick Migration Guide + +### Automatic Migration + +The easiest way to migrate is using our automated migration command: + +```bash +nango migrate-to-zero-yaml +``` + +This **operation is destructive** and will overwrite your existing files. Make sure to back up your existing files before running the command. + +This command will: +1. Analyze your existing `nango.yaml` and TypeScript files +2. Generate new self-contained TypeScript files +3. Create the required `package.json` if it doesn't exist +4. Set up the `index.ts` entry point +5. Preserve your existing logic and configuration + +### Post-Migration Steps + +The migration command should automatically transform all your files. However, you should review the changes and make sure everything is correct. + +Because the new format is stricter, some type issues can arise after the migration. + +### Migration Plan + +We recommend: +1. **Back up** your current nango integrations folder +2. Use your **dev env** to migrate to test the new format +3. Deploy to **prod env** after you have assessed that everything works properly + +## What Has Changed? + +### Configuration: YAML β†’ TypeScript Objects + +**Before** (nango.yaml + separate .ts file): +```yaml +# nango.yaml +integrations: + github: + issues: + runs: every 1h + sync_type: full + endpoint: GET /issues + description: Fetches GitHub issues +models: + GithubIssue: + id: string + title: string +``` + +**After** (single self-contained file): +```typescript +const sync = createSync({ + description: 'Fetches GitHub issues', + frequency: 'every hour', + models: { GithubIssue: issueSchema } +}); +``` + +### Models: YAML Definitions β†’ Zod Schemas + +**Before**: +```yaml +models: + GithubIssue: + id: string + title: string + state: string +``` + +**After**: +```typescript +const issueSchema = z.object({ + id: z.string(), + title: z.string(), + state: z.string() +}); +``` + +## Before and After Examples + +### Sync Example + +**Before** (issues.ts + nango.yaml excerpt): +```typescript +// issues.ts +import type { NangoSync, GithubIssue } from '../../models'; + +export default async function fetchData(nango: NangoSync) { + // Sync logic here +} +``` + +```yaml +# nango.yaml excerpt +integrations: + github: + issues: + runs: every 1h + sync_type: full + endpoint: GET /issues +``` + +**After** (self-contained fetchIssues.ts): +```typescript +import { createSync } from 'nango'; +import * as z from 'zod'; + +const issueSchema = z.object({ + id: z.string(), + title: z.string(), + state: z.string() +}); + +const sync = createSync({ + description: 'Fetches GitHub issues', + frequency: 'every hour', + models: { GithubIssue: issueSchema }, + exec: async (nango) => { + // Your existing sync logic here + } +}); + +export default sync; +``` + +### Action Example + +**Before** (separate files): +```typescript +// create-issue.ts +export default async function runAction(nango: NangoAction, input: CreateIssueInput) { + // Action logic +} +``` + +**After** (self-contained): +```typescript +import { createAction } from 'nango'; +import * as z from 'zod'; + +const inputSchema = z.object({ + title: z.string(), + body: z.string() +}); + +const action = createAction({ + description: 'Create a GitHub issue', + input: inputSchema, + output: z.void(), + exec: async (nango, input) => { + // Your action logic here + } +}); + +export default action; +``` + +### Index File Structure + +The new `index.ts` file imports all your integrations: + +```typescript +// index.ts +import './github/syncs/fetchIssues.js'; +import './github/actions/createIssue.js'; +// Add more imports as needed +``` + +## Migration Gotchas & FAQ + +### Gotchas +```typescript +err - github/syncs/issues.ts:57:43 + Argument of type '{ id: number; owner: string; repo: string; issue_number: number; title: string; author: string; author_id: string; state: string; date_created: Date; date_last_modified: Date; body: string; }[]' is not assignable to parameter of type 'RawModel[]'. + Type '{ id: number; owner: string; repo: string; issue_number: number; title: string; author: string; author_id: string; state: string; date_created: Date; date_last_modified: Date; body: string; }' is not assignable to type 'RawModel'. + Types of property 'id' are incompatible. + Type 'number' is not assignable to type 'string'. +``` +Previously you were setting the ID property of a sync to a number when it should always be a string. + +------ + +```typescript +err - 1password-scim/actions/create-user.ts:26:45 + Property 'errors' does not exist on type 'ZodError<{ firstName: string; lastName: string; email: string; active?: boolean | undefined; externalId?: string | undefined; phoneNumbers?: { type: "work" | "mobile" | "other"; value: string; }[] | undefined; photos?: { ...; }[] | undefined; addresses?: { ...; }[] | undefined; title?: string | undefined; }>'. +``` +Previously you were validating an input using Zod in this way +```typescript +const parsedInput = scimCreateUserSchema.safeParse(input); + +if (!parsedInput.success) { + for (const error of parsedInput.error.errors) { + await nango.log( + `Invalid input provided to create a user: ${error.message} at path ${error.path.join(".")}`, + { level: "error" }, + ); + } + + throw new nango.ActionError({ + message: "Invalid input provided to create a user", + }); +} +``` +Instead of this, you can use a Nango helper: +```typescript +const parsedInput = await nango.zodValidateInput({ zodSchema: scimCreateUserSchema, input }); +``` + +### Nango.yaml EOL + +**Q: When will nango.yaml stop being supported?** + +**A:** nango.yaml integrations will be supported until the end of 2025. Zero YAML will be the only supported way to build integrations after that. An official roadmap will be published soon. + +### Package.json Requirement + +**Q: Why is package.json now mandatory?** + +**A:** The new system uses modern JavaScript tooling that requires proper dependency management. The `package.json` ensures: +- Consistent dependency versions across environments +- Proper module resolution +- Better integration with modern development tools + +If you don't have one, the migration command will create it automatically. + +Note: Bundling custom dependencies is not yet possible but is now on our roadmap thanks to this update. + +### Backward Compatibility + +**Q: What still works the same?** + +**A:** Your core integration logic remains unchanged. No new features or breaking changes. All CLI commands are still available. + +### Testing Migrated Integrations + +**Q: How do I test after migration?** + +**A:** Use the same testing commands: + +```bash +# Test a specific sync +nango dryrun +``` + +### Rollback Process + +**Q: Can I rollback if something goes wrong?** + +**A:** Yes, Nango's platform remains compatible with nango.yaml at all times: +1. Go to your backup folder +2. `nango deploy dev` + +Keep your original files until you've fully validated the migration. + +--- + +The Zero YAML approach represents a significant step forward in Nango's developer experience. By eliminating custom syntax and embracing pure TypeScript, we've made integrations more maintainable, shareable, and enjoyable to work with. Many more features will be possible thanks to this new syntax. + +If you encounter any issues during migration, our support team is ready to help. Happy integrating! πŸš€ + + + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + + +## Related guides + +- [Functions guide](/guides/functions/functions-guide) - understand the current TypeScript-first project layout. +- [Functions CLI](/reference/functions/functions-cli) - deploy and dry-run migrated functions. +- [Testing](/guides/functions/testing) - verify migrated integrations before rollout. - allowed_integrations: ['', ''], - integrations_config_defaults: { - '': { - connection_config: { - '': '' - } - } - }, - overrides: { - '': { - docs_connect: 'https://your-docs.com/how-to-connect' - } - } -}); -``` -
+## Frontend Sdk - -See the full [API reference](/reference/backend/http-api/connect/sessions/create) for all available parameters. +Source: https://nango.dev/docs/reference/frontend/frontend-sdk.md -```bash -curl --request POST \ - --url https://api.nango.dev/connect/sessions \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "tags": { - "end_user_id": "", - "end_user_email": "" - }, - "overrides": { - "": { - "docs_connect": "https://your-docs.com/how-to-connect" - } - } -}' -``` - +--- +title: 'Frontend SDK' +sidebarTitle: 'Frontend SDK' +icon: 'js' +--- + +Trigger authorization flows in your frontend with this SDK. It is available on [NPM](https://www.npmjs.com/package/@nangohq/frontend) as `@nangohq/frontend`. + +# Instantiate the frontend SDK + +```ts +import Nango from '@nangohq/frontend'; + +const nango = new Nango({ connectSessionToken: '' }); +``` + +**Parameters** + + + + + + Get your public key in the environment settings of the Nango UI. This is key is not sensitive. + + + + Omitting the host points to Nango Cloud. For local development, use `http://localhost:3003`. Use your instance URL if self-hosting. + + + + For self-hosted instances only to specify a customs path for the WebSocket connection. + + + + Specify a specific width for the OAuth authorization modal. + + + + Specify a specific height for the OAuth authorization modal. + + + + Print additional console logs to debug authorization issues. + + + + + + +# Connect using Nango Connect UI + +Nango provides a UI component that guides your app's users through automatically and securely setting up an integration. This UI is hosted on Nango's servers and requires minimal setup on your end to get started quickly. +This is the recommended way to use Nango in your frontend. + +```js +const connectUI = nango.openConnectUI({ sessionToken: 'SESSION_TOKEN' }); +``` + +**Parameters** + + + The unique token to identify your user. It is required but can be set asynchronously. + + + + The base URL to load the UI + + + + The base URL to reach Nango API + + + + A callback to listen to events sent by Nango Connect + + + + Control OAuth popup close detection. If set to true, a closed popup will be detected as a failed authorization. + + + + The language to use for the UI. Defaults to browser language or english if not supported. + + + + The theme (light, dark, system) to use for the UI. Overrides your global setting in the dashboard. + + + +**Response** + + + + The class to manipulate Nango Connect + + + +# Connect using the headless client + +You store end-user credentials with the `nango.auth` method. It creates a connection in Nango. + + + + + +For OAuth, this will open a modal to let the user log in to their external account. + +```js +const result = await nango.auth('').catch((error) => { +... +}); +``` + + + + + +For API key authorization, pass the end-user's previously-collected API key directly in the parameters. + +```js +const result = await nango.auth('', { + credentials: { apiKey: '' } +}).catch((error) => { + ... +}); +``` + + + + + +For Basic Auth, pass the end-user's previously-collected username & password in the parameters. + +```js +const result = nango.auth('', { + credentials: { username: '', password: '' } +}).catch((error) => { + ... +}); +``` + + + + +**Parameters** + + + The integration ID that you can find in the integration settings on the Nango UI. + + + + The connection ID that you can find in the _Connections_ tab on the Nango UI. + + + + + + Specify additional connection configuration necessary to perform the authorization request. + + + + HMAC key to secure the authorization flow + + + + If `true`, `nango.auth()` would fail if the login window is closed before the authorization flow is completed. + + + + For OAuth, specify the query parameters of the authorization URL. + + + + For Slack OAuth, specify user-specific scopes. + + + + + + For API key authorization, pass in the user's API key. + + + + For Basic authorization, pass in the user's username. + + + + For Basic authorization, pass in the user's password. + + + + For OAuth 2, override the integration's client ID with a connection-level client ID. This is useful when your users bring their own OAuth 2 app (e.g. Netsuite). + + + + For OAuth 2, override the integration's client secret with a connection-level client secret. This is useful when your users bring their own OAuth 2 app (e.g. Netsuite). + + + + + + + +**Success response** + + + + The integration ID that you can find in the integration settings on the Nango UI. + + + + The connection ID that you can find in the _Connections_ tab on the Nango UI. + + + +**Error response** + + + + + The type of error (e.g. 'authorization_cancelled'). + + + + The detailed error message (e.g. 'Authorization fail: The user has closed the authorization modal before the process was complete.'). + + + + + +# Error Handling + +The Nango Frontend SDK may throw different types of errors during authentication and connection setup. Below is a list of all possible error types along with their meanings: + +1. `missing_auth_token` + - Occurs when neither a public key nor a connect session token is provided. + - Message: "You must specify a public key OR a connect session token (cf. documentation)." + +2. `blocked_by_browser` + - Occurs when the browser blocks the popup window for authentication. + - Message: "Modal blocked by browser" + +3. `invalid_host_url` + - Occurs when the provided host URL is invalid. + - Message: "Invalid URL provided for the Nango host." + +4. `missing_credentials` + - Occurs when required credentials are not provided. + - Message: "You must specify credentials." + +5. `window_closed` + - Occurs when the authentication window is closed before completing the flow. + - Message: "The authorization window was closed before the authorization flow was completed" + +6. `connection_test_failed` + - Occurs when credential verification fails for certain integrations before the connection is established. + - Message: "The given credentials were found to be invalid. Please check the credentials and try again." + +7. `missing_connect_session_token` + - Occurs when attempting to reconnect without a session token. + - Message: "Reconnect requires a session token" + +8. `resource_capped` + - Occurs when the resource usage limit has been reached. + - Message: "Reached maximum number of allowed connections for your plan" or "Reached maximum number of connections with functions enabled" + +9. `unknown_error` + - Occurs when an unexpected error happens that doesn't fall into other error categories. + - Message: Varies depending on the underlying error (e.g., network failures, unexpected exceptions) + +## Error Response Structure + +All errors from the Nango Frontend SDK follow this structure: + +```json +{ + "error": { + "code": "", + "message": "" + } +} +``` + +## Handling Errors + +You can handle these errors in your code using the `AuthError` class. + +```ts +import { AuthError } from '@nangohq/frontend'; + +try { + const result = await nango.auth('', { + credentials: { apiKey: '' } + }); +} catch (error) { + if (error instanceof AuthError && error.type === '') { + // Handle specific error + console.error('Your error message'); + } +} +``` + +**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + -
+## API keys -Replace `` with the unique name of the integration, for example `jira` or `slack`, and set `docs_connect` to the URL you want the info icons to link to. +Source: https://nango.dev/docs/reference/backend/http-api/api-keys.md +Description: Manage API keys with scoped permissions for your Nango environments. -## Build your own auth UI +# API keys -Headless auth means you build the user-facing setup UI yourself and use the frontend SDK to pass the required values to Nango. +API keys allow programmatic access to your Nango environment. Each environment can have multiple API keys with different permissions, enabling you to follow the principle of least privilege. -Headless auth still uses Nango for the backend parts of auth: Nango stores credentials, refreshes OAuth tokens, manages connection records, sends auth webhooks, and lets you call APIs through the proxy or from functions. What changes is the setup experience your user sees before the connection is created. +## Managing API Keys -## What changes with headless auth +API keys are managed in the Nango UI under **Environment Settings > API Keys**. -For OAuth APIs, calling `nango.auth()` opens the external API's login popup directly. Your user skips the Nango pre-authorization screen. This is useful when you want a shorter flow, but it also means you must collect any provider-specific inputs that the Nango Connect UI would normally ask for first. +Each environment comes with a **Default - Full access** key that grants access to all API endpoints. You can create additional keys with restricted scopes for specific use cases. -For API key, Basic Auth, and other non-OAuth flows, there is no external login popup. You must build the form that collects the user's credentials, validate field formats in your own UI, and pass the credentials to `nango.auth()`. Nango can still reject invalid credentials when the integration supports credential checks, but your UI owns the input fields, error messages, and setup guidance. +### Creating a Key -Some APIs also require **connection configuration** in addition to credentials. For example, an API might need a subdomain, domain, tenant ID, region, or account-specific base URL to build the authorization URL or make future API requests. Connect UI collects these fields automatically. With headless auth, your UI must collect them and pass them programmatically. +1. Go to **Environment Settings > API Keys** +2. Click **Create API Key** +3. Enter a display name (e.g., "CI Deploy Key", "Backend service") +4. Choose **Full access** or **Custom** permissions β€” custom lets you pick individual scopes +5. The key is created immediately and can be revealed and copied from the key list -See [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) for the difference between connection configuration, metadata, and tags. +### Rotating a Key -## Use the frontend SDK for headless auth +To rotate a key: +1. Create a new key with the same scopes +2. Update your application to use the new key +3. Monitor the **Last used** column on the old key to confirm it's no longer in use +4. Delete the old key -In your frontend, initiate Nango ([reference](/reference/frontend/frontend-sdk#instantiate-the-frontend-sdk)): +### Using a Key -```ts -import Nango from '@nangohq/frontend'; +Pass the API key as a Bearer token in the `Authorization` header: -const nango = new Nango({ connectSessionToken: '' }); -``` + + + ```ts + import { Nango } from '@nangohq/node'; -Then create the connection with `nango.auth()` ([reference](/reference/frontend/frontend-sdk#connect-using-the-headless-client)): + const nango = new Nango({ secretKey: '' }); + ``` + + + ```bash + curl --request GET \ + --url https://api.nango.dev/connections \ + --header 'Authorization: Bearer ' + ``` + + - +## Scopes - +Scopes control what an API key can access. When creating a key with **Custom** permissions, you select which scopes to grant. A key without a specific scope will receive a `403 Forbidden` response when trying to access a protected endpoint. -For OAuth, `nango.auth()` opens the external API's login popup directly. +### Credential Scopes -```js -nango - .auth('') - .then((result) => { - // Show success UI. - }) - .catch((error) => { - // Show failure UI. - }); -``` +Some resources (Integrations and Connections) have sensitive credential data. Access to this data is controlled by dedicated `_credentials` scopes: - +- `list` / `read` β€” returns the resource **without** sensitive credentials +- `list_credentials` / `read_credentials` β€” returns the resource **with** credentials (access tokens, client secrets, etc.) - +The `_credentials` scopes are supersets β€” selecting `read_credentials` automatically includes `read` access. You don't need to select both. -For API key auth, collect the API key in your own UI, then pass it to Nango. +| Resource | Without credentials | With credentials | +|----------|-------------------|-----------------| +| **Connections** | Connection metadata, tags, status | + access/refresh tokens | +| **Integrations** | Provider, display name, config | + client ID and client secret | -```js -nango - .auth('', { - credentials: { - apiKey: '' - } - }) - .then((result) => { - // Show success UI. - }) - .catch((error) => { - // Show failure UI. - }); -``` +## Advised Profiles - +Common scope combinations for typical use cases: - +### Auth (Connect UI) -For Basic Auth, collect the username and password in your own UI, then pass them to Nango. +For backends that create connect sessions for the auth flow: -```js -nango - .auth('', { - credentials: { - username: '', - password: '' - } - }) - .then((result) => { - // Show success UI. - }) - .catch((error) => { - // Show failure UI. - }); -``` - +| Scope | +|-------| +| `environment:connect_sessions:write` | - +### CI/CD Deploy -## Pass connection configuration +For CI/CD pipelines deploying syncs and actions to production: -Some APIs require connection-specific configuration to authorize or make API requests later. Zendesk is a common example: the OAuth authorization URL includes the user's Zendesk subdomain: +| Scope | +|-------| +| `environment:deploy` | -`https://.zendesk.com/oauth/authorizations/new` +### Backend Service -With Connect UI, Nango asks for this value in an automatically generated form. With headless auth, collect it in your own UI and pass it as `params`: +For backend services that consume data, trigger actions, and proxy requests: -```js -nango.auth('zendesk', { - params: { subdomain: '' } -}); -``` +| Scope | +|-------| +| `environment:connections:read` | +| `environment:records:read` | +| `environment:actions:execute` | +| `environment:syncs:execute` | +| `environment:proxy` | -You can also set default connection configuration when you create the Connect session. This is useful when your backend already knows a required value: +Add `environment:connections:read_credentials` if the service needs access to connection tokens. - + +For extra security, avoid when possible granting `environment:connections:list` to backend services. Without it, connection IDs act as connection-specific secrets β€” a leaked API key alone won't let an attacker enumerate and access customer data. + - +### Local Development -```js -const { data } = await nango.createConnectSession({ - allowed_integrations: [''], - integrations_config_defaults: { - '': { - connection_config: { - '': '' - } - } - } -}); -``` - +For local development, use a **Full access** key. This is the default key created for each environment. - +## CLI -```bash -curl --request POST \ - --url https://api.nango.dev/connect/sessions \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "allowed_integrations": [""], - "integrations_config_defaults": { - "": { - "connection_config": { - "": "" - } - } - } - }' -``` - +The Nango CLI uses the `NANGO_SECRET_KEY_` environment variable for authentication. Set it to an API key with the required scopes: - +| CLI Command | Required Scope | +|-------------|---------------| +| `nango deploy` | `environment:deploy` | +| `nango dryrun` | `environment:connections:read` + `environment:integrations:read` + `environment:proxy` | -In some cases, you might want to override scopes at the connection level. Pass the scopes to `nango.auth()`: +For most functions, `environment:connections:read` is sufficient for `nango dryrun` β€” Nango injects credentials into the proxy automatically, so the function does not need them in its response. Upgrade to `environment:connections:read_credentials` when the function reads credential data from the connection, including: -```js -nango.auth('', { - params: { oauth_scopes_override: 'custom-connection-scope' } -}); -``` +- accessing `connection.credentials` directly (e.g. `nango.getConnection().credentials`) +- calling `nango.getToken()` β€” returns the access token from `connection.credentials` +- calling `nango.getRawTokenResponse()` β€” returns `connection.credentials.raw` -Nango stores this connection configuration on the connection. You can retrieve it with the SDK ([reference](/reference/backend/backend-sdk/node#get-a-connection-with-credentials)) or API ([reference](/reference/backend/http-api/connections/get)), or see it in connection details in the Nango UI. +Without `read_credentials`, these helpers return empty values because the API strips the `credentials` field from the response. -## Next +The **Default - Full access** key that comes with each environment already has all required scopes for deploying and dry-running. For production CI/CD pipelines, consider creating a dedicated key with only the `environment:deploy` scope to follow the principle of least privilege. -Once authorization succeeds, [_save the connection ID_](/guides/auth/auth-guide#guide). +## All Available Scopes - - **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - +### Integrations -## Related guides +| Scope | Description | +|-------|-------------| +| `environment:integrations:list` | List integrations (no credentials) | +| `environment:integrations:list_credentials` | List integrations with client credentials | +| `environment:integrations:list_functions` | List deployed functions (syncs and actions) | +| `environment:integrations:read` | Read a single integration (no credentials) | +| `environment:integrations:read_credentials` | Read a single integration with client credentials | +| `environment:integrations:create` | Create integrations | +| `environment:integrations:update` | Update integrations | +| `environment:integrations:delete` | Delete integrations | -- [Auth guide](/guides/auth/auth-guide) - compare the managed Connect UI flow. -- [Frontend SDK reference](/reference/frontend/frontend-sdk#connect-using-the-headless-client) - headless authorization methods and parameters. -- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - understand connection-level storage. +### Connections -## Token refreshing & validity +| Scope | Description | +|-------|-------------| +| `environment:connections:list` | List connections (no credentials) | +| `environment:connections:list_credentials` | List connections with access/refresh tokens | +| `environment:connections:read` | Read a single connection (no credentials) | +| `environment:connections:read_credentials` | Read a single connection with access/refresh tokens | +| `environment:connections:create` | Create connections | +| `environment:connections:update` | Update connections and metadata | +| `environment:connections:delete` | Delete connections | -Source: https://nango.dev/docs/guides/auth/token-refreshing.md -Description: How Nango handles OAuth token refresh and what to do when tokens are revoked. +### Connect Sessions -## Automatic token refresh +| Scope | Description | +|-------|-------------| +| `environment:connect_sessions:write` | Create and reconnect sessions for the Connect UI auth flow | -Nango automatically refreshes OAuth access tokens before they expire. You don't need to implement any refresh logic in your application. +### Syncs -To prevent token revocation due to inactivity (some APIs revoke unused refresh tokens), Nango refreshes each access token at least once every 24 hours. +| Scope | Description | +|-------|-------------| +| `environment:syncs:read` | Read sync status | +| `environment:syncs:execute` | Trigger, pause, start syncs | +| `environment:syncs:update` | Update sync connection frequency | +| `environment:syncs:variant:create` | Create sync variants | +| `environment:syncs:variant:delete` | Delete sync variants | -## Handling refresh failures +### Deploy -Token refresh can fail for various reasons: -- The user revoked access in the external application -- The external API revoked the refresh token -- The external API experienced an outage +| Scope | Description | +|-------|-------------| +| `environment:deploy` | Deploy syncs and actions via CLI or API | -When a refresh fails, Nango can [notify your app via webhook](/guides/platform/webhooks-from-nango) so you can prompt the user to reconnect. +### Functions -## Best practices +| Scope | Description | +|-------|-------------| +| `environment:functions:list` | List deployed functions | +| `environment:functions:read` | Read a single deployed function | +| `environment:functions:delete` | Delete a deployed function | +| `environment:functions:compile` | Compile function source code | +| `environment:functions:dryrun` | Dry run function source code | -Revoked access tokens and refresh failures happen to all integrations. To handle them gracefully: +### Records -1. **Monitor for failures**: Set up [webhooks from Nango](/guides/platform/webhooks-from-nango) to receive notifications when token refresh fails -2. **Handle revoked tokens**: Follow our [guide on handling revoked access tokens](/guides/platform/common-issues#token-refresh-error-from-the-external-api) -3. **Implement re-authorization**: Make sure you have the [re-authorization flow](/guides/auth/auth-guide#re-authorize-an-existing-connection) in place so users can easily reconnect broken connections +| Scope | Description | +|-------|-------------| +| `environment:records:read` | Read synced records | +| `environment:records:write` | Prune records | -## Related guides +### Actions -- [Auth guide](/guides/auth/auth-guide#re-authorize-an-existing-connection) - implement reconnect sessions for invalid credentials. -- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - receive refresh failure notifications. -- [Common issues](/guides/platform/common-issues#token-refresh-error-from-the-external-api) - troubleshoot revoked tokens. +| Scope | Description | +|-------|-------------| +| `environment:actions:execute` | Trigger actions and read action results | - -**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - +### Proxy -## Functions guide +| Scope | Description | +|-------|-------------| +| `environment:proxy` | Send proxy requests to external APIs through Nango | -Source: https://nango.dev/docs/guides/functions/functions-guide.md -Description: Understand Nango Functions and choose the right way to start using them. +### Variables -## Overview +| Scope | Description | +|-------|-------------| +| `environment:variables:read` | Read environment variables | -**Functions** are Nango's runtime for custom integration logic. +### MCP -When you build integrations directly, every provider forces you to solve the same hard problems: OAuth credentials, token refresh, per-customer permissions, retries, rate limits, data freshness, observability, and safe execution. Nango handles that infrastructure, and functions let you write the provider-specific logic that is unique to your product. +| Scope | Description | +|-------|-------------| +| `environment:mcp` | Access the MCP endpoint | -You write functions in TypeScript and deploy them to Nango. Your app can call them from any language, framework, backend job, or agent workflow. Each execution runs for a specific integration and connection, so the function has scoped access to the right customer's credentials without exposing those credentials to your app or agent. +## Authentication -## How functions fit +Source: https://nango.dev/docs/reference/backend/http-api/authentication.md -1. Your user authorizes an external API through [Nango Auth](/guides/auth/auth-guide). -2. Your app stores the resulting `connectionId`. -3. You enable or deploy functions for the integration. -4. Nango runs the function on demand, on a schedule, from an external webhook, or after a connection lifecycle event. -5. Your app receives the function result, sync records, or webhooks from Nango. +--- +title: 'Authentication' +--- + +Use an [API key](/reference/backend/http-api/api-keys) as a Bearer token in the `Authorization` header. API keys are managed in **Environment Settings > API Keys** in the Nango UI. + +``` +Authorization: Bearer +``` + +Each API key has [scopes](/reference/backend/http-api/api-keys#scopes) that control which endpoints it can access. A key without the required scope will receive a `403 Forbidden` response. -Functions are the right layer when you need custom API logic, data syncing, webhook processing, AI tools, or per-customer integration behavior. +## Rate Limits -## Capabilities +Source: https://nango.dev/docs/reference/backend/http-api/rate-limits.md -- **Scoped external API access** β€” run API calls with the credentials and scopes of one connection. -- **Any app stack** β€” trigger functions through HTTP APIs or SDKs from any backend language. -- **Multiple trigger types** β€” call functions on demand, run them on a schedule, route external webhooks into them, or react to connection lifecycle events. -- **Agent-ready tools** β€” expose selected functions to agents through the API or Nango's MCP server while keeping provider credentials out of the model loop. -- **Built-in integration infrastructure** β€” retries, rate-limit handling, logs, OpenTelemetry export, records storage, checkpoints, and per-connection metadata. -- **Flexible development workflows** β€” enable a template, build headlessly through the Functions API, or keep function code in a local CLI project. +--- +title: 'Rate limits' +--- + +The Nango API is rate-limited to prevent abuse and ensure fair usage across all clients. The rate limit is enforced on a per-account basis, with a fixed window of time and a maximum number of requests allowed within that window. + +Those headers are sent back with every API response: +- `X-RateLimit-Limit` indicates the maximum number of requests a client can make within the rate limit window. +- `X-RateLimit-Remaining` shows how many requests are remaining before the limit is reached. +- `X-RateLimit-Reset` provides a Unix timestamp representing the time at which the current rate limit window resets, and the remaining request count is replenished. + +If a client exceeds the rate limit, the API will respond with a 429 `Too Many Requests` status code. In this case, the `Retry-After` header is included, indicating the number of seconds the client should wait before making another request to avoid being rate-limited. - -## Guide +## List -### Ways to enable functions +Source: https://nango.dev/docs/reference/backend/http-api/integration/list.md -There are three ways to enable or develop Nango functions. Start with the path that matches how much control and dynamism you need. +--- +title: 'List all integrations' +openapi: 'GET /integrations' +--- + + + Requires an API key with one of: `environment:integrations:list` or `environment:integrations:list_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + + + +```ts Node Client +const nango = new Nango({ secretKey }); + +const response = await nango.listIntegrations(); +``` + + + + +```json Example Response +{ + "data": [ + { + "unique_key": "slack-nango-community", + "display_name": "Slack", + "provider": "slack", + "logo": "http://localhost:3003/images/template-logos/slack.svg", + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z", + }, + { + "unique_key": "github-prod", + "display_name": "GitHub", + "provider": "github", + "logo": "http://localhost:3003/images/template-logos/github.svg", + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z", + }, + ] +} +``` + -| Path | Best for | How it works | -| --- | --- | --- | -| [Option 1: Use function templates](#use-function-templates) | Getting started quickly when Nango already has the provider operation in the catalog. | Enable a pre-built function on an integration, then call it from your app, backend job, or agent workflow. | -| [Option 2: Build locally with the CLI](#build-locally-with-the-cli) | Serious production use cases where you want reviewable diffs, tests, CI/CD, and source control. | Write TypeScript functions in your repo, dry run them against real connections, and deploy with the Nango CLI. | -| [Option 3: Build with the Functions API](#build-with-the-functions-api) | Prototypes, provider operations not covered by templates, and just-in-time integrations where an agent creates behavior dynamically. | Send generated TypeScript source to Nango, compile it, dry run it, and deploy it without a local functions project. | +## Get - - - -### Option 1: Use function templates +Source: https://nango.dev/docs/reference/backend/http-api/integration/get.md -Function templates are pre-built Nango functions for common provider operations. Use them when the catalog already covers what you need and you want the shortest path to a working integration. +--- +title: 'Get an integration' +openapi: 'GET /integrations/{uniqueKey}' +--- + + + Requires an API key with one of: `environment:integrations:read` or `environment:integrations:read_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + + +```json Basic response +{ + "data": { + "unique_key": "slack-nango-community", + "display_name": "Slack", + "provider": "slack", + "logo": "http://localhost:3003/images/template-logos/github.svg", + "forward_webhooks": true, + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z" + } +} +``` + +```json With credentials (OAuth2/OAuth1/TBA) +{ + "data": { + "unique_key": "github-nango", + "display_name": "GitHub", + "provider": "github", + "logo": "http://localhost:3003/images/template-logos/github.svg", + "forward_webhooks": false, + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z", + "credentials": { + "type": "OAUTH2", + "client_id": "abc123", + "client_secret": "secret456", + "scopes": "repo,user", + "webhook_secret": null + } + } +} +``` + +```json With credentials (GitHub App / CUSTOM) +{ + "data": { + "unique_key": "github-app-nango", + "display_name": "GitHub App", + "provider": "github-app", + "logo": "http://localhost:3003/images/template-logos/github.svg", + "forward_webhooks": false, + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z", + "credentials": { + "type": "CUSTOM", + "client_id": "abc123", + "client_secret": "secret456", + "app_id": "123456", + "app_link": "https://github.com/apps/my-app", + "private_key": "-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----" + } + } +} +``` + -You can find templates in the [template catalog](https://www.nango.dev/templates), in the integration page of the Nango dashboard, and in the [Nango integration templates repository](https://github.com/NangoHQ/integration-templates). +## Create -When a template matches your use case, enable it on the integration and call it from your app. If it is close but not exact, [pull it into a local functions project and customize it](#extend-a-template). +Source: https://nango.dev/docs/reference/backend/http-api/integration/create.md - -#### Extend a template +--- +title: 'Create an integration' +openapi: 'POST /integrations' +--- + + + Requires an API key with the `environment:integrations:create` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + + +```json Example Response +{ + "data": { + "unique_key": "slack-nango-community", + "display_name": "Slack", + "provider": "slack", + "logo": "http://localhost:3003/images/template-logos/github.svg", + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z", + } +} +``` + -Use the CLI to pull a template's code into your local functions project from the public catalog: +## Update -```bash -nango pull github list-repos --catalog -``` +Source: https://nango.dev/docs/reference/backend/http-api/integration/update.md -`nango pull` writes a single function and its dependencies. After pulling, review the source and schemas, import the function from `index.ts` if needed, adjust inputs, outputs, record models, metadata, or provider mapping logic, then run `nango dryrun` and deploy with `nango deploy`. +--- +title: 'Update an integration' +openapi: 'PATCH /integrations/{uniqueKey}' +--- + + + Requires an API key with the `environment:integrations:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + - - Pull template code when you need custom fields, a smaller output shape, customer-specific filtering, different retry behavior, or a provider workflow that is close to a template function but not identical. - +## Delete - -### Option 2: Build locally with the CLI +Source: https://nango.dev/docs/reference/backend/http-api/integration/delete.md -Local development is the default path for production integrations. Use it when your engineering team wants function code in source control, reviewable diffs, local tests, CI/CD, and a stable project layout. +--- +title: 'Delete an integration' +openapi: 'DELETE /integrations/{uniqueKey}' +--- + + + Requires an API key with the `environment:integrations:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + -
- -
+## Create - - - Install the Nango CLI globally: +Source: https://nango.dev/docs/reference/backend/http-api/connect/sessions/create.md - ```bash - npm install -g nango - ``` +--- +title: 'Create a connect session' +openapi: 'POST /connect/sessions' +--- + + + Requires an API key with the `environment:connect_sessions:write` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +Creates a short-lived connect session (30m). +The returned token can be used for instance to create connections through Connect UI. + +You can attach connection-level tags to the session via the `tags` field. These tags are copied onto the created connection and included in auth webhooks. + +Most apps start with these tags: `end_user_id`, `end_user_email`, `organization_id`. - Initialize your integrations folder at the root of your repo and commit it to source control: +## Reconnect - ```bash - nango init nango-integrations - ``` +Source: https://nango.dev/docs/reference/backend/http-api/connect/sessions/reconnect.md - This creates a `nango-integrations/` folder with example configuration. The `.nango` subdirectory must be committed because the CLI uses it to track deployed state. - +--- +title: 'Create a reconnect session' +openapi: 'POST /connect/sessions/reconnect' +--- + + + Requires an API key with the `environment:connect_sessions:write` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + - - Add your [API keys](/reference/backend/http-api/api-keys) to a `.env` file inside `nango-integrations/`. The CLI currently reads these API keys from `NANGO_SECRET_KEY_` variables: +## Get - ```bash - NANGO_SECRET_KEY_PROD='' - NANGO_SECRET_KEY_DEV='' - ``` +Source: https://nango.dev/docs/reference/backend/http-api/connect/session/get.md - Get your [API keys](/reference/backend/http-api/api-keys) from **Environment Settings > API Keys**. Despite the variable name, each value stores a [Nango API key](/reference/backend/http-api/api-keys). The CLI picks up the matching key for whichever environment you deploy to. +--- +title: 'Get a connect session' +openapi: 'GET /connect/session' +--- + +Retrieves a connect session information (allowed integrations, default connection configurations). - `nango init` creates `nango-integrations/.gitignore` with `.env` ignored. Keep the `.env` file untracked so [Nango API keys](/reference/backend/http-api/api-keys) are not committed. +## Delete - - Keys are matched by environment name: `NANGO_SECRET_KEY_`. If you rename an environment in the UI, update the variable name in `.env` to match. +Source: https://nango.dev/docs/reference/backend/http-api/connect/session/delete.md - For example, an environment named `staging` needs: +--- +title: 'Delete a connect session' +openapi: 'DELETE /connect/session' +--- + +Deletes a connect session - ```bash - NANGO_SECRET_KEY_STAGING='' - ``` - +## Post - - Use a shared environment (usually `dev`) for day-to-day collaboration. Create personal test connections with [per-connection webhook URL overrides](/guides/platform/webhooks-from-nango#override-webhook-urls-per-connection) pointing at your local webhook endpoint, and deploy functions granularly (`nango deploy --sync` / `--action` / `--integration`) so teammates don't overwrite each other. See [Engineering collaboration](/guides/platform/environments#engineering-collaboration). - Use CI to do full deploys across stable environments (like `staging` or `prod`). See the [CI/CD guide](/guides/functions/ci-cd). - +Source: https://nango.dev/docs/reference/backend/http-api/connections/post.md - - Run `nango init nango-integrations` to scaffold the folder. Ask the user for their [Nango API key](/reference/backend/http-api/api-keys) from **Environment Settings > API Keys** and write it to the matching `NANGO_SECRET_KEY_` variable in `nango-integrations/.env`. Confirm that `nango-integrations/.gitignore` ignores `.env`. +--- +title: 'Import a connection' +openapi: 'POST /connections' +--- + + + Requires an API key with the `environment:connections:create` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## When to use + +Use this API endpoint to import existing access tokens into Nango. It is mostly meant for one-off bulk imports when onboarding Nango, or for migrating existing connections when a provider introduced changes to its auth flow. + +If a connection with the same `connection_id` and `provider_config_key` already exists, the endpoint updates it with the provided credentials instead of creating a new one. + +To trigger OAuth flows with Nango, use the [Nango frontend SDK](/reference/frontend/frontend-sdk). + +## Request body + +You can use this endpoint to import OAuth 2, OAuth 1, API Keys, and Basic auth credentials. + +The required fields depend on the type of authentication of the _connections_ you are trying to import. - For additional context while building, add Nango's documentation MCP server (`https://nango.dev/docs/mcp`) and install the local builder skill: +## List - ```bash - npx skills add NangoHQ/skills -s building-nango-functions-locally - ``` - - +Source: https://nango.dev/docs/reference/backend/http-api/connections/list.md - - A Nango integrations folder is a small TypeScript project. The root contains shared project files, and each integration gets its own folder named after the integration ID. +--- +title: 'List connections' +openapi: 'GET /connections' +--- + + + Requires an API key with one of: `environment:connections:list` or `environment:connections:list_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + + + ```json Example Response +{ + "connections": [ + { + "id": 1, + "connection_id": "test-1", + "provider": "slack", + "provider_config_key": "slack-nango-community", + "created": "2023-06-03T14:53:22.051Z", + "metadata": null, + "tags": { + "end_user_id": "your-internal-id", + "end_user_email": "user@example.com", + "organization_id": "user-organization-id" + }, + "errors": [{ "type": "auth", "log_id": "VrnbtykXJFckCm3HP93t"}] + }, + { + "id": 2, + "connection_id": "test-2", + "provider": "slack", + "provider_config_key": "slack-nango-community", + "created": "2023-06-03T15:00:14.945Z", + "metadata": { + "bot_id": "some-uuid" + }, + "tags": { + "end_user_id": "your-internal-id", + "end_user_email": "user@example.com", + "organization_id": "user-organization-id" + }, + "errors": [] + } + ] +} + ``` + - Inside each integration folder, keep function files grouped by type. Sync functions live in `syncs/`, action functions in `actions/`, and event functions in `on-events/`. This keeps the trigger model visible from the file path and matches how the CLI discovers function code. +## Get - The root `index.ts` is the deployment entry point. It should import every function file you want Nango to compile and deploy, for example `import './github/syncs/github-issues';`. Files that are not imported from `index.ts` are not part of the deployed function set. - - The `.nango/` folder stores CLI-managed project state, including deployment tracking. Commit it so teammates and CI deploy from the same baseline. - - ``` - nango-integrations/ - β”œβ”€β”€ .nango/ # auto-managed state, commit it - β”œβ”€β”€ .env # API keys per environment - β”œβ”€β”€ .gitignore # keeps .env and dist untracked - β”œβ”€β”€ index.ts # imports every function file - β”œβ”€β”€ package.json - └── / # one folder per integration, e.g. github - β”œβ”€β”€ syncs/ - β”‚ └── github-issues.ts - β”œβ”€β”€ actions/ - β”‚ └── github-create-issue.ts - └── on-events/ - └── post-connection-creation.ts - ``` - +Source: https://nango.dev/docs/reference/backend/http-api/connections/get.md - - Keep dev mode running while you write code: +--- +title: 'Get connection & credentials' +openapi: 'GET /connections/{connectionId}' +--- + + + Requires an API key with one of: `environment:connections:read` or `environment:connections:read_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + + + +The response content depends on the API authentication type (e.g: OAuth 2, OAuth 1, API key, etc.). + +If you do not want to deal with collecting & injecting credentials in requests for multiple authentication types, use the [Proxy](/guides/platform/proxy-requests). + + + + +Every time you fetch the connection with this API endpoint, Nango will check if the access token has expired. If it has, it will refresh it. + +**We recommend you always fetch the token just before you use it to make sure it is fresh!** + + - ```bash - nango dev - ``` +## Patch - `nango dev` continuously type-checks and compiles your function files, surfacing errors immediately. - +Source: https://nango.dev/docs/reference/backend/http-api/connections/patch.md - - Choose the right function type for your integration use case: +--- +title: 'Patch a connection' +openapi: 'PATCH /connections/{connectionId}' +--- + + + Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + - +## Set Metadata - | If you need to... | Use | Common trigger | Guide | - | --- | --- | --- | --- | - | Keep external API data fresh, replicate records, or reconcile changes | Sync function | Schedule, manual sync trigger, or external webhook reconciliation | [Sync functions](/guides/functions/syncs/sync-functions) | - | Run an operation when your app, backend job, or agent asks for it | Action function | HTTP API, SDK, async action queue, or MCP/tool call | [Action functions](/guides/functions/action-functions) | - | Process an external provider webhook inside Nango | Webhook function | External API webhook | [Webhook functions](/guides/functions/webhook-functions) | - | React to Nango connection lifecycle events | Event function | Connection creation, validation, or deletion | [Event functions](/guides/functions/event-functions) | +Source: https://nango.dev/docs/reference/backend/http-api/connections/set-metadata.md - For shared primitives, use [Storage](/guides/functions/storage) for connection metadata and [Data validation](/guides/functions/data-validation) for function input, output, and provider response validation. - +--- +title: 'Set connection metadata' +openapi: 'POST /connections/metadata' +--- + + + Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Set _connection metadata_ + +Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides any existing metadata. The connection_id must be passed in the body as well. Note that the connection_id can be a single string or an array of strings. + +## Fetching _connection metadata_ + +To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. - - Dry run a function against a real connection: +## Update Metadata - ```bash - nango dryrun '' -e dev - ``` +Source: https://nango.dev/docs/reference/backend/http-api/connections/update-metadata.md - If the function reads connection metadata, pass test metadata: +--- +title: 'Edit connection metadata' +openapi: 'PATCH /connections/metadata' +--- + + + Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Update _connection metadata_ + +Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides specified properties, not the entire metadata. The connection_id must be passed in the body as well. Note that the connection_id can be a single string or an array of strings. + +## Fetching _connection metadata_ + +To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. - ```bash - nango dryrun '' -e dev --metadata '{"accountRegion":"eu"}' - ``` +## Delete - Deploy the function you changed: +Source: https://nango.dev/docs/reference/backend/http-api/connections/delete.md - ```bash - nango deploy --sync dev - # or - nango deploy --action dev - # or - nango deploy --integration dev - ``` +--- +title: 'Delete a connection' +openapi: 'DELETE /connections/{connectionId}' +--- + + + Requires an API key with the `environment:connections:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + - A bare `nango deploy` reconciles every function in the environment and can overwrite teammates' work on a shared collaborative environment. See [Engineering collaboration](/guides/platform/environments#engineering-collaboration). +## List functions - For function-type-specific commands, see the [Sync function guide](/guides/functions/syncs/sync-functions#test-and-deploy), [Action function guide](/guides/functions/action-functions#test-and-deploy), and [Testing](/guides/functions/testing). - - +Source: https://nango.dev/docs/reference/backend/http-api/functions/list.md - - -### Option 3: Build with the Functions API + + Requires an API key with the `environment:functions:list` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + -Use the Functions API when an agent should create or change an integration without the user working in a codebase. The agent might be Codex, Claude Code, Cursor, or a product agent running inside your app or sandbox. +Returns the functions deployed to an integration. -This is useful for prototypes, onboarding flows, provider operations not covered by templates, and just-in-time integrations where users describe behavior in text and an agent publishes the matching function to Nango. +## Get a function -
- -
+Source: https://nango.dev/docs/reference/backend/http-api/functions/get.md -At a high level, the flow is: + + Requires an API key with the `environment:functions:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + -1. Give the agent the integration ID, a connection ID for validation, the intended behavior, input and output shape, and any provider API context. -2. The agent generates a self-contained TypeScript function using the right function type. -3. Compile the source with `POST /functions/compile`. Send the TypeScript source as `code` and use compiler errors to improve it. -4. Start a dry run with `POST /functions/dryruns`. Send the integration ID, function type, source `code`, connection ID, and any action input, sync metadata, or checkpoint payload needed for the run. -5. Poll `GET /functions/dryruns/{id}` until the dry run reaches `success` or `failed`, then inspect the result, logs, records, or error. -6. Deploy it with `POST /functions/deployments`. Send `type: "function"`, the integration ID, function name, function type, and final source `code`. After deployment, your app can call or trigger the function like any other Nango function. +Returns a single deployed function. -Resolve these endpoints against `NANGO_SERVER_URL`, or `https://api.nango.dev` by default. Send `Authorization: Bearer ` and `Content-Type: application/json`. Scoped API keys need `environment:functions:compile` for compile, `environment:functions:dryrun` for dry run creation and polling, and `environment:deploy` for deployment. +## Get a function's source code -The Functions API is powerful, but it intentionally skips a local Git workflow. For production integrations that need code review, tests, ownership, and CI/CD, prefer [local development with the CLI](#build-locally-with-the-cli). +Source: https://nango.dev/docs/reference/backend/http-api/functions/code.md - -### Take ownership of a deployed function + + Requires an API key with the `environment:functions:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + -Pull the source of a function that is already deployed to an environment so you can manage it in your own repository: +Returns the TypeScript source code of a function for a given integration. -```bash -nango pull github list-repos --env dev -``` +## Delete a function -This works for any deployed function β€” a template you enabled from the dashboard, or code deployed through [`POST /functions/deployments`](/reference/backend/http-api/functions/deployments). The CLI writes the function's TypeScript source locally; from there, `nango deploy` redeploys it as a repo-managed function, so it lives in your Git workflow with code review, tests, and CI/CD. +Source: https://nango.dev/docs/reference/backend/http-api/functions/delete.md -## Related guides + + Requires an API key with the `environment:functions:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + -- [Function tool calling](/guides/functions/tool-calling) β€” expose action functions to agents, LLM SDKs, and MCP clients. -- [Unified APIs](/guides/functions/unified-apis) β€” build provider-specific functions behind one stable model. -- [Logging](/guides/functions/logging) β€” control custom function logs locally and in cloud environments. -- [Storage](/guides/functions/storage) β€” store per-connection metadata and read it inside functions. -- [Data validation](/guides/functions/data-validation) β€” validate function input, output, and provider API responses. -- [Testing](/guides/functions/testing) β€” dry runs, mocks, and snapshot tests. -- [Rate limits](/guides/functions/rate-limits) β€” handle provider `429` responses and long-running retries. -- [CI/CD](/guides/functions/ci-cd) β€” deploy functions with your application pipeline. +Deletes a deployed function and enqueues its async teardown. Functions managed by `nango deploy` (repo source) cannot be deleted through this endpoint. -## Sync function guide +## Compile -Source: https://nango.dev/docs/guides/functions/syncs/sync-functions.md -Description: Build sync functions that keep external API data fresh and consumable by your app. +Source: https://nango.dev/docs/reference/backend/http-api/functions/compile.md -Sync functions keep external API data fresh in your app. They run on a recurring cadence, write records to Nango's records cache, and let your app consume changes reliably. +--- +title: 'Compile a function' +openapi: 'POST /functions/compile' +--- + + + Requires an API key with the `environment:functions:compile` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +Compiles TypeScript function source code and returns the bundled JavaScript. -Use sync functions when your app needs to replicate a dataset from an external system for sync, indexing, RAG, reporting, or change-detection workflows. +## Dryruns Create -## Create the function +Source: https://nango.dev/docs/reference/backend/http-api/functions/dryruns-create.md -Add a file under the integration's `syncs/` folder: +--- +title: 'Dry run a function' +openapi: 'POST /functions/dryruns' +--- + + + Requires an API key with the `environment:functions:dryrun` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +Starts an asynchronous dry run for TypeScript function source code against a connection without deploying it. -```typescript crm/syncs/contacts.ts -import { createSync } from 'nango'; -import * as z from 'zod'; +## Dryruns Get -const Contact = z.object({ - id: z.string(), - email: z.string().email().optional(), - updatedAt: z.string() -}); +Source: https://nango.dev/docs/reference/backend/http-api/functions/dryruns-get.md -const Metadata = z.object({ - accountRegion: z.string().optional() -}); +--- +title: 'Get dry run results' +openapi: 'GET /functions/dryruns/{id}' +--- + + + Requires an API key with the `environment:functions:dryrun` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +Returns the status and result of an asynchronous function dry run. -const Checkpoint = z.object({ - lastUpdatedAt: z.string() -}); +## Deployments -export default createSync({ - description: 'Syncs contacts', - version: '1.0.0', - frequency: 'every hour', - autoStart: true, - models: { Contact }, - metadata: Metadata, - checkpoint: Checkpoint, - exec: async (nango) => { - const metadata = await nango.getMetadata(); - const checkpoint = await nango.getCheckpoint(); - const since = checkpoint?.lastUpdatedAt; - - for await (const page of nango.paginate({ - endpoint: '/contacts', - params: { - ...(since ? { updated_after: since } : {}), - ...(metadata?.accountRegion ? { region: metadata.accountRegion } : {}) - }, - paginate: { - type: 'cursor', - cursor_path_in_response: 'pagination.next_cursor', - cursor_name_in_request: 'cursor', - response_path: 'contacts', - limit_name_in_request: 'limit', - limit: 100 - } - })) { - const contacts = page.map((contact) => ({ - id: contact.id, - email: contact.email, - updatedAt: contact.updated_at - })); - - await nango.batchSave(contacts, 'Contact'); - - const lastContact = contacts[contacts.length - 1]; - if (lastContact) { - await nango.saveCheckpoint({ lastUpdatedAt: lastContact.updatedAt }); - } - } - } -}); -``` +Source: https://nango.dev/docs/reference/backend/http-api/functions/deployments.md -Import the function from `index.ts`: +--- +title: 'Create a function deployment' +openapi: 'POST /functions/deployments' +--- + + + Requires an API key with the `environment:deploy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +Deploys a function to an existing integration: either submitted TypeScript source code (`type: function`) or a template from the provider catalog (`type: template`). -```typescript index.ts -import './crm/syncs/contacts'; -``` +## Config - - Sync implementation quality matters. Suboptimal syncs can consume far more API calls, compute, memory, and storage than needed; they can also become expensive, crash, behave unreliably, or hit provider rate limits. Before deploying a sync to production, review the [Sync efficiency guide](/guides/functions/syncs/sync-efficiency). - +Source: https://nango.dev/docs/reference/backend/http-api/scripts/config.md - - Before generating a sync, collect the integration ID, connection ID for testing, target records, provider pagination style, incremental filter, deletion strategy, required metadata, and expected sync frequency. +--- +title: 'Get integration functions config' +openapi: 'GET /scripts/config' +--- + + + Requires an API key with the `environment:integrations:list_functions` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +The `/scripts/config` endpoint returns the configuration for all integration functions. There are two variants of this endpoint: + +1. `/scripts/config?format=nango` - Returns the standard configuration format +2. `/scripts/config?format=openai` - Returns the configuration in OpenAI's function calling format + +## OpenAI Function Format + +The `/scripts/config?format=openai` endpoint transforms the script configurations into OpenAI's function calling format. This format is particularly useful when working with OpenAI's API to enable function calling capabilities. + +### Parameter Descriptions + +The endpoint automatically parses parameter descriptions from the script's description field. If a script's description contains a markdown list of parameters, these descriptions will be used for the corresponding parameters in the OpenAI function format. + +For example, in your script file, you can define a script like this: + +```typescript google-calendar/actions/move-event.ts +export default createAction({ + description: `Move an event to a different time or calendar with the following parameters: + - eventId: The ID of the event to move + - start: New start time in ISO format (e.g., "2024-03-28T14:00:00") + - end: New end time in ISO format (e.g., "2024-03-28T15:00:00") + - calendar: Optional new calendar ID to move the event to`, + version: '1.0.0', + endpoints: [{ method: 'GET', path: '/example/github/issues', group: 'Issues' }], + frequency: 'every hour', + autoStart: false, + scopes: ['https://www.googleapis.com/auth/calendar'], + input: z.object({ + eventId: z.string(), + start: z.string(), + end: z.string(), + calendar: z.string().optional() + }) +}); +``` + +The endpoint will generate a function definition like this: + +```json +{ + "data": [ + { + "name": "move-event", + "description": "Move an event to a different time or calendar with the following parameters:\n- eventId: The ID of the event to move\n- start: New start time in ISO format (e.g., \"2024-03-28T14:00:00\")\n- end: New end time in ISO format (e.g., \"2024-03-28T15:00:00\")\n- calendar: Optional new calendar ID to move the event to", + "parameters": { + "type": "object", + "properties": { + "eventId": { + "type": "string", + "description": "The ID of the event to move" + }, + "start": { + "type": "string", + "description": "New start time in ISO format (e.g., \"2024-03-28T14:00:00\")" + }, + "end": { + "type": "string", + "description": "New end time in ISO format (e.g., \"2024-03-28T15:00:00\")" + }, + "calendar": { + "type": "string", + "description": "Optional new calendar ID to move the event to" + } + }, + "required": ["eventId", "start", "end"] + } + } + ] +} +``` + +### Array Fields + +The endpoint properly handles array fields in the configuration. For example, if a field is defined as: + +```typescript google-calendar/actions/create-event.ts +export default createAction({ + description: `Create a new calendar event with the following parameters: + - summary: The title of the event + - attendees: List of email addresses of event attendees`, + version: '1.0.0', + endpoints: [{ method: 'POST', path: '/example/google-calendar/events', group: 'Events' }], + input: z.object({ + summary: z.string(), + attendees: z.array(z.string()).optional() + }) +}); +``` + +It will be transformed into: + +```json +{ + "data": [ + { + "name": "create-event", + "description": "Create a new calendar event with the following parameters:\n- summary: The title of the event\n- attendees: List of email addresses of event attendees", + "parameters": { + "type": "object", + "properties": { + "summary": { + "type": "string", + "description": "The title of the event" + }, + "attendees": { + "type": "array", + "description": "List of email addresses of event attendees", + "items": { + "type": "string" + } + } + }, + "required": ["summary"] + } + } + ] +} +``` + +## Records List - Prefer incremental syncs when the provider supports them. Save records page by page, checkpoint after successful writes, and keep the record model limited to fields the app actually needs. - +Source: https://nango.dev/docs/reference/backend/http-api/sync/records-list.md -## Pass parameters with metadata +--- +title: 'Get records' +sidebarTitle: 'Get records' +openapi: 'GET /records' +--- + + + Requires an API key with the `environment:records:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Receive webhooks on data updates + +Receive webhooks from Nango when new records are available. Follow the [sync functions section](/guides/functions/syncs/sync-functions). + + +**Data availability**: Records are subject to Nango's [data retention policies](/guides/platform/security#synced-records-retention). Records not updated for 30 days will have their payload pruned (only metadata remains). Records from syncs not executed for 60 days are permanently deleted. Fetch and store records promptly in your own system. + + +## Response + + +This endpoint returns a list of records, ordered by modification date ascending. If some records are updated while you paginate through this endpoint, you might see these records multiple times. + + + +A response may contain fewer records than `limit` when records have a large size. Always check `next_cursor` and continue paginating until it is `null`. + + +### Default behavior +By default this returns an array of objects in the data model that you queried with some metadata about each record. + +```json +{ + records: + [ + { + id: 123, + ..., // Fields as specified in the model you queried + _nango_metadata: { + deleted_at: null, + last_action: 'ADDED', + first_seen_at: '2023-09-18T15:20:35.941305+00:00', + last_modified_at: '2023-09-18T15:20:35.941305+00:00', + cursor: 'MjAyNC0wMy0wNFQwNjo1OTo1MS40NzE0NDEtMDU6MDB8fDE1Y2NjODA1LTY0ZDUtNDk0MC1hN2UwLTQ1ZmM3MDQ5OTdhMQ==' + } + }, + ... + ], + next_cursor: "MjAyMy0xMS0xN1QxMTo0NzoxNC40NDcrMDI6MDB8fDAzZTA1NzIxLWNiZmQtNGYxNS1iYTNhLWFlNjM2Y2MwNmEw==" +} +``` + +## Prune Records -Use [connection metadata](/guides/functions/storage#connection-metadata) for any value the sync needs on scheduled runs: +Source: https://nango.dev/docs/reference/backend/http-api/sync/prune-records.md -- Customer configuration, such as selected folders, projects, accounts, regions, or custom field mappings. -- Provider context discovered after authorization. -- Feature flags or filters that change what the sync fetches. +--- +title: 'Prune records' +sidebarTitle: 'Prune records' +openapi: 'PATCH /records/prune' +--- + + + Requires an API key with the `environment:records:write` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +Prunes synced records for a given connection and model using cursor-based pagination. + +## What is pruning? + +Pruning empties the record payload while preserving the record metadata. +This is useful for compliance requirements, ensuring Nango doesn't hold onto your records data while maintaining the ability to track record state. The payload can be restored by re-syncing the data. + + +Pruning is not the same as marking a record as deleted from the external API. +This endpoint prunes data from Nango’s cache only. It does not delete anything on the external API, and it is not the same as [detecting a deletion from the source](/guides/functions/syncs/deletion-detection). + +If you need to tell your customers that a record was deleted on the external API while keeping its last-known payload in cache, use `batchDelete` or `trackDeletesStart`/`trackDeletesEnd` in your sync functions instead. + + +## Cursor behavior + +Records are pruned up to and including the specified `until_cursor` value. Use the `_nango_metadata.cursor` value from the record you want to prune up to. + +## Response + + +The `has_more` field indicates whether there are potentially more records to prune. When `true`, make another request with the same `until_cursor` to continue pruning. When `false`, all records up to the cursor have been pruned. + + +```json +{ + "count": 150, + "has_more": true +} +``` + +## Trigger -If the sync should not run before configuration exists, set `autoStart: false`, save the required metadata from your app, then start the schedule after configuration is complete. +Source: https://nango.dev/docs/reference/backend/http-api/sync/trigger.md -From your app, call the Node SDK [`nango.startSync()` method](/reference/backend/backend-sdk/node#start-schedule-for-syncs): +--- +title: 'Trigger sync(s)' +openapi: 'POST /sync/trigger' +--- + + + Requires an API key with the `environment:syncs:execute` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Triggering one-off syncs + +This is especially useful if you e.g. changed the metadata for the connection and now want to re-import data. + +Use `reset` to clear the checkpoint and re-fetch all data, or `reset` with `emptyCache` to start completely fresh. See the [checkpoints guide](/guides/functions/syncs/checkpoints#re-syncing-resetting-checkpoints-and-the-cache) for details. -```ts -await nango.startSync('crm', ['contacts'], ''); -``` +## Start -Or call the [Start sync API](/reference/backend/http-api/sync/start) from any backend. Starting a sync schedule also triggers an immediate first run. +Source: https://nango.dev/docs/reference/backend/http-api/sync/start.md -## Test and deploy +--- +title: 'Start sync(s)' +openapi: 'POST /sync/start' +--- + + + Requires an API key with the `environment:syncs:execute` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + -Dry run the function against a real connection: +## Pause -```bash -nango dryrun contacts '' -e dev -``` +Source: https://nango.dev/docs/reference/backend/http-api/sync/pause.md -If the sync reads connection metadata, pass test metadata to the dry run: +--- +title: 'Pause sync(s)' +openapi: 'POST /sync/pause' +--- + + + Requires an API key with the `environment:syncs:execute` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + -```bash -nango dryrun contacts '' -e dev --metadata '{"accountRegion":"eu"}' -``` +## Status -Or load metadata from a file: +Source: https://nango.dev/docs/reference/backend/http-api/sync/status.md -```bash -nango dryrun contacts '' -e dev --metadata @fixtures/metadata.json -``` +--- +title: 'Sync status' +openapi: 'GET /sync/status' +--- + + + Requires an API key with the `environment:syncs:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +The response includes the current `checkpoint` for each sync, which tracks how far the sync has progressed. Learn more about [checkpoints](/guides/functions/syncs/checkpoints). -Simulate resuming from a checkpoint: +## Update Connection Frequency -```bash -nango dryrun contacts '' -e dev --checkpoint '{"lastUpdatedAt":"2026-01-01T00:00:00.000Z"}' -``` +Source: https://nango.dev/docs/reference/backend/http-api/sync/update-connection-frequency.md -Print local diagnostics for memory and CPU behavior: +--- +title: 'Override sync connection frequency' +openapi: 'PUT /sync/update-connection-frequency' +--- + + + Requires an API key with the `environment:syncs:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + -```bash -nango dryrun contacts '' -e dev --diagnostics -``` +## Environment Variables -Deploy your functions: +Source: https://nango.dev/docs/reference/backend/http-api/sync/environment-variables.md -```bash -nango deploy -``` +--- +title: 'Get environment variables' +openapi: 'GET /environment-variables' +--- + + + Requires an API key with the `environment:variables:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + -To deploy only this sync function: +## Create Variant -```bash -nango deploy --sync contacts dev -``` +Source: https://nango.dev/docs/reference/backend/http-api/sync/create-variant.md -## Start or trigger runs +--- +title: 'Create sync variant' +sidebarTitle: 'Create variant' +openapi: 'POST /sync/{name}/variant/{variant}' +--- + + + Requires an API key with the `environment:syncs:variant:create` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Creating a sync variant + +Sync variants allow you to create different configurations of the same sync for a specific connection. This is useful when you need to sync the same data with different settings or filters. + +### Key features +- Each variant operates independently with its own sync schedule +- Variants can be queried separately through the records endpoint using the `variant` query parameter +- Cannot use "base" as a variant name (protected) + +After creating a variant, you can use the `/records` endpoint to access its data by specifying the variant query parameter: + +``` +GET /records?model=MyModel&variant=MyVariant +``` + +## Delete Variant -If `autoStart: true`, Nango starts the schedule for new connections automatically. Otherwise, start it after the connection is ready and required metadata is saved: +Source: https://nango.dev/docs/reference/backend/http-api/sync/delete-variant.md -```typescript -await nango.startSync('crm', ['contacts'], ''); -``` +--- +title: 'Delete sync variant' +sidebarTitle: 'Delete variant' +openapi: 'DELETE /sync/{name}/variant/{variant}' +--- + + + Requires an API key with the `environment:syncs:variant:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + -`nango.startSync()` is a [Node SDK method](/reference/backend/backend-sdk/node#start-schedule-for-syncs). Use the [Start sync API](/reference/backend/http-api/sync/start) if you are starting schedules from another backend language. +## Trigger -Trigger a run immediately: +Source: https://nango.dev/docs/reference/backend/http-api/action/trigger.md -```typescript -await nango.triggerSync('crm', ['contacts'], ''); -``` +--- +title: 'Trigger an action' +openapi: 'POST /action/trigger' +--- + + + Requires an API key with the `environment:actions:execute` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + -`nango.triggerSync()` is a [Node SDK method](/reference/backend/backend-sdk/node#trigger-syncs). Use the [Trigger sync API](/reference/backend/http-api/sync/trigger) for one-off sync runs from another backend language. +## Get -## Consume records +Source: https://nango.dev/docs/reference/backend/http-api/proxy/get.md -Configure your app's Nango webhook URL in **Environment Settings > Webhook URLs**. After a run, Nango sends a sync webhook with the connection, integration, sync name, model, and change counts. Your app should then read records by cursor: +--- +title: 'Proxy - GET requests' +sidebarTitle: 'Proxy - GET requests' +openapi: 'GET /proxy/{anyPath}' +--- + + + Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +### API request + +The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: +* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. +* Provider-Config-Key +* Connection-Id +* Retries +* Base-Url-Override: provide an API base URL when the base API is not listed in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) or it needs to be overridden + +### API response + +The response from the external API is passed back to you exactly as Nango gets it: +* Response code +* Response headers +* Response body - - - ```typescript - import { Nango } from '@nangohq/node'; - - const nango = new Nango({ secretKey: process.env.NANGO_SECRET_KEY! }); - - const result = await nango.listRecords({ - providerConfigKey: 'crm', - connectionId: '', - model: 'Contact', - cursor: '' - }); - ``` - - - ```bash - curl -G https://api.nango.dev/records \ - --header 'Authorization: Bearer ' \ - --header 'Provider-Config-Key: crm' \ - --header 'Connection-Id: ' \ - --data-urlencode 'model=Contact' \ - --data-urlencode 'cursor=' - ``` - - +## Post -The consumer loop is: receive a sync webhook from Nango, look up the last cursor processed for that connection and model, fetch records with that cursor, process them, then store the cursor from the last record fetched. +Source: https://nango.dev/docs/reference/backend/http-api/proxy/post.md -## Two-way syncs +--- +title: 'Proxy - POST requests' +sidebarTitle: 'Proxy - POST requests' +openapi: 'POST /proxy/{anyPath}' +--- + + + Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +### API request + +The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: +* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. +* Provider-Config-Key +* Connection-Id +* Retries + +### API response + +The response from the external API is passed back to you exactly as Nango gets it: +* Response code +* Response headers +* Response body -You can implement two-way syncs by combining sync functions with [action functions](/guides/functions/action-functions): +## Put -- Use a sync function to replicate external data into your app and keep your local state fresh. -- Use action functions for writes back to the external API, such as creating, updating, or deleting records. -- After a write action succeeds, update your local state optimistically or trigger the relevant sync so the records cache catches up with the external source of truth. +Source: https://nango.dev/docs/reference/backend/http-api/proxy/put.md -This keeps the read path and write path explicit. The sync owns ongoing data freshness, checkpoints, record storage, and change delivery. Actions own user-initiated writes and provider-specific validation or side effects. +--- +title: 'Proxy - PUT requests' +sidebarTitle: 'Proxy - PUT requests' +openapi: 'PUT /proxy/{anyPath}' +--- + + + Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +### API request + +The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: +* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. +* Provider-Config-Key +* Connection-Id +* Retries +* Base-Url-Override: provide an API base URL when the base API is not listed in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) or it needs to be overridden + +### API response + +The response from the external API is passed back to you exactly as Nango gets it: +* Response code +* Response headers +* Response body -For unified models, use the same schema for synced records and write action input where possible. This keeps your app from branching on each provider while still letting each provider implementation handle API-specific fields and edge cases. +## Patch -## Deep dives +Source: https://nango.dev/docs/reference/backend/http-api/proxy/patch.md -- [Sync efficiency](/guides/functions/syncs/sync-efficiency) -- [Checkpoints](/guides/functions/syncs/checkpoints) -- [Records cache](/guides/functions/syncs/records-cache) -- [Deletion detection](/guides/functions/syncs/deletion-detection) -- [Real-time syncs](/guides/functions/syncs/realtime-syncs) -- [Sync partitioning](/guides/functions/syncs/sync-partitioning) +--- +title: 'Proxy - PATCH requests' +sidebarTitle: 'Proxy - PATCH requests' +openapi: 'PATCH /proxy/{anyPath}' +--- + + + Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +### API request + +The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: +* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. +* Provider-Config-Key +* Connection-Id +* Retries + +### API response + +The response from the external API is passed back to you exactly as Nango gets it: +* Response code +* Response headers +* Response body -## Sync efficiency +## Delete -Source: https://nango.dev/docs/guides/functions/syncs/sync-efficiency.md -Description: Build sync functions that replicate external datasets without wasting API calls, memory, or compute. +Source: https://nango.dev/docs/reference/backend/http-api/proxy/delete.md -Sync functions are often used to replicate external datasets into your app or to notify your app when external data changes. Efficient syncs fetch only what changed, save records in batches, and let your app consume changes promptly. +--- +title: 'Proxy - DELETE requests' +sidebarTitle: 'Proxy - DELETE requests' +openapi: 'DELETE /proxy/{anyPath}' +--- + + + Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +### API request + +The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: +* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. +* Provider-Config-Key +* Connection-Id +* Retries +* Base-Url-Override: provide an API base URL when the base API is not listed in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) or it needs to be overridden + +### API response + +The response from the external API is passed back to you exactly as Nango gets it: +* Response code +* Response headers +* Response body -## Prefer incremental syncs +## List -An **incremental sync** fetches only records that changed since the previous run. The function stores progress in a [checkpoint](/guides/functions/syncs/checkpoints), then passes that progress back to the external API on the next run. +Source: https://nango.dev/docs/reference/backend/http-api/providers/list.md -A **full sync** fetches the whole dataset every run, then saves or compares the complete result. +--- +title: 'List all providers' +openapi: 'GET /providers' +--- + + +```json Example Response +{ + "data": [ + { + "name": "hubspot", + "logo_url": "https://app.nango.dev/images/template-logos/hubspot.svg", + "display_name": "HubSpot", + "categories": ["marketing","support","crm"], + "auth_mode": "OAUTH2", + "authorization_url": "https://app.hubspot.com/oauth/authorize", + "token_url": "https://api.hubapi.com/oauth/v1/token", + "connection_configuration": ["portalId"], + "post_connection_script": "hubspotPostConnection", + "webhook_routing_script": "hubspotWebhookRouting", + "proxy": { + "base_url": "https://api.hubapi.com", + "decompress": true, + "paginate": { + "type": "cursor", + "cursor_path_in_response": "paging.next.after", + "limit_name_in_request": "limit", + "cursor_name_in_request": "after", + "response_path": "results" + } + }, + "docs": "https://nango.dev/docs/api-integrations/hubspot" + }, + { + "name": "posthog", + "logo_url": "https://app.nango.dev/images/template-logos/posthog.svg", + "display_name": "PostHog", + "categories": ["dev-tools"], + "auth_mode": "API_KEY", + "proxy": { + "base_url": "https://api.posthog.com", + }, + "docs": "https://nango.dev/docs/api-integrations/posthog" + } + ] +} +``` + -Incremental syncs are usually an order of magnitude more efficient than full syncs. They reduce provider API calls, function runtime, memory usage, Nango compute, records churn, and downstream writes in your app. +## Get -Full syncs can be acceptable for small datasets or low-frequency jobs. For large datasets, they can become plainly unrealistic: expensive to run, slow to finish, more likely to crash, more likely to hit provider rate limits, and less reliable when a run needs to process thousands or millions of records every time. +Source: https://nango.dev/docs/reference/backend/http-api/providers/get.md -| Approach | Best for | Tradeoff | -| --- | --- | --- | -| Incremental sync | Large datasets, frequent polling, APIs with `updated_after`, cursor, or sequence filters | Requires checkpoint logic and provider support | -| Full refresh | Small datasets or APIs without incremental filters | Simpler, but uses more API calls, memory, and compute as data grows | +--- +title: 'Get a provider' +openapi: 'GET /providers/{provider}' +--- + + +```json Example Response +{ + "data": { + "name": "hubspot", + "logo_url": "https://app.nango.dev/images/template-logos/hubspot.svg", + "display_name": "HubSpot", + "categories": ["marketing","support","crm"], + "auth_mode": "OAUTH2", + "authorization_url": "https://app.hubspot.com/oauth/authorize", + "token_url": "https://api.hubapi.com/oauth/v1/token", + "connection_configuration": ["portalId"], + "post_connection_script": "hubspotPostConnection", + "webhook_routing_script": "hubspotWebhookRouting", + "proxy": { + "base_url": "https://api.hubapi.com", + "decompress": true, + "paginate": { + "type": "cursor", + "cursor_path_in_response": "paging.next.after", + "limit_name_in_request": "limit", + "cursor_name_in_request": "after", + "response_path": "results" + } + }, + "docs": "https://nango.dev/docs/api-integrations/hubspot" + } +} +``` + -This choice is constrained by the external API shape. To benefit from incremental syncing, the provider usually needs a parameter such as `updated_at`, `updated_since`, `modified_after`, a cursor, a sequence ID, or an event stream that lets you ask for only changed records. +## List provider templates -The hardest case is a large dataset where the API does not support incremental filters. Often, that happens because the provider expects you to use webhooks instead. In Nango, use [webhook functions](/guides/functions/webhook-functions), [webhook forwarding](/guides/platform/webhook-forwarding), or [real-time syncs](/guides/functions/syncs/realtime-syncs) to process provider events and avoid polling the entire dataset. +Source: https://nango.dev/docs/reference/backend/http-api/providers/templates.md -The risky combination is: **large dataset + no incremental API + high freshness requirement**. If you need to run a full sync frequently to keep data fresh, the design is usually unrealistic in terms of cost, runtime, reliability, and rate limits. Look for a webhook strategy, reduce freshness requirements, partition the dataset, or narrow the scope of synced data. +Returns the template functions available in the catalog for a provider. -## Save page by page +## List -Do not accumulate the full dataset in memory before calling `batchSave()`. Save each page as soon as it is mapped, then checkpoint after the save succeeds. +Source: https://nango.dev/docs/reference/backend/http-api/connection/list.md -```typescript -const checkpoint = await nango.getCheckpoint(); +--- +title: 'List connections (deprecated)' +openapi: 'GET /connection' +--- + + + Requires an API key with one of: `environment:connections:list` or `environment:connections:list_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + + + ```json Example Response +{ + "connections": [ + { + "id": 1, + "connection_id": "test-1", + "provider": "slack", + "provider_config_key": "slack-nango-community", + "created": "2023-06-03T14:53:22.051Z", + "metadata": null, + "tags": { + "end_user_id": "your-internal-id", + "end_user_email": "user@example.com", + "organization_id": "user-organization-id" + }, + "errors": [{ "type": "auth", "log_id": "VrnbtykXJFckCm3HP93t"}] + }, + { + "id": 2, + "connection_id": "test-2", + "provider": "slack", + "provider_config_key": "slack-nango-community", + "created": "2023-06-03T15:00:14.945Z", + "metadata": { + "bot_id": "some-uuid" + }, + "tags": { + "end_user_id": "your-internal-id", + "end_user_email": "user@example.com", + "organization_id": "user-organization-id" + }, + "errors": [] + } + ] +} + ``` + -for await (const page of nango.paginate({ - endpoint: '/contacts', - params: checkpoint ? { updated_after: checkpoint.lastModifiedISO } : {}, - paginate: { - type: 'cursor', - cursor_path_in_response: '', - cursor_name_in_request: 'cursor', - response_path: '', - limit_name_in_request: 'limit', - limit: 100 - } -})) { - const contacts = page.map(mapContact); +## Get - await nango.batchSave(contacts, 'Contact'); +Source: https://nango.dev/docs/reference/backend/http-api/connection/get.md - const lastContact = contacts[contacts.length - 1]; - if (lastContact) { - await nango.saveCheckpoint({ lastModifiedISO: lastContact.updatedAt }); - } -} -``` +--- +title: 'Get connection & credentials (deprecated)' +openapi: 'GET /connection/{connectionId}' +--- + + + Requires an API key with one of: `environment:connections:read` or `environment:connections:read_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + + + +The response content depends on the API authentication type (e.g: OAuth 2, OAuth 1, API key, etc.). + +If you do not want to deal with collecting & injecting credentials in requests for multiple authentication types, use the [Proxy](/guides/platform/proxy-requests). + + + + +Every time you fetch the connection with this API endpoint, Nango will check if the access token has expired. If it has, it will refresh it. + +**We recommend you always fetch the token just before you use it to make sure it is fresh!** + + -This pattern keeps memory bounded and lets the next run resume from the last saved page if the function stops midway. +## Post -## Keep records small +Source: https://nango.dev/docs/reference/backend/http-api/connection/post.md -Only fetch and save fields your app needs. Smaller records reduce external API usage, Nango compute, cache size, downstream processing, and cost. +--- +title: 'Import a connection (deprecated)' +openapi: 'POST /connection' +--- + + + Requires an API key with the `environment:connections:create` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## When to use + +Use this API endpoint to import existing access tokens into Nango. It is mostly meant for one-off bulk imports when onboarding Nango, or for migrating existing connections when a provider introduced changes to its auth flow. + +If a connection with the same `connection_id` and `provider_config_key` already exists, the endpoint updates it with the provided credentials instead of creating a new one. + +To trigger OAuth flows with Nango, use the [Nango frontend SDK](/reference/frontend/frontend-sdk). + +## Request body + +You can use this endpoint to import OAuth 2, OAuth 1, API Keys, and Basic auth credentials. + +The required fields depend on the type of authentication of the _connections_ you are trying to import. -Keep records steady too. During full syncs, Nango can process unchanged records faster when the saved record payload stays identical between runs. Avoid adding fields that change on every fetch even when the underlying external record did not change, such as `lastFetchedAt`, request timestamps, random IDs, or transient API metadata. Volatile fields make the record look changed every run, which forces extra processing and downstream updates. +## Set Metadata -## Filter unnecessary data early +Source: https://nango.dev/docs/reference/backend/http-api/connection/set-metadata.md -Filter data as early as possible, either by using filters provided by the external API or by discarding records before calling `batchSave()`. This keeps the external system as the source of truth while reducing provider API usage, Nango compute, cache size, and downstream processing. +--- +title: 'Set connection metadata (deprecated)' +openapi: 'POST /connection/metadata' +--- + + + Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Set _connection metadata_ + +Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides any existing metadata. The connection_id must be passed in the body as well. Note that the connection_id can be a single string or an array of strings. + +## Fetching _connection metadata_ + +To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. -Prefer provider-side filters such as selected folders, projects, accounts, regions, statuses, or `updated_after` parameters. If the provider cannot filter server-side, map and filter each page before saving so Nango and your app only process records that matter. +## Set Metadata Legacy -Use [connection metadata](/guides/functions/storage#connection-metadata) for per-customer filters. For example, store selected project IDs, folder IDs, regions, pipelines, or custom field mappings on the connection, then read that metadata inside the sync and pass it to the provider API. +Source: https://nango.dev/docs/reference/backend/http-api/connection/set-metadata-legacy.md -```typescript -const metadata = await nango.getMetadata(); -const checkpoint = await nango.getCheckpoint(); +--- +title: 'Set connection metadata (deprecated)' +openapi: 'POST /connection/{connectionId}/metadata' +--- + + + Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Set _connection metadata_ + +Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides any existing metadata. + +## Fetching _connection metadata_ + +To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. -for await (const page of nango.paginate({ - endpoint: '/tasks', - params: { - project_id: metadata?.projectId, - updated_after: checkpoint?.lastModifiedISO - }, - paginate: { - type: 'cursor', - cursor_path_in_response: 'next_cursor', - cursor_name_in_request: 'cursor', - response_path: 'tasks' - } -})) { - const tasks = page.filter((task) => !metadata?.status || task.status === metadata.status).map(mapTask); +## Update Metadata - await nango.batchSave(tasks, 'Task'); -} -``` +Source: https://nango.dev/docs/reference/backend/http-api/connection/update-metadata.md -If you need additional data later, update the sync function and trigger a run with `reset: true` to backfill historical data with the new shape or broader filter. +--- +title: 'Edit connection metadata (deprecated)' +openapi: 'PATCH /connection/metadata' +--- + + + Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Update _connection metadata_ + +Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides specified properties, not the entire metadata. The connection_id must be passed in the body as well. Note that the connection_id can be a single string or an array of strings. + +## Fetching _connection metadata_ + +To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. -## Consume changes promptly +## Update Metadata Legacy -Nango's records cache is a delivery mechanism, not your app's long-term data store. Configure [webhooks from Nango](/guides/platform/webhooks-from-nango), fetch changed records from the [records API](/reference/backend/http-api/sync/records-list), store them in your system, and persist the last processed cursor. +Source: https://nango.dev/docs/reference/backend/http-api/connection/update-metadata-legacy.md -When reading records from Nango, keep page sizes modest. A page size around `100` records is a good default: it keeps payloads quick to transfer, reduces memory spikes in your worker, and makes retries less expensive when a downstream write fails. +--- +title: 'Edit connection metadata (deprecated)' +openapi: 'PATCH /connection/{connectionId}/metadata' +--- + + + Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Update _connection metadata_ + +Nango uses the request body as the new metadata (it must be a JSON object). + +## Fetching _connection metadata_ + +To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. -Read [Records cache](/guides/functions/syncs/records-cache) for cursor behavior, payload shape, and retention details. +## Delete -## Related guides +Source: https://nango.dev/docs/reference/backend/http-api/connection/delete.md -- [Functions guide](/guides/functions/syncs/sync-functions) -- [Checkpoints](/guides/functions/syncs/checkpoints) -- [Records cache](/guides/functions/syncs/records-cache) -- [Real-time syncs](/guides/functions/syncs/realtime-syncs) -- [Sync partitioning](/guides/functions/syncs/sync-partitioning) +--- +title: 'Delete a connection (deprecated)' +openapi: 'DELETE /connection/{connectionId}' +--- + + + Requires an API key with the `environment:connections:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + -## Checkpoints +## Node -Source: https://nango.dev/docs/guides/functions/syncs/checkpoints.md -Description: Save progress mid-run, resume after failures, and turn full syncs into incremental ones. +Source: https://nango.dev/docs/reference/backend/backend-sdk/node.md -Checkpoints let sync functions save their progress and resume from where they left off. This enables a function to fetch only new or changed data instead of re-fetching everything on each run. Checkpoints are what make sync functions **resilient to failures** and enable **incremental syncing**, the recommended approach for any non-trivial dataset. +The backend SDK lets you interact with the Nango API. It is available on [NPM](https://www.npmjs.com/package/@nangohq/node) as `@nangohq/node`. -Define a `checkpoint` schema in your sync function to enable checkpoint support. If you are migrating from `nango.lastSyncDate`, see the [migration guide](/guides/platform/migrations/migrate-to-checkpoints). +## Instantiate the backend SDK -## Why checkpointing matters +Install it with your favorite package manager, e.g.: -Without checkpoints, every sync run fetches the entire dataset from the external API. This works for small datasets, but quickly becomes unsustainable as data grows. Consider a Salesforce account with 500,000 contacts syncing every 15 minutes: without checkpoints, each run re-fetches all 500,000 records even if only a handful changed β€” consuming orders of magnitude more API calls, compute time, and memory than necessary. - -Checkpoints solve this by tracking how far your sync has progressed. The benefits compound: - -- **Performance** β€” Only fetch what changed. A 15-minute incremental sync processes minutes of changes, not years of history. -- **Resilience** β€” If a sync fails mid-execution, the next run resumes from the last checkpoint instead of restarting from scratch. -- **Lower costs** β€” Less compute time on Nango, fewer API calls against the external API's rate limits, and lower bandwidth consumption. -- **Higher freshness** β€” Faster syncs mean you can run them more frequently, keeping your data closer to real-time. - -## Function interruption and resumption +```bash +npm i -S @nangohq/node +``` -Nango reserves the right to cap the duration of a function execution. When an execution reaches the limit, Nango interrupts it gracefully and schedules the next execution to start immediately. +Instantiate the `Nango` class: -Checkpoints are what make this seamless: the next execution should call `getCheckpoint()` and resumes from where the previous one stopped. **Without checkpoints, each execution starts from scratch**, meaning any function that takes longer than the execution cap will loop indefinitely without ever completing. +```js +import { Nango } from '@nangohq/node'; - -If your sync processes a large dataset, you must call `saveCheckpoint()` after every `batchSave`. A sync without checkpoints that exceeds the execution duration will restart from the beginning on every run and never finish. - +const nango = new Nango({ apiKey: '' }); +``` -The interrupt-and-resume flow: +**Parameters** -1. Sync runs, processes records, saves a checkpoint after each page. -2. Nango interrupts the sync gracefully when the execution cap is reached (ie: after the current `saveCheckpoint()` call completes). -3. The next execution starts immediately, calls `getCheckpoint()`, and continues from that point. -4. This repeats until the sync finishes naturally. + + + + + Your environment API key, found in **Environment Settings > API Keys** in the Nango UI. Sent as the bearer token for API calls. This key should never be shared. + -## How checkpoints work + + Deprecated alias for `apiKey`, kept for backward compatibility. Provide either `apiKey` or `secretKey`. + -A checkpoint is a small payload, defined by a schema you control, that your sync saves after processing each batch of data. On the next execution, the sync reads the checkpoint to know where it left off. + + The environment's webhook signing key, found in **Environment Settings > Webhooks > Signing key**. Used by `verifyIncomingWebhookRequest` to validate incoming webhook signatures. Falls back to `secretKey` when omitted. On environments created after 2026-04-20 (or any environment that later rotated its API key), the signing key differs from the API key, so set this explicitly to verify webhooks. + -The typical flow is: + + Omitting the host points to Nango Cloud. For local development, use `http://localhost:3003`. Use your instance URL if self-hosting. + + + + -1. Read the current checkpoint with `nango.getCheckpoint()` (returns `null` on first run). -2. Fetch a page of data from the external API, starting from the checkpoint. -3. Save the records to Nango's cache with `nango.batchSave()`. -4. Save a new checkpoint with `nango.saveCheckpoint()`. -5. Repeat until there is no more data. +## Rate limits -## Defining a checkpoint schema +The Nango SDK is rate-limited to prevent abuse and ensure fair usage across all clients. The rate limit is enforced on a per-account basis, with a fixed window of time and a maximum number of requests allowed within that window. -You define your checkpoint schema in the `createSync()` declaration using [Zod](https://zod.dev), just like your data models. The schema describes the shape of the progress marker your sync will save. +If a client exceeds the rate limit, the API will respond with a 429 `Too Many Requests` status code. In this case, the `Retry-After` header is included, indicating the number of seconds the client should wait before making another request to avoid being rate-limited. -Most commonly, the checkpoint is a timestamp indicating how far you've synced: +To handle rate limiting gracefully, clients should monitor for the 429 status code and honor the `Retry-After` header value provided in the response. -```ts -import { createSync } from 'nango'; -import * as z from 'zod'; - -export default createSync({ - description: 'Sync contacts from Salesforce', - frequency: 'every hour', - checkpoint: z.object({ - lastModifiedISO: z.string(), - }), - models: { Contact: ContactSchema }, - exec: async (nango) => { - // Implementation below - }, -}); +```js +// Example: +try { + const res = await nango.listIntegrations(); + ... +} catch(err) { + if (err.response.status === 429) { + const retryAfter = err.response.headers['retry-after']; + // wait and retry + ... + } + ... +} ``` -The checkpoint payload can be anything the external API gives you to track progress: a timestamp, a cursor, a page token, or any combination. You control the schema. +## Integrations -```ts -// Timestamp-based checkpoint -checkpoint: z.object({ lastModifiedISO: z.string() }) +### List all integrations -// Cursor-based checkpoint -checkpoint: z.object({ nextCursor: z.string() }) +Returns a list of integrations. -// Composite checkpoint -checkpoint: z.object({ lastModifiedISO: z.string(), pageToken: z.string().optional() }) +```js +await nango.listIntegrations() ``` -## Implementing an incremental sync with checkpoints - -Here is a complete example syncing Salesforce contacts incrementally: - -```ts -import { createSync } from 'nango'; -import * as z from 'zod'; - -const ContactSchema = z.object({ - id: z.string(), - first_name: z.string(), - last_name: z.string(), - email: z.string(), - last_modified_date: z.string(), -}); - -export default createSync({ - description: 'Sync contacts from Salesforce', - frequency: 'every hour', - checkpoint: z.object({ - lastModifiedISO: z.string(), - }), - models: { Contact: ContactSchema }, - - exec: async (nango) => { - // 1. Read the checkpoint (null on first run) - const checkpoint = await nango.getCheckpoint(); - - let query = 'SELECT Id, FirstName, LastName, Email, LastModifiedDate FROM Contact'; - if (checkpoint) { - // Only fetch records modified since the last checkpoint - query += ` WHERE LastModifiedDate > ${checkpoint.lastModifiedISO}`; - } - query += ' ORDER BY LastModifiedDate ASC'; - - for await (const records of nango.paginate({ - endpoint: '/services/data/v53.0/query', - params: { q: query }, - paginate: { - type: 'link', - response_path: 'records', - link_path_in_response_body: 'nextRecordsUrl', - }, - })) { - const contacts = mapContacts(records); - - // 2. Save records to the cache - await nango.batchSave(contacts, 'Contact'); +**Example Response** - // 3. Save checkpoint after each page - const lastContact = contacts[contacts.length - 1]; - await nango.saveCheckpoint({ - lastModifiedISO: lastContact.last_modified_date, - }); - } - }, -}); + +```json +{ + "configs": [ + { + "unique_key": "slack-nango-community", + "provider": "slack", + "logo": "http://localhost:3003/images/template-logos/slack.svg", + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z", + }, + { + "unique_key": "github-prod", + "provider": "github", + "logo": "http://localhost:3003/images/template-logos/github.svg", + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z", + }, + ] +} ``` + -The key pattern: **save records and checkpoint after every page**. This ensures that if the sync fails on page 50 of 100, the next run resumes from page 50 β€” not page 1. - -## The first sync run +### Get an integration -Even with checkpoints, the very first execution has no previous progress to resume from β€” `getCheckpoint()` returns `null`. This initial run fetches the entire historical dataset and is inherently more resource-intensive than subsequent runs. +Returns a specific integration. -One strategy to manage this is to limit the backfill window. For example, if you are syncing a Notion workspace, you might only fetch pages modified in the last three months, assuming older pages are less relevant: +```js +await nango.getIntegration({ uniqueKey: }); -```ts -const checkpoint = await nango.getCheckpoint(); -const since = checkpoint?.lastModifiedISO ?? threeMonthsAgo(); +// Deprecated +await nango.getIntegration(); ``` -After the initial run completes, subsequent runs are fast and incremental β€” only processing changes since the last checkpoint. - -## Implementing a full sync with checkpoints - -Not every sync can be incremental. Some APIs don't support filtering by modification date, so you must fetch all records on every run. Such syncs can still benefit from checkpoints for resilience: if a run is interrupted mid-dataset, the next run resumes from the last page instead of starting over. +**Parameters** -Call `clearCheckpoint()` at the end of a successful run so the next scheduled run starts from the first page. + + + The integration ID + + + Include sensitive data. Allowed values: `webhook`, `credentials` + + -```ts -export default createSync({ - description: 'Sync all contacts', - frequency: 'every hour', - checkpoint: z.object({ - nextCursor: z.string(), - }), - models: { Contact: ContactSchema }, - - exec: async (nango) => { - // Resume from the last page if this run was interrupted - const checkpoint = await nango.getCheckpoint(); - let nextCursor: string | undefined = checkpoint?.nextCursor; - - do { - const res = await nango.get({ - endpoint: '/contacts', - params: { cursor: nextCursor }, - }); - - const contacts = mapContacts(res.data.records); - await nango.batchSave(contacts, 'Contact'); - - nextCursor = res.data.nextCursor; - - if (nextCursor) { - await nango.saveCheckpoint({ nextCursor }); - } - } while (nextCursor); +**Example Response** - // All pages fetched, clear checkpoint so the next run starts from the first page - await nango.clearCheckpoint(); - }, -}); + +```json +{ + "data": { + "unique_key": "slack-nango-community", + "display_name": "Slack", + "provider": "slack", + "logo": "http://localhost:3003/images/template-logos/slack.svg", + "forward_webhooks": true, + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z" + } +} ``` + -## When to sync without checkpoints - -For small datasets (e.g., a list of Slack users for an organization with fewer than 100 employees), a sync without checkpoint can be perfectly fine. - -As datasets grow, full syncs become unscalable β€” taking longer to run, triggering rate limits, and consuming more compute and memory. If your dataset has more than a few thousand records and the API supports pagination and/or filtering by date or cursor, use checkpoints. - - -`deleteRecordsFromPreviousExecutions()` is incompatible with checkpoints because it requires comparing the full dataset between consecutive runs. Use `trackDeletesStart`/`trackDeletesEnd` instead β€” see [Deletion detection](/guides/functions/syncs/deletion-detection). - - -## Checkpoints vs. cursors - -Both checkpoints and [cursors](/guides/functions/syncs/records-cache#cursors-and-sync-progress) are markers of sync progress, but they track different relationships: - -| | Checkpoint | Cursor | -| --- | --- | --- | -| **Direction** | Nango β†’ external API | Your app β†’ Nango | -| **What it tracks** | How far Nango has synced from the external API | How far your app has fetched from Nango's records cache | -| **Who manages it** | Your sync function, via `saveCheckpoint()` | Your application, via the `cursor` parameter on [GET /records](/reference/backend/http-api/sync/records-list) | -| **Typical payload** | A timestamp or API cursor from the external system | An opaque string returned by Nango | +### Create an integration -Both are important: checkpoints keep your sync efficient, and cursors keep your application's data consumption efficient. +Create a new integration. -## Re-syncing: resetting checkpoints and the cache +```js +await nango.createIntegration({ provider: '', unique_key: '' }); +``` -When you [trigger a sync](/reference/backend/http-api/sync/trigger) manually (from the UI or API), you can control whether to preserve or reset progress: +**Parameters** -| Option | Default | What it does | -| --- | --- | --- | -| `reset` | `false` | When `true`, clears the checkpoint and re-fetches the full dataset from the external API. The cache is preserved, so Nango can still distinguish new records from updated ones. | -| `emptyCache` | `false` | When `true`, deletes all cached records before the sync runs. Must be used with `reset: true`. The sync starts completely fresh. | + + + The ID of the API provider in Nango (cf. [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) for a list of API provider IDs.) + -**Leave both off** for a standard incremental sync. + + The integration ID. + -**Use `reset: true`** when you want to re-fetch everything from the external API but preserve the cache for accurate change detection. This is useful when you suspect data may have been missed. + + The display name of this integration + -**Use `reset: true` with `emptyCache: true`** when you need to start from scratch β€” for example, after a breaking change to your data model. + + The credentials to include depend on the specific integration that you want to create. + - -Resetting the checkpoint triggers a full re-sync from the external API, which takes longer and may incur higher compute costs. Clearing the cache additionally means every record will be reported as `ADDED`, your previously persisted [cursors](/guides/functions/syncs/records-cache#cursors-and-sync-progress) become invalid, and you will need to reprocess the entire dataset on your side. - + + Provider-specific configuration for providers with an `integration_config` schema (e.g. `private-api-generic`, `aws-sigv4`). See the provider's integration page for fields. + -```ts -// Preserve checkpoint (standard incremental sync) -await nango.triggerSync('', ['contacts'], ''); + + Whether to forward webhooks received for this integration. Defaults to `true`. + + -// Reset checkpoint, re-fetch everything, preserve cache for change detection -await nango.triggerSync('', ['contacts'], '', { reset: true }); +**Example Response** -// Full reset β€” re-fetch everything and clear the cache -await nango.triggerSync('', ['contacts'], '', { reset: true, emptyCache: true }); + +```json +{ + "data": { + "unique_key": "slack-nango-community", + "provider": "slack", + "logo": "http://localhost:3003/images/template-logos/slack.svg", + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z", + } +} ``` + -## Observability - -Checkpoints are exposed in several places to help you monitor sync progress: - -- **Sync webhooks** β€” The [sync completion webhook](/guides/platform/webhooks-from-nango) includes checkpoint information, so your application knows how far the sync has progressed. -- **Sync status API** β€” The [GET /sync/status](/reference/backend/http-api/sync/status) endpoint returns the current checkpoint for each sync, letting you check progress programmatically. -- **Logs** β€” Checkpoint-related details are visible in the Nango dashboard logs. *(We are actively improving checkpoint visibility in the dashboard.)* - -## Testing checkpoints locally +### Update an integration -When developing locally with the Nango CLI, you can pass a checkpoint value to `dryrun` to simulate resuming from a previous run: +Patch an integration. The first argument identifies the integration; all body fields are optional and only the fields you pass are updated. -```bash -nango dryrun salesforce-contacts '' --checkpoint '{"lastModifiedISO": "2024-01-15T00:00:00Z"}' +```js +await nango.updateIntegration({ uniqueKey: '' }, { display_name: 'New name' }); ``` -This lets you test that your sync correctly resumes from a checkpoint without needing to run a full initial sync first. See the [testing guide](/guides/functions/testing) for more details, including how to write unit tests for checkpoint logic. +**Parameters** - -**Migrating from `nango.lastSyncDate`?** Checkpoints replace it with a schema you control, mid-run granularity, and failure-resumption. Follow the [migration guide](/guides/platform/migrations/migrate-to-checkpoints) for step-by-step instructions. - + + + The integration ID to update. Passed in the first argument. + -## Reference + + A new integration ID, to rename the integration. Not allowed when the integration has active connections. + -| Function | Description | -| --- | --- | -| [`nango.getCheckpoint()`](/reference/functions/functions-sdk#getcheckpoint) | Retrieves the current checkpoint. Returns `null` on first run or after a reset. | -| [`nango.saveCheckpoint()`](/reference/functions/functions-sdk#savecheckpoint) | Saves progress. Call after each batch of data. | -| [`nango.clearCheckpoint()`](/reference/functions/functions-sdk#clearcheckpoint) | Clears the checkpoint. Use at the end of a full sync so the next run starts from the first page. Checkpoints are also automatically cleared when triggering a sync with `reset: true`. | + + The display name of this integration + -## Records cache + + Whether to forward webhooks received for this integration. + -Source: https://nango.dev/docs/guides/functions/syncs/records-cache.md -Description: How Nango stores synced records, detects changes, and lets your app fetch deltas via cursors. + + The credentials to include depend on the specific integration that you want to update. + -Sync functions replicate records from an external API to your system continuously. To do this reliably, Nango uses a **records cache** β€” an intermediate store that sits between the external API and your application. + + Provider-specific configuration for providers with an `integration_config` schema. Only the fields you pass are updated. + -Every time you call [`nango.batchSave()`](/reference/functions/functions-sdk#save-records) or [`nango.batchDelete()`](/reference/functions/functions-sdk#delete-records) inside a sync function, you are writing to this cache. Your application then reads from the cache using the [GET /records](/reference/backend/http-api/sync/records-list) endpoint or the [Node SDK](/reference/backend/backend-sdk/node#get-records). + + Free-form custom values for providers without an `integration_config` schema. + + -## What the cache does +**Example Response** -The records cache fulfils three roles: + +```json +{ + "data": { + "unique_key": "slack-nango-community", + "provider": "slack", + "logo": "http://localhost:3003/images/template-logos/slack.svg", + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z", + } +} +``` + -**Change detection** β€” By tracking every record that has been synced, Nango can tell you which records are new, which have been updated, and which have been deleted. Your application only needs to fetch the delta, reducing bandwidth and processing on your side. +### Delete an integration -**Reliable data availability** β€” Fetching from external APIs is inherently unreliable: rate limits, timeouts, and transient errors are common. The cache decouples this unreliable step from your application. Once data lands in the cache, you can fetch it quickly and reliably. +Deletes a specific integration. -**Observability** β€” The cache gives you visibility into the state of synced data directly from the Nango dashboard and API, including record counts, last sync times, and change history. +```js +await nango.deleteIntegration(); +``` -## How records are identified and compared +**Parameters** -Each record in the cache is uniquely identified by two things: + + + The integration ID. + + -- **Record ID** β€” The `id` field you set on each record in your sync function. This should match the unique identifier of the record in the external system (e.g. the external API's primary key). -- **Payload hash** β€” Nango computes a hash of the full record payload. When a record with the same ID is saved again, Nango compares hashes to determine whether the record has actually changed. +**Example Response** -If the ID already exists and the hash is identical, the record is considered unchanged and no update is emitted. If the hash differs, Nango marks it as updated. + +```json +{ + "success": true +} +``` + - -Be careful with fields that change on every fetch but don't represent a meaningful change to the record, such as a `fetched_at` timestamp. Including such fields in the payload will cause Nango to report spurious updates on every sync run. If possible, exclude or normalize these fields before calling `batchSave()`. - +## Connect -## How records are stored +### Create a connect session -The cache only keeps the **latest version** of each record β€” there is no versioning or history of payloads. When you call `batchSave()` with an existing ID, the previous payload is overwritten. +Create a connect session. The token is short-lived and lasts for 30 minutes. -When you call `batchDelete()`, you only need to pass the record's `id`. This does **not** remove the record from the cache. Instead, it marks the record as deleted (a soft delete), so your application can react to the deletion event. The last-known payload is preserved. - -```ts -// Saving records to the cache -await nango.batchSave(contacts, 'Contact'); +```js +const { data } = await nango.createConnectSession({ + // Recommended: copied onto the connection and included in auth webhooks. + tags: { + end_user_id: '', + end_user_email: '', + organization_id: '' + }, -// Marking records as deleted (soft delete) -const toDelete = [{ id: 'record-123' }, { id: 'record-456' }]; -await nango.batchDelete(toDelete, 'Contact'); + allowed_integrations: ['', ''], + integrations_config_defaults: { + : { + connection_config: { + : '' + } + } + } +}); ``` -## Fetching records: the change stream - -The [GET /records](/reference/backend/http-api/sync/records-list) endpoint returns a **chronologically ordered stream of record changes**. Each entry in the stream includes: - -- The full record payload -- Metadata indicating whether the record was `ADDED`, `UPDATED`, or `DELETED` -- A cursor for tracking your sync progress - -```json -{ - "records": [ - { - "id": "contact-1", - "name": "Alice", - "_nango_metadata": { - "first_seen_at": "2024-01-15T10:00:00.000Z", - "last_modified_at": "2024-01-15T10:00:00.000Z", - "last_action": "ADDED", - "deleted_at": null, - "cursor": "MjAyNC0wMS0xNVQxMDowMDowMC..." - } - }, - { - "id": "contact-2", - "name": "Bob (updated)", - "_nango_metadata": { - "first_seen_at": "2024-01-10T08:00:00.000Z", - "last_modified_at": "2024-01-15T10:05:00.000Z", - "last_action": "UPDATED", - "deleted_at": null, - "cursor": "MjAyNC0wMS0xNVQxMDowNTowMC..." - } - } - ], - "next_cursor": "MjAyNC0wMS0xNVQxMDowNTowMC..." -} -``` +**Parameters** -You can filter the stream to only return records with a specific `last_action` (`added`, `updated`, or `deleted`) using the `filter` query parameter. + -## Cursors and sync progress + + Deprecated. Use `tags` instead. + -Every record change in the cache has a **cursor** attached to it. Cursors are opaque, ordered strings that let you: + + Deprecated. Use `tags` instead. + + + The unique identifier for the organization. + + + The display name of the organization. + + + -1. **Track how far you've synced** β€” After fetching records, persist the cursor of the last record you processed. On the next fetch, pass it back to only receive changes that happened after that point. -2. **Paginate through large result sets** β€” The same cursor is used for pagination when there are more records than the page `limit`. + + An array of integration IDs that are allowed for this session. + - -You must persist the cursor on your side for each combination of **connection** and **sync function**. This is how you keep track of your sync progress and avoid reprocessing records. - + + Optional. Tags that will be copied onto the created connection and included in auth webhooks. + - - -```ts -import { Nango } from '@nangohq/node'; + + Default configuration for specific integrations. For OAuth2 integrations, you can allow end-users to provide their own OAuth client credentials by setting empty `oauth_client_id_override` and `oauth_client_secret_override` values: + ```js + integrations_config_defaults: { + google: { + connection_config: { + oauth_client_id_override: '', + oauth_client_secret_override: '' + } + } + } + ``` + When set to empty strings, Connect UI will display optional input fields for users to enter their own OAuth app credentials. -const nango = new Nango({ secretKey: '' }); + `connection_config` also accepts `webhook_url` to override the environment's webhook URLs for the connection created with this session. When set, that connection's webhooks are sent only to this URL. See [Override webhook URLs per connection](/guides/platform/webhooks-from-nango#override-webhook-urls-per-connection). + ```js + integrations_config_defaults: { + '': { + connection_config: { + webhook_url: 'https://.ngrok.app/webhooks-from-nango' + } + } + } + ``` + -// Fetch only records that changed since your last cursor -const result = await nango.listRecords({ - providerConfigKey: '', - connectionId: '', - model: 'Contact', - cursor: '' -}); + + Override Connect UI settings per integration. The key is your integration's unique ID (e.g. `jira`, `slack`, `github`) and the value is an object with the settings to override. Currently supports overriding the documentation URL shown in info icons during the connect flow: + ```js + overrides: { + '': { + docs_connect: 'https://your-docs.com/how-to-connect' + } + } + ``` + Available on the [Growth plan](https://www.nango.dev/pricing). + + -// Process records... +**Returns** -// Persist the cursor of the last record for next time -if (result.records.length > 0) { - const lastCursor = result.records[result.records.length - 1]._nango_metadata.cursor; - await saveToDatabase(connectionId, syncName, lastCursor); + +```json +{ + "data": { + "token": "nango_connect_session_4603dbca8a588315ba69b5bfddde52e72d312dc2d2870bd5e45da6357333601c", + "connect_link": "https://connect.nango.dev/?session_token=nango_connect_session_4603dbca8a588315ba69b5bfddde52e72d312dc2d2870bd5e45da6357333601c", + "expires_at": "2024-09-27T19:49:51.449Z" + } } ``` -
- -```bash -curl -G https://api.nango.dev/records \ - --header 'Authorization: Bearer ' \ - --header 'Provider-Config-Key: ' \ - --header 'Connection-Id: ' \ - --data-urlencode 'model=Contact' \ - --data-urlencode 'cursor=' -``` - -
- -## Re-syncing: preserve vs. clear the cache - -See [Re-syncing: resetting checkpoints and the cache](/guides/functions/syncs/checkpoints#re-syncing-resetting-checkpoints-and-the-cache) in the Checkpoints guide for the `reset` / `emptyCache` options and their implications. - -## Cache summary - -| Concept | Details | -| --- | --- | -| **Writing to the cache** | `nango.batchSave()` and `nango.batchDelete()` in sync functions | -| **Reading from the cache** | `GET /records` endpoint or `nango.listRecords()` SDK method | -| **Record identity** | Determined by the `id` field you set on each record | -| **Change detection** | Based on comparing payload hashes for the same `id` | -| **Versioning** | None β€” only the latest payload is kept | -| **Deletions** | Soft delete β€” record is marked as deleted, payload is preserved | -| **Cursor** | Opaque ordered string for tracking sync progress and pagination | -| **Payload TTL** | 30 days without update β†’ payload pruned | -| **Full record TTL** | 60 days without sync execution β†’ all records hard-deleted | - -## Related guides - -- [Sync functions](/guides/functions/syncs/sync-functions) - write records into the cache. -- [Sync efficiency](/guides/functions/syncs/sync-efficiency) - keep records small and consume changes promptly. -- [Deletion detection](/guides/functions/syncs/deletion-detection) - mark records deleted in the cache. -- [Get records API](/reference/backend/http-api/sync/records-list) - fetch changed records from your app. - -## Deletion detection - -Source: https://nango.dev/docs/guides/functions/syncs/deletion-detection.md -Description: Surface deletes from the external API β€” even when the API itself doesn't expose them cleanly. - -Sometimes you need to know when a record you are syncing has been deleted in the external system. Deletion detection works differently depending on whether your sync function is incremental or full β€” pick the strategy that matches your sync approach. - -For incremental syncs, you must actively tell Nango which IDs have been removed. For full syncs (which fetch all records on every run), Nango can compute deletes for you automatically. - -## Detecting deletes in incremental syncs - -When your sync only fetches changed data since the previous run, Nango has no built-in way to know which records disappeared on the provider side. - -You must actively tell Nango which IDs have been removed by calling `nango.batchDelete()` ([full reference](/reference/functions/functions-sdk#delete-records)) inside the sync function. - -### When can you use this? - -You can use `nango.batchDelete()` if the external API supports one of the following: - -- A dedicated "recently deleted" endpoint (e.g. `GET /entities/deleted?since=...`) -- The ability to filter or sort by a deletion timestamp -- The ability to filter or sort by last-modified timestamp and records include a flag like `is_deleted`, `archived`, etc. + -If none of these are available, you cannot detect deletes in an incremental sync. You'll either need to switch to a full sync or skip deletion detection. +### Create a reconnect session -### Example +Create a reconnect session for a given `connection_id`. +You can pass `tags` to update connection attribution during reconnection. +Use this method when a user needs to input new credentials or to manually refresh token. -```ts -import { createSync } from 'nango'; -import * as z from 'zod'; +This method is only compatible with `connection_id` created with a session token. -const AccountSchema = z.object({ - id: z.string(), - name: z.string() -}); +```js +const { data } = await nango.createReconnectSession({ + // Required + connection_id: '', + integration_id: '', -export default createSync({ - description: 'Sync Accounts incrementally and handle deletions', - frequency: 'every 2 hours', - endpoints: [{ method: 'GET', path: '/accounts', group: 'Accounts' }], - models: { Account: AccountSchema }, - checkpoint: z.object({ - lastSyncedISO: z.string(), - }), - - exec: async (nango) => { - const checkpoint = await nango.getCheckpoint(); - const now = new Date().toISOString(); - - // (1) Fetch newly created / updated accounts - const res = await nango.get({ - endpoint: '/accounts', - params: { ...(checkpoint && { since: checkpoint.lastSyncedISO }) } - }); - await nango.batchSave(res.data, 'Account'); - - // (2) Fetch deletions since the last run (if this is not the first run) - if (checkpoint) { - const deletedRes = await nango.get({ - endpoint: '/accounts/deleted', - params: { since: checkpoint.lastSyncedISO } - }); - - // (3) Tell Nango which IDs have been deleted in the external system - const toDelete = deletedRes.data.map((row: any) => ({ id: row.id })); - if (toDelete.length) { - await nango.batchDelete(toDelete, 'Account'); - } + // Optional + tags: { + end_user_id: '', + end_user_email: '', + organization_id: '' + }, + integrations_config_defaults: { + : { + connection_config: { + : '' + } } - - // (4) Save checkpoint for next run - await nango.saveCheckpoint({ lastSyncedISO: now }); } }); ``` -## Detecting deletes in full syncs - -Sync functions that fetch all records on every run can automatically detect deletions. - -Nango detects removals by computing the diff between what existed before `trackDeletesStart` and what was saved between `trackDeletesStart` and `trackDeletesEnd` ([full reference](/reference/functions/functions-sdk#detect-deletions-automatically)). +**Parameters** -This works whether your full sync uses checkpoints for resilience or not. If it does, `trackDeletesStart` should be called before fetching any data and `trackDeletesEnd` after all records are saved and the checkpoint is cleared. + + + The unique identifier for the connection. + -### Example + + The unique identifier for the integration. + -```ts -import { createSync } from 'nango'; -import * as z from 'zod'; + + Optional. Tags to apply to the connection during reconnection. + -const TicketSchema = z.object({ - id: z.string(), - subject: z.string(), - status: z.string() -}); + + Deprecated. Use `tags` instead. + -export default createSync({ - description: 'Fetch all help-desk tickets', - frequency: 'every day', - endpoints: [{ method: 'GET', path: '/tickets', group: 'Tickets' }], - models: { Ticket: TicketSchema }, + + Deprecated. Use `tags` instead. + + + The unique identifier for the organization. + + + The display name of the organization. + + + - exec: async (nango) => { - // Mark the start of deletion tracking - await nango.trackDeletesStart('Ticket'); + + Default configuration for specific integrations. + + - const tickets = nango.paginate<{ id: string; subject: string; status: string }>({ - endpoint: '/tickets', - paginate: { type: 'cursor', cursor_path_in_response: 'next', cursor_name_in_request: 'cursor', response_path: 'tickets' } - }); +**Returns** - for await (const page of tickets) { - await nango.batchSave(page, 'Ticket'); + +```json +{ + "data": { + "token": "nango_connect_session_4603dbca8a588315ba69b5bfddde52e72d312dc2d2870bd5e45da6357333601c", + "connect_link": "https://connect.nango.dev/?session_token=nango_connect_session_4603dbca8a588315ba69b5bfddde52e72d312dc2d2870bd5e45da6357333601c", + "expires_at": "2024-09-27T19:49:51.449Z" } - - // Detect and mark deleted records - await nango.trackDeletesEnd('Ticket'); - } -}); +} ``` + -### How the algorithm works - -1. When `trackDeletesStart` is called, Nango marks the beginning of the deletion tracking window for the model. -2. Records saved with `batchSave` between `trackDeletesStart` and `trackDeletesEnd` are tracked. -3. When `trackDeletesEnd` is called, Nango compares what existed before `trackDeletesStart` with what was saved in the window. -4. Any records missing from the new dataset are marked as deleted (soft delete). They remain accessible from the Nango cache, but with `record._metadata.deleted === true`. - - -**Be careful with exception handling when using** `trackDeletesStart`/`trackDeletesEnd` - -Nango only performs deletion detection (the "diff") if a sync run completes successfully without any uncaught exceptions. - -Exception handling is critical: -- If your sync doesn't fetch the full dataset between the two calls (e.g. you catch and swallow an exception), Nango will attempt the diff on an incomplete dataset. -- This leads to false positives, where valid records are mistakenly considered deleted. - -**What You Should Do** - -If a failure prevents full data retrieval, make sure the sync run fails and `trackDeletesEnd` is not being called: -- Let exceptions bubble up and interrupt the run. -- If you're using `try/catch`, re-throw exceptions that indicate incomplete data. - - - -**How to use** `trackDeletesStart`/`trackDeletesEnd` **safely** - -If some records are incorrectly marked as deleted, you can trigger a full resync (via the UI or API) to restore the correct data state. - -We strongly recommend not performing irreversible destructive actions (like hard-deleting records in your system) based solely on deletions reported by Nango. A full resync should always be able to recover from issues. - - -## Troubleshooting deletion detection issues - -| Symptom | Likely cause | -| --- | --- | -| Records that still exist in the source API are shown as `deleted` in Nango | Sync didn't save all records (silent failures) between `trackDeletesStart` and `trackDeletesEnd` | -| You never see deleted records | Check if deletion detection is implemented for the sync. | - -## Related guides - -- [Sync functions](/guides/functions/syncs/sync-functions) - implement full and incremental syncs. -- [Records cache](/guides/functions/syncs/records-cache) - understand how deleted records are exposed to your app. -- [Sync efficiency](/guides/functions/syncs/sync-efficiency) - reduce API work during delete detection. -- [Functions SDK reference](/reference/functions/functions-sdk#delete-records) - deletion helper methods. - -## Real-time syncs with webhooks - -Source: https://nango.dev/docs/guides/functions/syncs/realtime-syncs.md -Description: Combine webhooks from external APIs with periodic polling for a reliable, real-time stream of changes. - -Nango supports real-time syncs using [webhook functions](/guides/functions/webhook-functions). You can rely entirely on webhooks or combine them with polling to ensure you never miss data. - -## What is a real-time sync - -Real-time sync involves receiving webhooks from external APIs and processing them inside a sync function. By default, sync functions poll data at a set frequency, but they can also be configured to handle webhooks for real-time updates. - -When processed in a sync: -- The webhook triggers the execution of a Nango sync script -- The script extracts data from the webhook and optionally fetches additional data from the external API -- The modified data is stored in the Nango cache - -Whenever the cache is updated, Nango sends a [sync completion webhook](/guides/platform/webhooks-from-nango#sync-webhooks) to notify your application of new data. This entire process happens in real-time. - -### Webhooks & periodic polling - -Webhooks can fail due to external API outages or unordered events. Periodic polling ensures data consistency by reconciling any missed updates. - -If you use webhooks for real-time syncs, we recommend always combining them with a polling sync function. - -### Near real-time syncing - -As an alternative to real-time syncing, consider **near**-real-time syncing by polling at a higher frequency, which is simpler. Sync functions can run as frequently as every 30 seconds. - -This is more resource intensive, but can be a good compromise if you are only syncing data for a handful of [Connections](/guides/auth/auth-guide#overview). - -## Implement a real-time sync - -### Step 1 β€” Setup prerequisites - -To create a real-time sync, you need: -- Webhooks from the external API enabled. Follow [Webhook functions](/guides/functions/webhook-functions). -- A sync function for the object you want to sync. See [Sync functions](/guides/functions/syncs/sync-functions). - -### Step 2 β€” Enable webhooks processing - -To enable the real-time sync, define `webhookSubscriptions` and `onWebhook` in your sync function: - -```typescript -export default createSync({ - exec: async (nango) => { - // Use for periodic polling. - }, +## Connections - webhookSubscriptions: ['contact.propertyChange'], // Webhook event type to listen to +### List connections - // Webhook handler - onWebhook: async (nango, payload) => { - if (payload.subscriptionType === 'contact.propertyChange') { - const updatedObject = { - id: payload.objectId, - [payload.propertyName]: payload.propertyValue - }; +Returns a list of connections without credentials. - // Use nango.batchSave() or nango.batchUpdate() to save/update records. - } - } +```js +await nango.listConnections({ + connectionId: 'connection-id', + integrationId: 'integration-456', + limit: 100, + tags: { "end_user_id": 'user-123' } }); ``` -To check if a sync supports webhooks, navigate to the _Integrations_ tab > select an integration > _Endpoints_ sub-tab > check the function settings for webhook subscriptions. +**Parameters** -## Sync concurrency considerations - -When a polling run and a webhook race to update the same record, the later write wins by default β€” which can clobber a fresher webhook update with stale polled data. To prevent that, set a merging strategy at the start of your function: + + + + + Optional. Will exactly match a given connectionId. Can return multiple connections with the same ID across integrations. + + + Deprecated. Prefer filtering connections using `tags` instead (e.g. `end_user_id`). + + + Optional. Filter by integration ID. + + + Optional. Filter by tags associated with connections. + + + + -```typescript -export default createSync({ - exec: async (nango) => { - // Don't overwrite records that were modified after this batch was fetched - await nango.setMergingStrategy({ strategy: 'ignore_if_modified_after' }, 'Contact'); +**Example Response** - const contacts: Contact[] = []; - await nango.batchSave(contacts, 'Contact'); - } -}); + +```json +{ + "connections": [ + { + "id": 1, + "connection_id": "test-1", + "provider": "slack", + "provider_config_key": "slack-nango-community", + "created": "2023-06-03T14:53:22.051Z", + "metadata": null, + "tags": { + "end_user_id": "your-internal-id", + "end_user_email": "user@example.com", + "organization_id": "user-organization-id" + }, + "errors": [] + }, + { + "id": 2, + "connection_id": "test-2", + "provider": "slack", + "provider_config_key": "slack-nango-community", + "created": "2023-06-03T15:00:14.945Z", + "metadata": { + "bot_id": "some-uuid" + }, + "tags": { + "end_user_id": "your-internal-id", + "end_user_email": "user@example.com", + "organization_id": "user-organization-id" + }, + "errors": [{ "type": "auth", "log_id": "VrnbtykXJFckCm3HP93t"}] + } + ] +} ``` + + +### Get a connection (with credentials) -Two strategies are available: +Returns a specific connection with credentials. -- **`override`** (default) β€” applies updates regardless of last modification time. May overwrite real-time webhook updates with older polled data. -- **`ignore_if_modified_after`** β€” preserves records that were modified after the current batch was fetched. **Recommended** when you combine polling with webhooks. +```js +await nango.getConnection(, ); +``` -Run `batchSave` / `batchUpdate` / `batchDelete` calls sequentially (not in parallel), and persist data promptly after fetching β€” concurrent batch operations can race against each other. + +The response content depends on the API authentication type (OAuth 2, OAuth 1, API key, Basic auth, etc.). -## Related guides +If you do not want to deal with collecting & injecting credentials in requests for multiple authentication types, use the Proxy ([step-by-step guide](/guides/platform/proxy-requests)). + -- [Webhook functions](/guides/functions/webhook-functions) - process external API webhooks in Nango. -- [Webhook forwarding](/guides/platform/webhook-forwarding) - forward provider webhooks to your app. -- [Sync functions](/guides/functions/syncs/sync-functions) - keep a polling sync as reconciliation. -- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - consume sync completion notifications. + +When you fetch the connection with this API endpoint, Nango will check if the access token has expired. If it has, it will refresh it. -## Sync partitioning +We recommend not caching tokens for longer than 5 minutes to ensure they are fresh. + -Source: https://nango.dev/docs/guides/functions/syncs/sync-partitioning.md -Description: Spawn multiple independent sync processes inside a single connection β€” one per mailbox, drive folder, Slack channel, repo, or any other partition. +**Parameters** -Sync variants let you spawn multiple independent sync processes **inside a single connection** β€” one per mailbox, file folder, Slack channel, repo, or any other sub-resource the end-user has access to. Each variant runs on its own schedule, with its own checkpoint and records cache, so a slow partition doesn't block a fast one. + + + The integration ID. + + + The connection ID. + + + Defaults to `false`. If `false`, the token will only be refreshed if it expires within 15 minutes. If `true`, a token refresh attempt will happen on each request. This is only useful for testing and should not be done at high traffic. + + + Defaults to `false`. If `false`, the refresh token is not included in the response, otherwise it is. In production, it is not advised to return the refresh token, for security reasons, since only the access token is needed to sign requests. + + + Defaults to `false`. If true, this will refresh the JWT token for GitHub App / Github App OAuth connections + + -Nango is already multi-tenant by default β€” every sync function executes in the context of an end-user [Connection](/guides/auth/auth-guide#overview), and runs independently for each connection. Variants are for the next level down: fan-out *within* one connection. +**Example Response** -## Overview + +```json +{ + "id": 18393, + "created_at": "2023-03-08T09:43:03.725Z", + "updated_at": "2023-03-08T09:43:03.725Z", + "provider_config_key": "github", + "connection_id": "1", + "credentials": { + "type": "OAUTH2", + "access_token": "gho_tsXLG73f....", + "refresh_token": "gho_fjofu84u9....", + "expires_at": "2024-03-08T09:43:03.725Z", + "raw": { // Raw token response from the OAuth provider: Contents vary! + "access_token": "gho_tsXLG73f....", + "refresh_token": "gho_fjofu84u9....", + "token_type": "bearer", + "scope": "public_repo,user" + } + }, + "connection_config": { + "subdomain": "myshop", + "realmId": "XXXXX", + "instance_id": "YYYYYYY" + }, + "metadata": { + "myProperty": "yes", + "filter": "closed=true" + } +} +``` + -Traditionally, a sync function is defined once and executed once per connection. With variants, you can create multiple instances of the same function that share the base configuration but run independently. Each variant has its own execution schedule, checkpoint, and data storage. +### Patch a connection -Key benefits: -- **Parallel execution** β€” variants run independently, so a slow mailbox or folder doesn't block the others. -- **Custom filtering** β€” each variant can target a different sub-resource (e.g., a specific Gmail label, a specific Drive folder). -- **Per-partition state** β€” each variant has its own checkpoint and cache, so failures and re-syncs are isolated. -- **Dynamic scale** β€” create or delete variants programmatically as the end-user adds/removes sub-resources. +Patch a connection. -## How sync variants work +```js +await nango.patchConnection({ + connectionId: '', + provider_config_key: '' + }, + { ...body }); +``` -- By default, a sync is associated with a base variant. -- You can create additional sync variants programmatically using the API or SDK. -- Each variant is treated as a separate sync in the Nango UI. -- Sync webhooks include a variant field to identify which variant was executed. -- External webhooks (e.g., from Airtable) are always processed by the base variant. -- If a sync variant needs additional context (e.g., filtering parameters), store/retrieve it using the connection metadata, namespaced with the variant ID. +**Parameters** -## Creating a sync variant + + + The body of the connection (see [API Reference](/reference/backend/http-api/connections/patch)). + + + Connection tags (key/value strings). Keys are normalized to lowercase. + + + Maximum string length: 255 + + + + + Deprecated. Use tags instead + + + Deprecated. Uniquely identifies the end user. + + + Deprecated. The email address of the end user. + + + Deprecated. The display name of the end user. + + + Deprecated. Tags associated with the end user. Only accepts string values, up to 64 keys. + + + + + + - -Each sync can have a maximum of **100 variants** per connection. For heavier workloads, reach out to increase this limit. - +**Example Response** -To create a sync variant, use the Nango API or SDK. The variant must have a unique name and cannot be "base" (reserved). + +```json +{ + "success": true +} +``` + - - - ```ts - // Create a sync variant - await nango.createSyncVariant({ - provider_config_key: 'my-integration', - connection_id: 'customer-123', - name: 'sync-orders', - variant: 'high-value-orders' - }); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/sync/sync-orders/variant/high-value-orders \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "provider_config_key": "my-integration", - "connection_id": "customer-123" - }' - ``` - - +### Get connection metadata -This creates a new variant named `high-value-orders` for the `sync-orders` sync. It will run separately from the base variant. +Returns a connection's metadata. -## Running & managing sync variants +```js +await nango.getMetadata('', 'CONNECTION-ID'); +``` -Once created, a variant can be managed just like a regular sync. All sync operations (triggering, pausing, resuming, etc.) support the variant parameter. +If you know the structure of the metadata, you can specify a type; -Check out the [HTTP API reference](/reference/backend/http-api/sync/trigger) or [Node SDK reference](/reference/backend/backend-sdk/node#trigger-syncs) for details. +```ts +interface CustomMetadata { + anyKey: Record; +} +const myTypedMetadata = await nango.getMetadata('', ''); +``` -## Accessing the variant in a sync script +**Parameters** -When a sync script runs, the variant name is available via `nango.variant`. You can use this to customize the behavior of your sync. + + + The integration ID of the connection. + -```ts example-partitioned-sync-script.ts -export default createSync({ - exec: async (nango) => { - await nango.log(`Running sync with variant: ${nango.variant}`); + + The connection ID. + + - // Use the variant name to namespace the metadata and/or customize API calls. - const res = await nango.get({ - endpoint: `/orders?filter=${nango.variant}` - }); +**Example Response** - // Records are saved in the context of this specific variant. - await nango.batchSave(res.data.orders, 'Order'); - }, -}); + +```json +{ + "custom_key1": "custom_value1" +} ``` + -## Fetching data for a variant +### Set connection metadata -Use the `variant` query parameter when retrieving records from the Nango API. +Set custom metadata for the connection or connections (overrides existing metadata). - - - ```ts - const records = await nango.listRecords({ - providerConfigKey: 'my-integration', - connectionId: 'customer-123', - model: 'Order', - variant: 'high-value-orders' - }); - ``` - - - ```bash - curl --request GET \ - --url "https://api.nango.dev/records?model=Order&variant=high-value-orders" \ - --header 'Authorization: Bearer ' - ``` - - +```js +await nango.setMetadata('', 'CONNECTION-ID', { 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); -This fetches only the records for the `high-value-orders` variant. +# set an array of connection ids +await nango.setMetadata('', ['CONNECTION-ID', 'CONNECTION-ID-TWO'], { 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); +``` -## Storing variant-specific context +**Parameters** -If a sync variant requires custom parameters (e.g., a filtering threshold), store them in the connection metadata, namespaced by the variant ID. + + + The integration ID of the connection. + -Storing metadata: + + The connection ID or connection IDs. + - - - ```ts - await nango.setMetadata('my-integration', 'customer-123', { - 'high-value-orders.threshold': 500 - }); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/metadata \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "connection_id": "customer-123", - "metadata": { - "high-value-orders.threshold": 500 - } - }' - ``` - - - -Retrieving metadata in a sync script: + + The custom metadata to store in the connection. + + -```ts example-partitioned-sync-script.ts -const metadata = await nango.getMetadata(); -const threshold = metadata[`${nango.variant}.threshold`] || 100; +**Response** -await nango.log(`Filtering orders above ${threshold}`); + +```json +{ + "connection_id": "", + "provider_config_key": "", + "metadata": { + "CUSTOM_KEY1": "CUSTOM_VALUE1" + } +} ``` + -Keep variants non-overlapping in data scope (unless intentional), store variant-specific settings in connection metadata rather than hardcoding them, and avoid creating one variant per row of data β€” variants are best for partitioning, not row-level fan-out. - -## Related guides - -- [Sync functions](/guides/functions/syncs/sync-functions) - build the base sync before adding variants. -- [Checkpoints](/guides/functions/syncs/checkpoints) - track progress per variant. -- [Records cache](/guides/functions/syncs/records-cache) - fetch data for each variant. -- [Create sync variant API](/reference/backend/http-api/sync/create-variant) - manage variants programmatically. - -## Action functions - -Source: https://nango.dev/docs/guides/functions/action-functions.md -Description: Build Action functions that your app, backend jobs, or agents can call on demand. - -Action functions run when your app, backend job, or agent explicitly calls them. In SDK and API names, this function type is often called an **action** because it receives an input and returns an output. - -Use action functions for reads, writes, multi-step provider workflows, unified API operations, and AI tools. - -## Create the function - -Add a file under the integration's `actions/` folder: - -```typescript github/actions/create-issue.ts -import { createAction } from 'nango'; -import * as z from 'zod'; - -export default createAction({ - description: 'Creates a GitHub issue', - version: '1.0.0', - input: z.object({ - owner: z.string(), - repo: z.string(), - title: z.string(), - body: z.string().optional() - }), - output: z.object({ - id: z.number(), - url: z.string().url() - }), - exec: async (nango, input) => { - const response = await nango.post({ - endpoint: `/repos/${input.owner}/${input.repo}/issues`, - data: { - title: input.title, - body: input.body - } - }); +### Edit connection metadata - return { - id: response.data.id, - url: response.data.html_url - }; - } -}); -``` +Edit custom metadata for the connection or connections. Only overrides specified properties, not the entire metadata. -Import it from `index.ts`: +```js +await nango.updateMetadata('', 'CONNECTION-ID', { 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); -```typescript index.ts -import './github/actions/create-issue'; +# update an array of connection ids +await nango.updateMetadata('', ['CONNECTION-ID', 'CONNECTION-ID-TWO'], { 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); ``` - - The output of an action function cannot exceed 2 MB. Return only the fields your app needs. For larger payloads, use the [requests proxy](/guides/platform/proxy-requests) to fetch data directly from your app. - +**Parameters** - - Before generating an action function, collect the integration ID, connection ID for testing, provider endpoint, required input fields, expected output shape, and whether the operation is safe to retry. + + + The integration ID of the connection. + - Prefer explicit Zod schemas and short provider response mapping. If the action performs writes, make the logic idempotent before using async execution or retries. - + + The connection ID or connection IDs. + -## Test and deploy + + The custom metadata to store in the connection. + + -Dry run the function with realistic input: +**Response** -```bash -nango dryrun create-issue '' -e dev --input '{"owner":"NangoHQ","repo":"interactive-demo","title":"Bug report","body":"Created from a Nango action"}' + +```json +{ + "connection_id": "", + "provider_config_key": "", + "metadata": { + "CUSTOM_KEY1": "CUSTOM_VALUE1" + } +} ``` + -Deploy your functions: - -```bash -nango deploy -``` +### Delete a connection -To deploy only this action function: +Deletes a specific connection. -```bash -nango deploy --action create-issue dev +```js +await nango.deleteConnection('', 'CONNECTION-ID'); ``` -For broader test coverage, see the [testing guide](/guides/functions/testing). To deploy from CI, see [CI/CD](/guides/functions/ci-cd). - -## Trigger synchronously - -Synchronous execution is the default. The API or SDK call returns the function output. - - - - ```typescript - import { Nango } from '@nangohq/node'; - - const nango = new Nango({ secretKey: process.env.NANGO_SECRET_KEY! }); +**Parameters** - const result = await nango.triggerAction( - 'github', - '', - 'create-issue', - { - owner: 'NangoHQ', - repo: 'interactive-demo', - title: 'Bug report', - body: 'Created from a Nango action' - } - ); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/action/trigger \ - --header 'Authorization: Bearer ' \ - --header 'Connection-Id: ' \ - --header 'Provider-Config-Key: github' \ - --header 'Content-Type: application/json' \ - --data '{ - "action_name": "create-issue", - "input": { - "owner": "NangoHQ", - "repo": "interactive-demo", - "title": "Bug report", - "body": "Created from a Nango action" - } - }' - ``` - - + + + The integration ID of the connection. + -## Trigger asynchronously + + The connection ID. + + -Use async execution for bulk writes, bursty work, or provider endpoints with tight rate limits. Nango queues the execution, applies retries, and lets you poll or receive a webhook when it completes. +**Response** - - Execution timing for asynchronous actions is not guaranteed. Async actions are currently processed sequentially per environment, so completion time depends on how many actions are queued and how long each one runs. Design callers to handle delays by polling the result endpoint or listening for the completion webhook. - +Empty response. - - - ```typescript - const { id, statusUrl } = await nango.triggerActionAsync( - 'github', - '', - 'create-issue', - { - owner: 'NangoHQ', - repo: 'interactive-demo', - title: 'Bug report', - body: 'Created from an async Nango action' - } - ); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/action/trigger \ - --header 'Authorization: Bearer ' \ - --header 'Connection-Id: ' \ - --header 'Provider-Config-Key: github' \ - --header 'X-Async: true' \ - --header 'X-Max-Retries: 3' \ - --header 'Content-Type: application/json' \ - --data '{ - "action_name": "create-issue", - "input": { - "owner": "NangoHQ", - "repo": "interactive-demo", - "title": "Bug report", - "body": "Created from an async Nango action" - } - }' - ``` - - +### Wait for connection -Poll the result: +Waits for a connection to be created for a given end user and integration. This is useful in agentic flows where you need to wait for a user to complete the OAuth flow before proceeding. -```typescript -const result = await nango.getAsyncActionResult({ id }); +```js +const connection = await nango.waitForConnection('', ''); ``` -The async trigger response includes a `statusUrl` and `id`. Poll `GET /action/` for the result: `404` means the execution is still running, `200` returns the function output, and `500` returns the execution error. - -To receive completion events instead of polling, configure [webhooks from Nango to your app](/guides/platform/webhooks-from-nango) and enable the `Async action completed` webhook. - - - Use retries only for idempotent function logic. Retried writes can otherwise create duplicate side effects in the external API. - - -## Related guides - -- [Function tool calling](/guides/functions/tool-calling) -- [Data validation](/guides/functions/data-validation) -- [Rate limits](/guides/functions/rate-limits) -- [Trigger action API](/reference/backend/http-api/action/trigger) -- [Functions SDK reference](/reference/functions/functions-sdk) - -## Webhook functions - -Source: https://nango.dev/docs/guides/functions/webhook-functions.md -Description: Process external API webhooks inside Nango functions. - -Webhook functions run when an external API sends a webhook to Nango. Use them when the webhook should execute Nango-hosted logic, update records, normalize events, or mark data for later reconciliation. - -If your app should handle the webhook directly, use [webhook forwarding](/guides/platform/webhook-forwarding) instead. - -## Processing or forwarding - -Webhook functions and webhook forwarding both start with the same external event: a provider sends a webhook to Nango. - -Use a webhook function when: - -- Nango should run function code as soon as the provider webhook arrives. -- The webhook should update the records cache. -- The webhook payload needs normalization before your app sees it. -- The event should trigger reconciliation logic inside a sync function. + +This method polls for a connection every 2 seconds for up to 60 seconds (30 attempts). If no connection is found within this time, it will throw a timeout error. + -Use [webhook forwarding](/guides/platform/webhook-forwarding) when: +**Parameters** -- Your app already has webhook handling logic. -- You want Nango to attribute the event to a connection and forward it. -- The event should not run Nango function code. + + + The integration ID (provider config key). + -## How routing works + + The end user ID to wait for a connection for. + + -External APIs send webhooks to the integration's Nango webhook URL. Find it in **Integrations > [Integration] > Webhooks**. +**Example Response** -When the provider has a webhook routing script, Nango reads the incoming payload, headers, or allowed query parameters and tries to map the event to one or more Nango connections. Provider-specific guides explain the exact routing fields when extra setup is required. + +```json +{ + "id": 1, + "connection_id": "", + "provider": "slack", + "provider_config_key": "slack-integration", + "created": "2023-06-03T14:53:22.051Z", + "metadata": null, + "errors": [], + "tags": { + "end_user_id": "user-123", + "end_user_email": "user@example.com", + "organization_id": "org-456" + } +} +``` + -If Nango can map the webhook to a connection, the webhook function runs in that connection context. If Nango cannot map the event, the event cannot safely run connection-scoped function logic; use provider-specific setup or webhook forwarding for that case. +## Integration functions -Some providers require one global webhook registration. Others require one webhook subscription per connected account, which you can automate with an [event function](/guides/functions/event-functions). +### List functions - - Before implementing a webhook function, inspect the provider-specific Nango docs for webhook routing requirements. Some providers need the Nango connection ID embedded in the provider webhook payload, while others route automatically from account, team, tenant, or installation identifiers. +Returns the functions deployed to an integration, with pagination. - Do not assume an external webhook payload is already trusted or complete. Keep `onWebhook` short, idempotent, and resilient to duplicates or out-of-order delivery. - +```ts +await nango.listFunctions({ uniqueKey: 'github' }); +``` -## Create the function +Filter by function type, name, or page: -Webhook function logic usually lives on a sync function with `webhookSubscriptions` and `onWebhook`: +```ts +await nango.listFunctions({ uniqueKey: 'github' }, { type: 'action', search: 'issue', page: 0, limit: 20 }); +``` -```typescript crm/syncs/contacts.ts -import { createSync } from 'nango'; -import * as z from 'zod'; +**Parameters** -const Contact = z.object({ - id: z.string(), - email: z.string().email().optional(), - updatedAt: z.string().optional() -}); + + + The integration ID. + + + Filter by function type: `sync`, `action`, or `on-event`. + + + Case-insensitive filter on the function name. + + + Page to return (starts at `0`, default `0`). + + + Results per page (1-100, default `20`). + + -export default createSync({ - description: 'Sync contacts and process contact webhooks', - version: '1.0.0', - frequency: 'every hour', - webhookSubscriptions: ['contact.updated', 'contact.deleted'], - models: { Contact }, - exec: async (nango) => { - // Periodic reconciliation logic. Keep this as the source of truth - // when provider webhooks can be missed, delayed, or partial. - }, - onWebhook: async (nango, payload) => { - if (payload.body.event === 'contact.deleted') { - await nango.batchDelete([{ id: payload.body.contactId }], 'Contact'); - return; - } +**Example Response** - if (payload.body.event === 'contact.updated' && payload.body.contact) { - await nango.batchSave( - [ - { - id: payload.body.contact.id, - email: payload.body.contact.email, - updatedAt: payload.body.contact.updated_at - } - ], - 'Contact' - ); + +```json +{ + "data": [ + { + "type": "action", + "name": "create-issue", + "description": "Create a GitHub issue", + "returns": ["GithubIssue"], + "json_schema": null, + "id": 42, + "enabled": true, + "last_deployed": "2024-03-28T14:00:00.000Z", + "source": "repo" + }, + { + "type": "sync", + "name": "issues", + "returns": ["GithubIssue"], + "json_schema": null, + "runs": "every hour", + "auto_start": true, + "track_deletes": false, + "id": 43, + "enabled": true, + "last_deployed": "2024-03-28T14:00:00.000Z", + "source": "repo" } + ], + "pagination": { + "total": 2, + "page": 0, + "limit": 20 } -}); -``` - -Import it from `index.ts`: - -```typescript index.ts -import './crm/syncs/contacts'; +} ``` + -## Register the provider webhook URL - -Register the integration's Nango webhook URL in the external API's developer portal. If the provider requires per-connection registration, use an event function after connection creation. - -For example, an event function can call the provider's webhook subscription API with the connection's credentials and store the provider webhook subscription ID in connection metadata for cleanup later. - -## Test and deploy +### Get a function -Dry run the sync function's `exec` logic: +Retrieves a deployed function of an integration. -```bash -nango dryrun contacts '' -e dev +```ts +await nango.getFunction({ uniqueKey: 'github', name: 'create-issue' }); ``` -Deploy your functions: +Pass `type` to disambiguate when a sync and an action share the same name: -```bash -nango deploy +```ts +await nango.getFunction({ uniqueKey: 'github', name: 'issues' }, { type: 'sync' }); ``` -To deploy only this webhook-backed sync function: +**Parameters** -```bash -nango deploy --sync contacts dev -``` - -Then send a test webhook from the provider dashboard, CLI, or webhook testing tool to the Nango webhook URL. Check Nango logs for the incoming webhook, routing result, and function execution. - -## Keep webhook processing lightweight - -Avoid making slow provider API calls directly from `onWebhook` unless the provider's webhook is explicitly designed for that flow. Webhooks can arrive in bursts, be retried, or arrive out of order. - -Prefer lightweight, idempotent handling in `onWebhook`, and let the sync function's `exec` reconcile full state. - -## Related guides - -- [Webhook forwarding](/guides/platform/webhook-forwarding) -- [Process external webhooks](/getting-started/use-cases/webhooks-from-external-apis) -- [Real-time syncs](/guides/functions/syncs/realtime-syncs) -- [Event functions](/guides/functions/event-functions) -- [Records cache](/guides/functions/syncs/records-cache) - -## Event functions - -Source: https://nango.dev/docs/guides/functions/event-functions.md -Description: Run function logic automatically when Nango connection lifecycle events happen. - -Event functions run automatically when Nango reaches a connection lifecycle event. They are defined with `createOnEvent()`. - -Use them to validate credentials, register provider webhooks, seed connection-specific metadata, or clean up external resources before a connection is deleted. - -## Choose the lifecycle event - -Supported events: - -| Event | When it runs | Common use | -| --- | --- | --- | -| `post-connection-creation` | Immediately after a connection is created | Register provider webhooks, seed metadata, run setup checks | -| `validate-connection` | During connection creation and reconnect | Reject invalid credentials, missing provider permissions, or policy violations (e.g. same-account enforcement) | -| `pre-connection-deletion` | Before a connection is deleted | Delete provider webhook subscriptions or external resources | - - - Before generating an event function, identify the lifecycle event, provider endpoint, required metadata, and desired failure behavior. - - For `validate-connection`, throwing rejects the auth attempt. On first connect, the connection is deleted. On reconnect, the connection is marked as an auth error (`refresh_exhausted`) and the user must reconnect explicitly. For cleanup functions, make the provider call idempotent because the external resource may already be gone. - - For same-account enforcement on reconnect, store the provider account identifier in **connection metadata** during `post-connection-creation`, then compare it to a live identity API call in `validate-connection`. Do not compare `connection_config` fields: reconnect upserts new credentials before validation runs, so config values already reflect the newly authenticated account. - - -## Create a setup function - -Add a file under the integration's `on-events/` folder: - -```typescript salesforce/on-events/post-connection-setup.ts -import { createOnEvent } from 'nango'; -import * as z from 'zod'; - -const Metadata = z.object({ - organization_id: z.string().optional(), - webhookId: z.string().optional() -}); - -export default createOnEvent({ - description: 'Register a Salesforce webhook after a successful connection', - event: 'post-connection-creation', - metadata: Metadata, - exec: async (nango) => { - const response = await nango.post({ - endpoint: '/webhooks', - data: { - url: 'https://api.myapp.com/webhooks/salesforce', - events: ['contact.updated'] - } - }); - - await nango.setMetadata({ - webhookId: response.data.id - }); - } -}); -``` - -Import it from `index.ts`: - -```typescript index.ts -import './salesforce/on-events/post-connection-setup'; -``` - -## Create a connection validation function - -Add a file under the integration's `on-events/` folder: - -```typescript salesforce/on-events/validate-connection.ts -import { createOnEvent } from 'nango'; -import * as z from 'zod'; - -const Metadata = z.object({ - organizationId: z.string().optional(), - webhookId: z.string().optional() -}); - -export default createOnEvent({ - description: 'Validate connection against saved organization id to prevent changing account on reconnect', - event: 'validate-connection', - metadata: Metadata, - exec: async (nango) => { - const metadata = await nango.getMetadata(); - const lockedOrganizationId = metadata?.organizationId; - - const response = await nango.get<{organization_id: string}>({ - endpoint: '/services/oauth2/userinfo' - }); - const organizationId = response.data?.organization_id; - if (!organizationId) { - throw new nango.ActionError('Salesforce connection missing organization_id from /services/oauth2/userinfo'); - } - - // On initial connection, save organization id to connection metadata - if (!lockedOrganizationId) { - await nango.setMetadata({organizationId}); - return; - } - - // On subsequent connections, check if new organization id matches stored value - if (lockedOrganizationId !== organizationId) { - throw new nango.ActionError( - `Salesforce org mismatch: expected ${lockedOrganizationId}, got ${organizationId}` - ); - } - } -}); -``` - -Import it from `index.ts`: - -```typescript index.ts -import './salesforce/on-events/validate-connection'; -``` - -On first connect, validation passes when metadata has no locked org yet; the setup function records `organization_id` after auth succeeds. On reconnect, validation compares the new credentials against the saved org ID and rejects the attempt if they differ. - - -Compare the locked value in **metadata** to a live value from the provider API. Do not compare `connection_config` fields: on reconnect, Nango upserts the new credentials and overwrites `connection_config` **before** `validate-connection` runs, so config already reflects the account the user just authenticated with. - - -## Create a cleanup function - -If the provider webhook is registered per connection, clean it up before the Nango connection is deleted: - -```typescript salesforce/on-events/pre-connection-cleanup.ts -import { createOnEvent } from 'nango'; -import * as z from 'zod'; - -const Metadata = z.object({ - organization_id: z.string().optional(), - webhookId: z.string().optional() -}); + + + The integration ID. + + + The function name. + + + Disambiguates when functions share a name: `sync`, `action`, or `on-event`. + + -export default createOnEvent({ - description: 'Delete the Salesforce webhook before connection deletion', - event: 'pre-connection-deletion', - metadata: Metadata, - exec: async (nango) => { - const metadata = await nango.getMetadata(); - if (!metadata?.webhookId) { - return; - } +**Example Response** - await nango.delete({ - endpoint: `/webhooks/${metadata.webhookId}` - }); + +```json +{ + "data": { + "type": "action", + "name": "create-issue", + "description": "Create a GitHub issue", + "returns": ["GithubIssue"], + "json_schema": null, + "id": 42, + "enabled": true, + "last_deployed": "2024-03-28T14:00:00.000Z", + "source": "repo" } -}); -``` - -Import it from `index.ts`: - -```typescript index.ts -import './salesforce/on-events/pre-connection-cleanup'; -``` - -## Test and deploy - -Dry run an event function against an existing connection: - -```bash -nango dryrun post-connection-setup '' -e dev -``` - -Deploy your functions: - -```bash -nango deploy +} ``` + -Event functions run automatically when their configured event occurs. Your app does not trigger them directly. - -## Related guides - -- [Webhook functions](/guides/functions/webhook-functions) -- [Webhook forwarding](/guides/platform/webhook-forwarding) -- [Storage](/guides/functions/storage) -- [Functions SDK reference](/reference/functions/functions-sdk) - -## Tool calling & MCP - -Source: https://nango.dev/docs/guides/functions/tool-calling.md -Description: Expose Nango action functions to agents, LLM SDKs, and MCP clients. - -Tool calling in Nango happens through [action functions](/guides/functions/action-functions). Each tool is an action function that an agent, LLM SDK, or MCP client can call on demand for a specific connection. - -The agent chooses a tool, your application asks Nango to execute the action function for that connection, and Nango handles the external API credentials, retries, rate limits, and logs. - -## Prerequisites - -- A Nango integration configured for the external API. -- A connection for the user whose credentials should be used. -- One or more enabled action functions for the operations the agent may call. - -Build custom tools with [action functions](/guides/functions/action-functions), or enable template action functions from the [template catalog](/guides/functions/functions-guide#template-catalog). - -## Common auth and execution +### Get function code -Keep provider credentials out of the agent runtime. Your app should resolve the Nango connection for the current user, then pass only the connection ID and selected tool to Nango. +Retrieves the source code of a deployed function. ```ts -import { Nango } from '@nangohq/node'; - -const nango = new Nango({ secretKey: process.env.NANGO_SECRET_KEY! }); - -const integrationId = 'hubspot'; - -async function getConnectionIdForUser(userId: string) { - const connections = await nango.listConnections({ - integrationId, - tags: { end_user_id: userId } - }); - - let connectionId = connections.connections[0]?.connection_id; - - if (!connectionId) { - const session = await nango.createConnectSession({ - allowed_integrations: [integrationId], - tags: { end_user_id: userId } - }); - - // Send this URL to the user in your app, then wait for authorization. - console.log(session.data.connect_link); - - const connection = await nango.waitForConnection(integrationId, userId); - connectionId = connection!.connection_id; - } - - return connectionId; -} - -async function executeNangoTool(actionName: string, input?: unknown) { - const connectionId = await getConnectionIdForUser('user_123'); - - return await nango.triggerAction(integrationId, connectionId, actionName, input); -} +await nango.getFunctionCode({ uniqueKey: 'github', name: 'create-issue' }, { type: 'action' }); ``` -The examples below focus on framework-specific tool syntax and call the shared `executeNangoTool()` helper. - -## Framework examples - -These examples expose a HubSpot `whoami` action function as a `who_am_i` tool. - - - - ```ts - import OpenAI from 'openai'; - - const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY! }); - - const tools = [ - { - type: 'function' as const, - name: 'who_am_i', - description: 'Get the current HubSpot user information.', - strict: true, - parameters: { - type: 'object', - properties: {}, - required: [], - additionalProperties: false - } - } - ]; - - const input: any[] = [ - { - role: 'user', - content: 'Use who_am_i and summarize the current HubSpot user.' - } - ]; - - const response = await client.responses.create({ - model: 'gpt-5', - input, - tools - }); - - for (const item of response.output) { - if (item.type !== 'function_call' || item.name !== 'who_am_i') { - continue; - } - - const result = await executeNangoTool('whoami', JSON.parse(item.arguments || '{}')); - - input.push(item); - input.push({ - type: 'function_call_output', - call_id: item.call_id, - output: JSON.stringify(result) - }); - } - - const finalResponse = await client.responses.create({ - model: 'gpt-5', - input, - tools - }); - - console.log(finalResponse.output_text); - ``` - - - ```ts - import Anthropic from '@anthropic-ai/sdk'; - - const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY! }); - - const tools = [ - { - name: 'who_am_i', - description: 'Get the current HubSpot user information.', - input_schema: { - type: 'object', - properties: {}, - required: [] - } - } - ]; - - const messages: Anthropic.MessageParam[] = [ - { - role: 'user', - content: 'Use who_am_i and summarize the current HubSpot user.' - } - ]; - - const message = await client.messages.create({ - model: 'claude-sonnet-4-5', - max_tokens: 1024, - messages, - tools - }); - - const toolUse = message.content.find((block) => block.type === 'tool_use'); - - if (toolUse?.type === 'tool_use' && toolUse.name === 'who_am_i') { - const result = await executeNangoTool('whoami', toolUse.input); - - messages.push({ role: 'assistant', content: message.content }); - messages.push({ - role: 'user', - content: [ - { - type: 'tool_result', - tool_use_id: toolUse.id, - content: JSON.stringify(result) - } - ] - }); - - const finalMessage = await client.messages.create({ - model: 'claude-sonnet-4-5', - max_tokens: 1024, - messages, - tools - }); - - console.log(finalMessage.content); - } - ``` - - - ```ts - import { generateText, stepCountIs, tool } from 'ai'; - import { openai } from '@ai-sdk/openai'; - import { z } from 'zod'; - - const { text, toolResults } = await generateText({ - model: openai('gpt-4o'), - prompt: 'Use who_am_i and summarize the current HubSpot user.', - tools: { - who_am_i: tool({ - description: 'Get the current HubSpot user information.', - inputSchema: z.object({}), - execute: async () => { - return await executeNangoTool('whoami'); - } - }) - }, - stopWhen: stepCountIs(5) - }); - - console.log(text); - console.log(toolResults); - ``` - - - ```ts - import { createAgent, tool } from 'langchain'; - import { z } from 'zod'; - - const whoAmI = tool( - async () => { - const result = await executeNangoTool('whoami'); - return JSON.stringify(result); - }, - { - name: 'who_am_i', - description: 'Get the current HubSpot user information.', - schema: z.object({}) - } - ); - - const agent = createAgent({ - model: 'openai:gpt-5.4', - tools: [whoAmI] - }); - - const result = await agent.invoke({ - messages: [ - { - role: 'user', - content: 'Use who_am_i and summarize the current HubSpot user.' - } - ] - }); - - console.log(result.messages.at(-1)?.content); - ``` - - - ```ts - import { openai } from '@ai-sdk/openai'; - import { Agent } from '@mastra/core/agent'; - import { createTool } from '@mastra/core/tools'; - import { z } from 'zod'; - - const whoAmI = createTool({ - id: 'who_am_i', - description: 'Get the current HubSpot user information.', - inputSchema: z.object({}), - execute: async () => { - return await executeNangoTool('whoami'); - } - }); - - const agent = new Agent({ - name: 'HubSpot Agent', - instructions: 'Use available tools to answer HubSpot account questions.', - model: openai('gpt-4o'), - tools: { - who_am_i: whoAmI - } - }); - - const response = await agent.generate('Use who_am_i and summarize the current HubSpot user.'); - - console.log(response.text); - ``` - - +**Parameters** -## Programmatic tool discovery + + + The integration ID. + + + The function name. + + + Disambiguates when functions share a name: `sync`, `action`, or `on-event`. + + -The [Get integration functions config API](/reference/backend/http-api/scripts/config) returns enabled action function definitions. Use it when an agent or orchestration layer should discover available tools at runtime. +**Example Response** -```bash -curl --request GET \ - --url 'https://api.nango.dev/scripts/config?provider_config_key=&format=openai' \ - --header 'Authorization: Bearer ' + +```json +{ + "type": "action", + "code": "export default createAction({ /* ... */ });" +} ``` + -Use `format=nango` for Nango's native configuration shape, or `format=openai` when you want OpenAI-compatible function definitions. - -## Direct tool execution +### Delete a function -For SDKs that let you provide your own tool executor, define the tool schema in your app and call Nango from the executor. +Deletes a deployed function of an integration. The `type` is required. ```ts -import { Nango } from '@nangohq/node'; - -const nango = new Nango({ secretKey: process.env.NANGO_SECRET_KEY! }); - -async function executeTool(connectionId: string, input: { owner: string; repo: string; title: string }) { - return await nango.triggerAction('github', connectionId, 'create-issue', input); -} +await nango.deleteFunction({ uniqueKey: 'github', name: 'create-issue' }, { type: 'action' }); ``` -Keep these values explicit: - -- `providerConfigKey` / integration ID - which integration owns the action function. -- `connectionId` - which user's credentials the call uses. -- Action function name - the enabled action function to execute. -- Input payload - validated by the action function schema when configured. +**Parameters** -## MCP server + + + The integration ID. + + + The function name. + + + The function type: `sync` or `action`. + + -Nango exposes enabled action functions through a hosted MCP server: +**Example Response** -```text -https://api.nango.dev/mcp + +```json +{ + "data": { + "success": true + } +} ``` + -The server supports Streamable HTTP transport. Requests must include: - -| Header | Value | -| --- | --- | -| `Authorization` | `Bearer ` | -| `connection-id` | The connection whose credentials should be used | -| `provider-config-key` | The integration ID | +### Get integration functions config -Example client setup with the MCP TypeScript SDK: +Return the configuration for all integration functions ```ts -import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'; - -const transport = new StreamableHTTPClientTransport(new URL('https://api.nango.dev/mcp'), { - requestInit: { - headers: { - Authorization: `Bearer ${process.env.NANGO_SECRET_KEY}`, - 'connection-id': '', - 'provider-config-key': '' - } - } -}); +const scriptsConfig = await nango.getScriptsConfig(); ``` -For desktop clients that only support stdio, use a bridge such as `mcp-remote` and pass the same headers. Keep the header spacing exactly as required by the bridge you choose. - -## Auth flow for agents - -Agents should not receive provider credentials. Your app should: - -1. Check whether the user already has a Nango connection. -2. Create a Connect session if they need to authorize. -3. Store the resulting `connectionId` in your app. -4. Use that `connectionId` for future tool calls. - -See the [Auth guide](/guides/auth/auth-guide) and [Create Connect Session API](/reference/backend/http-api/connect/sessions/create) for the end-to-end auth flow. - - - If you are implementing this flow programmatically, first list or create the user's connection, then call `GET /scripts/config` to discover enabled action functions, and finally execute tools with `POST /action/trigger` or the MCP server. - - Required values for every execution are the Nango secret key, integration ID, connection ID, action function name, and input payload. - - -## Observability and safety - -Every action function execution appears in Nango logs. Use logs to debug failed tool calls, inspect provider requests, and review agent behavior. - -Keep tool names and descriptions specific. Expose only action functions the agent is allowed to call for the current user and workflow. For write operations, make action function logic idempotent before using async execution or retries. - -## Related references +**Example Response** -- [Action functions](/guides/functions/action-functions) -- [Template catalog](/guides/functions/functions-guide#template-catalog) -- [Get integration functions config API](/reference/backend/http-api/scripts/config) -- [Trigger action API](/reference/backend/http-api/action/trigger) -- [Functions SDK reference](/reference/functions/functions-sdk) -- [Observability](/guides/platform/observability) - -## Storage - -Source: https://nango.dev/docs/guides/functions/storage.md -Description: Use connection metadata as the default storage for function parameters and per-customer configuration. - -Functions have access to storage that is scoped to the connection they run for. Use it to keep integration behavior tied to the customer, account, workspace, or tenant that authorized the connection. - -For the product-level workflow, see [Customize per customer](/getting-started/use-cases/customer-configuration). - -## Connection metadata - -Connection metadata is the default blob storage for Nango Functions. It is a JSON object stored on a Nango connection and available to action functions, sync functions, webhook functions, and event functions. - -Use metadata for: - -- Customer-specific settings, such as field mappings, filters, folders, projects, account IDs, or feature flags. -- Function configuration values that should persist across executions. -- Values discovered during setup, such as provider webhook subscription IDs or tenant-specific identifiers. -- Configuration shared across multiple functions for the same connection. - -Do not use metadata for synced datasets or large lists of records. For data replicated by sync functions, use the [records cache](/guides/functions/syncs/records-cache). - -## Set and update metadata from your app - -Set metadata after the customer chooses integration settings during onboarding or in your app's settings UI. - - - - ```ts - await nango.setMetadata( - '', - '', - { - accountRegion: 'eu', - syncArchived: false, - fieldMapping: { - companyName: 'Account_Name__c' - } - } - ); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/connection//metadata \ - --header 'Authorization: Bearer ' \ - --header 'Provider-Config-Key: ' \ - --header 'Content-Type: application/json' \ - --data '{ - "accountRegion": "eu", - "syncArchived": false, - "fieldMapping": { - "companyName": "Account_Name__c" - } - }' - ``` - - - ```ts - await nango.updateMetadata( - '', - '', - { syncArchived: true } - ); - ``` - - - ```bash - curl --request PATCH \ - --url https://api.nango.dev/connection//metadata \ - --header 'Authorization: Bearer ' \ - --header 'Provider-Config-Key: ' \ - --header 'Content-Type: application/json' \ - --data '{ "syncArchived": true }' - ``` - - - -`setMetadata` replaces the metadata object. `updateMetadata` merges the provided fields into the existing object. - -For exact parameters and response shapes, see the [set metadata API](/reference/backend/http-api/connections/set-metadata), [update metadata API](/reference/backend/http-api/connections/update-metadata), [Node SDK set metadata method](/reference/backend/backend-sdk/node#set-connection-metadata), and [Node SDK edit metadata method](/reference/backend/backend-sdk/node#edit-connection-metadata). - -## Read metadata from your app - -Read metadata from your app when you need to render saved settings, pre-fill a configuration UI, or decide whether a connection is ready for syncs: - -```ts -const metadata = await nango.getMetadata('', ''); -``` - -You can also fetch the connection with the REST API: - -```bash -curl --request GET \ - --url 'https://api.nango.dev/connection/?provider_config_key=' \ - --header 'Authorization: Bearer ' -``` - -## Read metadata inside a function - -Define a metadata schema on the function, then call `nango.getMetadata()`: - -```ts crm/syncs/contacts.ts -import { createSync } from 'nango'; -import * as z from 'zod'; - -const Metadata = z.object({ - accountRegion: z.string().optional(), - syncArchived: z.boolean().default(false) -}); - -export default createSync({ - description: 'Sync contacts', - frequency: 'every hour', - metadata: Metadata, - exec: async (nango) => { - const metadata = await nango.getMetadata(); - - await nango.get({ - endpoint: '/contacts', - params: { - region: metadata.accountRegion, - archived: metadata.syncArchived + +```json +[ + { + "providerConfigKey": "demo-github-integration", + "syncs": [ + { + "name": "github-issue-example", + "type": "sync", + "models": [ + { + "name": "GithubIssue", + "fields": [ + { + "name": "id", + "type": "integer" + }, + { + "name": "owner", + "type": "string" + }, + { + "name": "repo", + "type": "string" + }, + { + "name": "issue_number", + "type": "number" + }, + { + "name": "title", + "type": "string" + }, + { + "name": "author", + "type": "string" + }, + { + "name": "author_id", + "type": "string" + }, + { + "name": "state", + "type": "string" + }, + { + "name": "date_created", + "type": "date" + }, + { + "name": "date_last_modified", + "type": "date" + }, + { + "name": "body", + "type": "string" + } + ] + } + ], + "sync_type": "FULL", // DEPRECATED + "runs": "every half hour", + "track_deletes": false, + "auto_start": false, + "last_deployed": "2024-02-28T20:16:38.052Z", + "is_public": false, + "pre_built": false, + "version": "4", + "attributes": {}, + "input": {}, + "returns": [ + "GithubIssue" + ], + "description": "Fetches the Github issues from all a user's repositories.\nDetails: doesn't track deletes, metadata is not required.\n", + "scopes": [ + "public_repo" + ], + "endpoints": [ + { + "GET": "/github/issue-example" + } + ], + "nango_yaml_version": "v2", + "webhookSubscriptions": [] + } + ], + "actions": [ + { + "name": "fetch-issues", + "type": "action", + "models": [ + { + "name": "GithubIssue", + "fields": [ + { + "name": "id", + "type": "integer" + }, + { + "name": "owner", + "type": "string" + }, + { + "name": "repo", + "type": "string" + }, + { + "name": "issue_number", + "type": "number" + }, + { + "name": "title", + "type": "string" + }, + { + "name": "author", + "type": "string" + }, + { + "name": "author_id", + "type": "string" + }, + { + "name": "state", + "type": "string" + }, + { + "name": "date_created", + "type": "date" + }, + { + "name": "date_last_modified", + "type": "date" + }, + { + "name": "body", + "type": "string" + } + ] + } + ], + "runs": "", + "is_public": false, + "pre_built": false, + "version": "4", + "last_deployed": "2024-02-28T20:16:38.052Z", + "attributes": {}, + "returns": [ + "GithubIssue" + ], + "description": "", + "scopes": [], + "input": {}, + "endpoints": [ + { + "GET": "/github/issues" + } + ], + "nango_yaml_version": "v2" } - }); + ], + "postConnectionScripts": [], + "provider": "github" } -}); -``` - -Inside a function, `nango.getMetadata()` automatically reads metadata for the connection being executed. - - - When a sync function reads metadata with `nango.getMetadata()`, metadata can be cached for up to 60 seconds during that execution. The next execution always reads the latest metadata. - - -## Customer configuration pattern - -A common customer configuration pattern is to ask the customer how their external custom fields map to your product model, then store that mapping as connection metadata. - -```json -{ - "fieldMapping": { - "internal_customer_id": "External_Customer_ID__c", - "plan": "Plan__c" - } -} -``` - -Use an action function to fetch available custom fields from the provider, save the customer's choices as metadata, then read the mapping inside the sync function that fetches records. - -If a sync function should start only after the required configuration exists, start it after saving metadata: - -```ts -await nango.startSync('', ['contacts'], ''); +] ``` + -## Records cache - -The records cache is the storage layer for sync output. Sync functions write records with `nango.batchSave()`, `nango.batchUpdate()`, and `nango.batchDelete()`. Your app reads changed records through the records API or SDK. - -Use the records cache for synced external data, not for function configuration. See [Records cache](/guides/functions/syncs/records-cache). - -## Related guides - -- [Customize per customer](/getting-started/use-cases/customer-configuration) - design the product workflow for customer-specific integration settings. -- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - distinguish tags, connection configuration, and runtime metadata. -- [Set connection metadata API](/reference/backend/http-api/connections/set-metadata) - replace metadata from your app. -- [Update connection metadata API](/reference/backend/http-api/connections/update-metadata) - patch metadata from your app. - -## Function logging - -Source: https://nango.dev/docs/guides/functions/logging.md -Description: Use function logs for local debugging, cloud observability, and production troubleshooting. - -Nango records function executions in the Logs tab. You can also add custom logs from action, sync, webhook, and event functions with `nango.log()`. - -Use custom logs for information that helps you understand function behavior: selected filters, page counts, checkpoint values, provider identifiers, branch decisions, and recoverable errors. - -## Add custom logs +You can also pass in an optional argument with the value of `nango` or `openai`. The default is `nango` ```ts -await nango.log('Starting contacts sync'); -await nango.log('Applying region filter', { level: 'debug' }); -await nango.log('Provider returned a partial response', { level: 'warn' }); -await nango.log('Failed to map contact', { level: 'error' }); -``` - -If you do not pass a level, `nango.log()` uses `info`. - -## Log levels - -Nango supports these levels, from most to least verbose: - -| Level | Use for | -| --- | --- | -| `debug` | Local diagnostics, pagination details, temporary investigation logs | -| `info` | Normal execution milestones you may want during development | -| `warn` | Unexpected but recoverable behavior | -| `error` | Failed operations, invalid provider responses, or errors you catch and continue from | -| `off` | Disable custom logs | - -Only logs at or above the configured logger level are ingested into the Nango UI Logs tab. - -For example, when the logger level is `warn`, only `warn` and `error` custom logs are visible in the cloud logs. - -## Cloud vs local behavior - -| Runtime | Default custom log level | Where custom logs appear | -| --- | --- | --- | -| Cloud environments | `warn` | Nango UI Logs tab for logs at `warn` or `error` | -| `nango dryrun` | `debug` | Local console for all custom log levels | - -This means `await nango.log('message')` is visible during local dry runs, because local dry runs default to `debug`. The same call defaults to `info`, so it is not visible in cloud logs unless you lower the configured logger level to `info` or `debug`. - - - Cloud custom logs can affect log volume and billing. Prefer `debug` and `info` for local investigation, and use `warn` or `error` for production signals you want retained by default. - - -## Configure the logger - -Set the default logger level for an environment with `NANGO_LOGGER_LEVEL` in **Environment Settings > Environment Variables**: - -```bash -NANGO_LOGGER_LEVEL=info +const scriptsConfig = await nango.getScriptsConfig('openai'); ``` - -Valid values are `debug`, `info`, `warn`, `error`, and `off`. - -You can also change the logger level inside a function. This applies to `nango.log()` calls after the setting is changed: - -```ts -nango.setLogger({ level: 'debug' }); - -await nango.log('Detailed investigation log'); - -nango.setLogger({ level: 'warn' }); -``` - -Use function-level configuration when one run or one branch needs additional visibility. Use the environment variable when all functions in that environment should share the same threshold. - -## What to log - -Good function logs are specific and bounded: - -- Log the connection-specific configuration that changes behavior, such as selected folder IDs, regions, or pipeline IDs. -- Log provider pagination progress with counts, cursors, or checkpoints, but avoid logging every record. -- Log warnings when the provider omits optional data or returns a shape you can recover from. -- Log errors when you catch an exception and continue, so the run is still inspectable. - -Avoid logging secrets, access tokens, refresh tokens, full request headers, or raw payloads that may contain sensitive customer data. - -## Related guides - -- [Observability](/guides/platform/observability) -- [Functions SDK reference](/reference/functions/functions-sdk#logging) -- [Testing](/guides/functions/testing) -- [Sync efficiency](/guides/functions/syncs/sync-efficiency) - -## Rate limits - -Source: https://nango.dev/docs/guides/functions/rate-limits.md -Description: Guide on how to handle API rate limits from external APIs. - -External APIs often enforce rate limits to prevent excessive use. When these limits are reached, you'll start receiving HTTP `429 Too Many Requests` errors, blocking further requests until the limit resets. - -To maintain data freshness and avoid disruptions in your integration functions, it's crucial to manage your API call volume and handle rate limits effectively. Nango simplifies this process significantly. - -## Strategy 1: Retry with exponential backoff - -The simplest strategy involves retrying failed requests after waiting: - -When you configure HTTP requests using Nango's helper ([reference](/reference/functions/functions-sdk#http-requests)), you can specify the number of retries: - -```ts -await nango.get({ endpoint: '/some-endpoint', retries: 10 }); -``` - -This configuration enables automatic retries on receiving a `429` status code, with the retries spaced out using exponential backoff. This method is efficient because: - -- It uses exponential backoff to wait out the rate-limit period -- Nango [sync functions](/guides/functions/syncs/sync-functions) can run for up to 24 hours, allowing retries to occur within this window (note that action functions and webhook functions have shorter lifespans; see [Resource limits](/guides/platform/limits)) -- It works for APIs without requiring any API-specific configurations - -Find details about HTTP request retries in the [reference](/reference/functions/functions-sdk#http-request-retries). - -## Strategy 2: Leverage rate-limit headers - -Most of the time, the first strategy is sufficient to handle rate limits. - -For APIs with stringent limits, Nango provides a more refined and customized approach by automatically parsing API-specific rate-limit headers from responses and scheduling retries only after the rate limit period has reset: - -This is set up in the same way as the first strategy: - -```ts -await nango.get({ endpoint: '/some-endpoint', retryHeader: { at: "x-ratelimit-reset" } }); -``` - -If rate-limit headers are not already configured for an API you are using, you can request their inclusion by reaching out to the Nango team via the [community](https://nango.dev/slack)β€”typically within 24 hours. - -## Related guides - -- [Sync efficiency](/guides/functions/syncs/sync-efficiency) - avoid unnecessary provider requests. -- [Action functions](/guides/functions/action-functions) - design retries for idempotent actions. -- [Resource limits](/guides/platform/limits) - understand runtime constraints. -- [Functions SDK reference](/reference/functions/functions-sdk#http-request-retries) - configure request retries. - - -**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - - -## Data validation - -Source: https://nango.dev/docs/guides/functions/data-validation.md -Description: How to validate data in your functions and in your app - -Nango offers data validation at two levels: inside your [Nango functions](/guides/functions/functions-guide) (when calling external APIs) and in your application code (when consuming function responses). - -## Validate API responses in Nango functions - -Use Zod to validate data you receive from and send to external APIs. The CLI will also surface *type* errors during dry runs when using the `--validation` option. - -```typescript -import * as z from 'zod'; - -const dataFromAPI = z.object({ - ticketId: z.string(), -}); - -export default createSync({ - exec: async (nango) => { - const response = await nango.get({ endpoint: '/tickets' }); - const isValid = dataFromAPI.parse(response.json); - if (isValid) { - [...] - } - }, -}); -``` - -## Validate Nango function responses in your app - -### TypeScript types (compile-time) - -Use `z.infer` to derive TypeScript types from your Zod schemas and export them from your sync/action files: - -```ts -// In: github/syncs/fetchIssues.ts (Nango function) -export type GithubIssue = z.infer; -``` - -Then import the types in your application code: - -```ts -import type { GithubIssue } from './nango-integrations/github/syncs/fetchIssues'; - -const issues = await nango.listRecords({ ... }); -``` - -### JSON Schema (runtime, language-agnostic) - -When you run `nango compile` or `nango deploy`, Nango generates a `nango.json` file in the `.nango` folder. Each sync/action entry includes a `json_schema` property with the JSON Schema for its models: - + ```json -// .nango/nango.json (simplified) -[ - { - "providerConfigKey": "github", - "syncs": [ - { - "name": "fetchIssues", - "output": ["GithubIssue"], - "json_schema": { - "definitions": { - "GithubIssue": { - "type": "object", - "properties": { - "id": { "type": "string" }, - "title": { "type": "string" }, - "state": { "type": "string" } - }, - "required": ["id", "title", "state"], - "additionalProperties": false - } - } - } - } - ] - } -] -``` - -You can extract the `json_schema` object for a given sync or action and use it with any JSON Schema validator in your language of choice (e.g., `ajv` in TypeScript, `jsonschema` in Python, `jsonschema` in Rust, `santhosh-tekuri/jsonschema` in Go). - -Alternatively, Zod v4 supports JSON Schema conversion natively with [`z.toJSONSchema()`](https://zod.dev/json-schema?id=ztojsonschema): - -```ts -import { z } from 'zod'; -import { issueSchema } from './nango-integrations/github/syncs/fetchIssues'; - -const jsonSchema = z.toJSONSchema(issueSchema); -``` - -## Related guides - -- [Action functions](/guides/functions/action-functions) - validate action inputs and outputs. -- [Sync functions](/guides/functions/syncs/sync-functions) - validate synced record models. -- [Unified APIs](/guides/functions/unified-apis) - normalize provider data behind stable schemas. -- [Testing](/guides/functions/testing) - cover validation behavior in tests. - -## Testing integrations - -Source: https://nango.dev/docs/guides/functions/testing.md -Description: How to test your Nango integrations using dry runs, mocks, and snapshots - -Nango provides a comprehensive testing framework that combines dry runs with mock-based snapshot testing. This guide will walk you through testing your integrations effectively. - -## Testing approach - -Nango's testing framework is built on three core concepts: - -1. **Dry runs**: Test your integrations against live API connections without affecting production data -2. **Mocks**: Save API responses during dry runs to create reproducible test fixtures -3. **Snapshot testing**: Automatically compare integration outputs against saved snapshots using Vitest - -This approach ensures your integrations work correctly while providing fast, reliable tests that don't depend on external APIs. - -## Dry run testing - -Dry runs allow you to execute your sync functions and action functions against real API connections without saving data to your database. This is essential for: - -- Testing integration logic before deployment -- Debugging issues with live data -- Generating test fixtures (mocks) -- Validating data transformations - -### Basic dry run - -Execute a sync or action against an existing connection: - -```bash -nango dryrun -``` - -**Example:** -```bash -nango dryrun fetch-tickets abc-123-connection -``` - -### Dry run options - -Common options for testing: - -```bash -# Specify environment (dev or prod) -nango dryrun fetch-tickets abc-123 -e prod - -# For action functions: pass input data -nango dryrun create-ticket abc-123 --input '{"title": "Test ticket"}' - -# For sync functions: specify an initial checkpoint -nango dryrun fetch-tickets abc-123 --checkpoint '{ "lastModifiedAt": "2026-02-01T01:00:00.000Z" }' - -# Use a specific integration when sync names overlap -nango dryrun fetch-tickets abc-123 --integration-id github - -# Execute a specific variant -nango dryrun fetch-tickets abc-123 --variant premium -``` - -## Data validation - -Validation ensures your integration inputs and outputs match your defined schemas. This catches data transformation errors early. - -### Enable validation during dry runs - -Use the `--validate` flag to enforce validation: - -```bash -nango dryrun fetch-tickets abc-123 --validate -``` - -When validation is enabled: -- **Action inputs** are validated before execution -- **Action outputs** are validated after execution -- **Sync records** are validated before they would be saved -- **Validation failures** halt execution and display detailed error messages - -### Validation with Zod - -You can also validate data directly in your integration code using Zod: - -```typescript -import { z } from 'zod'; - -const TicketSchema = z.object({ - id: z.string(), - title: z.string(), - status: z.enum(['open', 'closed']), - createdAt: z.string().datetime(), -}); - -export default createSync({ - exec: async (nango) => { - const response = await nango.get({ endpoint: '/tickets' }); - - // Validate the API response - const tickets = response.data.map(ticket => { - return TicketSchema.parse(ticket); // Throws if validation fails - }); - - await nango.batchSave(tickets, 'Ticket'); - }, -}); -``` - -### Validation error output - -When validation fails, you'll see detailed error information: - -``` -Invalid sync record. Use `--validate` option to see the details (invalid_sync_record) { - "validation": [ + "data": [ { - "path": "createdAt", - "message": "Invalid datetime string! Must be UTC.", - "code": "invalid_string" - } - ], - "model": "Ticket" -} -``` - -## Saving mocks for tests - -Mocks are saved API responses that allow you to run tests without hitting external APIs. This makes tests faster and more reliable. - -### Generate mocks with dry run - -Use the `--save` flag to save all API responses: - -```bash -nango dryrun fetch-tickets abc-123 --save -``` - -**Important**: When using `--save`, validation is automatically enabled. Mocks are only saved if validation passes, ensuring your test fixtures contain valid data. - -### Mock file structure - -Mocks are saved in a single `.test.json` file that can be used alongside your test file: - -``` -github/ -β”œβ”€β”€ tests/ -β”‚ β”œβ”€β”€ fetch-tickets.test.ts -β”‚ └── fetch-tickets.test.json -``` - -The `test.json` file contains all the necessary mock data for a given test: - -```json -{ - "input": { "title": "Test ticket" }, - "output": { "id": "TKT-123", "status": "created" }, - "nango": { - "getConnection": { "connectionId": "abc-123", "provider": "github" }, - "getMetadata": { "accountId": "test-123" }, - "batchSave": { - "Ticket": [{ "id": "TKT-123", "title": "Test ticket" }] + "name": "calendars", + "description": "Sync the user's calendar list.\nIncludes all calendars the user has access to.", + "parameters": { + "type": "object", + "properties": {}, + "required": [] + } }, - "batchDelete": { - "Ticket": [{ "_nango_id": "del-456" }] - } - }, - "api": { - "GET": { - "/tickets": { - "response": [{ "id": "TKT-123", "title": "Test ticket" }] + { + "name": "events", + "description": "Sync calendar events from the primary calendar.\nIncludes events from the past month.", + "parameters": { + "type": "object", + "properties": {}, + "required": [] } }, - "POST": { - "/issues": { - "response": { "id": "ISS-789" } + { + "name": "cancel-event", + "description": "Cancel/delete an event by searching for it.\n\nInput parameters:\n- title: The title of the event to cancel\n- date: The date of the event in ISO format\n- time: The time of the event in 24-hour format (HH:mm)\n- calendar: Calendar ID where to search for the event\n- id: Calendar identifier\n- summary: Calendar name/title\n- description: Calendar description\n- location: Calendar location\n- timeZone: Time zone of the calendar\n- backgroundColor: Calendar color in UI\n- foregroundColor: Text color in UI\n- selected: Whether the calendar is selected in UI\n- accessRole: User's access role for the calendar\n- primary: Whether this is the primary calendar", + "parameters": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Calendar identifier" + }, + "summary": { + "type": "string", + "description": "Calendar name/title" + }, + "description": { + "type": "string", + "description": "Calendar description" + }, + "location": { + "type": "string", + "description": "Calendar location" + }, + "timeZone": { + "type": "string", + "description": "Time zone of the calendar" + }, + "backgroundColor": { + "type": "string", + "description": "Calendar color in UI" + }, + "foregroundColor": { + "type": "string", + "description": "Text color in UI" + }, + "selected": { + "type": "boolean", + "description": "Whether the calendar is selected in UI" + }, + "accessRole": { + "type": "string", + "description": "User's access role for the calendar" + }, + "primary": { + "type": "boolean", + "description": "Whether this is the primary calendar" + }, + "title": { + "type": "string", + "description": "The title of the event to cancel" + }, + "date": { + "type": "string", + "description": "The date of the event in ISO format" + }, + "time": { + "type": "string", + "description": "The time of the event in 24-hour format (HH:mm)" + }, + "calendar": { + "type": "string", + "description": "Calendar ID where to search for the event" + } + }, + "required": [ + "id", + "summary" + ] } - } - } -} -``` - -### Using stubbed metadata - -For sync functions that rely on connection metadata, you can provide test metadata: - -```bash -nango dryrun fetch-tickets abc-123 --save --metadata '{"accountId": "test-123"}' -``` - -Or load from a file: - -```bash -nango dryrun fetch-tickets abc-123 --save --metadata @fixtures/metadata.json -``` - -## Testing with Vitest - -Nango uses [Vitest](https://vitest.dev/) as its testing framework. Vitest is fast, has a great developer experience, and provides snapshot testing out of the box. - -### Setup - -Install Vitest as a dev dependency: - -```bash -npm install -D vitest -``` - -Generate tests for your integrations: - -```bash -nango generate:tests -``` - -You can also generate tests for specific integrations, sync functions, or action functions: - -```bash -# Generate tests for a specific integration -nango generate:tests -i github - -# Generate tests for a specific sync function -nango generate:tests -s fetch-tickets - -# Generate tests for a specific action function -nango generate:tests -a create-ticket - -# Combine flags for more specific targeting -nango generate:tests -i github -s fetch-tickets -``` - -Run your tests: - -```bash -npm test -``` - -### Auto-generated tests - -When you run `nango generate:tests`, Nango creates test files for all your integrations: - -**Sync test example:** -```typescript -import { vi, expect, it, describe, beforeAll } from 'vitest'; -import createSync from '../syncs/fetch-tickets.js'; - -describe('github fetch-tickets tests', () => { - let nangoMock; - - beforeAll(async () => { - nangoMock = new global.vitest.NangoSyncMock({ - dirname: __dirname, - name: "fetch-tickets", - Model: "Ticket" - }); - }); - - const models = 'Ticket'.split(','); - const batchSaveSpy = vi.spyOn(nangoMock, 'batchSave'); - - it('should get, map correctly the data and batchSave the result', async () => { - await createSync.exec(nangoMock); - - for (const model of models) { - const expectedBatchSaveData = await nangoMock.getBatchSaveData(model); - const spiedData = batchSaveSpy.mock.calls.flatMap(call => { - if (call[1] === model) { - return call[0]; - } - return []; - }); - - const spied = JSON.parse(JSON.stringify(spiedData)); - expect(spied).toStrictEqual(expectedBatchSaveData); - } - }); - - it('should get, map correctly the data and batchDelete the result', async () => { - await createSync.exec(nangoMock); - - for (const model of models) { - const batchDeleteData = await nangoMock.getBatchDeleteData(model); - if (batchDeleteData && batchDeleteData.length > 0) { - expect(nangoMock.batchDelete).toHaveBeenCalledWith(batchDeleteData, model); - } - } - }); -}); -``` - -**Action test example:** -```typescript -import { vi, expect, it, describe, beforeAll } from 'vitest'; -import createAction from '../actions/create-ticket.js'; - -describe('github create-ticket tests', () => { - let nangoMock; - - beforeAll(async () => { - nangoMock = new global.vitest.NangoActionMock({ - dirname: __dirname, - name: "create-ticket", - Model: "Ticket" - }); - }); - - it('should output the action output that is expected', async () => { - const input = await nangoMock.getInput(); - const response = await createAction.exec(nangoMock, input); - const output = await nangoMock.getOutput(); - - expect(response).toEqual(output); - }); -}); -``` - -### How mocks work in tests - -The `NangoSyncMock` and `NangoActionMock` classes automatically load your saved mocks from the `.test.json` file: - -1. **API requests** are intercepted and return saved mock responses from the `api` section. -2. **Input data** is loaded from the `input` property for action functions. -3. **Expected outputs** are loaded from the `output` property. -4. **Tests compare** actual outputs against expected outputs. - -This means: -- Tests run **instantly** (no API calls) -- Tests are **deterministic** (same input = same output) -- Tests work **offline** - -### Migrating from the old format - -If you have tests using the old multi-file mock format, you can automatically migrate them to the new unified format. - -Set the `MIGRATE_MOCKS` environment variable to `2026-01` and run your tests: - -```bash -MIGRATE_MOCKS=2026-01 npm test -``` - -This will: -1. Run your tests using the old mock files. -2. Intercept all mock data accessed during the test run. -3. Save the data into a new `.test.json` file. -4. The old mock directory (`mocks` and `fixtures`) can then be safely deleted once a clean green test run is achieved. - -> **Note:** This migration tool works by intercepting the mock data loaded by your existing tests. It requires that your tests are using the standard Nango mock utilities (`NangoSyncMock` or `NangoActionMock`) imported from `nango/test`. - - -**Pagination Bug in Legacy Test Utilities** - -The legacy test utilities had a bug where pagination would sometimes stop after the first page. This means: - -1. **Tests appeared to pass** but were only testing the first page of results -2. **Mock files may exist** for subsequent pages, but might be incorrect (hashes or params were never checked) -3. **Some mock files may be missing entirely** if they were never recorded - -**How the migration handles this:** - -The migration tool performs a **best-effort recovery**: -- It first tries to match mock files by their exact request hash -- If that fails, it scans all available mock files and matches by comparing the actual request parameters (endpoint, query params, headers) -- This handles cases where the hash in the filename is wrong but the request data inside the file is correct - -**What to do if tests fail after migration:** - -If your tests fail after running the migration, it means one of: -- The mock file for a paginated request doesn't exist at all (it was never recorded due to the bug) -- The request parameters stored in the mock file don't match what Nango's pagination now sends - -**To fix failing tests, re-record your mocks:** - -```bash -nango dryrun --save -``` - -This will generate a complete `.test.json` file with all paginated responses using Nango's actual pagination implementation. - - -### Running tests - -```bash -# Run all tests -npm test - -# Run tests in watch mode -npm test -- --watch - -# Run tests for a specific integration -npm test github - -# Run a specific test file -npm test github-fetch-tickets.test.ts - -# Run with coverage -npm test -- --coverage -``` - -### Test configuration - -Vitest is configured via `vite.config.ts` in your project root: - -```typescript -import { defineConfig } from 'vite'; - -export default defineConfig({ - test: { - globals: true, - environment: 'node', - setupFiles: ['./vitest.setup.ts'], - }, -}); -``` - -The `vitest.setup.ts` file makes Nango mocks available globally: - -```typescript -import { NangoActionMock, NangoSyncMock } from "nango/test"; - -globalThis.vitest = { - NangoActionMock, - NangoSyncMock, -}; -``` - -## Customizing tests with business logic - -While auto-generated tests validate basic data flow, you often need custom tests for business logic. - -### Adding custom assertions - -Extend the generated tests with additional assertions: - -```typescript -import { vi, expect, it, describe, beforeAll } from 'vitest'; -import createSync from '../syncs/fetch-tickets.js'; - -describe('github fetch-tickets tests', () => { - let nangoMock; - - beforeAll(async () => { - nangoMock = new global.vitest.NangoSyncMock({ - dirname: __dirname, - name: "fetch-tickets", - Model: "Ticket" - }); - }); - - it('should correctly transform ticket priorities', async () => { - await createSync.exec(nangoMock); - - const savedTickets = await nangoMock.getBatchSaveData('Ticket'); - - // Custom business logic validation - savedTickets.forEach(ticket => { - // Ensure priority is normalized - expect(['low', 'medium', 'high', 'critical']).toContain(ticket.priority); - - // Ensure dates are ISO 8601 - expect(ticket.createdAt).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/); - - // Ensure ticket numbers are prefixed correctly - if (ticket.source === 'github') { - expect(ticket.id).toMatch(/^GH-\d+$/); + }, + { + "name": "create-event", + "description": "Create a new calendar event.\n\nInput parameters:\n- summary: The title/summary of the event\n- description: A detailed description of the event\n- location: The location of the event\n- start: The start time of the event in ISO format\n- end: The end time of the event in ISO format\n- attendees: List of email addresses to invite\n- recurrence: List of recurrence rules in RRULE format\n- calendar: Calendar ID to create the event in\n- id: Calendar identifier\n- timeZone: Time zone of the calendar\n- backgroundColor: Calendar color in UI\n- foregroundColor: Text color in UI\n- selected: Whether the calendar is selected in UI\n- accessRole: User's access role for the calendar\n- primary: Whether this is the primary calendar", + "parameters": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Calendar identifier" + }, + "summary": { + "type": "string", + "description": "The title/summary of the event" + }, + "description": { + "type": "string", + "description": "A detailed description of the event" + }, + "location": { + "type": "string", + "description": "The location of the event" + }, + "timeZone": { + "type": "string", + "description": "Time zone of the calendar" + }, + "backgroundColor": { + "type": "string", + "description": "Calendar color in UI" + }, + "foregroundColor": { + "type": "string", + "description": "Text color in UI" + }, + "selected": { + "type": "boolean", + "description": "Whether the calendar is selected in UI" + }, + "accessRole": { + "type": "string", + "description": "User's access role for the calendar" + }, + "primary": { + "type": "boolean", + "description": "Whether this is the primary calendar" + }, + "start": { + "type": "string", + "description": "The start time of the event in ISO format" + }, + "end": { + "type": "string", + "description": "The end time of the event in ISO format" + }, + "attendees": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of email addresses to invite" + }, + "recurrence": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of recurrence rules in RRULE format" + }, + "calendar": { + "type": "string", + "description": "Calendar ID to create the event in" + } + }, + "required": [ + "id", + "summary", + "start", + "end" + ] } - }); - }); - - it('should filter out spam tickets', async () => { - await createSync.exec(nangoMock); - - const savedTickets = await nangoMock.getBatchSaveData('Ticket'); - - // Verify spam filtering logic - const spamTickets = savedTickets.filter(t => - t.title.toLowerCase().includes('spam') - ); - expect(spamTickets).toHaveLength(0); - }); -}); -``` - -### Testing error handling - -Test how your integration handles errors: - -```typescript -it('should handle API errors gracefully', async () => { - // Create a mock that will throw an error - const errorMock = new global.vitest.NangoSyncMock({ - dirname: __dirname, - name: "fetch-tickets-error", - Model: "Ticket" - }); - - // Mock the get method to throw - vi.spyOn(errorMock, 'get').mockRejectedValue( - new Error('API rate limit exceeded') - ); - - // Verify error is logged - const logSpy = vi.spyOn(errorMock, 'log'); - - await expect(async () => { - await createSync.exec(errorMock); - }).rejects.toThrow('API rate limit exceeded'); - - expect(logSpy).toHaveBeenCalledWith( - expect.stringContaining('rate limit'), - { level: 'error' } - ); -}); -``` - -### Testing pagination - -Verify pagination logic works correctly: - -```typescript -it('should fetch all pages of results', async () => { - await createSync.exec(nangoMock); - - const savedTickets = await nangoMock.getBatchSaveData('Ticket'); - - // Verify we got results from multiple pages - // (based on your pagination implementation) - expect(savedTickets.length).toBeGreaterThan(100); // Assuming page size is 100 -}); -``` - -### Testing sync functions with checkpoints - -Test that checkpoint logic works: - -```typescript -it('should only fetch tickets after checkpoint date', async () => { - const getSpy = vi.spyOn(nangoMock, 'get'); - const saveCheckpointSpy = vi.spyOn(nangoMock, 'saveCheckpoint'); - - // Mock getCheckpoint to return a previous checkpoint - vi.spyOn(nangoMock, 'getCheckpoint').mockResolvedValue({ - lastModifiedISO: '2024-01-01T00:00:00Z' - }); - - await createSync.exec(nangoMock); - - // Verify the API request used the checkpoint value - expect(getSpy).toHaveBeenCalledWith( - expect.objectContaining({ - params: expect.objectContaining({ - since: '2024-01-01T00:00:00Z' - }) - }) - ); - - // Verify checkpoint was saved - expect(saveCheckpointSpy).toHaveBeenCalled(); -}); -``` - -### Parameterized tests - -Test multiple scenarios with different inputs: - -```typescript -import { it, describe, expect, beforeAll } from 'vitest'; - -describe.each([ - { priority: 'P0', expected: 'critical' }, - { priority: 'P1', expected: 'high' }, - { priority: 'P2', expected: 'medium' }, - { priority: 'P3', expected: 'low' }, -])('priority mapping for $priority', ({ priority, expected }) => { - let nangoMock; - - beforeAll(async () => { - nangoMock = new global.vitest.NangoSyncMock({ - dirname: __dirname, - name: `fetch-tickets-${priority}`, - Model: "Ticket" - }); - }); - - it(`should map ${priority} to ${expected}`, async () => { - await createSync.exec(nangoMock); - - const savedTickets = await nangoMock.getBatchSaveData('Ticket'); - const ticket = savedTickets.find(t => t.rawPriority === priority); - - expect(ticket?.priority).toBe(expected); - }); -}); -``` - -## Related resources - -- [Data Validation](/guides/functions/data-validation) - Learn more about schema validation -- [Vitest Documentation](https://vitest.dev/) - Official Vitest docs -- [Action functions](/guides/functions/action-functions) - Building and testing on-demand functions -- [Sync functions](/guides/functions/syncs/sync-functions) - Building and testing sync functions - -## CI/CD for Nango Functions - -Source: https://nango.dev/docs/guides/functions/ci-cd.md -Description: How to integrate Nango Function deployments into your CI/CD pipeline. - -CI/CD for Nango is about keeping your [Functions](/guides/functions/functions-guide) β€” sync functions, action functions, webhook functions, and event functions β€” in sync with your application across environments. - -The core principle: **deploy to Nango as part of the same pipeline step as your application**. Deploying them separately risks your app and your Functions going out of sync, which can cause subtle bugs that are hard to trace. - -## Authentication - -To deploy from CI, you need a scoped API key for each Nango environment. - -1. **Create API keys**: In the Nango UI, go to **Environment Settings > API Keys** and create a key for each environment (e.g., `dev` and `prod`). For CI/CD pipelines, use a key scoped to `environment:deploy` only β€” see the [CI/CD Deploy profile](/reference/backend/http-api/api-keys#cicd-deploy). -2. **Store the keys**: Add them as secrets in your CI/CD provider. The Nango CLI reads them from these environment variables: - - `NANGO_SECRET_KEY_DEV` - - `NANGO_SECRET_KEY_PROD` - -## Recommended pipeline - -Treat Nango Functions like application code: validate on every PR, deploy to each environment in the same step as your application. - -| Pipeline stage | What to do | -|---|---| -| **Pull request** | Run `nango compile` and `npm test` as required checks. Block merge on failure. | -| **Merge to main** | Deploy to your dev/staging Nango environment alongside your app. | -| **Release to production** | Deploy to your prod Nango environment in the same step as your app release. | - -The Nango CLI `deploy` command targets a specific environment: - -```bash -nango deploy -``` - -If you don't specify an environment, it defaults to `dev`. - -**If you don't have a staging environment**, wire the prod Nango deploy directly to your production release step β€” use a `workflow_dispatch` trigger or equivalent manual approval. This keeps production deploys intentional, and ensures they always happen through CI using the prod API key rather than from a local machine. - - -Add the `dist/` folder inside your `nango-integrations` directory to `.gitignore`. The CLI writes compiled JS artifacts there, and committing them creates noisy diffs and risks deploying stale bundles. - - -## Example: GitHub Actions - -Two workflow files implement the pipeline above. - - - -```yaml -name: Validate Nango Functions - -on: - pull_request: - branches: - - main - -jobs: - validate: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Install dependencies - run: npm ci - - - name: Compile - run: npx nango@latest compile --no-dependency-update - - - name: Test - run: npm test -``` - - - -```yaml -name: Deploy Nango Functions - -on: - # Manual trigger to deploy to a specific environment - workflow_dispatch: - inputs: - stage: - type: choice - description: 'Environment to deploy to' - required: true - default: 'dev' - options: - - dev - - prod - allowDestructive: - type: boolean - description: 'Allow destructive changes' - required: true - default: false - - # Automatic deploy to dev on merge to main - push: - branches: - - main - -jobs: - deploy: - runs-on: ubuntu-latest - env: - NANGO_SECRET_KEY_DEV: ${{ secrets.NANGO_SECRET_KEY_DEV }} - NANGO_SECRET_KEY_PROD: ${{ secrets.NANGO_SECRET_KEY_PROD }} - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Install dependencies - run: npm ci - - - name: Deploy to Nango - run: | - if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then - stage="${{ inputs.stage }}" - else - stage="dev" - fi - - secret_key_var="NANGO_SECRET_KEY_$(echo "$stage" | tr '[:lower:]' '[:upper:]')" - secret_key="${!secret_key_var}" - - if [ -z "$secret_key" ]; then - echo "Error: ${secret_key_var} is not set" - exit 1 - fi - - destructive_flag="" - if [ "${{ github.event_name }}" == "workflow_dispatch" ] && [ "${{ inputs.allowDestructive }}" == "true" ]; then - destructive_flag="--allow-destructive" - fi - - npx nango@latest deploy "$stage" --secret-key "$secret_key" --no-dependency-update $destructive_flag -``` - - - - - **Destructive Changes** - - A destructive change removes an integration, sync function, or action function. To prevent accidental deletions, `nango deploy` will prompt for confirmation when it detects one. - - In CI, use `--auto-confirm` or `--allow-destructive` to bypass the prompt. We recommend only doing this on a manual trigger, as shown above. - - -## Testing in CI - -Run your test suite in CI before every deployment. Nango's testing framework uses dry runs and snapshot testing to validate your Functions without affecting live data: - -```bash -npm test -``` - -See the [Testing integrations guide](/guides/functions/testing) for details. - -## Ephemeral preview environments (e.g. Vercel) - -If you use ephemeral preview environments β€” such as Vercel preview deployments β€” as your staging layer, you'll run into a challenge: each preview has a unique URL, but Nango webhook URLs must be registered in advance and point to a stable destination. - - -Nango doesn't currently support creating environments programmatically. This is on the roadmap and will make ephemeral environment setups much cleaner when available. - - -For now, the simplest approach is to designate a fixed, long-lived Nango environment (e.g., `dev`) specifically for Nango-related changes, and use that consistently across preview deployments rather than trying to create a new Nango environment per preview. - -If you need previews to receive live webhook events, a proxy server is the current workaround: register a stable URL in Nango, and have the proxy forward incoming webhooks to the correct preview URL. - -## Dependency-safe CI and monorepos - -When running Nango in CI or monorepos, you often want to avoid modifying `package.json` or running extra installs from within Nango commands. Use `--no-dependency-update` on CLI commands, or set `NANGO_CLI_DEPENDENCY_UPDATE=false` as an environment variable: - -```bash -npx nango@latest deploy dev --no-dependency-update -``` - - -With `--no-dependency-update`, Nango will not install dependencies. Make sure your pipeline does so first (e.g. `npm ci`, `pnpm install --frozen-lockfile`, `yarn install --immutable`, or `bun install --frozen-lockfile`). - - - -In CI environments, Nango automatically disables dependency updates to prevent modifying `package.json`. Passing `--no-dependency-update` explicitly silences the related warning. - - -## Related resources - -- [Testing integrations](/guides/functions/testing) - A comprehensive guide to testing your Nango Functions. -- [API Keys reference](/reference/backend/http-api/api-keys) - Available scopes and advised profiles for CI/CD and other use cases. - -## Unified APIs with functions - -Source: https://nango.dev/docs/guides/functions/unified-apis.md -Description: Build provider-specific functions behind one stable model and operation surface. - -API unification is the process of standardizing multiple provider APIs behind one interface that your product can use consistently. - -In Nango, unification is optional and code-first. You define the models and operations that fit your product, then implement provider-specific functions that translate to and from each external API. - -## When to unify - -Unification is useful when your customers use different systems for the same business object: - -- CRMs with contacts, companies, deals, and custom fields. -- ATS platforms with candidates, jobs, stages, and applications. -- Accounting systems with invoices, customers, transactions, and accounts. -- Support tools with tickets, comments, users, and organizations. - -It is less useful when the provider exposes concepts that are deeply unique. For example, Notion's block model can be partially normalized for simple document export, but advanced block behavior usually needs provider-specific logic. - -Unification does not need to be perfect to be valuable. A stable common model with explicit provider extensions is often better than trying to force every API into a lowest-common-denominator shape. - -## Design principles - -Design the unified model around your product, not around the external APIs. - -If your app already has a `Contact`, `Invoice`, or `Candidate` model, use that as the starting point. Keep the fields your workflows actually need, and resist carrying every provider field into the common model. - -Expect optional fields. Providers rarely expose the same data with the same semantics, and some customers may rely on custom fields or custom statuses. Model those gaps intentionally with nullable fields, fallbacks, metadata, or provider-specific extensions. - -Use the same model for reads and writes when possible. If a sync writes `UnifiedContact` records into your app, the corresponding create or update action should accept the same shape unless the write operation truly needs a different contract. - -Validate close to the external API. Use [data validation](/guides/functions/data-validation) in your functions so mapping drift, malformed provider responses, and invalid write inputs fail at the integration boundary. - -## Define the model - -Put shared schemas in a common file and import them from each provider implementation: - -```ts models.ts -import * as z from 'zod'; - -export const UnifiedUser = z.object({ - id: z.string().optional(), - name: z.string().optional(), - email: z.string().email().optional(), - externalUrl: z.string().url().optional(), - raw: z.unknown().optional() -}); - -export const CreateUnifiedUser = z.object({ - name: z.string(), - email: z.string().email() -}); - -export type UnifiedUser = z.infer; -``` - -Keep provider-specific fields explicit: - -```ts models.ts -export const JiraUser = UnifiedUser.extend({ - accountType: z.string().optional() -}); -``` - -## Implement unified actions - -Each provider gets an action with the same input and output contract: - - - - ```ts jira/actions/create-user.ts - import { createAction } from 'nango'; - import { CreateUnifiedUser, UnifiedUser } from '../../models'; - - export default createAction({ - description: 'Creates a user in Jira', - input: CreateUnifiedUser, - output: UnifiedUser, - exec: async (nango, input) => { - const response = await nango.post({ - endpoint: '/rest/api/3/user', - data: { - emailAddress: input.email, - displayName: input.name - } - }); - - return { - id: response.data.accountId, - name: response.data.displayName ?? input.name, - email: input.email, - raw: response.data - }; - } - }); - ``` - - - ```ts zendesk/actions/create-user.ts - import { createAction } from 'nango'; - import { CreateUnifiedUser, UnifiedUser } from '../../models'; - - export default createAction({ - description: 'Creates a user in Zendesk', - input: CreateUnifiedUser, - output: UnifiedUser, - exec: async (nango, input) => { - const response = await nango.post({ - endpoint: '/api/v2/users.json', - data: { - user: { - name: input.name, - email: input.email - } - } - }); - - return { - id: String(response.data.user.id), - name: response.data.user.name, - email: response.data.user.email, - externalUrl: response.data.user.url, - raw: response.data.user - }; - } - }); - ``` - - - -Your app can choose the integration ID at runtime and call the same action name for each provider: - -```ts -await nango.triggerAction(integrationId, connectionId, 'create-user', { - name: 'Ada Lovelace', - email: 'ada@example.com' -}); -``` - -## Implement unified syncs - -Sync functions are where read-side unification usually lives. Fetch provider records, map each page into your unified model, then save those records to Nango's records cache: - -```ts hubspot/syncs/users.ts -import { createSync } from 'nango'; -import { UnifiedUser } from '../../models'; - -export default createSync({ - description: 'Syncs users into the unified user model', - frequency: 'every hour', - models: { UnifiedUser }, - exec: async (nango) => { - for await (const page of nango.paginate({ - endpoint: '/crm/v3/objects/contacts', - params: { properties: 'email,firstname,lastname' }, - paginate: { - type: 'cursor', - cursor_path_in_response: 'paging.next.after', - cursor_name_in_request: 'after', - response_path: 'results', - limit_name_in_request: 'limit', - limit: 100 - } - })) { - const users = page.map((contact) => ({ - id: contact.id, - name: [contact.properties.firstname, contact.properties.lastname].filter(Boolean).join(' '), - email: contact.properties.email, - raw: contact - })); - - await nango.batchSave(users, 'UnifiedUser'); - } - } -}); -``` - -## Handle provider-specific behavior - -Use one of these patterns when the common model is not enough: - -- Extend the common model with provider-specific fields for integrations that need them. -- Store raw provider data under a `raw` field for debugging or advanced workflows. -- Use connection metadata for customer-specific mappings, such as custom fields, custom statuses, or selected pipelines. -- Create provider-specific actions for operations that do not map cleanly to the unified interface. - -## Related guides - -- [Action functions](/guides/functions/action-functions) -- [Sync functions](/guides/functions/syncs/sync-functions) -- [Data validation](/guides/functions/data-validation) -- [Storage](/guides/functions/storage) - -## Observability - -Source: https://nango.dev/docs/guides/platform/observability.md -Description: How Nango helps you with observability for your integrations - -Nango's logs are comprehensive and give you a detailed picture of what happens in your integrations. - -## Our approach - -Since integrations rely on third-party APIs, production issues are bound to happen. - -When you encounter a problem, great observability is the difference between a week-long needle-in-a-haystack hunt and a timely resolution. - -We built Nango's logs based on three principles: - -- **Comprehensive**: Everything that happens in Nango for your integrations produces an "operation" in the logs -- **Detailed**: Every operation and every log message contains detailed information about the integration, [connection](/guides/auth/auth-guide#overview), and [function](/guides/functions/functions-guide). Error messages are as detailed as the external APIs allow. -- **Customizable**: You can easily log your own messages from functions you write ([learn more](/reference/functions/functions-sdk#logging)). To consume logs, you can either use our built-in interface or export them with our [OpenTelemetry exporter](#opentelemetry-export) - -## Overview of Nango logs - - - ![](/images/screenshots/nango-logs-overview.png) - - -Logs are structured into: -- Operations: High-level actions happening in your Nango account (e.g., sync executed, connection created, webhook processed) -- Log messages: Nested in operations, these provide details on what happened (e.g., HTTP request executed, data validation warning, custom log message) - -Nango provides detailed filtering and searching of log messages by integration, connection, operation type, status, etc. - -We recommend exploring the logs in your own Nango account under **Logs**. - -## OpenTelemetry export - -Nango supports exporting OpenTelemetry traces so you can monitor and analyze integration activity in your own observability stack. - -Use this for: -- Advanced custom metrics -- Advanced alerting and escalation paths (e.g., segment sync errors by customer account for customized escalation paths) - -### Supported operations - -The following operations are exported as traces: -- Sync executions -- Action executions -- Third-party API webhook executions -- Proxied requests - - - If you need support for other operations please reach out. We can enable support for them. - - -### Configuration - - - - Log into the Nango dashboard and navigate to the Environment settings page. - - - In the Environment Settings, provide the following information: - - OpenTelemetry endpoint: The endpoint URL of your OpenTelemetry collector. Ex: https://my.otlp.collector:4318 - - Headers (Optional): Any authorization headers or additional headers required to access your collector. - - - -## Related guides - -- [Function logging](/guides/functions/logging) - add custom logs from function code. -- [Webhooks from Nango](/guides/platform/webhooks-from-nango#webhook-retries-debugging) - debug webhook delivery. -- [Common issues](/guides/platform/common-issues) - troubleshoot failed auth, sync, and proxy operations. - -## Environments - -Source: https://nango.dev/docs/guides/platform/environments.md -Description: Organize your integrations & data with environments - -Environments help you segment your integration configuration and customer data across different stages of your development lifecycle. - -## Overview - -Each environment in your Nango account is completely isolated with its own: - -- Integration configurations -- [Functions](/guides/functions/functions-guide) -- [Connections](/guides/auth/auth-guide) -- Environment-specific settings - - -Each Nango account comes with **dev** and **prod** environments by default. Additional environments are available depending on your [pricing plan](https://www.nango.dev/pricing). - - -## Production environments - -Any environment can be designated as a production environment. This affects how team members interact with it based on their [role](/guides/platform/security#team-and-roles). - -**To mark an environment as production:** - -1. Open the environment settings (gear icon in the top navigation) -2. Toggle the **Production environment** switch - - -Only **Full Access** team members can toggle the production flag. Once an environment is marked as production, **Support** members get read-only access to it, and **Contributor** members lose access entirely. - - -By default, the `prod` environment created with your account is already marked as production. - -## Engineering collaboration - -Use a **shared non-production environment** (usually `dev`) for day-to-day engineering work. The team shares integrations and the baseline function set. For local webhook testing, each engineer creates their own connections with a webhook URL override (see below). - -### Local webhooks on a shared environment - -Keep the environment webhook URL pointed at your shared app (or staging backend). To receive webhooks from Nango locally, create connections with a [per-connection `webhook_url` override](/guides/platform/webhooks-from-nango#override-webhook-urls-per-connection) pointing at your local webhook endpoint (for example via [ngrok](https://ngrok.com/)). - -One convenient pattern is to read the override from an optional env var, so the same connect-session code works locally and when the var is unset. For example, set `NANGO_CONNECTION_WEBHOOK_URL` in your local `.env` to that URL and leave it unset elsewhere: - -```ts -const webhookUrl = process.env.NANGO_CONNECTION_WEBHOOK_URL; // e.g. https://.ngrok.app/webhooks-from-nango - -const session = await nango.createConnectSession({ - tags: { - end_user_id: '' }, - allowed_integrations: [''], - ...(webhookUrl && { - integrations_config_defaults: { - '': { - connection_config: { webhook_url: webhookUrl } - } - } - }) -}); -``` - -When the var is set, new connections from that session route webhooks to your machine without changing the environment webhook URLs. - -### Local function deploys on a shared environment - -A full `nango deploy` reconciles every function in the environment. On a shared collaborative environment, that can overwrite teammates' deploys. Deploy only what you changed: - -```bash -nango deploy --sync -nango deploy --action -nango deploy --integration # all functions for one integration, including event functions -``` - -Reserve full deploys for environments where the repo is the sole source of truth (for example staging or prod). See the [CI/CD guide](/guides/functions/ci-cd). - -### One environment per engineer - -You can give each engineer their own environment for full isolation. You then need to recreate integrations, connections, and settings in each environment yourself; that also means more API keys to manage and config that tends to drift over time. A shared `dev` environment avoids that overhead for most teams. - -## Best practices - -**Mirror your application environments** - -We recommend creating Nango environments that match your application's deployment stages. For example: -- Development / local β†’ dev environment -- Staging β†’ staging environment -- Production β†’ prod environment -- Demo β†’ demo environment - -**Deploy to specific environments** - -When you deploy [Functions](/guides/functions/functions-guide), you always target a specific environment. This ensures changes are tested before reaching production. - -## Related guides - -- [API keys](/reference/backend/http-api/api-keys) - scope keys per environment. -- [CI/CD](/guides/functions/ci-cd) - deploy functions safely across environments. -- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - environment and per-connection webhook URLs. -- [Self-host Nango](/guides/platform/self-hosting) - plan environments for self-hosted deployments. - -## Limits - -Source: https://nango.dev/docs/guides/platform/limits.md -Description: Overview of resource limits on Nango Cloud. - -Nango Cloud has several resource limits to ensure platform stability and fair usage across all customers. - - -For plan-specific limits, refer to the [pricing page](https://www.nango.dev/pricing) and the Usage & Billing page in your account. - - -## API rate limits - -Rate limits apply to API requests from your application to Nango: - -| Plan | Requests per Minute | -| - | - | -| Free tier | 200 | -| Starter | 1,000 | -| Growth | 2,000 | -| Enterprise | Custom | - - -If you exceed the rate limit, use the standard rate-limit headers to determine when to resume requests. - - -## Function execution limits - -Different function types have varying execution and enqueuing time limits: - -| Function Type | Max Execution Time | -| - | - | -| [Sync functions](/guides/functions/syncs/sync-functions) | 24 hours | -| [Action functions](/guides/functions/action-functions) | 15 minutes | -| [Webhook functions](/guides/functions/webhook-functions) | 1 hour | - -### Minimum sync frequency - -For polling syncs, the minimum frequency is **30 seconds**, available on all plans. You can set the frequency in the sync definition or override it per connection using the [SDK](/reference/backend/backend-sdk/node#override-sync-connection-frequency) or [API](/reference/backend/http-api/sync/update-connection-frequency). - -For real-time updates, use [real-time syncs](/guides/functions/syncs/realtime-syncs) which trigger from external API webhooks instead of polling. - -### Sync variant limits - -Each sync can have a maximum of **100 variants** per connection. For heavier workloads, reach out to increase this limit. See the [sync partitioning guide](/guides/functions/syncs/sync-partitioning) for more details. - -### Action function output limits - -Action functions have a maximum output payload size of **2MB**. For large payloads, use the [Proxy](/guides/platform/proxy-requests) instead. - -## Data retention policies - -Nango automatically manages data retention for records in the sync cache: - -### Payload pruning (30 days) - -If a record hasn't been updated for **30 days**, Nango automatically prunes its payload while preserving: -- Record ID -- Sync state -- Payload hash (for change detection) - -The record still exists and Nango can detect future changes, but the data fields are no longer retrievable from the cache. - -### Hard deletion (60 days) - -If a sync hasn't executed for **60 days**, all associated records (payload + metadata) are permanently deleted. - - -These policies ensure sensitive data isn't stored indefinitely. If you need to access record payloads long after updates (30+ days), please reach out in the [Slack community](https://nango.dev/slack). - - -## Webhook limits - -Webhooks sent from Nango to your application have the following limits: - -- **Timeout**: 20 seconds -- **Retries**: 2 attempts - -These limits apply to all webhook types: auth, sync function completion, async action function completion, and webhook forwards. - -## Related guides - -- [Rate limits](/guides/functions/rate-limits) - handle provider throttling in functions. -- [Sync efficiency](/guides/functions/syncs/sync-efficiency) - stay within payload and runtime limits. -- [Security](/guides/platform/security) - review retention and access constraints. - - -**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - - -## Security - -Source: https://nango.dev/docs/guides/platform/security.md -Description: How Nango secures your API credentials and customer data. - -Nango is designed with security as a core principle. This page provides technical details about how Nango stores, encrypts, and manages API credentials. - -## Compliance - -Nango is **SOC 2 Type II** certified, **GDPR** compliant, and **HIPAA** compliant. - -| Certification | Details | -| - | - | -| SOC 2 Type II | Annual audit covering security, availability, and confidentiality. [View report β†’](https://trust.nango.dev) | -| GDPR | Data Processing Agreement (DPA) automatically applies to all cloud accounts. [View DPA β†’](https://nango.dev/terms#dpa) | -| HIPAA | Business Associate Agreement (BAA) available on request. [Contact us β†’](https://nango.dev/demo) | - -Our security practices include: - -- Regular security assessments and penetration testing -- Secure development lifecycle -- Incident response procedures -- Continuous monitoring and alerting - -Visit our [Trust Center](https://trust.nango.dev) for the latest compliance documentation, security policies, and audit reports. - -## Credential storage - -### What credentials are stored - -Nango stores the following credential types depending on your API integrations: - -- **OAuth tokens**: Access tokens, refresh tokens, and associated metadata -- **API keys**: For APIs using key-based authentication -- **Client credentials**: OAuth client IDs and secrets for your integrations -- **Connection configuration**: OAuth scopes, authorization parameters, and provider-specific settings - -### Storage infrastructure - -Nango Cloud stores all data in **AWS Aurora PostgreSQL** databases hosted in AWS. The database infrastructure includes: - -- Encryption at rest using AWS-managed keys -- Automated backups with point-in-time recovery -- Multi-AZ deployment for high availability -- Network isolation within a private VPC - -For self-hosted deployments, you control the database infrastructure and can apply your own security policies. - -## Encryption - -### Encryption at rest - -All sensitive credentials are encrypted before being stored in the database using **AES-256-GCM** (Advanced Encryption Standard with Galois/Counter Mode). - -| Property | Value | -| - | - | -| Algorithm | AES-256-GCM | -| Key size | 256 bits (32 bytes) | -| IV size | 12 bytes (generated per encryption) | -| Auth tag size | 16 bytes | - -### What is encrypted - -The following data types are encrypted at rest: - -- Connection credentials (OAuth tokens, API keys, etc.) -- OAuth client secrets (your integration credentials) -- Environment secret keys -- Environment variables - -### Key management - -- **Nango Cloud**: Encryption keys are securely managed by Nango. All credentials are encrypted at rest. -- **Self-hosted**: You must provide your own encryption key to enable encryption at rest. - -### Encryption in transit - -All data transmitted to and from Nango is encrypted using TLS 1.2+. This includes: - -- API requests between your application and Nango -- Requests from Nango to external APIs (using each provider's TLS configuration) -- Dashboard access - -## Data retention - -### Active connections - -Credentials are stored for as long as the connection exists. You have full control over connection lifecycle: - -- Create connections when users authorize integrations -- Delete connections at any time via the API or dashboard -- Connections can be programmatically managed through your application - -#### Retention after deletion - -When a connection is deleted: - -1. **Immediate soft delete**: Connection is marked as deleted and becomes inaccessible -2. **Associated data cleanup**: Sync functions are stopped, and scheduled tasks are cancelled -3. **Hard delete after retention period**: Credentials and associated data are permanently removed from the database - -The default retention period is **31 days**. For self-hosted deployments, this is configurable. - -This retention period allows for: -- Recovery from accidental deletions -- Compliance with audit requirements -- Graceful handling of in-flight operations - -#### What is deleted - -When a connection is permanently deleted, the following data is removed: - -- All stored credentials (tokens, keys, secrets) -- Connection metadata and configuration -- Sync records associated with the connection -- Related job history and logs - -### Synced records retention - - -This section only applies if you are using Functions of type Sync, e.g. for replicating data or receiving trigger notifications from an external API. - - -Nango automatically manages data retention for records stored in the Nango records cache to ensure that sensitive user data is not stored indefinitely when it's no longer needed. - -#### Automated payload pruning (30 days) - -If a record has not been updated for **30 days**, Nango will automatically empty its payload. - -**Impact:** -After pruning, the record's data fields are no longer retrievable from the Nango cache via the API or SDK. However, Nango retains the metadata needed for change detection (record ID and payload hash). Your sync functions will continue to work normally. This pruning does not impact sync execution or delta-detection capabilities. - -#### Automated hard deletion (60 days) - -If a sync has not executed for **60 days**, all records belonging to that sync will be permanently deleted. - -**Impact:** -Complete removal of all records from the inactive sync, including metadata and payload hashes used for delta-detection. The sync itself remains configured but starts fresh on the next execution. Nango will no longer be able to detect changes against previously synced records. - -#### When do retention policies apply? - -- **30-day pruning countdown**: Starts from the last time a specific record was updated. -- **60-day deletion countdown**: Starts from the last time a sync successfully executed. - -#### Best practices - -To work optimally with Nango's retention policies: - -**1. Fetch records promptly** - -Set up [webhooks from Nango](/guides/platform/webhooks-from-nango) to be notified when new data is available. Fetch the updated records immediately after receiving a sync webhook. - -**2. Use cursor-based synchronization** - -Track your sync progress using cursors to ensure you never miss records, even if webhooks are occasionally missed. Store the cursor of the last-fetched record and use it on subsequent fetches. - -**3. Store data in your own system** - -Don't use Nango's cache as your primary data store. Instead: -- Store synced records in your own database -- Use Nango as a synchronization pipeline -- Keep your own copy of all critical data - -#### Longer retention requirements - -If your use case requires accessing record payloads from Nango's cache beyond the 30-day window, please reach out to the Nango team. We can work with you to ensure you don't experience breaking changes. - -## Deletion procedures - -### User-initiated deletion - -You can delete connections through: - -- **Dashboard**: Navigate to the connection and click "Delete" -- **API**: Call the [delete connection endpoint](/reference/backend/http-api/connections/delete) -- **SDK**: Use the `deleteConnection` method in any of our backend SDKs - -### Automatic cleanup - -Nango automatically cleans up: - -- Expired OAuth sessions -- Expired connect session tokens -- Orphaned data from deleted integrations - -### Data purge requests - -For compliance requirements (e.g., GDPR), contact Nango support to request immediate data purges. We can expedite the deletion process when required by regulation. - -## Access controls - -### API authentication - -Nango supports multiple authentication methods: - -| Method | Use case | Token lifetime | -| - | - | - | -| Secret key | Server-to-server API access | Long-lived (until rotated) | -| Connect session token | Frontend auth flows | 30 minutes | -| Session cookie | Dashboard access | Session-based | - -### Secret key security - -- Secret keys are environment-specific (dev, prod, etc.) -- Keys can be rotated via the dashboard -- All API requests require a valid secret key in the `Authorization` header - -### Environment isolation - -Each [environment](/guides/platform/environments) in your Nango account is completely isolated: - -- Separate credentials and connections -- Separate integration configurations -- Separate secret keys - -This ensures your production data is never accessible from development environments. - -### Audit logging - -All credential access and modifications are logged: - -- Connection creation and deletion -- Credential refresh operations -- API requests using credentials - -Logs are available in the Nango dashboard and can be exported via [OpenTelemetry](/guides/platform/observability#opentelemetry-export). - - -## Team & roles - -Nango supports multiple team members per account with role-based access control (RBAC). Roles determine what each member can view and modify, particularly in production environments. - -### Role overview - -There are three roles: - -| | **Full Access** | **Support** | **Contributor** | -| - | - | - | - | -| **Summary** | Unrestricted access across all environments. The only role that can manage account settings, billing, and the team. | Designed for monitoring production without being able to change it. Full access in non-production environments. | Designed for developers who work exclusively in non-production environments. No production access at all. | - -**Full Access is the default role** for just-in-time (JIT) provisioning when using SSO. When inviting members manually, you choose their role during the invitation flow. - - -At least one Full Access member is required per account. - - -### Permissions - -| | **Full Access** | **Support** | **Contributor** | -| - | - | - | - | -| Non-production: read (integrations, connections, syncs, logs) | βœ“ | βœ“ | βœ“ | -| Non-production: write / delete | βœ“ | βœ“ | βœ“ | -| Production: read (integrations, connections, syncs, logs) | βœ“ | βœ“ | β€” | -| Production: trigger syncs | βœ“ | βœ“ | β€” | -| Production: write / delete | βœ“ | β€” | β€” | -| Production: view secret key | βœ“ | β€” | β€” | -| Production: view integration credentials | βœ“ | β€” | β€” | -| Production: view connection credentials | βœ“ | β€” | β€” | -| Invite / update / remove team members | βœ“ | β€” | β€” | -| Manage billing & plan | βœ“ | β€” | β€” | -| Configure Connect UI | βœ“ | β€” | β€” | -| Create environments / toggle production flag | βœ“ | β€” | β€” | - - -All environments appear in the dashboard switcher regardless of role, but access is enforced server-side β€” users are blocked from entering environments their role does not permit. Permissions cannot be bypassed by manipulating URLs or API parameters. - - -### Production environment flag - -Whether an environment is considered production is configured in **Environment Settings β†’ General**. The production status of the current environment is also visible in the environment dropdown at the top left of the dashboard. - -The flag can be set on any environment regardless of its name β€” not just `prod`. This lets you protect environments like `prod-eu`, `production`, or `live` the same way. - -Only **Full Access** members can toggle this flag. Once set, Support members get read-only access (without sensitive credentials) and Contributor members lose access entirely. - - -The production flag currently governs role-based access. In the future it may also control additional environment traits to differentiate production-grade environments from development or staging ones. - - - -These roles apply to dashboard access only. They do not affect API authentication β€” any caller with a valid secret key retains full API access regardless of their dashboard role. - - - -## Single sign-on (SSO) - -Nango Cloud uses [WorkOS](https://workos.com) to power SSO. - -### Availability - -| Plan | SSO support | -| - | - | -| Free / Starter | Google SSO only | -| Growth | SSO with 20+ identity providers (add-on) | -| Enterprise (Cloud) | SSO with 20+ identity providers (included) | -| Enterprise (Self-hosted) | Not yet available (planned) | - -### Supported providers - -Through WorkOS, Nango supports the main SSO providers, including **Okta**, **Entra ID**, **OneLogin** and 20+ other identity providers. - -### How to enable SSO - -1. To enable SSO for your account, contact the Nango team (on our shared Slack channel or the [community](https://nango.dev/slack)). -2. If you are on the Growth plan, we will subscribe your workspace to the SSO add-on. -3. We will invite an admin from your company to complete the SSO setup flow. - -### Setup flow - -During setup, your company admin can configure the **domains allowed to sign in**. User accounts are created automatically through just-in-time (JIT) provisioning. - -### How users log in - -Once SSO is configured, users sign in through your company's identity provider (IdP). Nango currently does not provide a dedicated SSO button on the login page β€” login must be initiated from the IdP side. - -## IP Allowlist - -Some integrations require network-level access controls that only allow inbound traffic from known IP addresses. -This page lists the **public IP addresses used by Nango services** when making outbound requests. - -### When is IP allowlisting required? - -IP allowlisting is only required if **your customers' systems** restrict inbound network traffic. - -Common examples include: -- Private or self-hosted APIs behind a firewall -- Enterprise systems that only accept traffic from approved IPs -- Third-party services with IP-based access controls - -If a system is publicly accessible without IP restrictions, **no allowlist configuration is needed**. - -### Nango public IP addresses - -Allowlist the following IP addresses to permit inbound traffic from Nango: - -- `52.34.139.153` -- `54.69.127.183` -- `44.247.133.183` -- `52.26.211.56` - -### IP address changes - -While we aim to keep IP addresses stable, they **may change over time** as we scale or improve reliability. - -To minimize disruption: -- Ensure all listed IPs are allowlisted -- Periodically review this page for updates - -We will make reasonable efforts to communicate breaking changes in advance. - -## API Key Scoping - -Nango supports scoped API keys, allowing you to follow the principle of least privilege when granting programmatic access to your environments. Each API key can be restricted to specific operations β€” for example, a CI/CD pipeline key that can only deploy, or a backend service key that can read connections but not manage integrations. - -For details on available scopes, advised profiles, and key management, see the [API Keys reference](/reference/backend/http-api/api-keys). - - -**Questions about security?** Please reach out in the [Slack community](https://nango.dev/slack) or contact security@nango.dev. - - -## Related guides - -- [API keys](/reference/backend/http-api/api-keys) - create scoped keys for production access. -- [Auth guide](/guides/auth/auth-guide) - keep provider credentials out of your app. -- [Token refreshing and validity](/guides/auth/token-refreshing) - handle revoked OAuth credentials. -- [Self-host Nango](/guides/platform/self-hosting) - review deployment and data ownership options. - -## Self-host Nango - -Source: https://nango.dev/docs/guides/platform/self-hosting.md -Description: Overview of self-hosted deployments. - -Nango offers a self-hosted deployment option for Enterprise customers. This guide covers deployment, scaling, updates, and other key operational details. - -## Architecture overview - - - - - -## Architecture components - -Nango consists of several core services, each handling specific responsibilities: - -- **Server (Node service)**: Powers the dashboard, API, proxy requests, and incoming/outgoing webhooks. -- **Orchestrator (Node service)**: Manages task scheduling and state tracking. -- **Jobs (Node service)**: Processes tasks and dispatches them to the Runner. -- **Runner (Node service)**: Executes integration code and interacts with external APIs. -- **Persist (Node service)**: Stores synced records and logs. -- **Postgres**: Stores data for the control plane, API credentials, scheduled tasks, and synced records. -- **Object Storage (e.g. S3)**: Stores compiled integration code for execution by the Runner. -- **ElasticSearch**: Stores execution data. -- **Redis**: Caches system data, including socket information, token refresh locks, and rate limits. - -## Cloud vs. self-hosted architecture - -The Nango architecture is largely the same for both Cloud and Enterprise self-hosting. This ensures self-hosted instances benefit from continuous dogfooding and load testing. - -The primary differences are: -- In the Cloud version, the Runner service runs as isolated instances per customer. -- The Postgres database is segmented by use case (control plane, task scheduling, synced records). - -## Features - -All paid features available on Nango Cloud are also included in the Enterprise self-hosted edition. - -## Plan requirement - -An [Enterprise plan](https://www.nango.dev/pricing) subscription is required. - -Enterprise Self-Hosted pricing contain a fixed annual license and maintenance fee, plus a fraction of the cloud usage-based fees since infrastructure is on the customer side. - -## Intended users - -Inteded for large and/or regulated enterprises. - -## Deployment - -By default, Nango is deployed using [Helm charts](https://github.com/NangoHQ/nango-helm-charts). Custom deployments (e.g., ECS) are possible with our guidance. - -## Updates - -Managed image updates are published on a **two-month cadence**, with occasional **hotfixes** as needed. Notifications about new releases will be posted to your dedicated Nango Slack channel. - -You can also subscribe to release notifications on the [`NangoHQ/managed-image-releases`](https://github.com/NangoHQ/managed-image-releases) repository: - -- **GitHub:** watch the repository, select **Custom**, and enable **Releases**. -- **RSS/Atom:** subscribe to `https://github.com/NangoHQ/managed-image-releases/releases.atom`, which can be wired into Slack, Microsoft Teams, RSS readers, or internal automation. - -Each release includes the managed image tag, application version, source commit hash, release date, Docker pull reference, a GitHub compare link to the previous managed release, and a generated changelog of changes since the previous managed release. - -### Image tags - -Managed image tags follow this format: - -``` -nangohq/nango:managed-{managed-release-version}-{application-version}-{commit-sha} -``` - -* `managed-release-version`: Semantic version for the managed image lifecycle (major = breaking, minor/patch = features/fixes) -* `application-version`: Semantic version of the Nango application baked into the image -* `commit-sha`: Full Git commit hash of the released source - -For example, pull a release from Docker Hub with: - -```bash -docker pull nangohq/nango:managed-1.5.4-0.70.4-0fe07a6d83aea0becc4cea382c5cead2f555718d -``` - -Customers should **pin their CLI version to the `application-version`** specified in the tag for compatibility. - -### Versions and policy - -You can find the latest version in [`managed-manifest.json`](https://github.com/NangoHQ/managed-image-releases/blob/main/managed-manifest.json) on `managed-image-releases` (mirrored from [`NangoHQ/nango`](https://github.com/NangoHQ/nango/blob/master/managed-manifest.json) on each release). The in-repo [`CHANGELOG.md`](https://github.com/NangoHQ/managed-image-releases/blob/main/CHANGELOG.md) tracks release history. - -Each managed release maps to a specific source commit, and published image tags are never changed after release. Customers are encouraged to stay reasonably current with managed image releases. - -See the full [changelog](/updates/changelog) for details on each release. - -## Cloud provider support - -Supports all major cloud providers (AWS, GCP, Azure). - -## Recommended configuration - -- **5 Node services** (Server, Persist, Runner, Jobs, Orchestrator): 1 CPU, 2GB RAM per service -- **Postgres database**: 2 CPU, 8GB RAM, 128GB storage -- **Redis data store**: 128MB -- **ElasticSearch data store**: 2 vCPU, 1GB RAM, 30GB storage -- **Object storage (e.g. S3)**: less than 500MB of storage - -## Scaling - -The default configuration supports 1M+ sync/action executions per day (assuming ~2s execution time per action/sync). - -Auto-scaling is not provided out-of-the-box yet, but the default configuration scales far. We can guide you on configuring auto-scaling when needed. - -Bottlenecks mostly depend on: -- **Action/sync execution time**: solved by scaling the Runner service vertically, then horizontally. -- **Cached records & size (for sync functions only)**: solved by scaling Postgres vertically. - -## Data storage - -- **Postgres**: Stores data for the control plane, API credentials, scheduled tasks, and synced records. -- **Object Storage (e.g. S3)**: Stores compiled integration code for execution by the Runner. -- **ElasticSearch**: Stores execution data. -- **Redis**: Caches system data, including socket information, token refresh locks, and rate limits. - -## Using existing data stores - -Yes, Nango is flexible with data store setups. However, we recommend a separate instance for independent scaling. - -## Internet access requirements - -- **Server:** Required for proxy requests, credential management, and incoming/outgoing webhooks (inbound & outbound traffic). -- **Runner:** Required for reading/writing data from external APIs during sync and action executions (outbound traffic only). - -## Exporting metrics & logs - -Yes, metrics and logs can be exported to any monitoring tool using our OpenTelemetry Export add-on. Additional metrics and logs can be added upon request. - -## Email service - -Nango uses emails for account verification, password reset, and sending invitations, etc... - -Any SMTP server can be configured to be used by Nango for these email communications. - -## Encryption key - -You must provide your own encryption key via the `NANGO_ENCRYPTION_KEY` environment variable to enable encryption at rest. It encrypts credentials in the control-plane database as well as data in the records cache. Without this key, credentials are stored unencrypted. - -The records cache always requires this key. If you run sync functions that persist records, the persist and records services fail to store or retrieve records when `NANGO_ENCRYPTION_KEY` is not setβ€”they do not fall back to plaintext. - - -The encryption key must be a base64-encoded 256-bit (32-byte) key. Key rotation is not supported yetβ€”changing the key after initial setup will cause decryption failures. Plan your key management accordingly. - - -## Data retention configuration - -The default retention period for deleted connections is 31 days. You can configure this via the `CRON_DELETE_OLD_CONNECTIONS_MAX_DAYS` environment variable. - -## Free self-hosting - -A limited free self-hosting option is available for hobby projects. It is intended for lightweight deployments that need Auth and Proxy, without the managed features and support included with Enterprise self-hosting or Nango Cloud. - -For more details, see the [pricing page](https://nango.dev/pricing) or [schedule a call](https://nango.dev/demo) to discuss the Enterprise self-hosted version. - -### Feature availability - -| Feature | Free self-hosted | Enterprise self-hosted / Nango Cloud | -| --- | --- | --- | -| Auth | Yes | Yes | -| Proxy | Yes | Yes | -| Observability | Auth + proxy only | Full | -| OpenTelemetry export | No | Yes | -| Functions | No | Yes | -| Webhooks | No | Yes | -| MCP server | No | Yes | -| Customize auth branding | No | Yes | -| Role-based permissions | No | Yes | -| SAML SSO | No | On the roadmap | -| Support SLA | No | Yes | - -### Server URL, callback URL, and custom domains - -Add server environment variables for the instance URL and port in the `.env` file or directly in your hosting provider: - -```sh -NANGO_SERVER_URL= -SERVER_PORT= -``` - -The resulting OAuth callback URL is `/oauth/callback`. - -You can customize the callback URL by updating the "Callback URL" field in the "Environment Settings" tab in the Nango admin. - - -If you are using a custom domain, update `NANGO_SERVER_URL` to match it. - - -### Connect UI - -Nango Connect is available for self-hosted deployments in the main Docker image. - -```sh -FLAG_SERVE_CONNECT_UI=true -NANGO_CONNECT_UI_PORT=3009 -NANGO_PUBLIC_CONNECT_URL= -``` - -Nango Connect is available by default at `http://localhost:3009`. - - -If you are using a custom domain, update `NANGO_PUBLIC_CONNECT_URL` to match it. - - -See [Auth](/guides/auth/auth-guide) for the end-user connection flow. - -### Persistent storage - -If you deploy with Docker Compose, the bundled database uses local container storage. This is not appropriate for production. - -Connect Nango to an external Postgres database by setting the database environment variables: - -```sh -NANGO_DB_USER= -NANGO_DB_PASSWORD= -NANGO_DB_HOST= -NANGO_DB_PORT= -NANGO_DB_NAME= -NANGO_DB_SSL=true -``` - -You can also use a database URL: - -```sh -NANGO_DATABASE_URL=postgresql://user:password@host:port/dbname -``` - -Special characters in `NANGO_DATABASE_URL` must be URL encoded. - - -Nango is incompatible with connection poolers using `pool_mode=transaction`. Use a direct database connection or configure the pooler to use a different mode. - - -Records saved by sync functions can be persisted in a dedicated database. To use a dedicated records database, set `RECORDS_DATABASE_URL`: - -```sh -RECORDS_DATABASE_URL=postgresql://user:password@host:port/dbname -``` - -Special characters in `RECORDS_DATABASE_URL` must be URL encoded. If it is not specified, records are stored in the main database. - - -Deploying with Render or Heroku automatically generates a persistent database connected to your Nango instance. - - -### External Redis - -The bundled Redis is fine for local use but not for production. Connect Nango to an external Redis (or Valkey) with either a full URL or discrete variables: - -```sh -NANGO_REDIS_URL=rediss://:@: -# or -NANGO_REDIS_HOST= -NANGO_REDIS_PORT= -NANGO_REDIS_AUTH= -``` - -Use the `rediss://` scheme (or discrete variables, which default to TLS) to enable in-transit encryption. - -#### IAM / short-lived token authentication - -Managed Redis with IAM authentication (for example GCP Memorystore for Valkey) uses a short-lived token as the password and requires the token to be refreshed before it expires. Instead of a static `NANGO_REDIS_AUTH`, point Nango at a file that an external process (such as a sidecar) keeps up to date: - -```sh -NANGO_REDIS_HOST= -NANGO_REDIS_PORT= -NANGO_REDIS_AUTH_TOKEN_FILE=/path/to/token # re-read on every (re)connect -NANGO_REDIS_USERNAME= # optional; defaults to "default" -``` - -Nango reads the token file on every connection and reconnection, so a rotated token is always picked up without a restart. This is cloud-agnostic: anything that writes the current token to the file works. The writer must update the file atomically β€” write a temporary file and `rename()` it into place β€” so a reconnect never reads a half-written token and fails authentication. When `NANGO_REDIS_AUTH_TOKEN_FILE` is set, do not embed credentials in `NANGO_REDIS_URL`. - -The runner boundary has the same set of variables prefixed with `NANGO_CUSTOMER_REDIS_` (for example `NANGO_CUSTOMER_REDIS_AUTH_TOKEN_FILE`); it falls back to the system Redis when unset. - -### Securing your instance - -#### Proxy base URL override hardening - -The [proxy](/guides/platform/proxy-requests) can send authenticated requests to external APIs. Some proxy calls accept a **base URL override** (HTTP header `Base-Url-Override`, SDK `baseUrlOverride`, or an integration `custom.baseUrl`) to target a host that differs from the provider's default API base URL. - -Because the proxy makes outbound HTTP requests from your Nango server (and from the runner for sync and action scripts), a caller with permission to use the proxy could use an override to reach hosts that were not meant to be exposedβ€”such as cloud metadata services or `localhost` on the host making the request. This is a classic **SSRF** risk. - -By default, Nango keeps base URL override **enabled** and blocks override targets and redirect hops whose hostnames match a built-in denylist (cloud metadata and loopback addresses). Configure these environment variables and restart the **server** and **runners** after changes: - -```sh -NANGO_PROXY_BASE_URL_OVERRIDE_ENABLED=true -NANGO_PROXY_BASE_URL_OVERRIDE_DENYLIST='["169.254.169.254","metadata.google.internal","localhost","127.0.0.1","[::1]"]' -``` - -| Variable | Default | Purpose | -| - | - | - | -| `NANGO_PROXY_BASE_URL_OVERRIDE_ENABLED` | `true` | Set to `false` to reject all base URL overrides | -| `NANGO_PROXY_BASE_URL_OVERRIDE_DENYLIST` | Secure defaults when unset | JSON array of hostnames or URLs to block; custom entries are merged with defaults | -| `NANGO_OUTBOUND_URL_POLICY` | Secure defaults when unset | JSON object controlling SSRF protection for proxy, customer webhooks, and `uncontrolledFetch` | - -**Operator guidance:** - -- **Production:** keep the default denylist. Add environment-specific hosts if your deployment exposes additional internal endpoints. -- **Legitimate localhost overrides (dev only):** set `NANGO_PROXY_BASE_URL_OVERRIDE_DENYLIST='[]'` to restore fail-open behavior. -- **No overrides at all:** set `NANGO_PROXY_BASE_URL_OVERRIDE_ENABLED=false`. - -Denylist matching is hostname-based and applies to redirect hops as well as the initial override target. - -#### Outbound URL policy (DNS rebinding, private IPs, redirects) - -Beyond the hostname denylist, Nango routes every outbound connection on the **proxy**, **customer webhook delivery**, and **`uncontrolledFetch`** paths through DNS-pinning agents that re-validate the *resolved* IP address β€” closing DNS-rebinding and redirect-to-internal-address SSRF holes. The behavior is controlled by `NANGO_OUTBOUND_URL_POLICY`, a JSON object (applied on top of the denylist). It propagates automatically to runners. - -The `mode` field selects how hostnames are filtered: - -- **`denylist`** (default): every destination is reachable except hostnames on the denylist (plus the IP-based protections below). This is the out-of-the-box mode, since the denylist always carries the secure defaults. -- **`allowlist`**: only hostnames in `allowlist` are reachable (a leading `.` matches subdomains); everything else is rejected. The denylist and the IP-based protections still apply on top, so allowlist is strictly *more* restrictive β€” a listed hostname that resolves to a blocked IP is still rejected. -- **`permissive`**: no hostname-based filtering (the IP-based protections below still apply). You only reach this mode deliberately β€” either by emptying the server denylist with no explicit mode (see below), or by setting `mode: "permissive"`. - - -The IP-based protections apply in **every** mode, including `permissive`. Loopback (`127.0.0.0/8`, `::1`) and unspecified addresses are **always** blocked; private/RFC1918/CGNAT addresses (`blockPrivateIps`) and link-local addresses β€” including the cloud-metadata IP `169.254.169.254` (`blockLinkLocal`) β€” are blocked by default. - -The denylist is **never empty by default** β€” it is always seeded with the secure defaults (`localhost`, `metadata.google.internal`, `169.254.169.254`, …). It only becomes empty if you explicitly opt out: either `NANGO_PROXY_BASE_URL_OVERRIDE_DENYLIST='[]'` (server only, which then selects `permissive`) or `mode: "permissive"`. Even then, only hostname string matches such as `localhost` are dropped β€” literal or resolved internal IPs stay blocked unless you also set `blockPrivateIps`/`blockLinkLocal` to `false`. Runners re-apply the secure denylist defaults even when the server has emptied its denylist; note an explicit `mode: "permissive"` empties the denylist everywhere, runners included. - - -```sh -# Block private/link-local IPs (default) and cap redirects at 3 -NANGO_OUTBOUND_URL_POLICY='{"blockPrivateIps":true,"blockLinkLocal":true,"maxRedirects":3}' - -# Allowlist mode: only the listed hostnames (and their subdomains) are reachable -NANGO_OUTBOUND_URL_POLICY='{"mode":"allowlist","allowlist":[".hubspot.com","api.github.com"]}' -``` - -| Field | Default | Purpose | -| - | - | - | -| `mode` | `denylist` (auto-`permissive` only if you empty the denylist) | `denylist`, `allowlist`, or `permissive` (see above) | -| `allowlist` | `[]` | In `allowlist` mode, hostnames (a leading `.` matches subdomains) that may be reached | -| `blockPrivateIps` | `true` | Block RFC1918 / CGNAT addresses (all modes) | -| `blockLinkLocal` | `true` | Block link-local addresses incl. `169.254.169.254` (all modes) | -| `maxRedirects` | `5` | Maximum redirect hops followed | - -Each resolved address (including on every redirect hop) is validated; in `allowlist` mode, only listed hostnames are reachable regardless of IP. - -#### Securing the dashboard - -By default, the dashboard of your Nango instance is open to anyone who can access your instance URL. - -You can secure it with Basic Auth by setting the following environment variables and restarting the server: - -```bash -FLAG_AUTH_ENABLED=false -NANGO_DASHBOARD_USERNAME= -NANGO_DASHBOARD_PASSWORD= -``` - -#### Encrypting sensitive data - -You can enforce encryption of sensitive data, including tokens, secret keys, and app secrets, by setting a 256-bit base64-encoded key: - -```sh -openssl rand -base64 32 -``` - -Set the generated value as `NANGO_ENCRYPTION_KEY`: - -```sh -NANGO_ENCRYPTION_KEY= -``` - -After you restart the Nango server, database encryption happens automatically. The encryption key cannot currently be modified after it is set. - - -`NANGO_ENCRYPTION_KEY` is also required for Connect UI. It is used to generate sessions for [Connect UI](/reference/frontend/frontend-sdk#connect-using-nango-connect-ui). Without this key, Connect UI will not work. - - -#### Custom websockets path - -The Nango server serves websockets from `/` by default for use by `@nangohq/frontend` during the login flow. - -To isolate websockets from the dashboard, set `NANGO_SERVER_WEBSOCKETS_PATH`: - -```sh -NANGO_SERVER_WEBSOCKETS_PATH= -``` - -If you set a custom path, configure `websocketsPath` when initializing the `Nango` object in the `@nangohq/frontend` SDK: - -```js -import Nango from '@nangohq/frontend'; - -let nango = new Nango({ host: 'https://', websocketsPath: '' }); -``` - -### Telemetry - -Self-hosted instances do not automatically send telemetry back to Nango. Operational metrics and logs stay within your own infrastructure and are only exported if you configure the OpenTelemetry Export add-on described above. - -### Logs - -Nango stores execution logs and powers the logs UI with either Elasticsearch or OpenSearch. To keep free self-hosted deployments lighter, this stack is optional. - -To enable logs: - -- Host an Elasticsearch or OpenSearch cluster. -- Set `NANGO_LOGS_ENABLED=true`. -- Configure the relevant `NANGO_LOGS_ES_*` environment variables (these apply to both providers). - -Nango uses Elasticsearch by default. To use OpenSearch instead, set: - -```sh -NANGO_LOGS_PROVIDER=opensearch -``` - -Elasticsearch hosting options include: - -- Local: uncomment the service in [`docker-compose.yaml`](https://github.com/NangoHQ/nango/blob/master/docker-compose.yaml#L63) and run `docker-compose up`. -- Elastic Cloud: use [elastic.co](https://www.elastic.co/). -- Render: deploy an Elasticsearch instance with [Render](https://docs.render.com/deploy-elasticsearch). - -If `NANGO_LOGS_ENABLED` is `false`, logs are sent to stdout and can be viewed in your host logs. - -### Run and update Nango - -To install Nango on a VM: - -```bash -mkdir nango && cd nango -wget https://raw.githubusercontent.com/NangoHQ/nango/master/docker-compose.yaml -docker-compose up -d -``` - -To update Nango: - -```bash -docker-compose stop -docker-compose rm -f -docker-compose pull -docker-compose up -d -``` - - -If you are interested in the Enterprise self-hosting version, please get in touch with us in the [community](https://nango.dev/slack) or [book a demo](https://nango.dev/demo). - - -## Related guides - -- [Security](/guides/platform/security) - review data, encryption, and access controls. -- [Environments](/guides/platform/environments) - organize dev, staging, and production setups. -- [Changelog](/updates/changelog) - track changes that affect self-hosted upgrades. - -## Proxy requests - -Source: https://nango.dev/docs/guides/platform/proxy-requests.md -Description: How to use the requests proxy from Nango - -Use the requests proxy to make authenticated API requests to the external API. - -## How to use the proxy - -Make sure you have an [integration configured](/guides/auth/auth-guide#guide) in your environment, and at least one [connection](/guides/auth/auth-guide#overview) available for it. - -You can use the proxy with the [Node SDK](/reference/backend/backend-sdk/node#proxy) or [REST API](/reference/backend/http-api/proxy/get): - - - - ```typescript - try { - const res = await nango.proxy({ - method: 'POST', - baseUrlOverride: 'https://api.example.com', - endpoint: '/external-endpoint', - providerConfigKey: '', - connectionId: '', - retries: 5, // Retries with exponential backoff (optional, default 0) - data: { - id: 1, - colorId: 'blue', - selected: true - } - }); - - // Response was 200! - // See https://axios-http.com/docs/res_schema - console.log(res.data); - } catch (error) { - // Status of response != 200 - // See https://axios-http.com/docs/handling_errors - console.log(error.response.data); - console.log(error.response.status); - console.log(error.response.headers); - } - ``` - - - - ```bash - curl -X POST -H 'Content-Type: application/json' \ - -H 'Authorization: Bearer ' \ - -H 'Provider-Config-Key: ' \ - -H 'Connection-Id: ' \ - -d '{"colorId: "blue"}' \ - 'https://api.nango.dev/proxy/' - ``` - - - -## Related guides - -- [Auth guide](/guides/auth/auth-guide) - create the connection used by proxy requests. -- [Node SDK reference](/reference/backend/backend-sdk/node#proxy) - proxy helper methods. -- [Proxy API reference](/reference/backend/http-api/proxy/get) - REST endpoints for proxied requests. -- [Rate limits](/guides/functions/rate-limits) - handle provider throttling. - -## Receive webhooks from Nango - -Source: https://nango.dev/docs/guides/platform/webhooks-from-nango.md -Description: Reference for the webhooks Nango sends to your app β€” setup, types, payloads, signature verification, and retries. - -Nango POSTs webhooks to your app to notify it of important events: a new connection was created, a sync run finished, an async action completed, or an external webhook was forwarded. This page covers how to receive and verify webhooks from Nango, plus the payloads for auth, sync, and async action webhooks. - - -To process webhooks coming **from external APIs** (not from Nango), see [Process external webhooks](/getting-started/use-cases/webhooks-from-external-apis). To forward external API webhooks through Nango to your app, see [Webhook forwarding](/guides/platform/webhook-forwarding). - - -## Set up webhooks from Nango - - - Webhook settings in Nango are specific to each [environment](/guides/platform/environments). - - -To subscribe to Nango webhooks: - -1. Set up a `POST` endpoint in your app to receive the Nango webhooks -2. Input the endpoint's URL in your _Environment Settings_, under _Webhook URLs_ ([direct link for your dev environment](https://app.nango.dev/dev/environment-settings#notification)) -3. Implement [verify incoming webhooks](#verifying-webhooks-from-nango) to ensure sure only authentic Nango webhooks are processed -4. Implement processing logic for each [webhook type](#types-of-nango-webhooks) from Nango you want to handle - - Make sure your processing logic handles the webhooks you have enabled in the environment settings - -You can configure up to two webhook URLs per environment. Nango webhooks will be sent to both. A single connection can [override these with its own URL](#override-webhook-urls-per-connection). - -To test webhooks locally, use a webhook forwarding service like [ngrok](https://dev.to/mmascioni/testing-and-debugging-webhooks-with-ngrok-4alp), or [webhook.site](https://webhook.site/). - -## Override webhook URLs per connection - -A single connection can override the environment's webhook URLs with its own `webhook_url`. The connection still receives all the same [webhook types](#types-of-nango-webhooks), with the same signing, retries, and logs. - -When a connection sets `webhook_url`, its webhooks are sent **only** to that URL β€” the environment's primary and secondary webhook URLs are both bypassed for that connection. It does not add a third destination. - -Set `webhook_url` when creating a [connect session](/reference/backend/http-api/connect/sessions/create), under `integrations_config_defaults..connection_config`: - - - - ```ts - const session = await nango.createConnectSession({ - allowed_integrations: [''], - integrations_config_defaults: { - '': { - connection_config: { - webhook_url: 'https://.ngrok.app/webhooks-from-nango' - } - } - } - }); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/connect/sessions \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "allowed_integrations": [""], - "integrations_config_defaults": { - "": { - "connection_config": { - "webhook_url": "https://.ngrok.app/webhooks-from-nango" - } - } - } - }' - ``` - - - -You can also set `webhook_url` from the **Create connection** flow in the Nango dashboard, under the connection's advanced configuration. - - - `webhook_url` can only be set at connect-session creation time β€” the trusted actor that creates the session. The same key passed to `nango.auth()` `params` from the client is ignored. - - - - **Local development:** create a connection with `webhook_url` pointing at your local webhook endpoint (for example via [ngrok](https://ngrok.com/) or [webhook.site](https://webhook.site/)) to receive that connection's webhooks on your machine β€” without changing the shared environment webhook URLs. See [Engineering collaboration](/guides/platform/environments#engineering-collaboration) for the shared-environment workflow. - - -## Verifying webhooks from Nango - -Validate webhooks from Nango by looking at the `X-Nango-Hmac-Sha256` header. - -It's an HMAC-SHA256 hash of the webhook payload, using the webhook signing key found in **Environment Settings > Webhooks > Signing key** in the Nango UI. - - -Nango webhook requests include an `X-Nango-Hmac-Sha256` header for secure verification. A legacy `X-Nango-Signature` header (using plain SHA-256) is also sent for backwards compatibility but should not be used. If you're currently using `X-Nango-Signature`, migrate to `X-Nango-Hmac-Sha256` for improved security. - - -The webhook signature can be verified with the following code: - - -Verify the signature with the **webhook signing key** from **Environment Settings > Webhooks > Signing key** β€” not your API secret key. These are two distinct keys. With the Node SDK, pass it as `webhookSigningKey`; for raw HMAC verification, use it as the HMAC secret. Using the API secret key will cause verification to fail on any environment where the keys differ. - - - - - Pass the webhook signing key as `webhookSigningKey` so a single client can make API calls with the API key and verify webhooks with the signing key. `webhookSigningKey` falls back to `secretKey` when omitted. - - ```typescript - const nango = new Nango({ - apiKey: process.env.NANGO_API_KEY, // used for API calls - webhookSigningKey: process.env.NANGO_WEBHOOK_SIGNING_KEY // used to verify webhooks - }); - - async (req, res) => { - const isValid = nango.verifyIncomingWebhookRequest(req.body, req.headers); - } - ``` - - - ```typescript - import crypto from 'crypto'; - - // From Environment Settings > Webhooks > Signing key - const webhookSigningKey = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'; - const body = // raw request body as string - const hash = crypto.createHmac('sha256', webhookSigningKey).update(body).digest('hex'); - ``` - - - ```python - import hmac - import hashlib - - # From Environment Settings > Webhooks > Signing key - webhook_signing_key = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' - body = # raw request body as bytes - hash = hmac.new(webhook_signing_key.encode('utf-8'), body, hashlib.sha256).hexdigest() - ``` - - - ```java - import javax.crypto.Mac; - import javax.crypto.spec.SecretKeySpec; - import java.nio.charset.StandardCharsets; - - public class Main { - public static void main(String[] args) throws Exception { - // From Environment Settings > Webhooks > Signing key - String webhookSigningKey = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; - String body = // raw request body as string - - Mac mac = Mac.getInstance("HmacSHA256"); - SecretKeySpec secretKey = new SecretKeySpec(webhookSigningKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); - mac.init(secretKey); - byte[] hashBytes = mac.doFinal(body.getBytes(StandardCharsets.UTF_8)); - - StringBuilder hexString = new StringBuilder(); - for (byte b : hashBytes) { - hexString.append(String.format("%02x", b)); - } - String hash = hexString.toString(); - } - } - ``` - - - ```ruby - require 'openssl' - - # From Environment Settings > Webhooks > Signing key - webhook_signing_key = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' - body = # raw request body - hash = OpenSSL::HMAC.hexdigest('SHA256', webhook_signing_key, body) - ``` - - - ```go - package main - - import ( - "crypto/hmac" - "crypto/sha256" - "encoding/hex" - "io" - "net/http" - ) - - func main() { - // From Environment Settings > Webhooks > Signing key - webhookSigningKey := "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" - var body []byte // raw request body - - h := hmac.New(sha256.New, []byte(webhookSigningKey)) - h.Write(body) - hash := hex.EncodeToString(h.Sum(nil)) - } - ``` - - - ```rust - use hmac::{Hmac, Mac}; - use sha2::Sha256; - - type HmacSha256 = Hmac; - - // From Environment Settings > Webhooks > Signing key - let webhook_signing_key = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; - let body = // raw request body as string or bytes - let mut mac = HmacSha256::new_from_slice(webhook_signing_key.as_bytes()).unwrap(); - mac.update(body.as_bytes()); - let hash = format!("{:x}", mac.finalize().into_bytes()); - ``` - - - ```php - Webhooks > Signing key - $webhookSigningKey = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'; - $body = // raw request body as string - $hash = hash_hmac('sha256', $body, $webhookSigningKey); - ?> - ``` - - - -Only accept a webhook if the `X-Nango-Hmac-Sha256` header value matches the webhook signature. - -## Types of Nango webhooks - - - New Nango webhook types are added regularly, without considering this a breaking change. Your webhook handling logic should gracefully support receiving new types of webhooks by simply ignoring them. - - -All webhooks from Nango are POST requests. - -The exact webhook type definitions can be found [here](https://github.com/NangoHQ/nango/blob/master/packages/types/lib/webhooks/api.ts). - -### Auth webhooks - -New connection webhooks have `"type": "auth"` and `"operation": "creation"`. They are sent after a connection has been successfully created. - -Payload received following a connection creation: - -```json -{ - "type": "auth", - "operation": "creation", - "connectionId": "", - "authMode": "OAUTH2 | BASIC | API_KEY | ...", - "providerConfigKey": "", - "provider": "", - "environment": "DEV | PROD | ...", - "success": true, - "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "" - } -} -``` - - - Processing webhooks with `"type": "auth"` and `"operation": "creation"` is **necessary**. After a connection is created, these webhooks give you the generated connection ID which lets you access the connection later on. - - Use `tags` to reconcile and save the connection ID with the user/org/workspace that initiated the connection. - - -All `authMode` values can be found [here](https://github.com/NangoHQ/nango/blob/master/packages/types/lib/auth/api.ts). The `authMode` value depends on the `provider` value. - -All `operation` values are: - -- `creation`: a new connection has been created -- `override`: a connection has been re-authorized -- `refresh`: an OAuth connection's access token has failed to refresh - -Payload received following a refresh token error: - -```json -{ - "type": "auth", - "operation": "refresh", - "connectionId": "", - "authMode": "OAUTH2 | BASIC | API_KEY | ...", - "providerConfigKey": "", - "provider": "", - "environment": "DEV | PROD | ...", - "success": false, - "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "" - }, - "error": { - "type": "", - "description": "" - } -} -``` - - - Webhooks are only sent for certain connection creation errors. For example, during the OAuth flow, some errors are reported locally in the OAuth modal by the external API. Since Nango does not receive these errors, it cannot trigger a webhook for them. - - -### Sync webhooks - -Sync webhooks are sent when a [sync function](/guides/functions/syncs/sync-functions) execution finishes, whether successful or not. - -Payload received following a successful sync execution: - -```json -{ - "type": "sync", - "connectionId": "", - "providerConfigKey": "", - "syncName": "", - "model": "", - "syncType": "INCREMENTAL | INITIAL | WEBHOOK", // DEPRECATED β€” use checkpoints instead - "success": true, - "modifiedAfter": "", - "responseResults": { - "added": number, - "updated": number, - "deleted": number - }, - // checkpoints itself may be missing or null if the sync doesn't use checkpoints β€” - // always guard against that before reading `from`/`to`. - "checkpoints": { - "from": { "": "" }, // or null if no prior checkpoint - "to": { "": "" } // or null if the sync didn't save one - } -} -``` - -`modifiedAfter` is an ISO-8601 timestamp marking the start of the last run. To read the changed records, use cursor-based fetching as described in [Records cache β†’ Cursors and sync progress](/guides/functions/syncs/records-cache#cursors-and-sync-progress). - -**Distinguishing full vs incremental syncs:** use `checkpoints` instead of the deprecated `syncType` field. `checkpoints.from`/`checkpoints.to` are checkpoint objects (`Record`) as saved by the sync function via `saveCheckpoint()` β€” not strings β€” and either can be `null`. The `checkpoints` field itself can also be missing or `null`, so guard against that before reading nested fields: - -```javascript -const { checkpoints } = payload; -const isFullSync = !checkpoints || checkpoints.from === null; -``` - -- `checkpoints` is missing/`null`, or `checkpoints.from === null` β€” the run started with no prior state. This happens on the first run, after a manual reset, or when the sync explicitly cleared its checkpoint. Treat this as a full sync and overwrite your data. -- `checkpoints.from` is a non-null checkpoint object β€” the run continued from a previously saved checkpoint. This is an incremental sync; merge the new records into your existing data. -- **Webhook-triggered runs** (deprecated `syncType: "WEBHOOK"`): always treat these as incremental merges, regardless of `checkpoints.from`. A webhook-triggered run processes a single incoming external event on top of already-synced data β€” it never represents a full resync. - - -**Fetch records promptly**: Due to Nango's [data retention policies](/guides/platform/security#synced-records-retention), you should fetch and store synced records in your own system promptly after receiving webhook notifications. Records not updated for 30 days will have their payload pruned, and sync functions not executed for 60 days will have all records deleted. - - -By default, Nango sends a webhook even if no modified data was detected in the last sync execution (referred as an "empty" sync), but this is configurable in your _Environment Settings_. In case of an empty sync, the `responseResults` would be: -```json -{ - "added": 0, - "updated": 0, - "deleted": 0 -} -``` - -Payload received following a failed sync execution: - -```json -{ - "type": "sync", - "connectionId": "", - "providerConfigKey": "", - "syncName": "", - "model": "", - "syncType": "INCREMENTAL | INITIAL | WEBHOOK", // DEPRECATED β€” use checkpoints instead - "success": false, - "error": { - "type": "", - "description": "" - }, - "startedAt": "", - "failedAt": "", - // checkpoints itself may be missing or null β€” see the note above. - "checkpoints": { - "from": { "": "" }, // or null - "to": { "": "" } // or null - } -} -``` - -### External webhook forwarding - -Forwarded external webhooks use the same webhook URLs, signing, retries, and logs as other Nango webhooks. See [Webhook forwarding](/guides/platform/webhook-forwarding) for setup, routing behavior, and payload shapes. - -## Webhook retries & debugging - -Nango retries each webhook with non-2xx responses 2 times with exponential backoff (starting delay: 100ms, time multiple: 2, view details in the [code](https://github.com/NangoHQ/nango/blob/master/packages/webhooks/lib/utils.ts)). - -Webhooks time out after 20 seconds. - -Each webhook attempt is logged in Nango's [logs](/guides/platform/observability). - -You can also use the [OpenTelemetry exporter](/guides/platform/observability#opentelemetry-export) to monitor Nango webhooks in your own observability stack. - - - **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - - -## Related guides - -- [Webhook forwarding](/guides/platform/webhook-forwarding) - forward external provider webhooks through Nango. -- [Webhook functions](/guides/functions/webhook-functions) - process provider webhooks inside Nango. -- [Event functions](/guides/functions/event-functions) - react to connection lifecycle events. -- [Observability](/guides/platform/observability) - monitor webhook operations and retries. - -## External webhook forwarding - -Source: https://nango.dev/docs/guides/platform/webhook-forwarding.md -Description: Forward external API webhooks through Nango to your app, with connection attribution. - -Webhook forwarding lets Nango receive webhooks from external APIs and forward them to your app's webhook URL. Use it when your app should own the webhook handling logic, but you still want Nango to provide the provider-specific webhook URL, routing, signing, retries, and logs. - -For processing the webhook inside Nango function code, use [webhook functions](/guides/functions/webhook-functions). - -## How forwarding works - -1. You configure your app's webhook URL in **Environment Settings > Webhook URLs**. -2. You register the integration's Nango webhook URL in the provider's developer portal. Find it in **Integrations > [Integration] > Webhooks**. -3. The provider sends a webhook to Nango. -4. Nango runs the provider-specific routing logic and tries to map the event to one or more Nango connections. -5. Nango forwards the payload to your app's webhook URL and signs the request like other Nango webhooks. - -Nango forwards webhooks asynchronously after accepting the provider webhook, so slow app endpoints do not block the provider response. - -## Forwarded payloads - -When Nango can attribute the webhook to a connection, your app receives a Nango wrapper: - -```json -{ - "from": "hubspot", - "providerConfigKey": "", - "type": "forward", - "connectionId": "", - "payload": { - "...": "raw provider payload" - } -} -``` - -If a provider webhook maps to multiple connections, Nango sends one forwarded webhook per connection. - -If Nango cannot map the webhook to a connection, Nango forwards the raw provider payload without the wrapper. Your consumer should handle both shapes when the provider can emit unattributed events. - -## Headers and signatures - -Nango forwards safe provider headers when possible, excluding headers that should not be replayed such as `authorization`, `cookie`, `host`, `content-length`, `content-type`, `user-agent`, and similar transport-sensitive headers. - -Every forwarded webhook is signed with the same headers used by other Nango webhooks: - -- `X-Nango-Hmac-Sha256` -- `X-Nango-Signature` for backwards compatibility - -Verify forwarded webhooks the same way you verify other webhooks from Nango. See [Verifying webhooks from Nango](/guides/platform/webhooks-from-nango#verifying-webhooks-from-nango). - -## When to use forwarding - -Use forwarding when: - -- Your app already has webhook handling logic. -- You want app code to decide what to do with the provider event. -- You need Nango to attribute the event to a connection when possible. -- You want webhook delivery logs and retries without running Nango function code. - -Use [webhook functions](/guides/functions/webhook-functions) when Nango should update records, normalize the payload, or run connection-scoped integration logic immediately. - -## Configure forwarding - - - - In Nango, open **Environment Settings > Webhook URLs** and add your app's endpoint. - - Nango sends forwarded webhooks to the same URLs used for auth, sync, and async action webhooks. - - - - In the integration page, copy the Nango webhook URL from **Integrations > [Integration] > Webhooks** and register it in the provider's developer portal. - - Some providers use one global webhook registration. Others require one webhook registration per connected account. Provider-specific docs explain the required setup. - - - - If the payload has `"type": "forward"`, read `connectionId`, `providerConfigKey`, and `payload`. - - If the payload does not have `"type": "forward"`, handle it as the raw provider payload. This can happen when the provider event cannot be attributed to a Nango connection. - - - - - When implementing webhook forwarding, first find the provider-specific Nango webhook guide. Confirm whether the provider routes automatically or requires embedding the Nango connection ID, tenant ID, team ID, installation ID, or another identifier in the provider webhook subscription. - - Implement signature verification with `X-Nango-Hmac-Sha256`, then branch on whether the incoming body has `type: "forward"`. Store and use `connectionId` only when it is present. - - -## Retries and debugging - -Nango retries forwarded webhooks when your app returns a non-2xx response or has a network failure. Forwarded attempts appear in Nango logs as webhook forwarding operations. - -For retry behavior, timeout limits, and local testing tips, see [Webhook retries & debugging](/guides/platform/webhooks-from-nango#webhook-retries-debugging) and [Webhook limits](/guides/platform/limits#webhook-limits). - -## Related guides - -- [Webhook functions](/guides/functions/webhook-functions) -- [Process external webhooks](/getting-started/use-cases/webhooks-from-external-apis) -- [Receive webhooks from Nango](/guides/platform/webhooks-from-nango) -- [Observability](/guides/platform/observability) - -## Common issues - -Source: https://nango.dev/docs/guides/platform/common-issues.md -Description: Troubleshooting guide for frequent errors and how to fix them. - -If you encounter an issue not documented here, reach out on the [Slack community](https://nango.dev/slack). - -## I just run `nango migrate-to-zero-yaml`, can I change the folder structure? - -Yes, you can change the folder structure. You can move files, zod definitions, types, rename files, folders, etc. -The results of the migration is just an example of how you can structure your project. - -## I'm getting `ZodXX is missing the following properties` errors - -If you are getting Zod errors, it's most likely because you are using a different version of Zod than the one we use in our CLI. We currently require zod `4.0.5`. - -If you have an overrides in your package.json or something that is changing the version of Zod, you will need to remove that. - -NB: `nango compile` will automatically update your dependencies to the version we use in our CLI. - -## Token refresh error from the external API - -Indications of the error: - -- Nango logs may show: - -```json -{ - "error": { - "message": "An error occurred during an HTTP call", - "payload": { - "error": { - "code": "invalid_credentials", - "payload": { [...] }, - "message": "The refresh limit has been reached for this connection." - } - } - } -} -``` - -- Or in `Token refresh` log operations: - -```json -{ - "payload": { - "dataMessage": { - "error_description": "Token has been expired or revoked.", - "error": "invalid_grant" - } - }, - "type": "refresh_token_external_error", - "status": 400 -} -``` - - -The `error` and `error_description` fields may differ by API, but typically include `invalid_grant` and mention the token being expired or revoked. - - -### How to debug - -- This error means the external API (e.g., Google, Salesforce) rejected the refresh token as expired or revoked. Nango retries several times, but if the error persists, the credentials are considered permanently broken. -- The only solution is to ask the user to re-authenticate. See: [How to trigger a re-authorization flow in Nango](/guides/auth/auth-guide#re-authorize-an-existing-connection) -- We recommend enabling [Nango's revoked token webhooks](/guides/platform/webhooks-from-nango#auth-webhooks) for real-time notifications. - -Revoked refresh tokens are a normal part of integrations. Ensure your app provides a good re-authorization experience for users. - -APIs may revoke tokens for unpredictable reasons. Only investigate if you observe an unusual increase of connection revocations for an API. Achieving a 0% revocation rate is not realistic. - -Known API-specific behaviors: -- Google: All tokens are revoked after 7 days if your OAuth app is in test mode ([detailed guide](https://www.nango.dev/blog/google-oauth-invalid-grant-token-has-been-expired-or-revoked)). To go to production, read our [guide for Google's OAuth app review](/api-integrations/google-shared/google-security-review). -- Salesforce: See [Salesforce refresh token issues](https://nango.dev/blog/salesforce-oauth-refresh-token-invalid-grant/). - -## Connection not found (unknown_connection / 404) - -Indications of the error: - -- Request failed with status code `404` -- code `unknown_connection` -- error message: "No connection matching the provided params of 'connection_id' and 'provider_config_key'" - -```json -{ - "error": { - "message": "Request failed with status code 404", - "data": { - "error": { - "message": "No connection matching the provided params of 'connection_id' and 'provider_config_key'.Please make sure these values exist in the Nango dashboard [...]", - "code": "unknown_connection" - } - } - } -} -``` - -### How to debug - -1. Confirm the environment and secret key - - The `secretKey` in the API or SDK is specific to the environment. Make sure you pass the key that corresponds to the environment you are using (e.g., dev vs prod). - - Open [Environment Settings > API Keys](https://app.nango.dev/dev/environment-settings#api-keys) and verify the key matches. - -2. Verify the Integration ID (aka `providerConfigKey`) - - Go to [Integrations](https://app.nango.dev/dev/integrations), open the integration, and copy the `Integration ID` exactly. - - Ensure the value you send as `providerConfigKey` matches this ID. - -3. Verify the Connection ID - - Go to [Connections](https://app.nango.dev/dev/connections), find the connection, and copy its `Connection ID`. - - Ensure the value you send as `connectionId` (header `Connection-Id` when using HTTP, or `connectionId` in the SDK) matches exactly. - -## Related guides - -- [Observability](/guides/platform/observability) - inspect logs and exported traces. -- [Auth guide](/guides/auth/auth-guide#re-authorize-an-existing-connection) - repair broken connections with re-authorization. -- [Token refreshing and validity](/guides/auth/token-refreshing) - understand refresh failures. -- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - receive failure notifications. - -## Migrate to checkpoints - -Source: https://nango.dev/docs/guides/platform/migrations/migrate-to-checkpoints.md -Description: Guide to migrate your sync functions from nango.lastSyncDate to the new checkpointing system. - -
- -
- -# Who is impacted - -If any of your sync functions read `nango.lastSyncDate` to determine where to resume syncing, you are impacted by this migration. - -To check, search your sync files for `lastSyncDate`. If you find references like `nango.lastSyncDate` or destructured equivalents, those syncs should be migrated to use checkpoints. - -If you want your syncs to be resilient to failures, ensuring that a failed run resumes from where it left off instead of starting over, you should also migrate any sync that paginates through large datasets, even if it doesn't currently use `lastSyncDate`. - -# What is changing - -`nango.lastSyncDate` is deprecated and replaced by checkpoints β€” a more flexible and resilient way to track sync progress. - -With `lastSyncDate`, Nango automatically tracked the timestamp of the last completed sync run. Your function could read it but not set it, and it was always a timestamp. With checkpoints, you define the schema, you control when it's saved, and you can store any type of progress marker β€” not just a date. - -| | `lastSyncDate` (deprecated) | Checkpoints | -| --- | --- | --- | -| **Type** | Always a `Date` | Any schema you define with Zod | -| **Control** | Managed by Nango, read-only | You set it explicitly with `saveCheckpoint()` | -| **Granularity** | Updated once per completed run | Updated mid-execution, after each batch | -| **Resilience** | If a run fails, no progress is saved | Progress is saved incrementally β€” the next run resumes from the last checkpoint | - - -Checkpoints also replace the `syncType: 'incremental'` field in your sync declaration. Whether the dataset is fetched from scratch or incrementally depends on how you use the checkpoint in your function code, not just whether you declared a checkpoint schema. - - -# Why this deprecation - -`lastSyncDate` had two significant limitations: - -1. **No mid-run resilience.** If a sync fetched 90% of its data and then failed, all progress was lost. The next run started over from the previous `lastSyncDate`, re-fetching everything. - -2. **Rigid type.** The value was always a timestamp managed by Nango. Some APIs use cursors, page tokens, or composite markers to track progress β€” `lastSyncDate` couldn't accommodate these. - -Checkpoints solve both problems. For a full overview, see the [checkpoints guide](/guides/functions/syncs/checkpoints). - -# Migration steps - - -## Migrate with the migrating-to-checkpoints skill - -You can migrate syncs to checkpoints with the **`migrating-to-checkpoints`** skill from [NangoHQ/skills](https://github.com/NangoHQ/skills). The skill guides a coding agent through converting `createSync()` implementations from `nango.lastSyncDate`, legacy `syncType: 'incremental'`, and non-resumable full refreshes to checkpoint-based syncs. - -Install it in your functions repo: - -```bash -npx skills add NangoHQ/skills -s migrating-to-checkpoints -``` - -Then ask your agent to migrate a specific sync using the `migrating-to-checkpoints` skill. The skill covers checkpoint schema selection, replacing `lastSyncDate` with `getCheckpoint()` and `saveCheckpoint()`, full-refresh recovery with `clearCheckpoint()`, and validating with `nango dryrun --checkpoint`. - -The manual steps below walk through the same migration if you prefer to do it by hand or want to review what the skill changes. - -## Step 1: Add a checkpoint schema to your sync declaration - -Add a `checkpoint` field to your `createSync()` call. In most cases, this is a single string field holding a timestamp: - -**Before:** -```typescript -export default createSync({ - description: 'Sync contacts from Salesforce', - frequency: 'every hour', - models: { Contact: ContactSchema }, - exec: async (nango) => { - // ... - }, -}); -``` - -**After:** -```typescript -export default createSync({ - description: 'Sync contacts from Salesforce', - frequency: 'every hour', - checkpoint: z.object({ - lastModifiedISO: z.string(), - }), - models: { Contact: ContactSchema }, - exec: async (nango) => { - // ... - }, -}); -``` - -If your sync previously declared `syncType: 'incremental'`, remove it β€” the presence of the `checkpoint` field replaces it. - -## Step 2: Replace `lastSyncDate` reads with `getCheckpoint()` - -Replace every reference to `nango.lastSyncDate` with a call to `nango.getCheckpoint()`. - -**Before:** -```typescript -exec: async (nango) => { - const lastSyncDate = nango.lastSyncDate; - - let query = 'SELECT Id, FirstName, LastName FROM Contact'; - if (lastSyncDate) { - query += ` WHERE LastModifiedDate > ${lastSyncDate.toISOString()}`; - } - query += ' ORDER BY LastModifiedDate ASC'; - - // ... fetch and save records -} -``` - -**After:** -```typescript -exec: async (nango) => { - const checkpoint = await nango.getCheckpoint(); - - let query = 'SELECT Id, FirstName, LastName FROM Contact'; - if (checkpoint) { - query += ` WHERE LastModifiedDate > ${checkpoint.lastModifiedISO}`; - } - query += ' ORDER BY LastModifiedDate ASC'; - - // ... fetch and save records -} -``` - -Note that `getCheckpoint()` is async and returns `null` on first run or after a reset, just like `lastSyncDate` was `null` on the first execution. - -## Step 3: Add `saveCheckpoint()` calls after each batch - -This is the most important change. With `lastSyncDate`, progress was saved automatically at the end of a run. With checkpoints, you save progress explicitly β€” and you should do it after every batch of records. - -**Before:** -```typescript -exec: async (nango) => { - const lastSyncDate = nango.lastSyncDate; - - while (nextPage) { - const res = await nango.get({ - endpoint: '/contacts', - params: { since: lastSyncDate?.toISOString(), cursor: nextPage }, - }); - - await nango.batchSave(mapContacts(res.data.records), 'Contact'); - nextPage = res.data.nextCursor; - } - // Progress saved automatically by Nango at run completion -} -``` - -**After:** -```typescript -exec: async (nango) => { - const checkpoint = await nango.getCheckpoint(); - - while (nextPage) { - const res = await nango.get({ - endpoint: '/contacts', - params: { since: checkpoint?.lastModifiedISO, cursor: nextPage }, - }); - - const contacts = mapContacts(res.data.records); - await nango.batchSave(contacts, 'Contact'); - - // Save progress after each page - const lastRecord = contacts[contacts.length - 1]; - await nango.saveCheckpoint({ lastModifiedISO: lastRecord.lastModified }); - - nextPage = res.data.nextCursor; - } -} -``` - -The pattern is: fetch a page, save records, save checkpoint. If the sync fails mid-way, the next run picks up from the last checkpoint instead of starting over. - -## Step 4: Test locally - -Use the CLI `dryrun` command with the `--checkpoint` flag to simulate resuming from a previous run: - -```bash -nango dryrun my-sync '' --checkpoint '{"lastModifiedISO": "2024-06-01T00:00:00Z"}' -``` - -Verify that your sync correctly filters data based on the checkpoint value. See the [testing guide](/guides/functions/testing) for how to write unit tests for checkpoint logic. - -## Step 5: Deploy - -Deploy as usual. On the first run after deployment, `getCheckpoint()` will return `null` (since no checkpoint has been saved yet), so the sync will perform a full initial fetch β€” just like it did on its first run with `lastSyncDate`. Subsequent runs will be incremental from the checkpoint. - -```bash -nango deploy -``` - - -Because the first post-migration run starts fresh, it may take longer than usual. This is expected and only happens once. - - - - **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - - -## Related guides - -- [Checkpoints](/guides/functions/syncs/checkpoints) - understand the new checkpoint model. -- [Sync functions](/guides/functions/syncs/sync-functions) - update sync implementations. -- [Testing](/guides/functions/testing) - test checkpoint filtering. - -## Migrate from end user - -Source: https://nango.dev/docs/guides/platform/migrations/migrate-from-end-user.md -Description: Guide to migrate away from using end users in connections and connect sessions - -# Who is impacted - -You are impacted if you use any of the following to identify who a connection belongs to: - -- `end_user` / `organization` in `POST /connect/sessions` -- `end_user` / `organization` in auth webhooks (`endUser` payload) -- `end_user` fields in the Connections list or connection details for reconciliation - -# What is changing - -Connections now have a first-class `tags` object. Connect sessions accept a top-level `tags` object as well. - -The legacy `end_user` and `organization` fields are deprecated. Tags exist because the end-user fields were not flexible enough for many real-world attribution and routing use cases. - -When a connection is created via a Connect session: - -- the Connect session `tags` are copied onto the newly created connection -- the auth webhook includes those tags as top-level `tags` - - - Use `tags` as your source of truth for identifying who a connection belongs to. - The legacy `end_user` and `organization` fields are deprecated and will be removed in a future version. - - -# Migration steps - -## Step 1: Start sending tags for new connect sessions - -Add a `tags` object when creating a Connect session token in your backend: - - - - ```ts - import { Nango } from '@nangohq/node'; - - const nango = new Nango({ secretKey: process.env[''] }); - - const { data } = await nango.createConnectSession({ - // Recommended - tags: { - end_user_id: '', - end_user_email: '', - organization_id: '' - }, - - allowed_integrations: [''] - }); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/connect/sessions \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "" - }, - "allowed_integrations": [""] - }' - ``` - - - -For more details (including limitations and filtering), see [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata). - -## Step 2: Update webhook reconciliation to use `tags` - -Auth webhooks include connection tags as top-level `tags`. - -If you previously used `endUser.endUserId`, switch to using `tags` as your primary source of truth. For compatibility during rollout, handle both: - -```ts -function resolveOwnerFromWebhook(payload: any) { - // Preferred - if (payload.tags?.end_user_id) { - return { endUserId: payload.tags.end_user_id, endUserEmail: payload.tags.end_user_email, organizationId: payload.tags.organization_id }; - } - - // Legacy fallback - if (payload.endUser?.endUserId) { - return { endUserId: payload.endUser.endUserId, endUserEmail: payload.endUser.endUserEmail, organizationId: payload.endUser.organizationId }; - } - - return null; -} -``` - -## Step 3: Existing connections are already backfilled - -You do not need to patch anything. - -Nango has already backfilled standard tags (like `end_user_id`, `end_user_email`, `organization_id`) onto existing connections based on your legacy end-user fields. - -During the deprecation period, if you still create new connections using the deprecated `end_user` / `organization` fields, Nango will also populate connection tags automatically using the same translation logic: - -- `end_user.id` -> `tags.end_user_id` -- `end_user.email` (if present) -> `tags.end_user_email` -- `end_user.display_name` (if present) -> `tags.end_user_display_name` -- `organization.id` -> `tags.organization_id` -- `organization.display_name` (if present) -> `tags.organization_display_name` -- `end_user.tags` (if present) -> merged into `tags` (subject to the same validation and normalization rules) - -If you provide both deprecated end-user fields and a top-level `tags` object, the top-level `tags` values win. - -## Step 4: Stop using `end_user` - -Once your code relies on `tags`, stop sending or reading the deprecated `end_user` and `organization` fields. - - - **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - - -## Related guides - -- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - use tags for connection attribution. -- [Auth guide](/guides/auth/auth-guide) - create connect sessions with tags. -- [Webhooks from Nango](/guides/platform/webhooks-from-nango#auth-webhooks) - reconcile auth webhooks with tags. - -## Migrate from public key - -Source: https://nango.dev/docs/guides/platform/migrations/migrate-from-public-key.md -Description: Guide to migrate from using the public key (and HMAC) to a Connect session. - -# Who is impacted - -If you use the Nango public key in your frontend, you are impacted by this migration. - -To check if you are using the public key, inspect your frontend code where the `Nango` object is instantiated. If the `config` parameter includes `publicKey`, you are affected. If it uses `connectSessionToken`, you are already up-to-date. - -# Changes summary - -1. The Nango public key is replaced with a short-lived Connect session token, fetched from your backend and passed to your frontend -2. The connection ID is now randomly generated by Nango instead of being specified manually -3. The connection ID is returned via backend webhooks instead of the frontend SDK - -# Migration timeline - -Public keys and HMAC signatures will be supported until **March 31, 2025** (announced on **January 31, 2025**). - -# Why this deprecation? - -For security reasons. - -If you were using the HMAC signature (strongly recommended in the docs), your authorization flow was already secure. However, not all users implemented HMAC, and we want to enforce best-in-class security practices by default. - -For those not using HMAC, the risk of attack was minimal but theoretically possible. We have no reports of such attacks, but feel free to reach out for more details. - -# Improvements with the Connect session - -1. The new Connect session flow is **secure by default** and replaces the HMAC signature. Randomly generated connection IDs further enhance security -2. Connection IDs are now **unique across integrations**, which will allow us to simplify API endpoints by transitioning from composite keys (`connection ID` + `integration ID`) to a single **unique connection ID** -3. The Connect session will let us provide additional API capabilities that can be called directly and securely from the frontend -4. The Connect session unlocks our [pre-built authorization UI](/guides/auth/auth-guide#guide), which simplifies collecting API keys, basic credentials, and OAuth flows with custom parameters. This UI also validates end-user inputs and provides guidance on required credentials - - -The Connect session works with both the pre-built authorization UI and custom authorization UIs. Custom authorization UIs are not being deprecated; they remain a critical feature and fully supported. - -The deprecated public key, however, was only compatible with custom authorization UIs and did not support the pre-built authorization UI. - - -# Migration steps - -This migration is split into 3 steps. You can migrate at your own pace, but we recommend doing it in this order. -During the migration, both connect session and public key authentication will work so you don't have to do all 3 steps at once. - - - Existing connections will keep the custom id you have used until now but new connections will have a random id. Your code will need to support both. - - -## Step 1: Attach tags to all existing connections - -Attach tags to all existing connections. -This step will allow you to use connect sessions with existing connections. -This will also be used to attribute webhooks to the correct end user. - - - - ```ts - import { Nango } from '@nangohq/node'; - -const nango = new Nango({ secretKey: process.env[''] }); - await nango.patchConnection({ - connectionId: '', - provider_config_key: '', - }, { - tags: { - end_user_id: '', - end_user_email: '', - organization_id: '' - } - }); -``` - - -```bash -curl -X PATCH https://api.nango.dev/v1/connections/ \ --H "Authorization: Bearer " \ --H "Content-Type: application/json" \ - -d '{ - "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "" - } - }' -``` - - - -Check endpoint documentation [here](/reference/backend/http-api/connections/patch). - -## Step 2: Implement the Connect and reconnect flows - -Follow the steps in this [guide](/guides/auth/auth-guide#guide), focusing on these key changes: - -Connect session token is now required to be passed to the frontend SDK. This improves security and allows you to pass additional information to the connection. - -### Step 3: Clean up - -Finally, remove all usage of the **public key and HMAC** from your frontend. - - - **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - - -## Related guides - -- [Auth guide](/guides/auth/auth-guide) - implement Connect sessions. -- [Customize Connect UI](/guides/auth/customize-connect-ui) - migrate custom authorization UIs or customize the pre-built UI. -- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - add ownership attribution during migration. - -## Migrating to Zero YAML - -Source: https://nango.dev/docs/guides/platform/migrations/migrate-to-zero-yaml.md -Description: Guide on how to migrate to Zero YAML in Nango. - -
- -
- -The `nango.yaml` configuration file is deprecated and should not be used for new integrations. If you are still using it, this guide will help you migrate your existing Nango integrations from the YAML-based approach to our new Zero YAML system, which uses pure TypeScript with modern tooling. - -## What is Zero YAML? - -Zero YAML is Nango's new approach to building integrations that eliminates the need for separate `nango.yaml` configuration files. Instead, everything is defined in TypeScript using a configuration-as-code approach with full type safety. - -Key benefits: -- **Type Safety**: Full TypeScript support with Zod schema validation -- **Better Developer Experience**: Modern tooling, enhanced CLI output, and better error messages -- **Portability**: Self-contained files that can be easily shared and version controlled -- **No Custom Syntax**: Pure TypeScriptβ€”no need to learn YAML-specific conventions and our previous custom model syntax - -Here's a quick example of the new syntax: - -```typescript -import { createSync } from 'nango'; -import * as z from 'zod'; - -const issueSchema = z.object({ - id: z.string(), - title: z.string(), - state: z.string() -}); - -const sync = createSync({ - description: 'Fetches GitHub issues', - frequency: 'every hour', - models: { GithubIssue: issueSchema }, - exec: async (nango) => { - await nango.batchSave([{ id: 'foobar' }], 'GithubIssue'); - } -}); -``` - -## How Zero YAML Works - -The new system is built around simplification - -### Simplified file Structure - -Like a regular TypeScript codebase - -```sh -β”œβ”€β”€ index.ts # Declare what's deployed -β”œβ”€β”€ package.json # Dependency management and types -β”œβ”€β”€ github/ # An integration - β”œβ”€β”€ syncs/ - β”‚ └── fetchIssues.ts # A sync - └── actions/ - └── createIssue.ts # An action -``` - -### Simplified configuration - -Three core functions that replace YAML configuration. You'll benefit from IntelliSense and type safety, directly in your IDE. No need to jump between files to find the right configuration. - -- **`createSync()`**: Defines data synchronization jobs -- **`createAction()`**: Defines one-off jobs -- **`createOnEvent()`**: Defines event-based jobs - ----- - -## Quick Migration Guide - -### Automatic Migration - -The easiest way to migrate is using our automated migration command: - -```bash -nango migrate-to-zero-yaml -``` - -This **operation is destructive** and will overwrite your existing files. Make sure to back up your existing files before running the command. - -This command will: -1. Analyze your existing `nango.yaml` and TypeScript files -2. Generate new self-contained TypeScript files -3. Create the required `package.json` if it doesn't exist -4. Set up the `index.ts` entry point -5. Preserve your existing logic and configuration - -### Post-Migration Steps - -The migration command should automatically transform all your files. However, you should review the changes and make sure everything is correct. - -Because the new format is stricter, some type issues can arise after the migration. - -### Migration Plan - -We recommend: -1. **Back up** your current nango integrations folder -2. Use your **dev env** to migrate to test the new format -3. Deploy to **prod env** after you have assessed that everything works properly - -## What Has Changed? - -### Configuration: YAML β†’ TypeScript Objects - -**Before** (nango.yaml + separate .ts file): -```yaml -# nango.yaml -integrations: - github: - issues: - runs: every 1h - sync_type: full - endpoint: GET /issues - description: Fetches GitHub issues -models: - GithubIssue: - id: string - title: string -``` - -**After** (single self-contained file): -```typescript -const sync = createSync({ - description: 'Fetches GitHub issues', - frequency: 'every hour', - models: { GithubIssue: issueSchema } -}); -``` - -### Models: YAML Definitions β†’ Zod Schemas - -**Before**: -```yaml -models: - GithubIssue: - id: string - title: string - state: string -``` - -**After**: -```typescript -const issueSchema = z.object({ - id: z.string(), - title: z.string(), - state: z.string() -}); -``` - -## Before and After Examples - -### Sync Example - -**Before** (issues.ts + nango.yaml excerpt): -```typescript -// issues.ts -import type { NangoSync, GithubIssue } from '../../models'; - -export default async function fetchData(nango: NangoSync) { - // Sync logic here -} -``` - -```yaml -# nango.yaml excerpt -integrations: - github: - issues: - runs: every 1h - sync_type: full - endpoint: GET /issues -``` - -**After** (self-contained fetchIssues.ts): -```typescript -import { createSync } from 'nango'; -import * as z from 'zod'; - -const issueSchema = z.object({ - id: z.string(), - title: z.string(), - state: z.string() -}); - -const sync = createSync({ - description: 'Fetches GitHub issues', - frequency: 'every hour', - models: { GithubIssue: issueSchema }, - exec: async (nango) => { - // Your existing sync logic here - } -}); - -export default sync; -``` - -### Action Example - -**Before** (separate files): -```typescript -// create-issue.ts -export default async function runAction(nango: NangoAction, input: CreateIssueInput) { - // Action logic -} -``` - -**After** (self-contained): -```typescript -import { createAction } from 'nango'; -import * as z from 'zod'; - -const inputSchema = z.object({ - title: z.string(), - body: z.string() -}); - -const action = createAction({ - description: 'Create a GitHub issue', - input: inputSchema, - output: z.void(), - exec: async (nango, input) => { - // Your action logic here - } -}); - -export default action; -``` - -### Index File Structure - -The new `index.ts` file imports all your integrations: - -```typescript -// index.ts -import './github/syncs/fetchIssues.js'; -import './github/actions/createIssue.js'; -// Add more imports as needed -``` - -## Migration Gotchas & FAQ - -### Gotchas -```typescript -err - github/syncs/issues.ts:57:43 - Argument of type '{ id: number; owner: string; repo: string; issue_number: number; title: string; author: string; author_id: string; state: string; date_created: Date; date_last_modified: Date; body: string; }[]' is not assignable to parameter of type 'RawModel[]'. - Type '{ id: number; owner: string; repo: string; issue_number: number; title: string; author: string; author_id: string; state: string; date_created: Date; date_last_modified: Date; body: string; }' is not assignable to type 'RawModel'. - Types of property 'id' are incompatible. - Type 'number' is not assignable to type 'string'. -``` -Previously you were setting the ID property of a sync to a number when it should always be a string. - ------- - -```typescript -err - 1password-scim/actions/create-user.ts:26:45 - Property 'errors' does not exist on type 'ZodError<{ firstName: string; lastName: string; email: string; active?: boolean | undefined; externalId?: string | undefined; phoneNumbers?: { type: "work" | "mobile" | "other"; value: string; }[] | undefined; photos?: { ...; }[] | undefined; addresses?: { ...; }[] | undefined; title?: string | undefined; }>'. -``` -Previously you were validating an input using Zod in this way -```typescript -const parsedInput = scimCreateUserSchema.safeParse(input); - -if (!parsedInput.success) { - for (const error of parsedInput.error.errors) { - await nango.log( - `Invalid input provided to create a user: ${error.message} at path ${error.path.join(".")}`, - { level: "error" }, - ); - } - - throw new nango.ActionError({ - message: "Invalid input provided to create a user", - }); -} -``` -Instead of this, you can use a Nango helper: -```typescript -const parsedInput = await nango.zodValidateInput({ zodSchema: scimCreateUserSchema, input }); -``` - -### Nango.yaml EOL - -**Q: When will nango.yaml stop being supported?** - -**A:** nango.yaml integrations will be supported until the end of 2025. Zero YAML will be the only supported way to build integrations after that. An official roadmap will be published soon. - -### Package.json Requirement - -**Q: Why is package.json now mandatory?** - -**A:** The new system uses modern JavaScript tooling that requires proper dependency management. The `package.json` ensures: -- Consistent dependency versions across environments -- Proper module resolution -- Better integration with modern development tools - -If you don't have one, the migration command will create it automatically. - -Note: Bundling custom dependencies is not yet possible but is now on our roadmap thanks to this update. - -### Backward Compatibility - -**Q: What still works the same?** - -**A:** Your core integration logic remains unchanged. No new features or breaking changes. All CLI commands are still available. - -### Testing Migrated Integrations - -**Q: How do I test after migration?** - -**A:** Use the same testing commands: - -```bash -# Test a specific sync -nango dryrun -``` - -### Rollback Process - -**Q: Can I rollback if something goes wrong?** - -**A:** Yes, Nango's platform remains compatible with nango.yaml at all times: -1. Go to your backup folder -2. `nango deploy dev` - -Keep your original files until you've fully validated the migration. - ---- - -The Zero YAML approach represents a significant step forward in Nango's developer experience. By eliminating custom syntax and embracing pure TypeScript, we've made integrations more maintainable, shareable, and enjoyable to work with. Many more features will be possible thanks to this new syntax. - -If you encounter any issues during migration, our support team is ready to help. Happy integrating! πŸš€ - - - **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - - -## Related guides - -- [Functions guide](/guides/functions/functions-guide) - understand the current TypeScript-first project layout. -- [Functions CLI](/reference/functions/functions-cli) - deploy and dry-run migrated functions. -- [Testing](/guides/functions/testing) - verify migrated integrations before rollout. - -## Frontend SDK - -Source: https://nango.dev/docs/reference/frontend/frontend-sdk.md - -Trigger authorization flows in your frontend with this SDK. It is available on [NPM](https://www.npmjs.com/package/@nangohq/frontend) as `@nangohq/frontend`. - -# Instantiate the frontend SDK - -```ts -import Nango from '@nangohq/frontend'; - -const nango = new Nango({ connectSessionToken: '' }); -``` - -**Parameters** - - - - - - Get your public key in the environment settings of the Nango UI. This is key is not sensitive. - - - - Omitting the host points to Nango Cloud. For local development, use `http://localhost:3003`. Use your instance URL if self-hosting. - - - - For self-hosted instances only to specify a customs path for the WebSocket connection. - - - - Specify a specific width for the OAuth authorization modal. - - - - Specify a specific height for the OAuth authorization modal. - - - - Print additional console logs to debug authorization issues. - - - - - -# Connect using Nango Connect UI - -Nango provides a UI component that guides your app's users through automatically and securely setting up an integration. This UI is hosted on Nango's servers and requires minimal setup on your end to get started quickly. -This is the recommended way to use Nango in your frontend. - -```js -const connectUI = nango.openConnectUI({ sessionToken: 'SESSION_TOKEN' }); -``` - -**Parameters** - - - The unique token to identify your user. It is required but can be set asynchronously. - - - - The base URL to load the UI - - - - The base URL to reach Nango API - - - - A callback to listen to events sent by Nango Connect - - - - Control OAuth popup close detection. If set to true, a closed popup will be detected as a failed authorization. - - - - The language to use for the UI. Defaults to browser language or english if not supported. - - - - The theme (light, dark, system) to use for the UI. Overrides your global setting in the dashboard. - - - -**Response** - - - - The class to manipulate Nango Connect - - - -# Connect using the headless client - -You store end-user credentials with the `nango.auth` method. It creates a connection in Nango. - - - - - -For OAuth, this will open a modal to let the user log in to their external account. - -```js -const result = await nango.auth('').catch((error) => { -... -}); -``` - - - - - -For API key authorization, pass the end-user's previously-collected API key directly in the parameters. - -```js -const result = await nango.auth('', { - credentials: { apiKey: '' } -}).catch((error) => { - ... -}); -``` - - - - - -For Basic Auth, pass the end-user's previously-collected username & password in the parameters. - -```js -const result = nango.auth('', { - credentials: { username: '', password: '' } -}).catch((error) => { - ... -}); -``` - - - - -**Parameters** - - - The integration ID that you can find in the integration settings on the Nango UI. - - - - The connection ID that you can find in the _Connections_ tab on the Nango UI. - - - - - - Specify additional connection configuration necessary to perform the authorization request. - - - - HMAC key to secure the authorization flow - - - - If `true`, `nango.auth()` would fail if the login window is closed before the authorization flow is completed. - - - - For OAuth, specify the query parameters of the authorization URL. - - - - For Slack OAuth, specify user-specific scopes. - - - - - - For API key authorization, pass in the user's API key. - - - - For Basic authorization, pass in the user's username. - - - - For Basic authorization, pass in the user's password. - - - - For OAuth 2, override the integration's client ID with a connection-level client ID. This is useful when your users bring their own OAuth 2 app (e.g. Netsuite). - - - - For OAuth 2, override the integration's client secret with a connection-level client secret. This is useful when your users bring their own OAuth 2 app (e.g. Netsuite). - - - - - - - -**Success response** - - - - The integration ID that you can find in the integration settings on the Nango UI. - - - - The connection ID that you can find in the _Connections_ tab on the Nango UI. - - - -**Error response** - - - - - The type of error (e.g. 'authorization_cancelled'). - - - - The detailed error message (e.g. 'Authorization fail: The user has closed the authorization modal before the process was complete.'). - - - - - -# Error Handling - -The Nango Frontend SDK may throw different types of errors during authentication and connection setup. Below is a list of all possible error types along with their meanings: - -1. `missing_auth_token` - - Occurs when neither a public key nor a connect session token is provided. - - Message: "You must specify a public key OR a connect session token (cf. documentation)." - -2. `blocked_by_browser` - - Occurs when the browser blocks the popup window for authentication. - - Message: "Modal blocked by browser" - -3. `invalid_host_url` - - Occurs when the provided host URL is invalid. - - Message: "Invalid URL provided for the Nango host." - -4. `missing_credentials` - - Occurs when required credentials are not provided. - - Message: "You must specify credentials." - -5. `window_closed` - - Occurs when the authentication window is closed before completing the flow. - - Message: "The authorization window was closed before the authorization flow was completed" - -6. `connection_test_failed` - - Occurs when credential verification fails for certain integrations before the connection is established. - - Message: "The given credentials were found to be invalid. Please check the credentials and try again." - -7. `missing_connect_session_token` - - Occurs when attempting to reconnect without a session token. - - Message: "Reconnect requires a session token" - -8. `resource_capped` - - Occurs when the resource usage limit has been reached. - - Message: "Reached maximum number of allowed connections for your plan" or "Reached maximum number of connections with functions enabled" - -9. `unknown_error` - - Occurs when an unexpected error happens that doesn't fall into other error categories. - - Message: Varies depending on the underlying error (e.g., network failures, unexpected exceptions) - -## Error Response Structure - -All errors from the Nango Frontend SDK follow this structure: - -```json -{ - "error": { - "code": "", - "message": "" - } -} -``` - -## Handling Errors - -You can handle these errors in your code using the `AuthError` class. - -```ts -import { AuthError } from '@nangohq/frontend'; - -try { - const result = await nango.auth('', { - credentials: { apiKey: '' } - }); -} catch (error) { - if (error instanceof AuthError && error.type === '') { - // Handle specific error - console.error('Your error message'); - } -} -``` - -**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - - -## API keys - -Source: https://nango.dev/docs/reference/backend/http-api/api-keys.md -Description: Manage API keys with scoped permissions for your Nango environments. - -# API keys - -API keys allow programmatic access to your Nango environment. Each environment can have multiple API keys with different permissions, enabling you to follow the principle of least privilege. - -## Managing API Keys - -API keys are managed in the Nango UI under **Environment Settings > API Keys**. - -Each environment comes with a **Default - Full access** key that grants access to all API endpoints. You can create additional keys with restricted scopes for specific use cases. - -### Creating a Key - -1. Go to **Environment Settings > API Keys** -2. Click **Create API Key** -3. Enter a display name (e.g., "CI Deploy Key", "Backend service") -4. Choose **Full access** or **Custom** permissions β€” custom lets you pick individual scopes -5. The key is created immediately and can be revealed and copied from the key list - -### Rotating a Key - -To rotate a key: -1. Create a new key with the same scopes -2. Update your application to use the new key -3. Monitor the **Last used** column on the old key to confirm it's no longer in use -4. Delete the old key - -### Using a Key - -Pass the API key as a Bearer token in the `Authorization` header: - - - - ```ts - import { Nango } from '@nangohq/node'; - - const nango = new Nango({ secretKey: '' }); - ``` - - - ```bash - curl --request GET \ - --url https://api.nango.dev/connections \ - --header 'Authorization: Bearer ' - ``` - - - -## Scopes - -Scopes control what an API key can access. When creating a key with **Custom** permissions, you select which scopes to grant. A key without a specific scope will receive a `403 Forbidden` response when trying to access a protected endpoint. - -### Credential Scopes - -Some resources (Integrations and Connections) have sensitive credential data. Access to this data is controlled by dedicated `_credentials` scopes: - -- `list` / `read` β€” returns the resource **without** sensitive credentials -- `list_credentials` / `read_credentials` β€” returns the resource **with** credentials (access tokens, client secrets, etc.) - -The `_credentials` scopes are supersets β€” selecting `read_credentials` automatically includes `read` access. You don't need to select both. - -| Resource | Without credentials | With credentials | -|----------|-------------------|-----------------| -| **Connections** | Connection metadata, tags, status | + access/refresh tokens | -| **Integrations** | Provider, display name, config | + client ID and client secret | - -## Advised Profiles - -Common scope combinations for typical use cases: - -### Auth (Connect UI) - -For backends that create connect sessions for the auth flow: - -| Scope | -|-------| -| `environment:connect_sessions:write` | - -### CI/CD Deploy - -For CI/CD pipelines deploying syncs and actions to production: - -| Scope | -|-------| -| `environment:deploy` | - -### Backend Service - -For backend services that consume data, trigger actions, and proxy requests: - -| Scope | -|-------| -| `environment:connections:read` | -| `environment:records:read` | -| `environment:actions:execute` | -| `environment:syncs:execute` | -| `environment:proxy` | - -Add `environment:connections:read_credentials` if the service needs access to connection tokens. - - -For extra security, avoid when possible granting `environment:connections:list` to backend services. Without it, connection IDs act as connection-specific secrets β€” a leaked API key alone won't let an attacker enumerate and access customer data. - - -### Local Development - -For local development, use a **Full access** key. This is the default key created for each environment. - -## CLI - -The Nango CLI uses the `NANGO_SECRET_KEY_` environment variable for authentication. Set it to an API key with the required scopes: - -| CLI Command | Required Scope | -|-------------|---------------| -| `nango deploy` | `environment:deploy` | -| `nango dryrun` | `environment:connections:read` + `environment:integrations:read` + `environment:proxy` | - -For most functions, `environment:connections:read` is sufficient for `nango dryrun` β€” Nango injects credentials into the proxy automatically, so the function does not need them in its response. Upgrade to `environment:connections:read_credentials` when the function reads credential data from the connection, including: - -- accessing `connection.credentials` directly (e.g. `nango.getConnection().credentials`) -- calling `nango.getToken()` β€” returns the access token from `connection.credentials` -- calling `nango.getRawTokenResponse()` β€” returns `connection.credentials.raw` - -Without `read_credentials`, these helpers return empty values because the API strips the `credentials` field from the response. - -The **Default - Full access** key that comes with each environment already has all required scopes for deploying and dry-running. For production CI/CD pipelines, consider creating a dedicated key with only the `environment:deploy` scope to follow the principle of least privilege. - -## All Available Scopes - -### Integrations - -| Scope | Description | -|-------|-------------| -| `environment:integrations:list` | List integrations (no credentials) | -| `environment:integrations:list_credentials` | List integrations with client credentials | -| `environment:integrations:list_functions` | List deployed functions (syncs and actions) | -| `environment:integrations:read` | Read a single integration (no credentials) | -| `environment:integrations:read_credentials` | Read a single integration with client credentials | -| `environment:integrations:create` | Create integrations | -| `environment:integrations:update` | Update integrations | -| `environment:integrations:delete` | Delete integrations | - -### Connections - -| Scope | Description | -|-------|-------------| -| `environment:connections:list` | List connections (no credentials) | -| `environment:connections:list_credentials` | List connections with access/refresh tokens | -| `environment:connections:read` | Read a single connection (no credentials) | -| `environment:connections:read_credentials` | Read a single connection with access/refresh tokens | -| `environment:connections:create` | Create connections | -| `environment:connections:update` | Update connections and metadata | -| `environment:connections:delete` | Delete connections | - -### Connect Sessions - -| Scope | Description | -|-------|-------------| -| `environment:connect_sessions:write` | Create and reconnect sessions for the Connect UI auth flow | - -### Syncs - -| Scope | Description | -|-------|-------------| -| `environment:syncs:read` | Read sync status | -| `environment:syncs:execute` | Trigger, pause, start syncs | -| `environment:syncs:update` | Update sync connection frequency | -| `environment:syncs:variant:create` | Create sync variants | -| `environment:syncs:variant:delete` | Delete sync variants | - -### Deploy - -| Scope | Description | -|-------|-------------| -| `environment:deploy` | Deploy syncs and actions via CLI or API | - -### Functions - -| Scope | Description | -|-------|-------------| -| `environment:functions:list` | List deployed functions | -| `environment:functions:read` | Read a single deployed function | -| `environment:functions:delete` | Delete a deployed function | -| `environment:functions:compile` | Compile function source code | -| `environment:functions:dryrun` | Dry run function source code | - -### Records - -| Scope | Description | -|-------|-------------| -| `environment:records:read` | Read synced records | -| `environment:records:write` | Prune records | - -### Actions - -| Scope | Description | -|-------|-------------| -| `environment:actions:execute` | Trigger actions and read action results | - -### Proxy - -| Scope | Description | -|-------|-------------| -| `environment:proxy` | Send proxy requests to external APIs through Nango | - -### Variables - -| Scope | Description | -|-------|-------------| -| `environment:variables:read` | Read environment variables | - -### MCP - -| Scope | Description | -|-------|-------------| -| `environment:mcp` | Access the MCP endpoint | - -## Authentication - -Source: https://nango.dev/docs/reference/backend/http-api/authentication.md - -Use an [API key](/reference/backend/http-api/api-keys) as a Bearer token in the `Authorization` header. API keys are managed in **Environment Settings > API Keys** in the Nango UI. - -``` -Authorization: Bearer -``` - -Each API key has [scopes](/reference/backend/http-api/api-keys#scopes) that control which endpoints it can access. A key without the required scope will receive a `403 Forbidden` response. - -## Rate limits - -Source: https://nango.dev/docs/reference/backend/http-api/rate-limits.md - -The Nango API is rate-limited to prevent abuse and ensure fair usage across all clients. The rate limit is enforced on a per-account basis, with a fixed window of time and a maximum number of requests allowed within that window. - -Those headers are sent back with every API response: -- `X-RateLimit-Limit` indicates the maximum number of requests a client can make within the rate limit window. -- `X-RateLimit-Remaining` shows how many requests are remaining before the limit is reached. -- `X-RateLimit-Reset` provides a Unix timestamp representing the time at which the current rate limit window resets, and the remaining request count is replenished. - -If a client exceeds the rate limit, the API will respond with a 429 `Too Many Requests` status code. In this case, the `Retry-After` header is included, indicating the number of seconds the client should wait before making another request to avoid being rate-limited. - -## List all integrations - -Source: https://nango.dev/docs/reference/backend/http-api/integration/list.md - - - Requires an API key with one of: `environment:integrations:list` or `environment:integrations:list_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - - - -```ts Node Client -const nango = new Nango({ secretKey }); - -const response = await nango.listIntegrations(); -``` - - - - -```json Example Response -{ - "data": [ - { - "unique_key": "slack-nango-community", - "display_name": "Slack", - "provider": "slack", - "logo": "http://localhost:3003/images/template-logos/slack.svg", - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z", - }, - { - "unique_key": "github-prod", - "display_name": "GitHub", - "provider": "github", - "logo": "http://localhost:3003/images/template-logos/github.svg", - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z", - }, - ] -} -``` - - -## Get an integration - -Source: https://nango.dev/docs/reference/backend/http-api/integration/get.md - - - Requires an API key with one of: `environment:integrations:read` or `environment:integrations:read_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - - -```json Basic response -{ - "data": { - "unique_key": "slack-nango-community", - "display_name": "Slack", - "provider": "slack", - "logo": "http://localhost:3003/images/template-logos/github.svg", - "forward_webhooks": true, - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z" - } -} -``` - -```json With credentials (OAuth2/OAuth1/TBA) -{ - "data": { - "unique_key": "github-nango", - "display_name": "GitHub", - "provider": "github", - "logo": "http://localhost:3003/images/template-logos/github.svg", - "forward_webhooks": false, - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z", - "credentials": { - "type": "OAUTH2", - "client_id": "abc123", - "client_secret": "secret456", - "scopes": "repo,user", - "webhook_secret": null - } - } -} -``` - -```json With credentials (GitHub App / CUSTOM) -{ - "data": { - "unique_key": "github-app-nango", - "display_name": "GitHub App", - "provider": "github-app", - "logo": "http://localhost:3003/images/template-logos/github.svg", - "forward_webhooks": false, - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z", - "credentials": { - "type": "CUSTOM", - "client_id": "abc123", - "client_secret": "secret456", - "app_id": "123456", - "app_link": "https://github.com/apps/my-app", - "private_key": "-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----" - } - } -} -``` - - -## Create an integration - -Source: https://nango.dev/docs/reference/backend/http-api/integration/create.md - - - Requires an API key with the `environment:integrations:create` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - - -```json Example Response -{ - "data": { - "unique_key": "slack-nango-community", - "display_name": "Slack", - "provider": "slack", - "logo": "http://localhost:3003/images/template-logos/github.svg", - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z", - } -} -``` - - -## Update an integration - -Source: https://nango.dev/docs/reference/backend/http-api/integration/update.md - - - Requires an API key with the `environment:integrations:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Delete an integration - -Source: https://nango.dev/docs/reference/backend/http-api/integration/delete.md - - - Requires an API key with the `environment:integrations:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Create a connect session - -Source: https://nango.dev/docs/reference/backend/http-api/connect/sessions/create.md - - - Requires an API key with the `environment:connect_sessions:write` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -Creates a short-lived connect session (30m). -The returned token can be used for instance to create connections through Connect UI. - -You can attach connection-level tags to the session via the `tags` field. These tags are copied onto the created connection and included in auth webhooks. - -Most apps start with these tags: `end_user_id`, `end_user_email`, `organization_id`. - -## Create a reconnect session - -Source: https://nango.dev/docs/reference/backend/http-api/connect/sessions/reconnect.md - - - Requires an API key with the `environment:connect_sessions:write` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Get a connect session - -Source: https://nango.dev/docs/reference/backend/http-api/connect/session/get.md - -Retrieves a connect session information (allowed integrations, default connection configurations). - -## Delete a connect session - -Source: https://nango.dev/docs/reference/backend/http-api/connect/session/delete.md - -Deletes a connect session - -## Import a connection - -Source: https://nango.dev/docs/reference/backend/http-api/connections/post.md - - - Requires an API key with the `environment:connections:create` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## When to use - -Use this API endpoint to import existing access tokens into Nango. It is mostly meant for one-off bulk imports when onboarding Nango, or for migrating existing connections when a provider introduced changes to its auth flow. - -If a connection with the same `connection_id` and `provider_config_key` already exists, the endpoint updates it with the provided credentials instead of creating a new one. - -To trigger OAuth flows with Nango, use the [Nango frontend SDK](/reference/frontend/frontend-sdk). - -## Request body - -You can use this endpoint to import OAuth 2, OAuth 1, API Keys, and Basic auth credentials. - -The required fields depend on the type of authentication of the _connections_ you are trying to import. - -## List connections - -Source: https://nango.dev/docs/reference/backend/http-api/connections/list.md - - - Requires an API key with one of: `environment:connections:list` or `environment:connections:list_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - - - ```json Example Response -{ - "connections": [ - { - "id": 1, - "connection_id": "test-1", - "provider": "slack", - "provider_config_key": "slack-nango-community", - "created": "2023-06-03T14:53:22.051Z", - "metadata": null, - "tags": { - "end_user_id": "your-internal-id", - "end_user_email": "user@example.com", - "organization_id": "user-organization-id" - }, - "errors": [{ "type": "auth", "log_id": "VrnbtykXJFckCm3HP93t"}] - }, - { - "id": 2, - "connection_id": "test-2", - "provider": "slack", - "provider_config_key": "slack-nango-community", - "created": "2023-06-03T15:00:14.945Z", - "metadata": { - "bot_id": "some-uuid" - }, - "tags": { - "end_user_id": "your-internal-id", - "end_user_email": "user@example.com", - "organization_id": "user-organization-id" - }, - "errors": [] - } - ] -} - ``` - - -## Get connection & credentials - -Source: https://nango.dev/docs/reference/backend/http-api/connections/get.md - - - Requires an API key with one of: `environment:connections:read` or `environment:connections:read_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - - - -The response content depends on the API authentication type (e.g: OAuth 2, OAuth 1, API key, etc.). - -If you do not want to deal with collecting & injecting credentials in requests for multiple authentication types, use the [Proxy](/guides/platform/proxy-requests). - - - - -Every time you fetch the connection with this API endpoint, Nango will check if the access token has expired. If it has, it will refresh it. - -**We recommend you always fetch the token just before you use it to make sure it is fresh!** - - - -## Patch a connection - -Source: https://nango.dev/docs/reference/backend/http-api/connections/patch.md - - - Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Set connection metadata - -Source: https://nango.dev/docs/reference/backend/http-api/connections/set-metadata.md - - - Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Set _connection metadata_ - -Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides any existing metadata. The connection_id must be passed in the body as well. Note that the connection_id can be a single string or an array of strings. - -## Fetching _connection metadata_ - -To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. - -## Edit connection metadata - -Source: https://nango.dev/docs/reference/backend/http-api/connections/update-metadata.md - - - Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Update _connection metadata_ - -Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides specified properties, not the entire metadata. The connection_id must be passed in the body as well. Note that the connection_id can be a single string or an array of strings. - -## Fetching _connection metadata_ - -To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. - -## Delete a connection - -Source: https://nango.dev/docs/reference/backend/http-api/connections/delete.md - - - Requires an API key with the `environment:connections:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## List functions - -Source: https://nango.dev/docs/reference/backend/http-api/functions/list.md - - - Requires an API key with the `environment:functions:list` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -Returns the functions deployed to an integration. - -## Get a function - -Source: https://nango.dev/docs/reference/backend/http-api/functions/get.md - - - Requires an API key with the `environment:functions:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -Returns a single deployed function. - -## Get a function's source code - -Source: https://nango.dev/docs/reference/backend/http-api/functions/code.md - - - Requires an API key with the `environment:functions:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -Returns the TypeScript source code of a function for a given integration. - -## Delete a function - -Source: https://nango.dev/docs/reference/backend/http-api/functions/delete.md - - - Requires an API key with the `environment:functions:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -Deletes a deployed function and enqueues its async teardown. Functions managed by `nango deploy` (repo source) cannot be deleted through this endpoint. - -## Compile a function - -Source: https://nango.dev/docs/reference/backend/http-api/functions/compile.md - - - Requires an API key with the `environment:functions:compile` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -Compiles TypeScript function source code and returns the bundled JavaScript. - -## Dry run a function - -Source: https://nango.dev/docs/reference/backend/http-api/functions/dryruns-create.md - - - Requires an API key with the `environment:functions:dryrun` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -Starts an asynchronous dry run for TypeScript function source code against a connection without deploying it. - -## Get dry run results - -Source: https://nango.dev/docs/reference/backend/http-api/functions/dryruns-get.md - - - Requires an API key with the `environment:functions:dryrun` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -Returns the status and result of an asynchronous function dry run. - -## Create a function deployment - -Source: https://nango.dev/docs/reference/backend/http-api/functions/deployments.md - - - Requires an API key with the `environment:deploy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -Deploys a function to an existing integration: either submitted TypeScript source code (`type: function`) or a template from the provider catalog (`type: template`). - -## Get integration functions config - -Source: https://nango.dev/docs/reference/backend/http-api/scripts/config.md - - - Requires an API key with the `environment:integrations:list_functions` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -The `/scripts/config` endpoint returns the configuration for all integration functions. There are two variants of this endpoint: - -1. `/scripts/config?format=nango` - Returns the standard configuration format -2. `/scripts/config?format=openai` - Returns the configuration in OpenAI's function calling format - -## OpenAI Function Format - -The `/scripts/config?format=openai` endpoint transforms the script configurations into OpenAI's function calling format. This format is particularly useful when working with OpenAI's API to enable function calling capabilities. - -### Parameter Descriptions - -The endpoint automatically parses parameter descriptions from the script's description field. If a script's description contains a markdown list of parameters, these descriptions will be used for the corresponding parameters in the OpenAI function format. - -For example, in your script file, you can define a script like this: - -```typescript google-calendar/actions/move-event.ts -export default createAction({ - description: `Move an event to a different time or calendar with the following parameters: - - eventId: The ID of the event to move - - start: New start time in ISO format (e.g., "2024-03-28T14:00:00") - - end: New end time in ISO format (e.g., "2024-03-28T15:00:00") - - calendar: Optional new calendar ID to move the event to`, - version: '1.0.0', - endpoints: [{ method: 'GET', path: '/example/github/issues', group: 'Issues' }], - frequency: 'every hour', - autoStart: false, - scopes: ['https://www.googleapis.com/auth/calendar'], - input: z.object({ - eventId: z.string(), - start: z.string(), - end: z.string(), - calendar: z.string().optional() - }) -}); -``` - -The endpoint will generate a function definition like this: - -```json -{ - "data": [ - { - "name": "move-event", - "description": "Move an event to a different time or calendar with the following parameters:\n- eventId: The ID of the event to move\n- start: New start time in ISO format (e.g., \"2024-03-28T14:00:00\")\n- end: New end time in ISO format (e.g., \"2024-03-28T15:00:00\")\n- calendar: Optional new calendar ID to move the event to", - "parameters": { - "type": "object", - "properties": { - "eventId": { - "type": "string", - "description": "The ID of the event to move" - }, - "start": { - "type": "string", - "description": "New start time in ISO format (e.g., \"2024-03-28T14:00:00\")" - }, - "end": { - "type": "string", - "description": "New end time in ISO format (e.g., \"2024-03-28T15:00:00\")" - }, - "calendar": { - "type": "string", - "description": "Optional new calendar ID to move the event to" - } - }, - "required": ["eventId", "start", "end"] - } - } - ] -} -``` - -### Array Fields - -The endpoint properly handles array fields in the configuration. For example, if a field is defined as: - -```typescript google-calendar/actions/create-event.ts -export default createAction({ - description: `Create a new calendar event with the following parameters: - - summary: The title of the event - - attendees: List of email addresses of event attendees`, - version: '1.0.0', - endpoints: [{ method: 'POST', path: '/example/google-calendar/events', group: 'Events' }], - input: z.object({ - summary: z.string(), - attendees: z.array(z.string()).optional() - }) -}); -``` - -It will be transformed into: - -```json -{ - "data": [ - { - "name": "create-event", - "description": "Create a new calendar event with the following parameters:\n- summary: The title of the event\n- attendees: List of email addresses of event attendees", - "parameters": { - "type": "object", - "properties": { - "summary": { - "type": "string", - "description": "The title of the event" - }, - "attendees": { - "type": "array", - "description": "List of email addresses of event attendees", - "items": { - "type": "string" - } - } - }, - "required": ["summary"] - } - } - ] -} -``` - -## Get records - -Source: https://nango.dev/docs/reference/backend/http-api/sync/records-list.md - - - Requires an API key with the `environment:records:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Receive webhooks on data updates - -Receive webhooks from Nango when new records are available. Follow the [sync functions section](/guides/functions/syncs/sync-functions). - - -**Data availability**: Records are subject to Nango's [data retention policies](/guides/platform/security#synced-records-retention). Records not updated for 30 days will have their payload pruned (only metadata remains). Records from syncs not executed for 60 days are permanently deleted. Fetch and store records promptly in your own system. - - -## Response - - -This endpoint returns a list of records, ordered by modification date ascending. If some records are updated while you paginate through this endpoint, you might see these records multiple times. - - - -A response may contain fewer records than `limit` when records have a large size. Always check `next_cursor` and continue paginating until it is `null`. - - -### Default behavior -By default this returns an array of objects in the data model that you queried with some metadata about each record. - -```json -{ - records: - [ - { - id: 123, - ..., // Fields as specified in the model you queried - _nango_metadata: { - deleted_at: null, - last_action: 'ADDED', - first_seen_at: '2023-09-18T15:20:35.941305+00:00', - last_modified_at: '2023-09-18T15:20:35.941305+00:00', - cursor: 'MjAyNC0wMy0wNFQwNjo1OTo1MS40NzE0NDEtMDU6MDB8fDE1Y2NjODA1LTY0ZDUtNDk0MC1hN2UwLTQ1ZmM3MDQ5OTdhMQ==' - } - }, - ... - ], - next_cursor: "MjAyMy0xMS0xN1QxMTo0NzoxNC40NDcrMDI6MDB8fDAzZTA1NzIxLWNiZmQtNGYxNS1iYTNhLWFlNjM2Y2MwNmEw==" -} -``` - -## Prune records - -Source: https://nango.dev/docs/reference/backend/http-api/sync/prune-records.md - - - Requires an API key with the `environment:records:write` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -Prunes synced records for a given connection and model using cursor-based pagination. - -## What is pruning? - -Pruning empties the record payload while preserving the record metadata. -This is useful for compliance requirements, ensuring Nango doesn't hold onto your records data while maintaining the ability to track record state. The payload can be restored by re-syncing the data. - - -Pruning is not the same as marking a record as deleted from the external API. -This endpoint prunes data from Nango’s cache only. It does not delete anything on the external API, and it is not the same as [detecting a deletion from the source](/guides/functions/syncs/deletion-detection). - -If you need to tell your customers that a record was deleted on the external API while keeping its last-known payload in cache, use `batchDelete` or `trackDeletesStart`/`trackDeletesEnd` in your sync functions instead. - - -## Cursor behavior - -Records are pruned up to and including the specified `until_cursor` value. Use the `_nango_metadata.cursor` value from the record you want to prune up to. - -## Response - - -The `has_more` field indicates whether there are potentially more records to prune. When `true`, make another request with the same `until_cursor` to continue pruning. When `false`, all records up to the cursor have been pruned. - - -```json -{ - "count": 150, - "has_more": true -} -``` - -## Trigger sync(s) - -Source: https://nango.dev/docs/reference/backend/http-api/sync/trigger.md - - - Requires an API key with the `environment:syncs:execute` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Triggering one-off syncs - -This is especially useful if you e.g. changed the metadata for the connection and now want to re-import data. - -Use `reset` to clear the checkpoint and re-fetch all data, or `reset` with `emptyCache` to start completely fresh. See the [checkpoints guide](/guides/functions/syncs/checkpoints#re-syncing-resetting-checkpoints-and-the-cache) for details. - -## Start sync(s) - -Source: https://nango.dev/docs/reference/backend/http-api/sync/start.md - - - Requires an API key with the `environment:syncs:execute` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Pause sync(s) - -Source: https://nango.dev/docs/reference/backend/http-api/sync/pause.md - - - Requires an API key with the `environment:syncs:execute` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Sync status - -Source: https://nango.dev/docs/reference/backend/http-api/sync/status.md - - - Requires an API key with the `environment:syncs:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -The response includes the current `checkpoint` for each sync, which tracks how far the sync has progressed. Learn more about [checkpoints](/guides/functions/syncs/checkpoints). - -## Override sync connection frequency - -Source: https://nango.dev/docs/reference/backend/http-api/sync/update-connection-frequency.md - - - Requires an API key with the `environment:syncs:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Get environment variables - -Source: https://nango.dev/docs/reference/backend/http-api/sync/environment-variables.md - - - Requires an API key with the `environment:variables:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Create sync variant - -Source: https://nango.dev/docs/reference/backend/http-api/sync/create-variant.md - - - Requires an API key with the `environment:syncs:variant:create` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Creating a sync variant - -Sync variants allow you to create different configurations of the same sync for a specific connection. This is useful when you need to sync the same data with different settings or filters. - -### Key features -- Each variant operates independently with its own sync schedule -- Variants can be queried separately through the records endpoint using the `variant` query parameter -- Cannot use "base" as a variant name (protected) - -After creating a variant, you can use the `/records` endpoint to access its data by specifying the variant query parameter: - -``` -GET /records?model=MyModel&variant=MyVariant -``` - -## Delete sync variant - -Source: https://nango.dev/docs/reference/backend/http-api/sync/delete-variant.md - - - Requires an API key with the `environment:syncs:variant:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Trigger an action - -Source: https://nango.dev/docs/reference/backend/http-api/action/trigger.md - - - Requires an API key with the `environment:actions:execute` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Proxy - GET requests - -Source: https://nango.dev/docs/reference/backend/http-api/proxy/get.md - - - Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -### API request - -The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: -* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. -* Provider-Config-Key -* Connection-Id -* Retries -* Base-Url-Override: provide an API base URL when the base API is not listed in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) or it needs to be overridden - -### API response - -The response from the external API is passed back to you exactly as Nango gets it: -* Response code -* Response headers -* Response body - -## Proxy - POST requests - -Source: https://nango.dev/docs/reference/backend/http-api/proxy/post.md - - - Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -### API request - -The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: -* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. -* Provider-Config-Key -* Connection-Id -* Retries - -### API response - -The response from the external API is passed back to you exactly as Nango gets it: -* Response code -* Response headers -* Response body - -## Proxy - PUT requests - -Source: https://nango.dev/docs/reference/backend/http-api/proxy/put.md - - - Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -### API request - -The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: -* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. -* Provider-Config-Key -* Connection-Id -* Retries -* Base-Url-Override: provide an API base URL when the base API is not listed in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) or it needs to be overridden - -### API response - -The response from the external API is passed back to you exactly as Nango gets it: -* Response code -* Response headers -* Response body - -## Proxy - PATCH requests - -Source: https://nango.dev/docs/reference/backend/http-api/proxy/patch.md - - - Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -### API request - -The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: -* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. -* Provider-Config-Key -* Connection-Id -* Retries - -### API response - -The response from the external API is passed back to you exactly as Nango gets it: -* Response code -* Response headers -* Response body - -## Proxy - DELETE requests - -Source: https://nango.dev/docs/reference/backend/http-api/proxy/delete.md - - - Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -### API request - -The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: -* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. -* Provider-Config-Key -* Connection-Id -* Retries -* Base-Url-Override: provide an API base URL when the base API is not listed in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) or it needs to be overridden - -### API response - -The response from the external API is passed back to you exactly as Nango gets it: -* Response code -* Response headers -* Response body - -## List all providers - -Source: https://nango.dev/docs/reference/backend/http-api/providers/list.md - - -```json Example Response -{ - "data": [ - { - "name": "hubspot", - "logo_url": "https://app.nango.dev/images/template-logos/hubspot.svg", - "display_name": "HubSpot", - "categories": ["marketing","support","crm"], - "auth_mode": "OAUTH2", - "authorization_url": "https://app.hubspot.com/oauth/authorize", - "token_url": "https://api.hubapi.com/oauth/v1/token", - "connection_configuration": ["portalId"], - "post_connection_script": "hubspotPostConnection", - "webhook_routing_script": "hubspotWebhookRouting", - "proxy": { - "base_url": "https://api.hubapi.com", - "decompress": true, - "paginate": { - "type": "cursor", - "cursor_path_in_response": "paging.next.after", - "limit_name_in_request": "limit", - "cursor_name_in_request": "after", - "response_path": "results" - } - }, - "docs": "https://nango.dev/docs/api-integrations/hubspot" - }, - { - "name": "posthog", - "logo_url": "https://app.nango.dev/images/template-logos/posthog.svg", - "display_name": "PostHog", - "categories": ["dev-tools"], - "auth_mode": "API_KEY", - "proxy": { - "base_url": "https://api.posthog.com", - }, - "docs": "https://nango.dev/docs/api-integrations/posthog" - } - ] -} -``` - - -## Get a provider - -Source: https://nango.dev/docs/reference/backend/http-api/providers/get.md - - -```json Example Response -{ - "data": { - "name": "hubspot", - "logo_url": "https://app.nango.dev/images/template-logos/hubspot.svg", - "display_name": "HubSpot", - "categories": ["marketing","support","crm"], - "auth_mode": "OAUTH2", - "authorization_url": "https://app.hubspot.com/oauth/authorize", - "token_url": "https://api.hubapi.com/oauth/v1/token", - "connection_configuration": ["portalId"], - "post_connection_script": "hubspotPostConnection", - "webhook_routing_script": "hubspotWebhookRouting", - "proxy": { - "base_url": "https://api.hubapi.com", - "decompress": true, - "paginate": { - "type": "cursor", - "cursor_path_in_response": "paging.next.after", - "limit_name_in_request": "limit", - "cursor_name_in_request": "after", - "response_path": "results" - } - }, - "docs": "https://nango.dev/docs/api-integrations/hubspot" - } -} -``` - - -## List provider templates - -Source: https://nango.dev/docs/reference/backend/http-api/providers/templates.md - -Returns the template functions available in the catalog for a provider. - -## List connections (deprecated) - -Source: https://nango.dev/docs/reference/backend/http-api/connection/list.md - - - Requires an API key with one of: `environment:connections:list` or `environment:connections:list_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - - - ```json Example Response -{ - "connections": [ - { - "id": 1, - "connection_id": "test-1", - "provider": "slack", - "provider_config_key": "slack-nango-community", - "created": "2023-06-03T14:53:22.051Z", - "metadata": null, - "tags": { - "end_user_id": "your-internal-id", - "end_user_email": "user@example.com", - "organization_id": "user-organization-id" - }, - "errors": [{ "type": "auth", "log_id": "VrnbtykXJFckCm3HP93t"}] - }, - { - "id": 2, - "connection_id": "test-2", - "provider": "slack", - "provider_config_key": "slack-nango-community", - "created": "2023-06-03T15:00:14.945Z", - "metadata": { - "bot_id": "some-uuid" - }, - "tags": { - "end_user_id": "your-internal-id", - "end_user_email": "user@example.com", - "organization_id": "user-organization-id" - }, - "errors": [] - } - ] -} - ``` - - -## Get connection & credentials (deprecated) - -Source: https://nango.dev/docs/reference/backend/http-api/connection/get.md - - - Requires an API key with one of: `environment:connections:read` or `environment:connections:read_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - - - -The response content depends on the API authentication type (e.g: OAuth 2, OAuth 1, API key, etc.). - -If you do not want to deal with collecting & injecting credentials in requests for multiple authentication types, use the [Proxy](/guides/platform/proxy-requests). - - - - -Every time you fetch the connection with this API endpoint, Nango will check if the access token has expired. If it has, it will refresh it. - -**We recommend you always fetch the token just before you use it to make sure it is fresh!** - - - -## Import a connection (deprecated) - -Source: https://nango.dev/docs/reference/backend/http-api/connection/post.md - - - Requires an API key with the `environment:connections:create` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## When to use - -Use this API endpoint to import existing access tokens into Nango. It is mostly meant for one-off bulk imports when onboarding Nango, or for migrating existing connections when a provider introduced changes to its auth flow. - -If a connection with the same `connection_id` and `provider_config_key` already exists, the endpoint updates it with the provided credentials instead of creating a new one. - -To trigger OAuth flows with Nango, use the [Nango frontend SDK](/reference/frontend/frontend-sdk). - -## Request body - -You can use this endpoint to import OAuth 2, OAuth 1, API Keys, and Basic auth credentials. - -The required fields depend on the type of authentication of the _connections_ you are trying to import. - -## Set connection metadata (deprecated) - -Source: https://nango.dev/docs/reference/backend/http-api/connection/set-metadata.md - - - Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Set _connection metadata_ - -Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides any existing metadata. The connection_id must be passed in the body as well. Note that the connection_id can be a single string or an array of strings. - -## Fetching _connection metadata_ - -To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. - -## Set connection metadata (deprecated) - -Source: https://nango.dev/docs/reference/backend/http-api/connection/set-metadata-legacy.md - - - Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Set _connection metadata_ - -Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides any existing metadata. - -## Fetching _connection metadata_ - -To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. - -## Edit connection metadata (deprecated) - -Source: https://nango.dev/docs/reference/backend/http-api/connection/update-metadata.md - - - Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Update _connection metadata_ - -Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides specified properties, not the entire metadata. The connection_id must be passed in the body as well. Note that the connection_id can be a single string or an array of strings. - -## Fetching _connection metadata_ - -To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. - -## Edit connection metadata (deprecated) - -Source: https://nango.dev/docs/reference/backend/http-api/connection/update-metadata-legacy.md - - - Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Update _connection metadata_ - -Nango uses the request body as the new metadata (it must be a JSON object). - -## Fetching _connection metadata_ - -To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. - -## Delete a connection (deprecated) - -Source: https://nango.dev/docs/reference/backend/http-api/connection/delete.md - - - Requires an API key with the `environment:connections:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Node - -Source: https://nango.dev/docs/reference/backend/backend-sdk/node.md - -The backend SDK lets you interact with the Nango API. It is available on [NPM](https://www.npmjs.com/package/@nangohq/node) as `@nangohq/node`. - -## Instantiate the backend SDK - -Install it with your favorite package manager, e.g.: - -```bash -npm i -S @nangohq/node -``` - -Instantiate the `Nango` class: - -```js -import { Nango } from '@nangohq/node'; - -const nango = new Nango({ apiKey: '' }); -``` - -**Parameters** - - - - - - Your environment API key, found in **Environment Settings > API Keys** in the Nango UI. Sent as the bearer token for API calls. This key should never be shared. - - - - Deprecated alias for `apiKey`, kept for backward compatibility. Provide either `apiKey` or `secretKey`. - - - - The environment's webhook signing key, found in **Environment Settings > Webhooks > Signing key**. Used by `verifyIncomingWebhookRequest` to validate incoming webhook signatures. Falls back to `secretKey` when omitted. On environments created after 2026-04-20 (or any environment that later rotated its API key), the signing key differs from the API key, so set this explicitly to verify webhooks. - - - - Omitting the host points to Nango Cloud. For local development, use `http://localhost:3003`. Use your instance URL if self-hosting. - - - - - -## Rate limits - -The Nango SDK is rate-limited to prevent abuse and ensure fair usage across all clients. The rate limit is enforced on a per-account basis, with a fixed window of time and a maximum number of requests allowed within that window. - -If a client exceeds the rate limit, the API will respond with a 429 `Too Many Requests` status code. In this case, the `Retry-After` header is included, indicating the number of seconds the client should wait before making another request to avoid being rate-limited. - -To handle rate limiting gracefully, clients should monitor for the 429 status code and honor the `Retry-After` header value provided in the response. - -```js -// Example: -try { - const res = await nango.listIntegrations(); - ... -} catch(err) { - if (err.response.status === 429) { - const retryAfter = err.response.headers['retry-after']; - // wait and retry - ... - } - ... -} -``` - -## Integrations - -### List all integrations - -Returns a list of integrations. - -```js -await nango.listIntegrations() -``` - -**Example Response** - - -```json -{ - "configs": [ - { - "unique_key": "slack-nango-community", - "provider": "slack", - "logo": "http://localhost:3003/images/template-logos/slack.svg", - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z", - }, - { - "unique_key": "github-prod", - "provider": "github", - "logo": "http://localhost:3003/images/template-logos/github.svg", - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z", - }, - ] -} -``` - - -### Get an integration - -Returns a specific integration. - -```js -await nango.getIntegration({ uniqueKey: }); - -// Deprecated -await nango.getIntegration(); -``` - -**Parameters** - - - - The integration ID - - - Include sensitive data. Allowed values: `webhook`, `credentials` - - - -**Example Response** - - -```json -{ - "data": { - "unique_key": "slack-nango-community", - "display_name": "Slack", - "provider": "slack", - "logo": "http://localhost:3003/images/template-logos/slack.svg", - "forward_webhooks": true, - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z" - } -} -``` - - -### Create an integration - -Create a new integration. - -```js -await nango.createIntegration({ provider: '', unique_key: '' }); -``` - -**Parameters** - - - - The ID of the API provider in Nango (cf. [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) for a list of API provider IDs.) - - - - The integration ID. - - - - The display name of this integration - - - - The credentials to include depend on the specific integration that you want to create. - - - - Provider-specific configuration for providers with an `integration_config` schema (e.g. `private-api-generic`, `aws-sigv4`). See the provider's integration page for fields. - - - - Whether to forward webhooks received for this integration. Defaults to `true`. - - - -**Example Response** - - -```json -{ - "data": { - "unique_key": "slack-nango-community", - "provider": "slack", - "logo": "http://localhost:3003/images/template-logos/slack.svg", - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z", - } -} -``` - - -### Update an integration - -Patch an integration. The first argument identifies the integration; all body fields are optional and only the fields you pass are updated. - -```js -await nango.updateIntegration({ uniqueKey: '' }, { display_name: 'New name' }); -``` - -**Parameters** - - - - The integration ID to update. Passed in the first argument. - - - - A new integration ID, to rename the integration. Not allowed when the integration has active connections. - - - - The display name of this integration - - - - Whether to forward webhooks received for this integration. - - - - The credentials to include depend on the specific integration that you want to update. - - - - Provider-specific configuration for providers with an `integration_config` schema. Only the fields you pass are updated. - - - - Free-form custom values for providers without an `integration_config` schema. - - - -**Example Response** - - -```json -{ - "data": { - "unique_key": "slack-nango-community", - "provider": "slack", - "logo": "http://localhost:3003/images/template-logos/slack.svg", - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z", - } -} -``` - - -### Delete an integration - -Deletes a specific integration. - -```js -await nango.deleteIntegration(); -``` - -**Parameters** - - - - The integration ID. - - - -**Example Response** - - -```json -{ - "success": true -} -``` - - -## Connect - -### Create a connect session - -Create a connect session. The token is short-lived and lasts for 30 minutes. - -```js -const { data } = await nango.createConnectSession({ - // Recommended: copied onto the connection and included in auth webhooks. - tags: { - end_user_id: '', - end_user_email: '', - organization_id: '' - }, - - allowed_integrations: ['', ''], - integrations_config_defaults: { - : { - connection_config: { - : '' - } - } - } -}); -``` - -**Parameters** - - - - - Deprecated. Use `tags` instead. - - - - Deprecated. Use `tags` instead. - - - The unique identifier for the organization. - - - The display name of the organization. - - - - - - An array of integration IDs that are allowed for this session. - - - - Optional. Tags that will be copied onto the created connection and included in auth webhooks. - - - - Default configuration for specific integrations. For OAuth2 integrations, you can allow end-users to provide their own OAuth client credentials by setting empty `oauth_client_id_override` and `oauth_client_secret_override` values: - ```js - integrations_config_defaults: { - google: { - connection_config: { - oauth_client_id_override: '', - oauth_client_secret_override: '' - } - } - } - ``` - When set to empty strings, Connect UI will display optional input fields for users to enter their own OAuth app credentials. - - `connection_config` also accepts `webhook_url` to override the environment's webhook URLs for the connection created with this session. When set, that connection's webhooks are sent only to this URL. See [Override webhook URLs per connection](/guides/platform/webhooks-from-nango#override-webhook-urls-per-connection). - ```js - integrations_config_defaults: { - '': { - connection_config: { - webhook_url: 'https://.ngrok.app/webhooks-from-nango' - } - } - } - ``` - - - - Override Connect UI settings per integration. The key is your integration's unique ID (e.g. `jira`, `slack`, `github`) and the value is an object with the settings to override. Currently supports overriding the documentation URL shown in info icons during the connect flow: - ```js - overrides: { - '': { - docs_connect: 'https://your-docs.com/how-to-connect' - } - } - ``` - Available on the [Growth plan](https://www.nango.dev/pricing). - - - -**Returns** - - -```json -{ - "data": { - "token": "nango_connect_session_4603dbca8a588315ba69b5bfddde52e72d312dc2d2870bd5e45da6357333601c", - "connect_link": "https://connect.nango.dev/?session_token=nango_connect_session_4603dbca8a588315ba69b5bfddde52e72d312dc2d2870bd5e45da6357333601c", - "expires_at": "2024-09-27T19:49:51.449Z" - } -} -``` - - -### Create a reconnect session - -Create a reconnect session for a given `connection_id`. -You can pass `tags` to update connection attribution during reconnection. -Use this method when a user needs to input new credentials or to manually refresh token. - -This method is only compatible with `connection_id` created with a session token. - -```js -const { data } = await nango.createReconnectSession({ - // Required - connection_id: '', - integration_id: '', - - // Optional - tags: { - end_user_id: '', - end_user_email: '', - organization_id: '' - }, - integrations_config_defaults: { - : { - connection_config: { - : '' - } - } - } -}); -``` - -**Parameters** - - - - The unique identifier for the connection. - - - - The unique identifier for the integration. - - - - Optional. Tags to apply to the connection during reconnection. - - - - Deprecated. Use `tags` instead. - - - - Deprecated. Use `tags` instead. - - - The unique identifier for the organization. - - - The display name of the organization. - - - - - - Default configuration for specific integrations. - - - -**Returns** - - -```json -{ - "data": { - "token": "nango_connect_session_4603dbca8a588315ba69b5bfddde52e72d312dc2d2870bd5e45da6357333601c", - "connect_link": "https://connect.nango.dev/?session_token=nango_connect_session_4603dbca8a588315ba69b5bfddde52e72d312dc2d2870bd5e45da6357333601c", - "expires_at": "2024-09-27T19:49:51.449Z" - } -} -``` - - -## Connections - -### List connections - -Returns a list of connections without credentials. - -```js -await nango.listConnections({ - connectionId: 'connection-id', - integrationId: 'integration-456', - limit: 100, - tags: { "end_user_id": 'user-123' } -}); -``` - -**Parameters** - - - - - - Optional. Will exactly match a given connectionId. Can return multiple connections with the same ID across integrations. - - - Deprecated. Prefer filtering connections using `tags` instead (e.g. `end_user_id`). - - - Optional. Filter by integration ID. - - - Optional. Filter by tags associated with connections. - - - - - -**Example Response** - - -```json -{ - "connections": [ - { - "id": 1, - "connection_id": "test-1", - "provider": "slack", - "provider_config_key": "slack-nango-community", - "created": "2023-06-03T14:53:22.051Z", - "metadata": null, - "tags": { - "end_user_id": "your-internal-id", - "end_user_email": "user@example.com", - "organization_id": "user-organization-id" - }, - "errors": [] - }, - { - "id": 2, - "connection_id": "test-2", - "provider": "slack", - "provider_config_key": "slack-nango-community", - "created": "2023-06-03T15:00:14.945Z", - "metadata": { - "bot_id": "some-uuid" - }, - "tags": { - "end_user_id": "your-internal-id", - "end_user_email": "user@example.com", - "organization_id": "user-organization-id" - }, - "errors": [{ "type": "auth", "log_id": "VrnbtykXJFckCm3HP93t"}] - } - ] -} -``` - - -### Get a connection (with credentials) - -Returns a specific connection with credentials. - -```js -await nango.getConnection(, ); -``` - - -The response content depends on the API authentication type (OAuth 2, OAuth 1, API key, Basic auth, etc.). - -If you do not want to deal with collecting & injecting credentials in requests for multiple authentication types, use the Proxy ([step-by-step guide](/guides/platform/proxy-requests)). - - - -When you fetch the connection with this API endpoint, Nango will check if the access token has expired. If it has, it will refresh it. - -We recommend not caching tokens for longer than 5 minutes to ensure they are fresh. - - -**Parameters** - - - - The integration ID. - - - The connection ID. - - - Defaults to `false`. If `false`, the token will only be refreshed if it expires within 15 minutes. If `true`, a token refresh attempt will happen on each request. This is only useful for testing and should not be done at high traffic. - - - Defaults to `false`. If `false`, the refresh token is not included in the response, otherwise it is. In production, it is not advised to return the refresh token, for security reasons, since only the access token is needed to sign requests. - - - Defaults to `false`. If true, this will refresh the JWT token for GitHub App / Github App OAuth connections - - - -**Example Response** - - -```json -{ - "id": 18393, - "created_at": "2023-03-08T09:43:03.725Z", - "updated_at": "2023-03-08T09:43:03.725Z", - "provider_config_key": "github", - "connection_id": "1", - "credentials": { - "type": "OAUTH2", - "access_token": "gho_tsXLG73f....", - "refresh_token": "gho_fjofu84u9....", - "expires_at": "2024-03-08T09:43:03.725Z", - "raw": { // Raw token response from the OAuth provider: Contents vary! - "access_token": "gho_tsXLG73f....", - "refresh_token": "gho_fjofu84u9....", - "token_type": "bearer", - "scope": "public_repo,user" - } - }, - "connection_config": { - "subdomain": "myshop", - "realmId": "XXXXX", - "instance_id": "YYYYYYY" - }, - "metadata": { - "myProperty": "yes", - "filter": "closed=true" - } -} -``` - - -### Patch a connection - -Patch a connection. - -```js -await nango.patchConnection({ - connectionId: '', - provider_config_key: '' - }, - { ...body }); -``` - -**Parameters** - - - - The body of the connection (see [API Reference](/reference/backend/http-api/connections/patch)). - - - Connection tags (key/value strings). Keys are normalized to lowercase. - - - Maximum string length: 255 - - - - - Deprecated. Use tags instead - - - Deprecated. Uniquely identifies the end user. - - - Deprecated. The email address of the end user. - - - Deprecated. The display name of the end user. - - - Deprecated. Tags associated with the end user. Only accepts string values, up to 64 keys. - - - - - - - -**Example Response** - - -```json -{ - "success": true -} -``` - - -### Get connection metadata - -Returns a connection's metadata. - -```js -await nango.getMetadata('', 'CONNECTION-ID'); -``` - -If you know the structure of the metadata, you can specify a type; - -```ts -interface CustomMetadata { - anyKey: Record; -} -const myTypedMetadata = await nango.getMetadata('', ''); -``` - -**Parameters** - - - - The integration ID of the connection. - - - - The connection ID. - - - -**Example Response** - - -```json -{ - "custom_key1": "custom_value1" -} -``` - - -### Set connection metadata - -Set custom metadata for the connection or connections (overrides existing metadata). - -```js -await nango.setMetadata('', 'CONNECTION-ID', { 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); - -# set an array of connection ids -await nango.setMetadata('', ['CONNECTION-ID', 'CONNECTION-ID-TWO'], { 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); -``` - -**Parameters** - - - - The integration ID of the connection. - - - - The connection ID or connection IDs. - - - - The custom metadata to store in the connection. - - - -**Response** - - -```json -{ - "connection_id": "", - "provider_config_key": "", - "metadata": { - "CUSTOM_KEY1": "CUSTOM_VALUE1" - } -} -``` - - -### Edit connection metadata - -Edit custom metadata for the connection or connections. Only overrides specified properties, not the entire metadata. - -```js -await nango.updateMetadata('', 'CONNECTION-ID', { 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); - -# update an array of connection ids -await nango.updateMetadata('', ['CONNECTION-ID', 'CONNECTION-ID-TWO'], { 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); -``` - -**Parameters** - - - - The integration ID of the connection. - - - - The connection ID or connection IDs. - - - - The custom metadata to store in the connection. - - - -**Response** - - -```json -{ - "connection_id": "", - "provider_config_key": "", - "metadata": { - "CUSTOM_KEY1": "CUSTOM_VALUE1" - } -} -``` - - -### Delete a connection - -Deletes a specific connection. - -```js -await nango.deleteConnection('', 'CONNECTION-ID'); -``` - -**Parameters** - - - - The integration ID of the connection. - - - - The connection ID. - - - -**Response** - -Empty response. - -### Wait for connection - -Waits for a connection to be created for a given end user and integration. This is useful in agentic flows where you need to wait for a user to complete the OAuth flow before proceeding. - -```js -const connection = await nango.waitForConnection('', ''); -``` - - -This method polls for a connection every 2 seconds for up to 60 seconds (30 attempts). If no connection is found within this time, it will throw a timeout error. - - -**Parameters** - - - - The integration ID (provider config key). - - - - The end user ID to wait for a connection for. - - - -**Example Response** - - -```json -{ - "id": 1, - "connection_id": "", - "provider": "slack", - "provider_config_key": "slack-integration", - "created": "2023-06-03T14:53:22.051Z", - "metadata": null, - "errors": [], - "tags": { - "end_user_id": "user-123", - "end_user_email": "user@example.com", - "organization_id": "org-456" - } -} -``` - - -## Integration functions - -### List functions - -Returns the functions deployed to an integration, with pagination. - -```ts -await nango.listFunctions({ uniqueKey: 'github' }); -``` - -Filter by function type, name, or page: - -```ts -await nango.listFunctions({ uniqueKey: 'github' }, { type: 'action', search: 'issue', page: 0, limit: 20 }); -``` - -**Parameters** - - - - The integration ID. - - - Filter by function type: `sync`, `action`, or `on-event`. - - - Case-insensitive filter on the function name. - - - Page to return (starts at `0`, default `0`). - - - Results per page (1-100, default `20`). - - - -**Example Response** - - -```json -{ - "data": [ - { - "type": "action", - "name": "create-issue", - "description": "Create a GitHub issue", - "returns": ["GithubIssue"], - "json_schema": null, - "id": 42, - "enabled": true, - "last_deployed": "2024-03-28T14:00:00.000Z", - "source": "repo" - }, - { - "type": "sync", - "name": "issues", - "returns": ["GithubIssue"], - "json_schema": null, - "runs": "every hour", - "auto_start": true, - "track_deletes": false, - "id": 43, - "enabled": true, - "last_deployed": "2024-03-28T14:00:00.000Z", - "source": "repo" - } - ], - "pagination": { - "total": 2, - "page": 0, - "limit": 20 - } -} -``` - - -### Get a function - -Retrieves a deployed function of an integration. - -```ts -await nango.getFunction({ uniqueKey: 'github', name: 'create-issue' }); -``` - -Pass `type` to disambiguate when a sync and an action share the same name: - -```ts -await nango.getFunction({ uniqueKey: 'github', name: 'issues' }, { type: 'sync' }); -``` - -**Parameters** - - - - The integration ID. - - - The function name. - - - Disambiguates when functions share a name: `sync`, `action`, or `on-event`. - - - -**Example Response** - - -```json -{ - "data": { - "type": "action", - "name": "create-issue", - "description": "Create a GitHub issue", - "returns": ["GithubIssue"], - "json_schema": null, - "id": 42, - "enabled": true, - "last_deployed": "2024-03-28T14:00:00.000Z", - "source": "repo" - } -} -``` - - -### Get function code - -Retrieves the source code of a deployed function. - -```ts -await nango.getFunctionCode({ uniqueKey: 'github', name: 'create-issue' }, { type: 'action' }); -``` - -**Parameters** - - - - The integration ID. - - - The function name. - - - Disambiguates when functions share a name: `sync`, `action`, or `on-event`. - - - -**Example Response** - - -```json -{ - "type": "action", - "code": "export default createAction({ /* ... */ });" -} -``` - - -### Delete a function - -Deletes a deployed function of an integration. The `type` is required. - -```ts -await nango.deleteFunction({ uniqueKey: 'github', name: 'create-issue' }, { type: 'action' }); -``` - -**Parameters** - - - - The integration ID. - - - The function name. - - - The function type: `sync` or `action`. - - - -**Example Response** - - -```json -{ - "data": { - "success": true - } -} -``` - - -### Get integration functions config - -Return the configuration for all integration functions - -```ts -const scriptsConfig = await nango.getScriptsConfig(); -``` - -**Example Response** - - -```json -[ - { - "providerConfigKey": "demo-github-integration", - "syncs": [ - { - "name": "github-issue-example", - "type": "sync", - "models": [ - { - "name": "GithubIssue", - "fields": [ - { - "name": "id", - "type": "integer" - }, - { - "name": "owner", - "type": "string" - }, - { - "name": "repo", - "type": "string" - }, - { - "name": "issue_number", - "type": "number" - }, - { - "name": "title", - "type": "string" - }, - { - "name": "author", - "type": "string" - }, - { - "name": "author_id", - "type": "string" - }, - { - "name": "state", - "type": "string" - }, - { - "name": "date_created", - "type": "date" - }, - { - "name": "date_last_modified", - "type": "date" - }, - { - "name": "body", - "type": "string" - } - ] - } - ], - "sync_type": "FULL", // DEPRECATED - "runs": "every half hour", - "track_deletes": false, - "auto_start": false, - "last_deployed": "2024-02-28T20:16:38.052Z", - "is_public": false, - "pre_built": false, - "version": "4", - "attributes": {}, - "input": {}, - "returns": [ - "GithubIssue" - ], - "description": "Fetches the Github issues from all a user's repositories.\nDetails: doesn't track deletes, metadata is not required.\n", - "scopes": [ - "public_repo" - ], - "endpoints": [ - { - "GET": "/github/issue-example" - } - ], - "nango_yaml_version": "v2", - "webhookSubscriptions": [] - } - ], - "actions": [ - { - "name": "fetch-issues", - "type": "action", - "models": [ - { - "name": "GithubIssue", - "fields": [ - { - "name": "id", - "type": "integer" - }, - { - "name": "owner", - "type": "string" - }, - { - "name": "repo", - "type": "string" - }, - { - "name": "issue_number", - "type": "number" - }, - { - "name": "title", - "type": "string" - }, - { - "name": "author", - "type": "string" - }, - { - "name": "author_id", - "type": "string" - }, - { - "name": "state", - "type": "string" - }, - { - "name": "date_created", - "type": "date" - }, - { - "name": "date_last_modified", - "type": "date" - }, - { - "name": "body", - "type": "string" - } - ] - } - ], - "runs": "", - "is_public": false, - "pre_built": false, - "version": "4", - "last_deployed": "2024-02-28T20:16:38.052Z", - "attributes": {}, - "returns": [ - "GithubIssue" - ], - "description": "", - "scopes": [], - "input": {}, - "endpoints": [ - { - "GET": "/github/issues" - } - ], - "nango_yaml_version": "v2" - } - ], - "postConnectionScripts": [], - "provider": "github" - } -] -``` - - -You can also pass in an optional argument with the value of `nango` or `openai`. The default is `nango` - -```ts -const scriptsConfig = await nango.getScriptsConfig('openai'); -``` - -```json -{ - "data": [ - { - "name": "calendars", - "description": "Sync the user's calendar list.\nIncludes all calendars the user has access to.", - "parameters": { - "type": "object", - "properties": {}, - "required": [] - } - }, - { - "name": "events", - "description": "Sync calendar events from the primary calendar.\nIncludes events from the past month.", - "parameters": { - "type": "object", - "properties": {}, - "required": [] - } - }, - { - "name": "cancel-event", - "description": "Cancel/delete an event by searching for it.\n\nInput parameters:\n- title: The title of the event to cancel\n- date: The date of the event in ISO format\n- time: The time of the event in 24-hour format (HH:mm)\n- calendar: Calendar ID where to search for the event\n- id: Calendar identifier\n- summary: Calendar name/title\n- description: Calendar description\n- location: Calendar location\n- timeZone: Time zone of the calendar\n- backgroundColor: Calendar color in UI\n- foregroundColor: Text color in UI\n- selected: Whether the calendar is selected in UI\n- accessRole: User's access role for the calendar\n- primary: Whether this is the primary calendar", - "parameters": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Calendar identifier" - }, - "summary": { - "type": "string", - "description": "Calendar name/title" - }, - "description": { - "type": "string", - "description": "Calendar description" - }, - "location": { - "type": "string", - "description": "Calendar location" - }, - "timeZone": { - "type": "string", - "description": "Time zone of the calendar" - }, - "backgroundColor": { - "type": "string", - "description": "Calendar color in UI" - }, - "foregroundColor": { - "type": "string", - "description": "Text color in UI" - }, - "selected": { - "type": "boolean", - "description": "Whether the calendar is selected in UI" - }, - "accessRole": { - "type": "string", - "description": "User's access role for the calendar" - }, - "primary": { - "type": "boolean", - "description": "Whether this is the primary calendar" - }, - "title": { - "type": "string", - "description": "The title of the event to cancel" - }, - "date": { - "type": "string", - "description": "The date of the event in ISO format" - }, - "time": { - "type": "string", - "description": "The time of the event in 24-hour format (HH:mm)" - }, - "calendar": { - "type": "string", - "description": "Calendar ID where to search for the event" - } - }, - "required": [ - "id", - "summary" - ] - } - }, - { - "name": "create-event", - "description": "Create a new calendar event.\n\nInput parameters:\n- summary: The title/summary of the event\n- description: A detailed description of the event\n- location: The location of the event\n- start: The start time of the event in ISO format\n- end: The end time of the event in ISO format\n- attendees: List of email addresses to invite\n- recurrence: List of recurrence rules in RRULE format\n- calendar: Calendar ID to create the event in\n- id: Calendar identifier\n- timeZone: Time zone of the calendar\n- backgroundColor: Calendar color in UI\n- foregroundColor: Text color in UI\n- selected: Whether the calendar is selected in UI\n- accessRole: User's access role for the calendar\n- primary: Whether this is the primary calendar", - "parameters": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Calendar identifier" - }, - "summary": { - "type": "string", - "description": "The title/summary of the event" - }, - "description": { - "type": "string", - "description": "A detailed description of the event" - }, - "location": { - "type": "string", - "description": "The location of the event" - }, - "timeZone": { - "type": "string", - "description": "Time zone of the calendar" - }, - "backgroundColor": { - "type": "string", - "description": "Calendar color in UI" - }, - "foregroundColor": { - "type": "string", - "description": "Text color in UI" - }, - "selected": { - "type": "boolean", - "description": "Whether the calendar is selected in UI" - }, - "accessRole": { - "type": "string", - "description": "User's access role for the calendar" - }, - "primary": { - "type": "boolean", - "description": "Whether this is the primary calendar" - }, - "start": { - "type": "string", - "description": "The start time of the event in ISO format" - }, - "end": { - "type": "string", - "description": "The end time of the event in ISO format" - }, - "attendees": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of email addresses to invite" - }, - "recurrence": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of recurrence rules in RRULE format" - }, - "calendar": { - "type": "string", - "description": "Calendar ID to create the event in" - } - }, - "required": [ - "id", - "summary", - "start", - "end" - ] - } - }, - { - "name": "move-event", - "description": "Move an event to a different time or calendar.\n\nInput parameters:\n- eventId: The ID of the event to move\n- title: The title of the event to move\n- sourceStart: The current start time of the event\n- start: The new start time for the event in ISO format\n- end: The new end time for the event in ISO format\n- calendar: Calendar ID to move the event to\n- id: Calendar identifier\n- summary: Calendar name/title\n- description: Calendar description\n- location: Calendar location\n- timeZone: Time zone of the calendar\n- backgroundColor: Calendar color in UI\n- foregroundColor: Text color in UI\n- selected: Whether the calendar is selected in UI\n- accessRole: User's access role for the calendar\n- primary: Whether this is the primary calendar", - "parameters": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Calendar identifier" - }, - "summary": { - "type": "string", - "description": "Calendar name/title" - }, - "description": { - "type": "string", - "description": "Calendar description" - }, - "location": { - "type": "string", - "description": "Calendar location" - }, - "timeZone": { - "type": "string", - "description": "Time zone of the calendar" - }, - "backgroundColor": { - "type": "string", - "description": "Calendar color in UI" - }, - "foregroundColor": { - "type": "string", - "description": "Text color in UI" - }, - "selected": { - "type": "boolean", - "description": "Whether the calendar is selected in UI" - }, - "accessRole": { - "type": "string", - "description": "User's access role for the calendar" - }, - "primary": { - "type": "boolean", - "description": "Whether this is the primary calendar" - }, - "eventId": { - "type": "string", - "description": "The ID of the event to move" - }, - "title": { - "type": "string", - "description": "The title of the event to move" - }, - "sourceStart": { - "type": "string", - "description": "The current start time of the event" - }, - "start": { - "type": "string", - "description": "The new start time for the event in ISO format" - }, - "end": { - "type": "string", - "description": "The new end time for the event in ISO format" - }, - "calendar": { - "type": "string", - "description": "Calendar ID to move the event to" - } - }, - "required": [ - "id", - "summary", - "start", - "end" - ] - } - }, - { - "name": "whoami", - "description": "Get information about the authenticated user.\n\nNo input parameters.", - "parameters": { - "type": "object", - "properties": {}, - "required": [] - } - }, - { - "name": "invite-user-to-repository", - "description": "Invite a user to a GitHub repository.\n\nInput parameters:\n- owner: The owner (user or organization) of the repository\n- repo: The name of the repository to invite the user to\n- username: The GitHub username of the user to invite\n- permission: The permission level to grant (\"pull\", \"push\", \"admin\", \"maintain\", \"triage\")", - "parameters": { - "type": "object", - "properties": { - "owner": { - "type": "string", - "description": "The owner (user or organization) of the repository" - }, - "repo": { - "type": "string", - "description": "The name of the repository to invite the user to" - }, - "username": { - "type": "string", - "description": "The GitHub username of the user to invite" - }, - "permission": { - "type": "string", - "description": "The permission level to grant (\"pull\", \"push\", \"admin\", \"maintain\", \"triage\")" - } - }, - "required": [ - "owner", - "repo", - "username" - ] - } - } - ] -} -``` - - -## Syncs - -### Get records - -Returns the synced data. - -```ts -import type { ModelName } from '/models' - -const records = await nango.listRecords({ - providerConfigKey: '', - connectionId: '', - model: '' -}); -``` - -**Parameters** - - - - - - The integration ID. - - - - The connection ID. - - - - The name of the model of the data you want to retrieve. - - - - The variant of the model to fetch. When omitted, the default base variant is used. - - - - Each record from this endpoint comes with a synchronization cursor in `_nango_metadata.cursor`. - - Save the last fetched record's cursor to track how far you've synced. - - By providing the cursor to this method, you'll continue syncing from where you left off, receiving only post-cursor changes. - - This same cursor is used to paginate through the results of this endpoint. - - - - The maximum number of records to return. Defaults to 100. - - - - Filter to only show results that have been added or updated or deleted. - - Available options: added, updated, deleted - - - - Timestamp, e.g. 2023-05-31T11:46:13.390Z. If passed, only records modified after this timestamp are returned, otherwise all records are returned. - - - - An array of string containing a list of your records IDs. The list will be filtered to include only the records with a matching ID. - - - - Deprecated. (use modifiedAfter) Timestamp, e.g. 2023-05-31T11:46:13.390Z. If passed, only records modified after this timestamp are returned, otherwise all records are returned. - - - - - -**Example Response** - - -This endpoint returns a list of records, ordered by modification date ascending. If some records are updated while you paginate through this endpoint, you might see these records multiple times. - - - -```json -{ - records: - [ - { - id: 123, - ..., // Fields as specified in the model you queried - _nango_metadata: { - deleted_at: null, - last_action: 'ADDED', - first_seen_at: '2023-09-18T15:20:35.941305+00:00', - last_modified_at: '2023-09-18T15:20:35.941305+00:00', - cursor: 'MjAyNC0wMi0yNlQwMzowMDozOS42MjMzODgtMDU6MDB8fGVlMDYwM2E1LTEwNDktNDA4Zi05YTEwLTJjNzVmNDkwODNjYQ==' - } - }, - ... - ], - next_cursor: "Y3JlYXRlZF9hdF4yMDIzLTExLTE3VDExOjQ3OjE0LjQ0NyswMjowMHxpZF4xYTE2MTYwMS0yMzk5LTQ4MzYtYWFiMi1mNjk1ZWI2YTZhYzI" -} -``` - - -### Prune records - -Prunes record payloads from Nango's cache for a given model and connection up to a specified cursor. The payload is emptied but record metadata is retained. Payload can be restored by re-syncing the data. - -```ts -const result = await nango.pruneRecords({ - providerConfigKey: '', - connectionId: '', - model: '', - untilCursor: '' -}); - -console.log(`Pruned ${result.count} records. More records available: ${result.has_more}`); -``` - -**Parameters** - - - - - - The integration ID. - - - - The connection ID. - - - - The name of the model from which to prune records. - - - - The variant of the model. When omitted, the default base variant is used. - - - - The cursor up to which records should be pruned. Only records with a cursor less than or equal to this value will be pruned. - - - - The maximum number of records to prune in this operation. - - - - - -**Response** - - -```json -{ - "count": 150, - "has_more": true -} -``` - - - The number of records that were pruned in this operation. - - - - Indicates whether there are more records available for pruning that match the criteria. If `true`, you must call the method again to continue pruning records. - - - -### Trigger sync(s) - -Triggers an additional, one-off execution of specified sync(s) for a given connection or all applicable connections if no connection is specified. - -```ts -// Simple usage - trigger sync preserving checkpoint -await nango.triggerSync('', ['SYNC_NAME1', 'SYNC_NAME2'], ''); - -// Reset checkpoint and start fresh -await nango.triggerSync('', ['SYNC_NAME1'], '', { reset: true }); - -// Reset checkpoint and clear all cached records -await nango.triggerSync('', ['SYNC_NAME1'], '', { reset: true, emptyCache: true }); - -// Using variants -await nango.triggerSync('', [ - { name: 'SYNC_NAME1', variant: 'VARIANT_A' }, - 'SYNC_NAME2' // Uses default base variant -], '', { reset: true }); -``` - -**Parameters** - - - - The integration ID. - - - The name of the syncs to trigger. If the array is empty, all syncs are triggered. - Each sync can be specified as either: - - A string: the sync name (uses the default base variant) - - An object: with name and variant properties to target a specific sync variant - - - The connection ID. If omitted, the sync will trigger for all relevant connections. - - - Options for triggering the sync. See the [checkpoints guide](/guides/functions/syncs/checkpoints#re-syncing-resetting-checkpoints-and-the-cache) for details on `reset` and `emptyCache`. - - - If `true`, clears the checkpoint before triggering the sync, causing it to start fresh. - - - If `true`, deletes all cached records associated with the sync before triggering. Must be used with `reset: true`. - - - - - -**Response** - -Empty response. - -### Start schedule for sync(s) - -Starts the schedule of specified sync(s) for a given connection or all applicable connections if no connection is specified. Upon starting the schedule, the sync will execute immediately and then continue to run at the specified frequency. If the schedule was already started, this will have no effect. - -```ts -// Simple usage with sync names -await nango.startSync('', ['SYNC_NAME1', 'SYNC_NAME2'], ''); - -// Using variants -await nango.startSync('', [ - { name: 'SYNC_NAME1', variant: 'VARIANT_A' }, - 'SYNC_NAME2' // Uses default base variant -], ''); -``` - -**Parameters** - - - - The integration ID. - - - The name of the syncs that should be triggered. - Each sync can be specified as either: - - A string: the sync name (uses the default base variant) - - An object: with name and variant properties to target a specific sync variant - - - The connection ID. If omitted, the sync will trigger for all relevant connections. - - - -**Response** - -Empty response. - -### Pause schedule for sync(s) - -Pauses the schedule of specified sync(s) for a given connection or all applicable connections if no connection is specified. - -```ts -// Simple usage with sync names -await nango.pauseSync('', ['SYNC_NAME1', 'SYNC_NAME2'], ''); - -// Using variants -await nango.pauseSync('', [ - { name: 'SYNC_NAME1', variant: 'VARIANT_A' }, - 'SYNC_NAME2' // Uses default base variant -], ''); -``` - -**Parameters** - - - - The integration ID. - - - The name of the syncs that should be paused. - Each sync can be specified as either: - - A string: the sync name (uses the default base variant) - - An object: with name and variant properties to target a specific sync variant - - - The connection ID. If omitted, the sync will pause for all relevant connections. - - - -**Response** - -Empty response. - -### Sync status - -Get the status of specified sync(s) for a given connection or all applicable connections if no connection is specified. - -```ts -// Simple usage with sync names -await nango.syncStatus('', ['SYNC_NAME1', 'SYNC_NAME2'], ''); - -// Using variants -await nango.syncStatus('', [ - { name: 'SYNC_NAME1', variant: 'VARIANT_A' }, - 'SYNC_NAME2' // Uses default base variant -], ''); - -// Get all syncs -await nango.syncStatus('', '*', ''); -``` - -**Parameters** - - - - The integration ID. - - - Either "*" to return all syncs, or an array of syncs to fetch status for. - When using an array, each sync can be specified as either: - - A string: the sync name (uses the default base variant) - - An object: with name and variant properties to target a specific sync variant - - - The connection ID. If omitted, all connections will be surfaced. - - - -**Response** - - -```json -{ - "syncs": [ - { - "id": "", - "connection_id": "", - "name": "", - "variant": "", - "status": "RUNNING", - "type": "INCREMENTAL", // DEPRECATED - "finishedAt": "", - "nextScheduledSyncAt": "", - "frequency": "", - "latestResult": { - "": { - "added": , - "updated": , - "deleted": , - } - }, - "recordCount": { - "": - ... - }, - "checkpoint": { - "": "" - ... - } - } - ] -} -``` - -The `checkpoint` field contains the last saved checkpoint for the sync. Learn more about [checkpoints](/guides/functions/syncs/checkpoints). - - -### Override sync connection frequency - -Override a sync's default frequency for a specific connection, or revert to the default frequency. - -```ts -// For base variant -await nango.updateSyncConnectionFrequency('', 'SYNC_NAME', '', ''); - -// For a specific variant -await nango.updateSyncConnectionFrequency('', { name: 'SYNC_NAME', variant: 'VARIANT_NAME' }, '', ''); -``` - -**Parameters** - - - - The integration ID. - - - The sync to update. Can be specified as either: - - A string: the sync name (uses the default base variant) - - An object: with name and variant properties to target a specific sync variant - - - The connection ID. - - - The frequency you want to set (ex: 'every hour'). Set to `null` to revert to the default frequency. Uses the https://github.com/vercel/ms notations. See [minimum sync frequency](/guides/platform/limits#minimum-sync-frequency) for details. - - - -**Response** - - -```json -{ - "frequency": "" -} -``` - - -### Create sync variant - -Creates a new sync variant for a specific connection. Sync variants allow you to run multiple instances of the same sync with different configurations. - -```ts -await nango.createSyncVariant({ - provider_config_key: '', - connection_id: '', - name: 'SYNC_NAME', - variant: 'VARIANT_NAME' -}); -``` - -**Parameters** - - - - - - The integration ID. - - - The connection ID. - - - The name of the sync. - - - The name of the variant to create. Cannot be "base" (protected name). - - - - - -**Example Response** - - -```json -{ - "id": "12345", - "name": "SYNC_NAME", - "variant": "VARIANT_NAME" -} -``` - - -### Delete sync variant - -Deletes a sync variant for a specific connection. - -```ts -await nango.deleteSyncVariant({ - provider_config_key: '', - connection_id: '', - name: 'SYNC_NAME', - variant: 'VARIANT_NAME' -}); -``` - -**Parameters** - - - - - - The integration ID. - - - The connection ID. - - - The name of the sync. - - - The name of the variant to delete. Cannot be "base" (protected name). - - - - - -**Example Response** - - -```json -{ - "success": true -} -``` - - -### Get environment variables - -Retrieve the environment variables as added in the Nango dashboard. - -```js -await nango.getEnvironmentVariables(); -``` - -**Parameters** - -No parameters. - -**Response** - - -```json -[ - { - "name": "MY_SECRET_KEY", - "value": "SK_373892NSHFNCOWFO..." - } -] -``` - - -## Actions - -### Trigger an action - -Triggers an action for a connection. - -```js -await nango.triggerAction('', '', '', { 'custom_key1': 'custom_value1' }); -``` - -**Parameters** - - - - The integration ID. - - - The connection ID. - - - The name of the action to trigger. - - - The necessary input for your action's `exec` function. - - - -**Response** - - -```json -{ - "your-properties": "The data returned by the action" -} -``` - - - -The output of an action cannot exceed 10MB. - - -### Trigger an action asynchronously - -Triggers an action asynchronously for a connection. This allows you to start an action and retrieve the results later. - -```js -const { id, statusUrl } = await nango.triggerActionAsync('', '', '', { 'custom_key1': 'custom_value1' }); -``` - -**Parameters** - - - - The integration ID. - - - The connection ID. - - - The name of the action to trigger. - - - The necessary input for your action's `exec` function. - - - -**Response** - - -```json -{ - "id": "action_123456", - "statusUrl": "/action/action_123456" -} -``` - - -### Get async action result - -Retrieves the result of an asynchronous action. - -```js -// Using the id -const result = await nango.getAsyncActionResult({ id: 'action_123456' }); - -// OR using the statusUrl -const result = await nango.getAsyncActionResult({ statusUrl: '/action/action_123456' }); -``` - -**Parameters** - - - - - - The ID of the action to retrieve the result for. - - - The URL where the result can be retrieved. - - - - - -**Response** - - -```json -{ - "your-properties": "The data returned by the action" -} -``` - - -## Proxy - -Makes an HTTP request using the [proxy](/guides/platform/proxy-requests): - -```js -const config = { - endpoint: '/some-endpoint', - providerConfigKey: '', - connectionId: '' -}; - -await nango.get(config); // GET request -await nango.post(config); // POST request -await nango.put(config); // PUT request -await nango.patch(config); // PATCH request -await nango.delete(config); // DELETE request -``` - -**Parameters** - - - - - - The endpoint of the request. - - - The integration ID (for credential injection). - - - The connection ID (for credential injection). - - - The headers of the request. - - - The query parameters of the request. - - - The body of the request. - - - The number of retries in case of failure (with exponential back-off). Optional, default 0. - - - Array of additional status codes to retry a request in addition to the 5xx, 429, ECONNRESET, ETIMEDOUT, and ECONNABORTED - - - The API base URL. Can be omitted if the base URL is configured for this API in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml). - - - Override the decompress option when making requests. Optional, defaults to false - - - The type of the response. - - - - - -**Response** - - -The response from the external API is passed back to you exactly as Nango gets it: -- response code -- response headers -- response body - - -## Providers - -### List all providers - -Returns a list of providers. - -```js -await nango.listProviders() -``` - -**Example Response** - - -```json -{ - "data": [ - { - "name": "posthog", - "categories": ["dev-tools"], - "auth_mode": "API_KEY", - "proxy": { - "base_url": "https://api.posthog.com", - }, - "docs": "https://nango.dev/docs/api-integrations/posthog" - } - ] -} -``` - - -### Get a provider - -Returns a specific provider. - -```js -await nango.getProvider({ provider: }) -``` - -**Example Response** - - -```json -{ - "data": { - "name": "posthog", - "categories": ["dev-tools"], - "auth_mode": "API_KEY", - "proxy": { - "base_url": "https://api.posthog.com", - }, - "docs": "https://nango.dev/docs/api-integrations/posthog" - } -} -``` - - -### Get provider templates - -Returns the function templates available for a provider. - -```js -await nango.getProviderTemplates({ provider: }) -``` - -**Parameters** - - - - The provider name. - - - -**Example Response** - - -```json -{ - "data": [ - { - "type": "action", - "name": "create-issue", - "description": "Create a GitHub issue", - "returns": ["GithubIssue"], - "json_schema": null - } - ] -} -``` - - -## Webhooks from Nango - -### Verify Webhook Signature - -Asserts that a Webhook is coming from Nango's backend. Verification uses `webhookSigningKey` when the client is constructed with one, otherwise it falls back to `secretKey`. On environments created after 2026-04-20 (or any environment that later rotated its API key), the signing key differs from the API key, so construct the client with `webhookSigningKey` (from **Environment Settings > Webhooks > Signing key**). - -```js -const nango = new Nango({ - apiKey: '', - webhookSigningKey: '' -}); - -async (req, res) => { - const isValid = nango.verifyIncomingWebhookRequest(req.body, req.headers); -} -``` - - -**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - - -## Python - -Source: https://nango.dev/docs/reference/backend/backend-sdk/python.md - -Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. - -## Java - -Source: https://nango.dev/docs/reference/backend/backend-sdk/java.md - -Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. - -## Ruby - -Source: https://nango.dev/docs/reference/backend/backend-sdk/ruby.md - -Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. - -## Go - -Source: https://nango.dev/docs/reference/backend/backend-sdk/go.md - -Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. - -## Rust - -Source: https://nango.dev/docs/reference/backend/backend-sdk/rust.md - -Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. - -## PHP - -Source: https://nango.dev/docs/reference/backend/backend-sdk/php.md - -Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. - -## Functions CLI - -Source: https://nango.dev/docs/reference/functions/functions-cli.md -Description: Full reference of the CLI available to implement, test & deploy Nango Functions. - -### Install the Nango CLI - -Install the Nango CLI globally: -```bash -npm install nango -g -``` - -In the folder where you want your integration folder (e.g. root of your project), run: -```bash -nango init nango-integrations -``` - -This creates the `./nango-integrations` folder with some initial configuration and an example -sync script. The `nango-integrations` directory looks like this: -``` -nango-integrations/ -β”œβ”€β”€ .env -β”œβ”€β”€ index.ts -└── demo-github-integration # this is the integration unique ID and must match an integration ID in the UI - └── syncs/ - └── github-issue-example.ts -``` - -### CLI Authentication - -Add the following env vars. We recommend that you have a `.env` file in `./nango-integrations`: -```bash -NANGO_SECRET_KEY_PROD='' -NANGO_SECRET_KEY_DEV='' -``` - -Get your `prod` and `dev` secret keys from [Environment Settings > API Keys](https://app.nango.dev/environment-settings#api-keys) (toggle between the `prod` and `dev` environment in the left nav bar). - - -For self-hosting, set the `NANGO_HOSTPORT` env variable to `http://localhost:3003` (for local development) or your instance's URL. - - -## All CLI commands & command details - -Check out all CLI commands by running: -```bash -nango -``` - -Get details about a specific command by running: -```bash -nango [command] --help -``` - -## Interactive Mode - -The Nango CLI includes an interactive mode that prompts you for missing arguments. For example, if you run `nango create` without specifying the function type, integration, or name, the CLI will prompt you for them. - -This mode is enabled by default when you're in an interactive terminal session. - -### Usage Examples - -**Interactive Usage:** - -If you run a command without all the required arguments, the CLI will prompt you for them. - -```bash -# Running "nango create" without arguments -$ nango create - -? What type of function do you want to create? -❯ sync - action - on-event -``` - -**Non-Interactive (Explicit) Usage:** - -You can provide all arguments upfront to bypass the interactive prompts. This is ideal for scripting. - -```bash -nango create --sync --integration my-api --name get-contacts -``` - -### Disabling Interactive Mode - -You can disable interactive mode in two ways: - -1. **Using a flag:** Pass the `--no-interactive` flag to any command. - ```bash - nango create --no-interactive - ``` -2. **In a CI environment:** Interactive mode is automatically disabled when the `CI` environment variable is set. This is the standard way to detect CI/CD environments. - -### Backwards Compatibility - -Interactive mode is fully backward compatible. If you provide all the required arguments for a command, the CLI will not prompt you for anything and will behave exactly as it did before. - -## Flags & environment variables - -Global command flags: - -```bash -# Command flag to auto-confirm all prompts (useful for CI). -# Note: Destructive changes (like removing a sync or renaming a model) requires confirmation, even when --auto-confirm is set. To bypass this restriction, the --allow-destructive flag can be passed to nango deploy. ---auto-confirm - -# Command flag to disable interactive mode. ---no-interactive - -# Command flag to skip automatic package.json updates and package installs. -# Recommended in CI and monorepos where dependency updates are managed elsewhere. ---no-dependency-update -``` - -Environment variables: -```bash -# Recommendation: in a ".env" file in ./nango-integrations. - -# Authenticates the CLI (get the keys in the dashboard's Environment Settings > API Keys). -NANGO_SECRET_KEY_DEV=xxxx-xxx-xxxx -NANGO_SECRET_KEY_PROD=xxxx-xxx-xxxx - -# Nango's instance URL (OSS: change to http://localhost:3003 or your instance URL). -NANGO_HOSTPORT=https://api.nango.dev # Default value - -# How to handle CLI upgrades ("prompt", "auto" or "ignore"). -NANGO_CLI_UPGRADE_MODE=prompt # Default value - -# Whether to prompt before deployments. -# Note: Destructive changes (like removing a sync or renaming a model) requires confirmation, even when NANGO_DEPLOY_AUTO_CONFIRM is set to true. To bypass this restriction, the --allow-destructive flag can be passed to nango deploy. -NANGO_DEPLOY_AUTO_CONFIRM=false # Default value - -# Control automatic dependency updates. Set to "false" to skip installs (equivalent to --no-dependency-update). -NANGO_CLI_DEPENDENCY_UPDATE=true # Default value -``` - -## Dependency management - -For Zero YAML projects, the CLI can keep required dev dependencies (for example `nango` and related tooling) in sync and run package installation when needed. - -### `--no-dependency-update` - -Use `--no-dependency-update` to disable automatic `package.json` updates and dependency installs: - -```bash -nango deploy dev --no-dependency-update -``` - -This is especially useful when: - -- your CI pipeline should not modify files -- your monorepo manages dependencies at the workspace root -- you want full control over when `install` runs - -In CI, dependency updates are automatically disabled to avoid hanging. Passing `--no-dependency-update` explicitly is still recommended to make intent clear and silence the warning. - - -When dependency updates are disabled, Nango will not install dependencies for you. Ensure dependencies are already installed before running commands. - - -## Package manager support - -Nango supports all major JavaScript package managers. The CLI automatically detects and uses your package manager for installs. Detection works from the current directory upward (monorepo-aware), in this order: - -1. `package.json` `packageManager` field (Corepack standard) -2. lock files (`pnpm-lock.yaml`, `yarn.lock`, `bun.lockb` / `bun.lock`) -3. fallback to `npm` - -Supported managers are `npm`, `pnpm`, `yarn`, and `bun`. - - -**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - - -## Functions SDK - -Source: https://nango.dev/docs/reference/functions/functions-sdk.md -Description: Full reference of the SDK available in Nango Functions. - -## Examples - - - - ```ts - import { createSync } from 'nango'; - - const githubIssueDemoSchema = z.object({ ... }); - type GithubIssueDemo = z.infer; - - export default createSync({ - description: `Fetches the Github issues from all a user's repositories.`, - version: '1.0.0', - frequency: 'every hour', - autoStart: true, - metadata: z.void(), - models: { - GithubIssueDemo: githubIssueDemoSchema - }, - - exec: async (nango) => { - // Mark the start of deletion tracking - await nango.trackDeletesStart('GithubIssueDemo'); - - // Fetch issues from GitHub. - const res = await nango.get({ - endpoint: '/repos/NangoHQ/interactive-demo/issues?labels=demo&sort=created&direction=asc' - }); - - // Map issues to your preferred schema. - const issues: GithubIssueDemo[] = res.data.map(({ id, title, html_url }: any) => { - return { id, title, url: html_url }; - }); - - // Persist issues to the Nango cache. - await nango.batchSave(issues, 'GithubIssueDemo'); - - // Detect and mark deleted records - await nango.trackDeletesEnd('GithubIssueDemo'); - }, - }); - ``` - - - ```ts - import { createAction } from 'nango'; - import { GithubCreateIssueInput, GithubCreateIssueResult } from '../../models.js'; - - export default createAction({ - description: `Create an issue in GitHub`, - version: '1.0.0', - input: GithubCreateIssueInput, - output: GithubCreateIssueResult, - - exec: async (nango, input) => { - // Create a GitHub issue. - const res = await nango.post({ - endpoint: '/repos/NangoHQ/interactive-demo/issues', - data: { - title: `[demo] ${input.title}`, - body: `The body of the issue.`, - labels: ['automatic'] - } - }); - - // Send response. - return { url: res.data.html_url, status: res.status }; - }, - }); - ``` - - - -Read more about [integration functions](/guides/functions/functions-guide) to understand what role they play in Nango. - -## Configuration - -### `createSync` - - - The description of the sync. - - - - The function that will be called when the sync is triggered. - - - - The frequency of the sync. - - ```ts - frequency: 'every 1 minute', - frequency: 'every hour', - frequency: 'every 2 days' - frequency: 'every 3 week' - ``` - - - - The models that will be synced by this function. - You need one endpoint per model. - - ```ts - models: { - GithubIssue: z.object({ - id: z.string(), - }), - }, - ``` - - - - Optional schema defining the shape of checkpoint data for this sync. - Use checkpoints to save progress and avoid re-fetching all data on every run. See the [checkpoints guide](/guides/functions/syncs/checkpoints) for details. - - ```ts - checkpoint: z.object({ - cursor: z.string(), - }), - ``` - - - - If `true`, automatically runs the sync when a new connection is created. - Otherwise, it needs to be triggered via the API or Nango UI. - - - - The connection's metadata of the action. - - ```ts - metadata: z.object({ - userId: z.string(), - }); - ``` - - - - The function that will be called when a webhook is received. - - - - The integration's scopes required by the action. - This field is for documentation purposes only and currently not enforced by Nango. - - ```ts - scopes: ['read:user', 'write:user'], - ``` - - - - [DEPRECATED] Instead use `await nango.trackDeletesStart('modelName')` and `await nango.trackDeletesEnd('modelName')` inside the sync `exec` function. - - When `trackDeletes` is set to `true`, Nango automatically detects deleted records **during full syncs only** and marks them as deleted in each record’s metadata (soft delete). These records remain stored in the cache. - - When set to `false`, Nango does not mark missing records as deleted, even if they weren’t returned in the latest full syncβ€”they simply remain in the cache unchanged. - - Defaults to `false`. - - - - The version of the sync. - Use it to track changes to the sync inside Nango's UI. - - - - The webhook subscriptions of the sync. - Specify the types of webhooks the method `onWebhook` will handle. - If a webhook type is not on the list, it will not be handled. - - ```ts - webhookSubscriptions: ['*'], - ``` - - - - [DEPRECATED] Use the [`GET /records`](/reference/backend/http-api/sync/records-list) API endpoint to fetch records. - - -### `createAction` - - - The description of the sync. - - - - The function that will be called when the action is triggered. - - - - The input required by the action when triggering it. - - ```ts - input: z.object({ - title: z.string(), - }); - ``` - - - - The output of the action. - - ```ts - output: z.object({ - issueId: z.string(), - }); - ``` - - - - The version of the sync. - Use it to track changes to the sync inside Nango's UI. - - - - The connection's metadata of the action. - - ```ts - metadata: z.object({ - userId: z.string(), - }); - ``` - - - - The integration's scopes required by the action. - This field is for documentation purposes only and currently not enforced by Nango. - - ```ts - scopes: ['read:user', 'write:user'], - ``` - - - - [DEPRECATED] Use the [`POST /action/trigger`](/reference/backend/http-api/action/trigger) API endpoint to trigger actions. - - -### `createOnEvent` - - - The description of the sync. - - - - The event that will trigger this function. - - - - The function that will be called when the action is triggered. - - - - The version of the onEvent function. - Use it to track changes to the onEvent function inside Nango's UI. - - - - The connection's metadata of the function. - - ```ts - metadata: z.object({ - userId: z.string(), - }); - ``` - + { + "name": "move-event", + "description": "Move an event to a different time or calendar.\n\nInput parameters:\n- eventId: The ID of the event to move\n- title: The title of the event to move\n- sourceStart: The current start time of the event\n- start: The new start time for the event in ISO format\n- end: The new end time for the event in ISO format\n- calendar: Calendar ID to move the event to\n- id: Calendar identifier\n- summary: Calendar name/title\n- description: Calendar description\n- location: Calendar location\n- timeZone: Time zone of the calendar\n- backgroundColor: Calendar color in UI\n- foregroundColor: Text color in UI\n- selected: Whether the calendar is selected in UI\n- accessRole: User's access role for the calendar\n- primary: Whether this is the primary calendar", + "parameters": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Calendar identifier" + }, + "summary": { + "type": "string", + "description": "Calendar name/title" + }, + "description": { + "type": "string", + "description": "Calendar description" + }, + "location": { + "type": "string", + "description": "Calendar location" + }, + "timeZone": { + "type": "string", + "description": "Time zone of the calendar" + }, + "backgroundColor": { + "type": "string", + "description": "Calendar color in UI" + }, + "foregroundColor": { + "type": "string", + "description": "Text color in UI" + }, + "selected": { + "type": "boolean", + "description": "Whether the calendar is selected in UI" + }, + "accessRole": { + "type": "string", + "description": "User's access role for the calendar" + }, + "primary": { + "type": "boolean", + "description": "Whether this is the primary calendar" + }, + "eventId": { + "type": "string", + "description": "The ID of the event to move" + }, + "title": { + "type": "string", + "description": "The title of the event to move" + }, + "sourceStart": { + "type": "string", + "description": "The current start time of the event" + }, + "start": { + "type": "string", + "description": "The new start time for the event in ISO format" + }, + "end": { + "type": "string", + "description": "The new end time for the event in ISO format" + }, + "calendar": { + "type": "string", + "description": "Calendar ID to move the event to" + } + }, + "required": [ + "id", + "summary", + "start", + "end" + ] + } + }, + { + "name": "whoami", + "description": "Get information about the authenticated user.\n\nNo input parameters.", + "parameters": { + "type": "object", + "properties": {}, + "required": [] + } + }, + { + "name": "invite-user-to-repository", + "description": "Invite a user to a GitHub repository.\n\nInput parameters:\n- owner: The owner (user or organization) of the repository\n- repo: The name of the repository to invite the user to\n- username: The GitHub username of the user to invite\n- permission: The permission level to grant (\"pull\", \"push\", \"admin\", \"maintain\", \"triage\")", + "parameters": { + "type": "object", + "properties": { + "owner": { + "type": "string", + "description": "The owner (user or organization) of the repository" + }, + "repo": { + "type": "string", + "description": "The name of the repository to invite the user to" + }, + "username": { + "type": "string", + "description": "The GitHub username of the user to invite" + }, + "permission": { + "type": "string", + "description": "The permission level to grant (\"pull\", \"push\", \"admin\", \"maintain\", \"triage\")" + } + }, + "required": [ + "owner", + "repo", + "username" + ] + } + } + ] +} +``` +
-## HTTP requests +## Syncs -Makes an HTTP request inside an integration function: +### Get records -```js -import type { ProxyConfiguration } from 'nango'; +Returns the synced data. -const config: ProxyConfiguration = { endpoint: '/some-endpoint' }; +```ts +import type { ModelName } from '/models' -await nango.get(config); // GET request -await nango.post(config); // POST request -await nango.put(config); // PUT request -await nango.patch(config); // PATCH request -await nango.delete(config); // DELETE request +const records = await nango.listRecords({ + providerConfigKey: '', + connectionId: '', + model: '' +}); ``` - - Note that all HTTP requests benefit from automatic credential injection. Because functions are executed in the context of a specific integration & connection, Nango can automatically retrieve & refresh the relevant API credentials. - - **Parameters** - - The endpoint of the request. - - - The headers of the request. - - - The query parameters of the request. - - - The body of the request. - - - The number of retries in case of failure (with exponential back-off). Optional, default 0. - - - Array of HTTP status codes to retry, in addition to those specified [below](#when-a-failed-request-is-retried). - - - The API base URL. Can be omitted if the base URL is configured for this API in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml). - - - Override the decompress option when making requests. Optional, defaults to false - - - The type of the response. + + The integration ID. - - - - -**Response** - - - ```json - { - data: {}, // the response provided by the server - status: 200, // the HTTP status code - headers: {}, // the HTTP headers - config: {}, // the config provided for the request - request: {} // the request that generated this response - } - ``` - - The response object is an [Axios response](https://axios-http.com/docs/res_schema). - - - -## HTTP request retries - -Configure behavior with two optional fields on your [HTTP request](#http-requests) config: [`retries`](#param-retries) and [`retryOn`](#param-retry-on). - -### When a failed request is retried - -Nango retries only when the failure looks **transient**. Exact rules depend on the integration: - -| Field | Condition for Retry | -| --- | --- | -| **Network Error** | If code is one of:
`ECONNRESET`, `ETIMEDOUT`, `ECONNABORTED`, `ECONNREFUSED`, `EHOSTUNREACH`, `EAI_AGAIN` | -| **Transient HTTP Error** | If provider specific `proxy.retry.error_code` is configured in [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml), only matching statuses are retried.

Otherwise, by default, status codes `401`, `429`, `5xx` are retried.

Additional status specified in [`retryOn`](#param-retry-on) are always retried in addition to the above statuses. | - -If nothing in the table applies, the error is **not** retried. - - -Status `401` is retryable so Nango can recover after refreshing the connection with potentially updated credentials. If a `401` happens and the connection credentials **do not change** on the next fetch, Nango treats that as a definitive authentication failure and stops performing additional retries - - -### Backoff - -Between retry attempts Nango waits with **exponential backoff**: first wait **3000ms**, then each wait doubles, capped at **10 minutes**. - -## Logging - -You can collect logs in integration functions. This is particularly useful when: - -- developing, to debug your integration functions -- in production, to collect information about integration function executions & understand issues - -Collect logs in integration functions as follows: - -```ts -await nango.log("This is a log."); // default log level is 'info' -await nango.log("This is an info log", { level: 'info' }); -await nango.log("This is a warning", { level: 'warn' }); -await nango.log("This is an error", { level: 'error' }); -``` - -### Log Levels - -Nango supports the following log levels (from most to least verbose): `debug`, `info`, `warn`, `error`, `off`. - -Only logs with a level greater than or equal to the configured logger level will surfaced in the Nango UI Logs tab. For example, if the logger level is set to `warn`, only `warn` and `error` logs will be shown. - -**Default log levels:** -- **All cloud environments**: `warn` (only warnings and errors are logged by default) -- **CLI dry-run**: `debug` (all logs are shown in the console) - -### Configuring Log Level - -You can override the default log level in two ways: - -1. **Environment variable**: Set `NANGO_LOGGER_LEVEL` in your environment settings (values: `debug`, `info`, `warn`, `error`, `off`). It will apply to all your functions running in this environment and can be overridden in functions by using `nango.setLogger(...)` - -2. **In your function code**: -```ts -nango.setLogger({ level: 'debug' }); // All logs will show in your cloud environments. It will apply to all `nango.log()` following this statement. -nango.setLogger({ level: 'off' }); // No logs will show -``` - -Logs can be viewed & searched in the Nango UI. We plan to make them exportable in the future as well. - -You can monitor your usage of custom logs in the [billing tab](https://app.nango.dev/prod/team/billing) of your Nango dashboard. - -## Environment variables + + The connection ID. + -Integration functions sometimes need to access sensitive variables that should not be revealed directly in the code. + + The name of the model of the data you want to retrieve. + -For this, you can define environment variables in the Nango UI, in the _Environment Settings_ tab. Then you can retrieve these environment variables from integration functions with: + + The variant of the model to fetch. When omitted, the default base variant is used. + -```js -await nango.getEnvironmentVariables(); -``` + + Each record from this endpoint comes with a synchronization cursor in `_nango_metadata.cursor`. -**Parameters** + Save the last fetched record's cursor to track how far you've synced. -No parameters. + By providing the cursor to this method, you'll continue syncing from where you left off, receiving only post-cursor changes. -**Response** + This same cursor is used to paginate through the results of this endpoint. + - - ```json - [ - { - "name": "MY_SECRET_KEY", - "value": "SK_373892NSHFNCOWFO..." - } - ] - ``` - + + The maximum number of records to return. Defaults to 100. + -## Trigger action + + Filter to only show results that have been added or updated or deleted. -You can call action functions from other integration functions with: + Available options: added, updated, deleted + -```js -await nango.triggerAction('', { 'custom_key1': 'custom_value1' }); -``` + + Timestamp, e.g. 2023-05-31T11:46:13.390Z. If passed, only records modified after this timestamp are returned, otherwise all records are returned. + -**Parameters** + + An array of string containing a list of your records IDs. The list will be filtered to include only the records with a matching ID. + - - - The name of the action to trigger. - - - The necessary input for your action's `exec` function. + + Deprecated. (use modifiedAfter) Timestamp, e.g. 2023-05-31T11:46:13.390Z. If passed, only records modified after this timestamp are returned, otherwise all records are returned. + + -**Response** - - - ```json - { - "your-properties": "The data returned by the action" - } - ``` - - -## Paginate through API responses - -Nango provides a helper to automatically paginate endpoint responses. - -Similar to [HTTP requests](/reference/functions/functions-sdk#http-requests), the `nango.paginate()` method takes in a `ProxyConfiguration` parameter. - -Use the `paginate` field to of the `ProxyConfiguration` to specify how the endpoint's pagination work. Here's an example for a Jira endpoint: - -```ts -const config: ProxyConfiguration = { - // https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-projects/#api-rest-api-3-project-search-get - endpoint: `/ex/jira/${cloud.cloudId}/rest/api/3/project/search`, - params: { - properties: properties - }, - paginate: { - type: 'offset', - offset_name_in_request: 'startAt', - response_path: 'values', - limit_name_in_request: 'maxResults', - limit: 50, - on_page: async ({ nextPageParam, response }) => { - await nango.log(`Next offset value = ${nextPageParam}`); - await nango.log(`Fetched ${response.data.total} records`); - }, - }, - headers: { - 'X-Atlassian-Token': 'no-check' - }, - retries: 10 -}; - -for await (const projects of nango.paginate(config)) { - const projectsToSave = toProjects(projects, cloud.baseUrl); - await nango.batchSave(projectsToSave, 'Project'); -} -``` - -As shown in the example above, use a `for` loop to iterate through the paginated results. +**Example Response** - Nango has pre-configured the pagination settings for some popular APIs, so you don't have to specify them in functions. - - You can view the pre-configured pagination settings for all APIs in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) file. - - Please note that some APIs have diverging pagination strategies per endpoint, so you might still need to override pre-configured pagination settings at times. +This endpoint returns a list of records, ordered by modification date ascending. If some records are updated while you paginate through this endpoint, you might see these records multiple times. -The pagination helper supports 3 types of pagination: `cursor`, `link` or `offset` with the following settings: - - - - - - - _For all pagination types._ - - The name of the parameter containing the number of items per page, in the request. Inserted in the query parameters for `GET`/`DELETE`, in the body for `POST`/`PUT`/`PATCH`. - - - _For all pagination types._ - - The maximum number of items per page. If omitted, no limit will be sent to the external endpoint, relying on the endpoint's default limit. - - - _For all pagination types._ - - The path of the field containing the results, in the response. If omitted or empty string, it defaults to the root. Use `.` for nested fields, e.g. `"results.contacts"`. - - - _For all pagination types._ - - The pagination strategy. - - - _For cursor pagination only (required)._ - - The path of the field containing the cursor for the next page, in the response. Use `.` for nested fields, e.g. `"pagination.cursor"`. - - - _For cursor pagination only (required)._ - - The name of the parameter containing the cursor for the next page, in the request. Inserted in the query parameters for `GET`/`DELETE`, in the body for `POST`/`PUT`/`PATCH`. - - - _`For link pagination (required unless link_path_in_response_body is specified).`_ - - The header containing the link to the next page, in the response. - - - _`For link pagination (required unless link_rel_in_response_header is specified).`_ - - The path of the field containing the link to the next page, in the response. Use `.` for nested fields, e.g. `"pagination.link"`. - - - _For offset pagination only (required)._ - - The name of the parameter containing the offset for the next page, in the request. Inserted in the query parameters for `GET`/`DELETE`, in the body for `POST`/`PUT`/`PATCH`. - - - _For offset pagination only (optional)._ - - The initial offset. Defaults to 0, but some APIs start at 1. - - - _For offset pagination only (optional)._ - - The offset calculation method. `by-response-size` (default) means the offset is incremented by the number of results. `per-page` means the offset is incremented by one for each page. - - - _For all pagination types (optional)._ - - A callback function that is called after each page is fetched. Useful for logging or tracking pagination progress. The callback receives the next page parameter and the full Axios response object, which includes the response data, status, headers, and request configuration. - - - - - - - You can find details on the pagination [types](https://github.com/NangoHQ/nango/blob/master/packages/runner-sdk/models.d.ts) and [logic](https://github.com/NangoHQ/nango/blob/master/packages/runner-sdk/lib/paginate.service.ts) in the code. - +```json +{ + records: + [ + { + id: 123, + ..., // Fields as specified in the model you queried + _nango_metadata: { + deleted_at: null, + last_action: 'ADDED', + first_seen_at: '2023-09-18T15:20:35.941305+00:00', + last_modified_at: '2023-09-18T15:20:35.941305+00:00', + cursor: 'MjAyNC0wMi0yNlQwMzowMDozOS42MjMzODgtMDU6MDB8fGVlMDYwM2E1LTEwNDktNDA4Zi05YTEwLTJjNzVmNDkwODNjYQ==' + } + }, + ... + ], + next_cursor: "Y3JlYXRlZF9hdF4yMDIzLTExLTE3VDExOjQ3OjE0LjQ0NyswMjowMHxpZF4xYTE2MTYwMS0yMzk5LTQ4MzYtYWFiMi1mNjk1ZWI2YTZhYzI" +} +``` -## Get Integration - -Returns the current integration information +### Prune records -```js -await nango.getIntegration(); -``` +Prunes record payloads from Nango's cache for a given model and connection up to a specified cursor. The payload is emptied but record metadata is retained. Payload can be restored by re-syncing the data. -With credentials +```ts +const result = await nango.pruneRecords({ + providerConfigKey: '', + connectionId: '', + model: '', + untilCursor: '' +}); -```js -await nango.getIntegration({ include: ['credentials'] }); +console.log(`Pruned ${result.count} records. More records available: ${result.has_more}`); ``` **Parameters** -See `GET /integrations/{uniqueKey}` query parameters: [documentation](/reference/backend/http-api/integration/get) - -**Response** + + + + + The integration ID. + -See `GET /integrations/{uniqueKey}` response: [documentation](/reference/backend/http-api/integration/get) + + The connection ID. + -## Manage connection metadata + + The name of the model from which to prune records. + -### Get connection metadata + + The variant of the model. When omitted, the default base variant is used. + -Returns the connection's metadata. + + The cursor up to which records should be pruned. Only records with a cursor less than or equal to this value will be pruned. + -```js -await nango.getMetadata(); -``` + + The maximum number of records to prune in this operation. + + + + -Better, you can specify the type of the metadata; +**Response** -```ts -interface CustomMetadata { - anyKey: Record; + +```json +{ + "count": 150, + "has_more": true } -const myTypedMetadata = await nango.getMetadata(); ``` -**Parameters** + + The number of records that were pruned in this operation. + -No parameters. + + Indicates whether there are more records available for pruning that match the criteria. If `true`, you must call the method again to continue pruning records. + + -**Example Response** +### Trigger sync(s) - - ```json - { - "custom_key1": "custom_value1" - } - ``` - +Triggers an additional, one-off execution of specified sync(s) for a given connection or all applicable connections if no connection is specified. -### Set connection metadata +```ts +// Simple usage - trigger sync preserving checkpoint +await nango.triggerSync('', ['SYNC_NAME1', 'SYNC_NAME2'], ''); -Set custom metadata for the connection (overrides existing metadata). +// Reset checkpoint and start fresh +await nango.triggerSync('', ['SYNC_NAME1'], '', { reset: true }); -```js -await nango.setMetadata({ 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); +// Reset checkpoint and clear all cached records +await nango.triggerSync('', ['SYNC_NAME1'], '', { reset: true, emptyCache: true }); + +// Using variants +await nango.triggerSync('', [ + { name: 'SYNC_NAME1', variant: 'VARIANT_A' }, + 'SYNC_NAME2' // Uses default base variant +], '', { reset: true }); ``` **Parameters** - - The custom metadata to store in the connection. - + + The integration ID. + + + The name of the syncs to trigger. If the array is empty, all syncs are triggered. + Each sync can be specified as either: + - A string: the sync name (uses the default base variant) + - An object: with name and variant properties to target a specific sync variant + + + The connection ID. If omitted, the sync will trigger for all relevant connections. + + + Options for triggering the sync. See the [checkpoints guide](/guides/functions/syncs/checkpoints#re-syncing-resetting-checkpoints-and-the-cache) for details on `reset` and `emptyCache`. + + + If `true`, clears the checkpoint before triggering the sync, causing it to start fresh. + + + If `true`, deletes all cached records associated with the sync before triggering. Must be used with `reset: true`. + + + **Response** Empty response. -### Edit connection metadata +### Start schedule for sync(s) -Edit custom metadata for the connection. Only overrides & adds specified properties, not the entire metadata. +Starts the schedule of specified sync(s) for a given connection or all applicable connections if no connection is specified. Upon starting the schedule, the sync will execute immediately and then continue to run at the specified frequency. If the schedule was already started, this will have no effect. -```js -await nango.updateMetadata({ 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); +```ts +// Simple usage with sync names +await nango.startSync('', ['SYNC_NAME1', 'SYNC_NAME2'], ''); + +// Using variants +await nango.startSync('', [ + { name: 'SYNC_NAME1', variant: 'VARIANT_A' }, + 'SYNC_NAME2' // Uses default base variant +], ''); ``` **Parameters** - - The custom metadata to store in the connection. - + + The integration ID. + + + The name of the syncs that should be triggered. + Each sync can be specified as either: + - A string: the sync name (uses the default base variant) + - An object: with name and variant properties to target a specific sync variant + + + The connection ID. If omitted, the sync will trigger for all relevant connections. + **Response** Empty response. -## Get the connection credentials - -Returns a specific connection with credentials. - -```js -await nango.getConnection(); -``` +### Pause schedule for sync(s) - - The response content depends on the API authentication type (OAuth 2, OAuth 1, API key, Basic auth, etc.). - +Pauses the schedule of specified sync(s) for a given connection or all applicable connections if no connection is specified. - - When you fetch the connection with this API endpoint, Nango will check if the access token has expired. If it has, it will refresh it. +```ts +// Simple usage with sync names +await nango.pauseSync('', ['SYNC_NAME1', 'SYNC_NAME2'], ''); - We recommend not caching tokens for longer than 5 minutes to ensure they are fresh. - +// Using variants +await nango.pauseSync('', [ + { name: 'SYNC_NAME1', variant: 'VARIANT_A' }, + 'SYNC_NAME2' // Uses default base variant +], ''); +``` **Parameters** - - An optional integration ID to override the one from the function context. + + The integration ID. - - An optional connection ID to override the one from the function context. + + The name of the syncs that should be paused. + Each sync can be specified as either: + - A string: the sync name (uses the default base variant) + - An object: with name and variant properties to target a specific sync variant - - - - Defaults to `false`. If `false`, the token will only be refreshed if it expires within 15 minutes. If `true`, a token refresh attempt will happen on each request. This is only useful for testing and should not be done at high traffic. - - - Defaults to `false`. If `false`, the refresh token is not included in the response, otherwise it is. In production, it is not advised to return the refresh token, for security reasons, since only the access token is needed to sign requests. - - - Defaults to `false`. If true, this will refresh the JWT token for GitHub App / Github App OAuth connections - - + + The connection ID. If omitted, the sync will pause for all relevant connections. -**Example Response** - - - ```json - { - "id": 18393, - "created_at": "2023-03-08T09:43:03.725Z", - "updated_at": "2023-03-08T09:43:03.725Z", - "provider_config_key": "github", - "connection_id": "1", - "credentials": { - "type": "OAUTH2", - "access_token": "gho_tsXLG73f....", - "refresh_token": "gho_fjofu84u9....", - "expires_at": "2024-03-08T09:43:03.725Z", - "raw": { // Raw token response from the OAuth provider: Contents vary! - "access_token": "gho_tsXLG73f....", - "refresh_token": "gho_fjofu84u9....", - "token_type": "bearer", - "scope": "public_repo,user" - } - }, - "connection_config": { - "subdomain": "myshop", - "realmId": "XXXXX", - "instance_id": "YYYYYYY" - }, - "account_id": 0, - "metadata": { - "myProperty": "yes", - "filter": "closed=true" - } - } - ``` - - -## Sync-specific helper methods - -Sync functions persist data updates to the Nango cache, which your app later fetches. See the [sync functions section](/guides/functions/syncs/sync-functions). - -### Checkpoints - -Checkpoints allow syncs to save their progress and resume from where they left off. This is useful for: -- Resuming after failures without re-fetching all data -- Tracking pagination state across sync runs -- Storing custom cursor/offset values +**Response** -To use checkpoints, define a `checkpoint` schema in your sync configuration (see [Configuration](#createsync)). For a complete guide on implementing incremental syncs with checkpoints, see the [checkpoints guide](/guides/functions/syncs/checkpoints). If you are migrating from `nango.lastSyncDate`, see the [migration guide](/guides/platform/migrations/migrate-to-checkpoints). +Empty response. -#### getCheckpoint() +### Sync status -Retrieves the current checkpoint. Returns `null` on first run or after a reset. +Get the status of specified sync(s) for a given connection or all applicable connections if no connection is specified. ```ts -const checkpoint = await nango.getCheckpoint(); -if (checkpoint) { - // Resume from checkpoint - startCursor = checkpoint.cursor; -} -``` - -**Response** - -Returns the checkpoint object matching your schema, or `null` if no checkpoint exists. - -#### saveCheckpoint() +// Simple usage with sync names +await nango.syncStatus('', ['SYNC_NAME1', 'SYNC_NAME2'], ''); -Saves the current progress. Call this after processing each batch of data to enable resumption if the sync fails. +// Using variants +await nango.syncStatus('', [ + { name: 'SYNC_NAME1', variant: 'VARIANT_A' }, + 'SYNC_NAME2' // Uses default base variant +], ''); -```ts -await nango.saveCheckpoint({ cursor: nextCursor }); +// Get all syncs +await nango.syncStatus('', '*', ''); ``` **Parameters** - - The checkpoint data matching your defined schema. - + + The integration ID. + + + Either "*" to return all syncs, or an array of syncs to fetch status for. + When using an array, each sync can be specified as either: + - A string: the sync name (uses the default base variant) + - An object: with name and variant properties to target a specific sync variant + + + The connection ID. If omitted, all connections will be surfaced. + -#### clearCheckpoint() - -Clears the checkpoint. Use at the end of a full sync so the next run starts from the first page. Checkpoints are also automatically cleared when triggering a sync with `reset: true`. - -```ts -await nango.clearCheckpoint(); -``` - -### Save records - -Upserts records to the Nango cache (i.e. create new records, update existing ones). Each record needs to contain a unique `id` field used to dedupe records. - -```js -const githubIssues: GitHubIssue[] = ...; // Fetch issues from GitHub API. +**Response** -await nango.batchSave(githubIssues, 'GitHubIssue'); + +```json +{ + "syncs": [ + { + "id": "", + "connection_id": "", + "name": "", + "variant": "", + "status": "RUNNING", + "type": "INCREMENTAL", // DEPRECATED + "finishedAt": "", + "nextScheduledSyncAt": "", + "frequency": "", + "latestResult": { + "": { + "added": , + "updated": , + "deleted": , + } + }, + "recordCount": { + "": + ... + }, + "checkpoint": { + "": "" + ... + } + } + ] +} ``` -**Parameters** - - - - The list of records to persist. - - - The model type of the records to persist. - +The `checkpoint` field contains the last saved checkpoint for the sync. Learn more about [checkpoints](/guides/functions/syncs/checkpoints). -### Delete records - -Marks records as deleted in the Nango cache. Deleted records are still returned when you fetch them, but they are marked as deleted in the record's metadata (i.e. soft delete). - - -This does not remove cached payloads. - -`nango.batchDelete()` is used to mark records as deleted in Nango because they were deleted on the external API. Nango may still keep the last-known payload so your customer can react to the deletion event. - -If you want to permanently remove data from Nango storage for cost or compliance reasons, use [record pruning instead](/reference/backend/http-api/sync/prune-records). - - -To implement deletion detection in your syncs, [follow this guide](/guides/functions/syncs/deletion-detection). +### Override sync connection frequency -The only field that needs to be present in each record when calling `batchDelete` is the unique `id`; the other fields are ignored. +Override a sync's default frequency for a specific connection, or revert to the default frequency. -```js -const githubIssuesToDelete: { id: string }[] = ...; // Fetch issues to delete from GitHub API. +```ts +// For base variant +await nango.updateSyncConnectionFrequency('', 'SYNC_NAME', '', ''); -await nango.batchDelete(githubIssuesToDelete, 'GitHubIssue'); +// For a specific variant +await nango.updateSyncConnectionFrequency('', { name: 'SYNC_NAME', variant: 'VARIANT_NAME' }, '', ''); ``` **Parameters** - - The list of records to delete. - - - The model type of the records to delete. - + + The integration ID. + + + The sync to update. Can be specified as either: + - A string: the sync name (uses the default base variant) + - An object: with name and variant properties to target a specific sync variant + + + The connection ID. + + + The frequency you want to set (ex: 'every hour'). Set to `null` to revert to the default frequency. Uses the https://github.com/vercel/ms notations. See [minimum sync frequency](/guides/platform/limits#minimum-sync-frequency) for details. + -### Detect deletions automatically - -Automatically detects and marks records as deleted by comparing what existed before `trackDeletesStart` with what was saved between `trackDeletesStart` and `trackDeletesEnd`. - - -This does not remove cached payloads. - -`nango.trackDeletesStart()`/`nango.trackDeletesEnd()` are used to mark records as deleted in Nango because they were not returned by the external API. Nango may still keep the last-known payload so your customer can react to the deletion event. - -If you want to permanently remove data from Nango storage for cost or compliance reasons, use [record pruning instead](/reference/backend/http-api/sync/prune-records). - - -```js -await nango.trackDeletesStart('ModelName'); - -// ... fetch and save all records ... - -await nango.trackDeletesEnd('ModelName'); -``` - -Call `trackDeletesStart` at the beginning of your sync execution, before fetching any data. Call `trackDeletesEnd` after all records have been saved with `batchSave`. Nango will compare the records that existed before `trackDeletesStart` with those saved in the window and mark any missing records as deleted. - -**Parameters** (both functions) +**Response** - - The model type to detect deletions for. - +```json +{ + "frequency": "" +} +``` -**Important considerations:** - -- Only use within syncs that fetch the complete dataset between `trackDeletesStart` and `trackDeletesEnd` -- If your sync fails or doesn't fetch the complete dataset, avoid calling `trackDeletesEnd` as it may cause false deletions -- Records are soft deleted (marked with `_metadata.deleted = true`) and remain in the cache - - -`deleteRecordsFromPreviousExecutions` is deprecated. Use `trackDeletesStart`/`trackDeletesEnd` instead. - - -For more details on deletion detection strategies, see the [detecting deletes guide](/guides/functions/syncs/deletion-detection). - -### Update records - -Updates records in the Nango cache by merging the given data into the existing record. The `id` field is required in each record and used to determine what existing record to merge into. - -`batchUpdate` is primarily useful in webhook sync functions, where you receive partial updates from a webhook and want to merge them into the existing records. - -The merge algorithm used is a deep merge. Nested objects are merged recursively, while arrays always use the new value for the array. Any fields not present in the update record are left unchanged. - -```ts -// Create partial GitHub Issue update records with only id and state. -const githubIssues: Pick[] = ...; - -await nango.batchUpdate(githubIssues, 'GitHubIssue'); -``` +### Create sync variant -**`Take special care when using batchUpdate with records containing arrays.`** The merge algorithm does not attempt to merge arrays, but rather always uses the value of the new array. +Creates a new sync variant for a specific connection. Sync variants allow you to run multiple instances of the same sync with different configurations. ```ts -// given a an existing record: -// { id: '1', tags: [{id: 12, name: 'Dev'}, {id: 13, name: "QA"}] } -const updates: Pick[] = [ - { id: '1', tags: [{id: 14, name: 'UX'}] } -]; - -// after the update, the record will be: -// { id: '1', tags: [{id: 14, name: "UX"}] } -await nango.batchUpdate(updates, 'Issue'); +await nango.createSyncVariant({ + provider_config_key: '', + connection_id: '', + name: 'SYNC_NAME', + variant: 'VARIANT_NAME' +}); ``` **Parameters** - - The list of partial records to persist. - - - The model type of the records to persist. - + + + + The integration ID. + + + The connection ID. + + + The name of the sync. + + + The name of the variant to create. Cannot be "base" (protected name). + + + -### Get records - -Fetches records from the Nango cache by ID. Returns a Map where the keys are the requested IDs, and the values are the corresponding records. Any records that are not found will simply be absent from the map. - -Example usage: - -```ts -const records = await nango.getRecordsById(['1', '2', '3'], 'Issue'); +**Example Response** -if (records.has('1')) { - const record = records.get('1'); - await nango.log(record.title); -} else { - await nango.log('Record with id 1 not found.'); + +```json +{ + "id": "12345", + "name": "SYNC_NAME", + "variant": "VARIANT_NAME" } ``` + - - Fetching records by ID is useful when you need to update specific records with a more granular approach than [`nango.batchUpdate()`](/reference/functions/functions-sdk#update-records), which performs a deep merge. Note that `nango.batchUpdate()` is more performant than using `nango.getRecordsById()`, followed by `nango.batchSave()`. - - A common use case is when handling external webhooks, where only a partial update of a record is received from an API. - - -### Variant +### Delete sync variant -If you are using sync variants, you can access the current variant name via the `nango.variant` property. +Deletes a sync variant for a specific connection. ```ts -export default createSync({ - exec: async (nango) => { - await nango.log(`Running sync with variant: ${nango.variant}`); - - // Customize sync behavior based on variant - const res = await nango.get({ - endpoint: `/spreadsheet/${nango.variant}` - }); - - // Rest of sync implementation... - }, +await nango.deleteSyncVariant({ + provider_config_key: '', + connection_id: '', + name: 'SYNC_NAME', + variant: 'VARIANT_NAME' }); ``` -## Action-specific helper methods - -### `ActionError` - -You can use `ActionError` in an action function to return a descriptive error to your app when needed: - -```ts - -export default createAction({ - exec: async (nango) => { - // Something went wrong... +**Parameters** - throw new ActionError({ any_key: 'any_value' }); - }, -}); -``` + + + + + The integration ID. + + + The connection ID. + + + The name of the sync. + + + The name of the variant to delete. Cannot be "base" (protected name). + + + + -In this case, the response to the trigger action call will be: +**Example Response** + ```json { - "error_type": "action_script_failure", - "payload": { - "any_key": "any_value" - } + "success": true } ``` + -## Relative imports in functions - -You can import relative files into your functions to allow for code abstraction and to -maintain DRY (Don't Repeat Yourself) principles. This means you can reuse code across -different functions by importing it. The imported file must live in the `nango-integrations` -directory and can be imported in the following way: - -```ts -import { issueMapper } from '../mappers/issue-mappper'; +### Get environment variables -export default createSync({ - exec: async (nango) => { - // Fetch issues from GitHub. - const res = await nango.get({ - endpoint: '/repos/NangoHQ/interactive-demo/issues?labels=demo&sort=created&direction=asc' - }); +Retrieve the environment variables as added in the Nango dashboard. - // Persist issues to the Nango cache. - await nango.batchSave(issueMapper(res.data), 'GithubIssueDemo'); - }, -}); +```js +await nango.getEnvironmentVariables(); ``` -Note that you cannot import third-party modules at this time. Additionally, if there is a compilation error in an imported file, the entry point file will also fail to compile. - -## Pre-included Dependencies - -Some libraries are pre-included for usage in functions: - -- [zod](https://github.com/colinhacks/zod) -- [crypto / node:crypto](https://nodejs.org/api/crypto.html#crypto) -- [url / node:url](https://nodejs.org/api/url.html#url) - -Please reach out in the [community](https://nango.dev/slack) if you would like to request additional ones. +**Parameters** - - **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - +No parameters. -## Explore APIs & integrations +**Response** -Source: https://nango.dev/docs/integrations/overview.md + +```json +[ + { + "name": "MY_SECRET_KEY", + "value": "SK_373892NSHFNCOWFO..." + } +] +``` + - -Nango is the leading provider of **API access for AI agents & apps**. It is designed for developers building integrations for their users, with full flexibility. - +## Actions - - -800+ APIs & thousands of integrations. - - -We deliver them in <48h. - - -It's fast & easy. - - +### Trigger an action -## API configuration (`providers.yaml`) +Triggers an action for a connection. -Source: https://nango.dev/docs/integrations/api-configuration.md +```js +await nango.triggerAction('', '', '', { 'custom_key1': 'custom_value1' }); +``` -API configurations are listed in the `providers.yaml` file, located in the [Nango GitHub repository](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml). +**Parameters** -# Examples + + + The integration ID. + + + The connection ID. + + + The name of the action to trigger. + + + The necessary input for your action's `exec` function. + + - +**Response** - -```yaml -hubspot: - display_name: HubSpot - categories: - - marketing - - support - - crm - auth_mode: OAUTH2 - authorization_url: https://app.hubspot.com/oauth/authorize - token_url: https://api.hubapi.com/oauth/v1/token - connection_configuration: - - portalId - post_connection_script: hubspotPostConnection - webhook_routing_script: hubspotWebhookRouting - proxy: - base_url: https://api.hubapi.com - decompress: true - paginate: - type: cursor - cursor_path_in_response: paging.next.after - limit_name_in_request: limit - cursor_name_in_request: after - response_path: results - docs: https://nango.dev/docs/api-integrations/hubspot + +```json +{ + "your-properties": "The data returned by the action" +} ``` + - - - -```yaml -salesforce: - display_name: Salesforce - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://login.salesforce.com/services/oauth2/authorize - token_url: https://login.salesforce.com/services/oauth2/token - authorization_params: - prompt: consent - default_scopes: - - offline_access - token_response_metadata: - - instance_url - proxy: - base_url: ${connectionConfig.instance_url} - webhook_routing_script: salesforceWebhookRouting - post_connection_script: salesforcePostConnection - docs: https://nango.dev/docs/api-integrations/salesforce - connection_config: - instance_url: - type: string - title: Instance URL - description: The instance URL of your Salesforce account - format: uri - pattern: '^https?://.*$' -``` + +The output of an action cannot exceed 10MB. + - - - -```yaml -google: - display_name: Google - auth_mode: OAUTH2 - authorization_url: https://accounts.google.com/o/oauth2/v2/auth - token_url: https://oauth2.googleapis.com/token - authorization_params: - response_type: code - access_type: offline - prompt: consent - proxy: - base_url: https://www.googleapis.com - paginate: - type: cursor - cursor_path_in_response: nextPageToken - limit_name_in_request: maxSize - cursor_name_in_request: pageToken - response_path: items - docs: https://nango.dev/docs/api-integrations/google -``` +### Trigger an action asynchronously - - - -```yaml -notion: - display_name: Notion - categories: - - knowledge-base - - productivity - auth_mode: OAUTH2 - authorization_url: https://api.notion.com/v1/oauth/authorize - token_url: https://api.notion.com/v1/oauth/token - authorization_params: - response_type: code - owner: user - authorization_method: header - body_format: json - proxy: - retry: - after: 'Retry-After' - base_url: https://api.notion.com - headers: - 'Notion-Version': '2022-06-28' - paginate: - type: cursor - cursor_path_in_response: next_cursor - cursor_name_in_request: start_cursor - limit_name_in_request: page_size - response_path: results - docs: https://nango.dev/docs/api-integrations/notion -``` +Triggers an action asynchronously for a connection. This allows you to start an action and retrieve the results later. - - - -```yaml -linear: - display_name: Linear - categories: - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://linear.app/oauth/authorize - token_url: https://api.linear.app/oauth/token - scope_separator: ',' - authorization_params: - prompt: consent - proxy: - base_url: https://api.linear.app - disable_pkce: true - webhook_routing_script: linearWebhookRouting - post_connection_script: linearPostConnection - webhook_user_defined_secret: true - docs: https://nango.dev/docs/api-integrations/linear +```js +const { id, statusUrl } = await nango.triggerActionAsync('', '', '', { 'custom_key1': 'custom_value1' }); ``` - - - -```yaml -slack: - display_name: Slack - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://slack.com/oauth/v2/authorize - token_url: https://slack.com/api/oauth.v2.access - token_response_metadata: - - incoming_webhook.url - - incoming_webhook.channel - - incoming_webhook.channel_id - - bot_user_id - - team.id - proxy: - base_url: https://slack.com/api - paginate: - type: cursor - cursor_path_in_response: response_metadata.next_cursor - cursor_name_in_request: cursor - limit_name_in_request: limit - webhook_routing_script: slackWebhookRouting - docs: https://nango.dev/docs/api-integrations/slack -``` +**Parameters** - + + + The integration ID. + + + The connection ID. + + + The name of the action to trigger. + + + The necessary input for your action's `exec` function. + + - +**Response** -# All configuration fields + +```json +{ + "id": "action_123456", + "statusUrl": "/action/action_123456" +} +``` + -Looking for the JSON Schema, find it in our [GitHub](https://github.com/NangoHQ/nango/blob/master/scripts/validation/providers/schema.json) +### Get async action result - - Allows to extend the configuration of another API. - +Retrieves the result of an asynchronous action. - - The display name of the provider, used in the UI. - +```js +// Using the id +const result = await nango.getAsyncActionResult({ id: 'action_123456' }); - - The authentication mode. Must be one of: "API_KEY", "APP", "APP_STORE", "BASIC", "NONE", "OAUTH1", "OAUTH2", "OAUTH2_CC", "CUSTOM", "TBA", "JWT", "BILL", "TWO_STEP", "SIGNATURE". - +// OR using the statusUrl +const result = await nango.getAsyncActionResult({ statusUrl: '/action/action_123456' }); +``` - - Authentication configuration. - - - The response type for authentication. - - - +**Parameters** - - The authorization method. Must be `header` - + + + + + The ID of the action to retrieve the result for. + + + The URL where the result can be retrieved. + + + + - - Query parameters of the authorization request. - - - Possible value: "offline" - - - Possible values: "auto", "force" - - - Possible value: "permanent" - - - Possible value: "never" - - - Whether to force verification - - - A unique string to be included in the request - - - Possible value: "consent" - - - The mode of the response - - - The type of the response - - - +**Response** - - The URL to get the OAuth 2 credentials from the external API. - + +```json +{ + "your-properties": "The data returned by the action" +} +``` + - - Should the `authorization_url` be encoded or not - +## Proxy - - An object containing key-value pairs for replacements in the authorization URL. - +Makes an HTTP request using the [proxy](/guides/platform/proxy-requests): - - The format of the request body. e.g: `json` - +```js +const config = { + endpoint: '/some-endpoint', + providerConfigKey: '', + connectionId: '' +}; - - An array of strings representing the categories of the API. - +await nango.get(config); // GET request +await nango.post(config); // POST request +await nango.put(config); // PUT request +await nango.patch(config); // PATCH request +await nango.delete(config); // DELETE request +``` - - An array of strings representing the `connectionConfig` that are automatically populated by post-connection functions. - +**Parameters** - - Whether to decode the URL or not. - + + + + + The endpoint of the request. + + + The integration ID (for credential injection). + + + The connection ID (for credential injection). + + + The headers of the request. + + + The query parameters of the request. + + + The body of the request. + + + The number of retries in case of failure (with exponential back-off). Optional, default 0. + + + Array of additional status codes to retry a request in addition to the 5xx, 429, ECONNRESET, ETIMEDOUT, and ECONNABORTED + + + The API base URL. Can be omitted if the base URL is configured for this API in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml). + + + Override the decompress option when making requests. Optional, defaults to false + + + The type of the response. + + + + - - The minimum list of scopes that are necessary to connect to the API. - +**Response** - - Disables the [PKCE](https://oauth.net/2/pkce/) extension to the Authorization Code flow. - + +The response from the external API is passed back to you exactly as Nango gets it: +- response code +- response headers +- response body + - - The URL to the developer API documentation. - +## Providers - - The URL to the end user documentation (e.g: how to connect). - +### List all providers - - The name of the script to run after a connection is established. - +Returns a list of providers. - - Proxy configuration for the API. - - - The base URL for the API. - - - Whether to decompress the response. - - - Headers to be sent with each request. - - - Pagination configuration. - - - The name of the cursor parameter in the request. - - - The path to the cursor value in the response. - - - The name of the limit parameter in the request. - - - The rel attribute of the link header for pagination. - - - The path to the link in the response body. - - - The name of the offset parameter in the request. - - - The method to calculate the offset in the request. Must be one of: "per-page" or "by-response-size". Optional parameter that defaults to "by-response-size". - - - The starting value for the offset. - - - The path to the paginated data in the response. - - - The type of pagination. Must be one of: "link", "cursor", "offset". - - - - - Query parameters to be sent with each request. - - - Retry configuration. - - - The name of the rate-limit header, e.g. `after: 'X-Rate-Limit-Reset'` - - - The name of the rate-limit header, e.g. `at: 'x-ratelimit-reset'` - - - - - Configure a HTTP call to verify if credentials are valid, only used for API Key and Basic auth. - - - The HTTP method for verification. Must be either "GET" or "POST". - - - The endpoint for verification. - - - Override the base URL for verification. - - - Headers for the verification request. - - - - - +```js +await nango.listProviders() +``` - - The metadata to capture from the callback request. - +**Example Response** - - The URL used for refreshing the access token. Defaults to the `token_url` - + +```json +{ + "data": [ + { + "name": "posthog", + "categories": ["dev-tools"], + "auth_mode": "API_KEY", + "proxy": { + "base_url": "https://api.posthog.com", + }, + "docs": "https://nango.dev/docs/api-integrations/posthog" + } + ] +} +``` + - - Parameters used for refreshing the access token. - - - The grant type for refreshing the token. Must be "refresh_token". - - - +### Get a provider - - An object containing request parameters to pass to an authorization request. - +Returns a specific provider. - - The URL for making API an authorization request. - +```js +await nango.getProvider({ provider: }) +``` - - The separator used between scopes in the authorization request. - Defaults to space, but some APIs sur `,` or `+`. - +**Example Response** - - The signature method used for OAuth 1.0. Must be either "HMAC-SHA1" or "PLAINTEXT". - + +```json +{ + "data": { + "name": "posthog", + "categories": ["dev-tools"], + "auth_mode": "API_KEY", + "proxy": { + "base_url": "https://api.posthog.com", + }, + "docs": "https://nango.dev/docs/api-integrations/posthog" + } +} +``` + - - A buffer time (in seconds) before the token expiration to trigger a refresh. - +### Get provider templates - - Parameters used for obtaining the access token. - - - The grant type for obtaining the token. Must be either "authorization_code" or "client_credentials". - - - Additional request information for obtaining the token. - - - +Returns the function templates available for a provider. - - The authentication method used for token requests. Must be either "basic" or "custom". - +```js +await nango.getProviderTemplates({ provider: }) +``` - - The unit of time for token expiration. Must be "milliseconds". - +**Parameters** - - An array of strings representing metadata from the token response that will be saved in `connection.metadata`. - + + + The provider name. + + - - The URL to get the OAuth 2 credentials from the external API. - +**Example Response** - - Should the `token_url` be encoded or not - + +```json +{ + "data": [ + { + "type": "action", + "name": "create-issue", + "description": "Create a GitHub issue", + "returns": ["GithubIssue"], + "json_schema": null + } + ] +} +``` + - - Wether the webhook secret is set by the user. - +## Webhooks from Nango - - Specifies a script to handle external [webhooks](/getting-started/use-cases/webhooks-from-external-apis). - +### Verify Webhook Signature - - Specifies a fragment to be appended to the authorization URL, typically used to modify the redirection flow or pass additional information in the URL before the query parameters. - +Asserts that a Webhook is coming from Nango's backend. Verification uses `webhookSigningKey` when the client is constructed with one, otherwise it falls back to `secretKey`. On environments created after 2026-04-20 (or any environment that later rotated its API key), the signing key differs from the API key, so construct the client with `webhookSigningKey` (from **Environment Settings > Webhooks > Signing key**). - - The list of properties available in `${connectionConfig}` and their validation. - - - - - The type of this value. Must be "string". - - - The title of this value. - - - The description of this value. - - - An example of valid value to display in a UI. - - - A regex pattern for the credential. - - - The special format of this value (e.g: `hostname`, `uri`) - - - The order in which this field should be displayed in a UI - - - The documentation section relative to `docs_connect` - - - - - +```js +const nango = new Nango({ + apiKey: '', + webhookSigningKey: '' +}); - - The list of credentials and their validation, only filed if necessary (e.g: API_KEY, BASIC) - - - - - The type of the credential. Must be "string". - - - The title of the credential. - - - The description of the credential. - - - An example of the credential. - - - A pattern for the credential. - - - The format of the credential. - - - The documentation section for the credential. - - - - - +async (req, res) => { + const isValid = nango.verifyIncomingWebhookRequest(req.body, req.headers); +} +``` **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). -## Contribute or request an API - -Source: https://nango.dev/docs/integrations/contribute-or-request-api.md -Description: Add support for a new API to Nango +## Python -## Option 1: Request a new API (most popular) +Source: https://nango.dev/docs/reference/backend/backend-sdk/python.md -The easiest way to add a new API is to request it from the Nango team. +--- +title: 'Python' +sidebarTitle: 'Python' +icon: 'python' +--- + +Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. -If you have a shared Slack channel with Nango, send your request there. Otherwise, post in the `#request-a-new-api` channel of the [community](https://nango.dev/slack). +## Java -We'll deliver them according to the SLAs on our [pricing page](https://www.nango.dev/pricing). +Source: https://nango.dev/docs/reference/backend/backend-sdk/java.md -## Option 2: Contribute a new API yourself +--- +title: 'Java' +sidebarTitle: 'Java' +icon: 'java' +--- + +Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. -To contribute a new API, follow the steps below and check out past [PRs](https://github.com/NangoHQ/nango/pulls?q=is%3Apr+is%3Aclosed) starting with `feat(integrations)` for examples. +## Ruby -### Pre-requisites +Source: https://nango.dev/docs/reference/backend/backend-sdk/ruby.md -- You have access to a test account for the API -- The API is publicly accessible -- The API is of type HTTP or SOAP +--- +title: 'Ruby' +sidebarTitle: 'Ruby' +icon: 'gem' +--- + +Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. -Nango supports all authorization types (OAuth, API key, basic), including custom ones. +## Go -### Add an API configuration +Source: https://nango.dev/docs/reference/backend/backend-sdk/go.md -Fork the [repo](https://github.com/NangoHQ/nango) and edit the API configurations file ([providers.yaml](https://nango.dev/providers-yaml)). See the [API configuration reference](/integrations/api-configuration) for the available fields. +--- +title: 'Go' +sidebarTitle: 'Go' +icon: 'golang' +--- + +Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. -You can test the configuration of your new provider with this command: +## Rust -```sh -npx tsx scripts/validation/providers/validate.ts -``` +Source: https://nango.dev/docs/reference/backend/backend-sdk/rust.md -### Test the API +--- +title: 'Rust' +sidebarTitle: 'Rust' +icon: 'rust' +--- + +Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. -To test your new provider, go to the `nango` repo root and run: +## Php -```bash -docker compose up -``` +Source: https://nango.dev/docs/reference/backend/backend-sdk/php.md - - You can modify the ports in the `docker-compose.yaml` file if there are conflicts with - other local services on your host machine. - +--- +title: 'PHP' +sidebarTitle: 'PHP' +icon: 'php' +--- + +Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. -When you are ready to test your API: +## Functions Cli -**Create an integration** +Source: https://nango.dev/docs/reference/functions/functions-cli.md -Open the [local Nango UI](http://localhost:3003) in your browser and add a new integration with your freshly added API. +--- +title: 'Functions CLI' +sidebarTitle: 'Functions CLI' +icon: 'terminal' +description: "Full reference of the CLI available to implement, test & deploy Nango Functions." +--- + +### Install the Nango CLI + +Install the Nango CLI globally: +```bash +npm install nango -g +``` + +In the folder where you want your integration folder (e.g. root of your project), run: +```bash +nango init nango-integrations +``` + +This creates the `./nango-integrations` folder with some initial configuration and an example +sync script. The `nango-integrations` directory looks like this: +``` +nango-integrations/ +β”œβ”€β”€ .env +β”œβ”€β”€ index.ts +└── demo-github-integration # this is the integration unique ID and must match an integration ID in the UI + └── syncs/ + └── github-issue-example.ts +``` + +### CLI Authentication + +Add the following env vars. We recommend that you have a `.env` file in `./nango-integrations`: +```bash +NANGO_SECRET_KEY_PROD='' +NANGO_SECRET_KEY_DEV='' +``` + +Get your `prod` and `dev` secret keys from [Environment Settings > API Keys](https://app.nango.dev/environment-settings#api-keys) (toggle between the `prod` and `dev` environment in the left nav bar). + + +For self-hosting, set the `NANGO_HOSTPORT` env variable to `http://localhost:3003` (for local development) or your instance's URL. + + +## All CLI commands & command details + +Check out all CLI commands by running: +```bash +nango +``` + +Get details about a specific command by running: +```bash +nango [command] --help +``` + +## Interactive Mode + +The Nango CLI includes an interactive mode that prompts you for missing arguments. For example, if you run `nango create` without specifying the function type, integration, or name, the CLI will prompt you for them. + +This mode is enabled by default when you're in an interactive terminal session. + +### Usage Examples + +**Interactive Usage:** + +If you run a command without all the required arguments, the CLI will prompt you for them. + +```bash +# Running "nango create" without arguments +$ nango create + +? What type of function do you want to create? +❯ sync + action + on-event +``` + +**Non-Interactive (Explicit) Usage:** + +You can provide all arguments upfront to bypass the interactive prompts. This is ideal for scripting. + +```bash +nango create --sync --integration my-api --name get-contacts +``` + +### Disabling Interactive Mode + +You can disable interactive mode in two ways: + +1. **Using a flag:** Pass the `--no-interactive` flag to any command. + ```bash + nango create --no-interactive + ``` +2. **In a CI environment:** Interactive mode is automatically disabled when the `CI` environment variable is set. This is the standard way to detect CI/CD environments. + +### Backwards Compatibility + +Interactive mode is fully backward compatible. If you provide all the required arguments for a command, the CLI will not prompt you for anything and will behave exactly as it did before. + +## Flags & environment variables + +Global command flags: + +```bash +# Command flag to auto-confirm all prompts (useful for CI). +# Note: Destructive changes (like removing a sync or renaming a model) requires confirmation, even when --auto-confirm is set. To bypass this restriction, the --allow-destructive flag can be passed to nango deploy. +--auto-confirm + +# Command flag to disable interactive mode. +--no-interactive + +# Command flag to skip automatic package.json updates and package installs. +# Recommended in CI and monorepos where dependency updates are managed elsewhere. +--no-dependency-update +``` + +Environment variables: +```bash +# Recommendation: in a ".env" file in ./nango-integrations. + +# Authenticates the CLI (get the keys in the dashboard's Environment Settings > API Keys). +NANGO_SECRET_KEY_DEV=xxxx-xxx-xxxx +NANGO_SECRET_KEY_PROD=xxxx-xxx-xxxx + +# Nango's instance URL (OSS: change to http://localhost:3003 or your instance URL). +NANGO_HOSTPORT=https://api.nango.dev # Default value + +# How to handle CLI upgrades ("prompt", "auto" or "ignore"). +NANGO_CLI_UPGRADE_MODE=prompt # Default value + +# Whether to prompt before deployments. +# Note: Destructive changes (like removing a sync or renaming a model) requires confirmation, even when NANGO_DEPLOY_AUTO_CONFIRM is set to true. To bypass this restriction, the --allow-destructive flag can be passed to nango deploy. +NANGO_DEPLOY_AUTO_CONFIRM=false # Default value + +# Control automatic dependency updates. Set to "false" to skip installs (equivalent to --no-dependency-update). +NANGO_CLI_DEPENDENCY_UPDATE=true # Default value +``` + +## Dependency management + +For Zero YAML projects, the CLI can keep required dev dependencies (for example `nango` and related tooling) in sync and run package installation when needed. + +### `--no-dependency-update` + +Use `--no-dependency-update` to disable automatic `package.json` updates and dependency installs: + +```bash +nango deploy dev --no-dependency-update +``` + +This is especially useful when: + +- your CI pipeline should not modify files +- your monorepo manages dependencies at the workspace root +- you want full control over when `install` runs + +In CI, dependency updates are automatically disabled to avoid hanging. Passing `--no-dependency-update` explicitly is still recommended to make intent clear and silence the warning. + + +When dependency updates are disabled, Nango will not install dependencies for you. Ensure dependencies are already installed before running commands. + + +## Package manager support + +Nango supports all major JavaScript package managers. The CLI automatically detects and uses your package manager for installs. Detection works from the current directory upward (monorepo-aware), in this order: + +1. `package.json` `packageManager` field (Corepack standard) +2. lock files (`pnpm-lock.yaml`, `yarn.lock`, `bun.lockb` / `bun.lock`) +3. fallback to `npm` + +Supported managers are `npm`, `pnpm`, `yarn`, and `bun`. + + +**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + -**Create a connection** +## Functions Sdk -Create a new connection for this API in the Nango UI, completing the authorization flow. +Source: https://nango.dev/docs/reference/functions/functions-sdk.md -**Verify the connection** +--- +title: "Functions SDK" +sidebarTitle: "Functions SDK" +icon: "code" +description: "Full reference of the SDK available in Nango Functions." +--- + +## Examples + + + + ```ts + import { createSync } from 'nango'; + + const githubIssueDemoSchema = z.object({ ... }); + type GithubIssueDemo = z.infer; + + export default createSync({ + description: `Fetches the Github issues from all a user's repositories.`, + version: '1.0.0', + frequency: 'every hour', + autoStart: true, + metadata: z.void(), + models: { + GithubIssueDemo: githubIssueDemoSchema + }, + + exec: async (nango) => { + // Mark the start of deletion tracking + await nango.trackDeletesStart('GithubIssueDemo'); + + // Fetch issues from GitHub. + const res = await nango.get({ + endpoint: '/repos/NangoHQ/interactive-demo/issues?labels=demo&sort=created&direction=asc' + }); + + // Map issues to your preferred schema. + const issues: GithubIssueDemo[] = res.data.map(({ id, title, html_url }: any) => { + return { id, title, url: html_url }; + }); + + // Persist issues to the Nango cache. + await nango.batchSave(issues, 'GithubIssueDemo'); + + // Detect and mark deleted records + await nango.trackDeletesEnd('GithubIssueDemo'); + }, + }); + ``` + + + ```ts + import { createAction } from 'nango'; + import { GithubCreateIssueInput, GithubCreateIssueResult } from '../../models.js'; + + export default createAction({ + description: `Create an issue in GitHub`, + version: '1.0.0', + input: GithubCreateIssueInput, + output: GithubCreateIssueResult, + + exec: async (nango, input) => { + // Create a GitHub issue. + const res = await nango.post({ + endpoint: '/repos/NangoHQ/interactive-demo/issues', + data: { + title: `[demo] ${input.title}`, + body: `The body of the issue.`, + labels: ['automatic'] + } + }); + + // Send response. + return { url: res.data.html_url, status: res.status }; + }, + }); + ``` + + + +Read more about [integration functions](/guides/functions/functions-guide) to understand what role they play in Nango. + +## Configuration + +### `createSync` + + + The description of the sync. + + + + The function that will be called when the sync is triggered. + + + + The frequency of the sync. + + ```ts + frequency: 'every 1 minute', + frequency: 'every hour', + frequency: 'every 2 days' + frequency: 'every 3 week' + ``` + + + + The models that will be synced by this function. + You need one endpoint per model. + + ```ts + models: { + GithubIssue: z.object({ + id: z.string(), + }), + }, + ``` + + + + Optional schema defining the shape of checkpoint data for this sync. + Use checkpoints to save progress and avoid re-fetching all data on every run. See the [checkpoints guide](/guides/functions/syncs/checkpoints) for details. + + ```ts + checkpoint: z.object({ + cursor: z.string(), + }), + ``` + + + + If `true`, automatically runs the sync when a new connection is created. + Otherwise, it needs to be triggered via the API or Nango UI. + + + + The connection's metadata of the action. + + ```ts + metadata: z.object({ + userId: z.string(), + }); + ``` + + + + The function that will be called when a webhook is received. + + + + The integration's scopes required by the action. + This field is for documentation purposes only and currently not enforced by Nango. + + ```ts + scopes: ['read:user', 'write:user'], + ``` + + + + [DEPRECATED] Instead use `await nango.trackDeletesStart('modelName')` and `await nango.trackDeletesEnd('modelName')` inside the sync `exec` function. + + When `trackDeletes` is set to `true`, Nango automatically detects deleted records **during full syncs only** and marks them as deleted in each record’s metadata (soft delete). These records remain stored in the cache. + + When set to `false`, Nango does not mark missing records as deleted, even if they weren’t returned in the latest full syncβ€”they simply remain in the cache unchanged. + + Defaults to `false`. + + + + The version of the sync. + Use it to track changes to the sync inside Nango's UI. + + + + The webhook subscriptions of the sync. + Specify the types of webhooks the method `onWebhook` will handle. + If a webhook type is not on the list, it will not be handled. + + ```ts + webhookSubscriptions: ['*'], + ``` + + + + [DEPRECATED] Use the [`GET /records`](/reference/backend/http-api/sync/records-list) API endpoint to fetch records. + + +### `createAction` + + + The description of the sync. + + + + + + The function that will be called when the action is triggered. + + + + The input required by the action when triggering it. + + ```ts + input: z.object({ + title: z.string(), + }); + ``` + + + + The output of the action. + + ```ts + output: z.object({ + issueId: z.string(), + }); + ``` + + + + The version of the sync. + Use it to track changes to the sync inside Nango's UI. + + + + The connection's metadata of the action. + + ```ts + metadata: z.object({ + userId: z.string(), + }); + ``` + + + + The integration's scopes required by the action. + This field is for documentation purposes only and currently not enforced by Nango. + + ```ts + scopes: ['read:user', 'write:user'], + ``` + + + + [DEPRECATED] Use the [`POST /action/trigger`](/reference/backend/http-api/action/trigger) API endpoint to trigger actions. + + +### `createOnEvent` + + + The description of the sync. + + + + The event that will trigger this function. + + + + The function that will be called when the action is triggered. + + + + The version of the onEvent function. + Use it to track changes to the onEvent function inside Nango's UI. + + + + The connection's metadata of the function. + + ```ts + metadata: z.object({ + userId: z.string(), + }); + ``` + + +## HTTP requests + +Makes an HTTP request inside an integration function: + +```js +import type { ProxyConfiguration } from 'nango'; + +const config: ProxyConfiguration = { endpoint: '/some-endpoint' }; + +await nango.get(config); // GET request +await nango.post(config); // POST request +await nango.put(config); // PUT request +await nango.patch(config); // PATCH request +await nango.delete(config); // DELETE request +``` + + + Note that all HTTP requests benefit from automatic credential injection. Because functions are executed in the context of a specific integration & connection, Nango can automatically retrieve & refresh the relevant API credentials. + + +**Parameters** + + + + + + The endpoint of the request. + + + The headers of the request. + + + The query parameters of the request. + + + The body of the request. + + + The number of retries in case of failure (with exponential back-off). Optional, default 0. + + + Array of HTTP status codes to retry, in addition to those specified [below](#when-a-failed-request-is-retried). + + + The API base URL. Can be omitted if the base URL is configured for this API in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml). + + + Override the decompress option when making requests. Optional, defaults to false + + + The type of the response. + + + + + +**Response** + + + ```json + { + data: {}, // the response provided by the server + status: 200, // the HTTP status code + headers: {}, // the HTTP headers + config: {}, // the config provided for the request + request: {} // the request that generated this response + } + ``` + + + The response object is an [Axios response](https://axios-http.com/docs/res_schema). + + + +## HTTP request retries + +Configure behavior with two optional fields on your [HTTP request](#http-requests) config: [`retries`](#param-retries) and [`retryOn`](#param-retry-on). + +### When a failed request is retried + +Nango retries only when the failure looks **transient**. Exact rules depend on the integration: + +| Field | Condition for Retry | +| --- | --- | +| **Network Error** | If code is one of:
`ECONNRESET`, `ETIMEDOUT`, `ECONNABORTED`, `ECONNREFUSED`, `EHOSTUNREACH`, `EAI_AGAIN` | +| **Transient HTTP Error** | If provider specific `proxy.retry.error_code` is configured in [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml), only matching statuses are retried.

Otherwise, by default, status codes `401`, `429`, `5xx` are retried.

Additional status specified in [`retryOn`](#param-retry-on) are always retried in addition to the above statuses. | + +If nothing in the table applies, the error is **not** retried. + + +Status `401` is retryable so Nango can recover after refreshing the connection with potentially updated credentials. If a `401` happens and the connection credentials **do not change** on the next fetch, Nango treats that as a definitive authentication failure and stops performing additional retries + + +### Backoff + +Between retry attempts Nango waits with **exponential backoff**: first wait **3000ms**, then each wait doubles, capped at **10 minutes**. + +## Logging + +You can collect logs in integration functions. This is particularly useful when: + +- developing, to debug your integration functions +- in production, to collect information about integration function executions & understand issues + +Collect logs in integration functions as follows: + +```ts +await nango.log("This is a log."); // default log level is 'info' +await nango.log("This is an info log", { level: 'info' }); +await nango.log("This is a warning", { level: 'warn' }); +await nango.log("This is an error", { level: 'error' }); +``` + +### Log Levels + +Nango supports the following log levels (from most to least verbose): `debug`, `info`, `warn`, `error`, `off`. + +Only logs with a level greater than or equal to the configured logger level will surfaced in the Nango UI Logs tab. For example, if the logger level is set to `warn`, only `warn` and `error` logs will be shown. + +**Default log levels:** +- **All cloud environments**: `warn` (only warnings and errors are logged by default) +- **CLI dry-run**: `debug` (all logs are shown in the console) + +### Configuring Log Level + +You can override the default log level in two ways: + +1. **Environment variable**: Set `NANGO_LOGGER_LEVEL` in your environment settings (values: `debug`, `info`, `warn`, `error`, `off`). It will apply to all your functions running in this environment and can be overridden in functions by using `nango.setLogger(...)` + +2. **In your function code**: +```ts +nango.setLogger({ level: 'debug' }); // All logs will show in your cloud environments. It will apply to all `nango.log()` following this statement. +nango.setLogger({ level: 'off' }); // No logs will show +``` + +Logs can be viewed & searched in the Nango UI. We plan to make them exportable in the future as well. + +You can monitor your usage of custom logs in the [billing tab](https://app.nango.dev/prod/team/billing) of your Nango dashboard. + +## Environment variables + +Integration functions sometimes need to access sensitive variables that should not be revealed directly in the code. + +For this, you can define environment variables in the Nango UI, in the _Environment Settings_ tab. Then you can retrieve these environment variables from integration functions with: + +```js +await nango.getEnvironmentVariables(); +``` + +**Parameters** + +No parameters. + +**Response** + + + ```json + [ + { + "name": "MY_SECRET_KEY", + "value": "SK_373892NSHFNCOWFO..." + } + ] + ``` + + +## Trigger action + +You can call action functions from other integration functions with: + +```js +await nango.triggerAction('', { 'custom_key1': 'custom_value1' }); +``` + +**Parameters** + + + + The name of the action to trigger. + + + The necessary input for your action's `exec` function. + + + +**Response** + + + ```json + { + "your-properties": "The data returned by the action" + } + ``` + + +## Paginate through API responses + +Nango provides a helper to automatically paginate endpoint responses. + +Similar to [HTTP requests](/reference/functions/functions-sdk#http-requests), the `nango.paginate()` method takes in a `ProxyConfiguration` parameter. + +Use the `paginate` field to of the `ProxyConfiguration` to specify how the endpoint's pagination work. Here's an example for a Jira endpoint: + +```ts +const config: ProxyConfiguration = { + // https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-projects/#api-rest-api-3-project-search-get + endpoint: `/ex/jira/${cloud.cloudId}/rest/api/3/project/search`, + params: { + properties: properties + }, + paginate: { + type: 'offset', + offset_name_in_request: 'startAt', + response_path: 'values', + limit_name_in_request: 'maxResults', + limit: 50, + on_page: async ({ nextPageParam, response }) => { + await nango.log(`Next offset value = ${nextPageParam}`); + await nango.log(`Fetched ${response.data.total} records`); + }, + }, + headers: { + 'X-Atlassian-Token': 'no-check' + }, + retries: 10 +}; + +for await (const projects of nango.paginate(config)) { + const projectsToSave = toProjects(projects, cloud.baseUrl); + await nango.batchSave(projectsToSave, 'Project'); +} +``` + +As shown in the example above, use a `for` loop to iterate through the paginated results. + + + Nango has pre-configured the pagination settings for some popular APIs, so you don't have to specify them in functions. + + You can view the pre-configured pagination settings for all APIs in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) file. + + Please note that some APIs have diverging pagination strategies per endpoint, so you might still need to override pre-configured pagination settings at times. + + +The pagination helper supports 3 types of pagination: `cursor`, `link` or `offset` with the following settings: + + + + + + + + _For all pagination types._ + + The name of the parameter containing the number of items per page, in the request. Inserted in the query parameters for `GET`/`DELETE`, in the body for `POST`/`PUT`/`PATCH`. + + + _For all pagination types._ + + The maximum number of items per page. If omitted, no limit will be sent to the external endpoint, relying on the endpoint's default limit. + + + _For all pagination types._ + + The path of the field containing the results, in the response. If omitted or empty string, it defaults to the root. Use `.` for nested fields, e.g. `"results.contacts"`. + + + _For all pagination types._ + + The pagination strategy. + + + _For cursor pagination only (required)._ + + The path of the field containing the cursor for the next page, in the response. Use `.` for nested fields, e.g. `"pagination.cursor"`. + + + _For cursor pagination only (required)._ + + The name of the parameter containing the cursor for the next page, in the request. Inserted in the query parameters for `GET`/`DELETE`, in the body for `POST`/`PUT`/`PATCH`. + + + _`For link pagination (required unless link_path_in_response_body is specified).`_ + + The header containing the link to the next page, in the response. + + + _`For link pagination (required unless link_rel_in_response_header is specified).`_ + + The path of the field containing the link to the next page, in the response. Use `.` for nested fields, e.g. `"pagination.link"`. + + + _For offset pagination only (required)._ + + The name of the parameter containing the offset for the next page, in the request. Inserted in the query parameters for `GET`/`DELETE`, in the body for `POST`/`PUT`/`PATCH`. + + + _For offset pagination only (optional)._ + + The initial offset. Defaults to 0, but some APIs start at 1. + + + _For offset pagination only (optional)._ + + The offset calculation method. `by-response-size` (default) means the offset is incremented by the number of results. `per-page` means the offset is incremented by one for each page. + + + _For all pagination types (optional)._ + + A callback function that is called after each page is fetched. Useful for logging or tracking pagination progress. The callback receives the next page parameter and the full Axios response object, which includes the response data, status, headers, and request configuration. + + + + + + + You can find details on the pagination [types](https://github.com/NangoHQ/nango/blob/master/packages/runner-sdk/models.d.ts) and [logic](https://github.com/NangoHQ/nango/blob/master/packages/runner-sdk/lib/paginate.service.ts) in the code. + + + +## Get Integration + +Returns the current integration information + +```js +await nango.getIntegration(); +``` + +With credentials + +```js +await nango.getIntegration({ include: ['credentials'] }); +``` + +**Parameters** + +See `GET /integrations/{uniqueKey}` query parameters: [documentation](/reference/backend/http-api/integration/get) + +**Response** + +See `GET /integrations/{uniqueKey}` response: [documentation](/reference/backend/http-api/integration/get) + +## Manage connection metadata + +### Get connection metadata + +Returns the connection's metadata. + +```js +await nango.getMetadata(); +``` + +Better, you can specify the type of the metadata; + +```ts +interface CustomMetadata { + anyKey: Record; +} +const myTypedMetadata = await nango.getMetadata(); +``` + +**Parameters** + +No parameters. + +**Example Response** + + + ```json + { + "custom_key1": "custom_value1" + } + ``` + + +### Set connection metadata + +Set custom metadata for the connection (overrides existing metadata). + +```js +await nango.setMetadata({ 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); +``` + +**Parameters** + + + + The custom metadata to store in the connection. + + + +**Response** + +Empty response. + +### Edit connection metadata + +Edit custom metadata for the connection. Only overrides & adds specified properties, not the entire metadata. + +```js +await nango.updateMetadata({ 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); +``` + +**Parameters** + + + + The custom metadata to store in the connection. + + + +**Response** + +Empty response. + +## Get the connection credentials + +Returns a specific connection with credentials. + +```js +await nango.getConnection(); +``` + + + The response content depends on the API authentication type (OAuth 2, OAuth 1, API key, Basic auth, etc.). + + + + When you fetch the connection with this API endpoint, Nango will check if the access token has expired. If it has, it will refresh it. + + We recommend not caching tokens for longer than 5 minutes to ensure they are fresh. + + +**Parameters** + + + + An optional integration ID to override the one from the function context. + + + An optional connection ID to override the one from the function context. + + + + + Defaults to `false`. If `false`, the token will only be refreshed if it expires within 15 minutes. If `true`, a token refresh attempt will happen on each request. This is only useful for testing and should not be done at high traffic. + + + Defaults to `false`. If `false`, the refresh token is not included in the response, otherwise it is. In production, it is not advised to return the refresh token, for security reasons, since only the access token is needed to sign requests. + + + Defaults to `false`. If true, this will refresh the JWT token for GitHub App / Github App OAuth connections + + + + + +**Example Response** + + + ```json + { + "id": 18393, + "created_at": "2023-03-08T09:43:03.725Z", + "updated_at": "2023-03-08T09:43:03.725Z", + "provider_config_key": "github", + "connection_id": "1", + "credentials": { + "type": "OAUTH2", + "access_token": "gho_tsXLG73f....", + "refresh_token": "gho_fjofu84u9....", + "expires_at": "2024-03-08T09:43:03.725Z", + "raw": { // Raw token response from the OAuth provider: Contents vary! + "access_token": "gho_tsXLG73f....", + "refresh_token": "gho_fjofu84u9....", + "token_type": "bearer", + "scope": "public_repo,user" + } + }, + "connection_config": { + "subdomain": "myshop", + "realmId": "XXXXX", + "instance_id": "YYYYYYY" + }, + "account_id": 0, + "metadata": { + "myProperty": "yes", + "filter": "closed=true" + } + } + ``` + + +## Sync-specific helper methods + +Sync functions persist data updates to the Nango cache, which your app later fetches. See the [sync functions section](/guides/functions/syncs/sync-functions). + +### Checkpoints + +Checkpoints allow syncs to save their progress and resume from where they left off. This is useful for: +- Resuming after failures without re-fetching all data +- Tracking pagination state across sync runs +- Storing custom cursor/offset values + +To use checkpoints, define a `checkpoint` schema in your sync configuration (see [Configuration](#createsync)). For a complete guide on implementing incremental syncs with checkpoints, see the [checkpoints guide](/guides/functions/syncs/checkpoints). If you are migrating from `nango.lastSyncDate`, see the [migration guide](/guides/platform/migrations/migrate-to-checkpoints). + +#### getCheckpoint() + +Retrieves the current checkpoint. Returns `null` on first run or after a reset. + +```ts +const checkpoint = await nango.getCheckpoint(); +if (checkpoint) { + // Resume from checkpoint + startCursor = checkpoint.cursor; +} +``` + +**Response** + +Returns the checkpoint object matching your schema, or `null` if no checkpoint exists. + +#### saveCheckpoint() + +Saves the current progress. Call this after processing each batch of data to enable resumption if the sync fails. + +```ts +await nango.saveCheckpoint({ cursor: nextCursor }); +``` + +**Parameters** + + + + The checkpoint data matching your defined schema. + + + +#### clearCheckpoint() + +Clears the checkpoint. Use at the end of a full sync so the next run starts from the first page. Checkpoints are also automatically cleared when triggering a sync with `reset: true`. + +```ts +await nango.clearCheckpoint(); +``` + +### Save records + +Upserts records to the Nango cache (i.e. create new records, update existing ones). Each record needs to contain a unique `id` field used to dedupe records. + +```js +const githubIssues: GitHubIssue[] = ...; // Fetch issues from GitHub API. + +await nango.batchSave(githubIssues, 'GitHubIssue'); +``` + +**Parameters** + + + + The list of records to persist. + + + The model type of the records to persist. + + + +### Delete records + +Marks records as deleted in the Nango cache. Deleted records are still returned when you fetch them, but they are marked as deleted in the record's metadata (i.e. soft delete). + + +This does not remove cached payloads. + +`nango.batchDelete()` is used to mark records as deleted in Nango because they were deleted on the external API. Nango may still keep the last-known payload so your customer can react to the deletion event. + +If you want to permanently remove data from Nango storage for cost or compliance reasons, use [record pruning instead](/reference/backend/http-api/sync/prune-records). + + +To implement deletion detection in your syncs, [follow this guide](/guides/functions/syncs/deletion-detection). + +The only field that needs to be present in each record when calling `batchDelete` is the unique `id`; the other fields are ignored. + +```js +const githubIssuesToDelete: { id: string }[] = ...; // Fetch issues to delete from GitHub API. + +await nango.batchDelete(githubIssuesToDelete, 'GitHubIssue'); +``` + +**Parameters** + + + + The list of records to delete. + + + The model type of the records to delete. + + + +### Detect deletions automatically + +Automatically detects and marks records as deleted by comparing what existed before `trackDeletesStart` with what was saved between `trackDeletesStart` and `trackDeletesEnd`. + + +This does not remove cached payloads. + +`nango.trackDeletesStart()`/`nango.trackDeletesEnd()` are used to mark records as deleted in Nango because they were not returned by the external API. Nango may still keep the last-known payload so your customer can react to the deletion event. + +If you want to permanently remove data from Nango storage for cost or compliance reasons, use [record pruning instead](/reference/backend/http-api/sync/prune-records). + + +```js +await nango.trackDeletesStart('ModelName'); + +// ... fetch and save all records ... + +await nango.trackDeletesEnd('ModelName'); +``` + +Call `trackDeletesStart` at the beginning of your sync execution, before fetching any data. Call `trackDeletesEnd` after all records have been saved with `batchSave`. Nango will compare the records that existed before `trackDeletesStart` with those saved in the window and mark any missing records as deleted. + +**Parameters** (both functions) + + + + The model type to detect deletions for. + + + +**Important considerations:** + +- Only use within syncs that fetch the complete dataset between `trackDeletesStart` and `trackDeletesEnd` +- If your sync fails or doesn't fetch the complete dataset, avoid calling `trackDeletesEnd` as it may cause false deletions +- Records are soft deleted (marked with `_metadata.deleted = true`) and remain in the cache + + +`deleteRecordsFromPreviousExecutions` is deprecated. Use `trackDeletesStart`/`trackDeletesEnd` instead. + + +For more details on deletion detection strategies, see the [detecting deletes guide](/guides/functions/syncs/deletion-detection). + +### Update records + +Updates records in the Nango cache by merging the given data into the existing record. The `id` field is required in each record and used to determine what existing record to merge into. + +`batchUpdate` is primarily useful in webhook sync functions, where you receive partial updates from a webhook and want to merge them into the existing records. + +The merge algorithm used is a deep merge. Nested objects are merged recursively, while arrays always use the new value for the array. Any fields not present in the update record are left unchanged. + +```ts +// Create partial GitHub Issue update records with only id and state. +const githubIssues: Pick[] = ...; + +await nango.batchUpdate(githubIssues, 'GitHubIssue'); +``` + +**`Take special care when using batchUpdate with records containing arrays.`** The merge algorithm does not attempt to merge arrays, but rather always uses the value of the new array. + +```ts +// given a an existing record: +// { id: '1', tags: [{id: 12, name: 'Dev'}, {id: 13, name: "QA"}] } +const updates: Pick[] = [ + { id: '1', tags: [{id: 14, name: 'UX'}] } +]; + +// after the update, the record will be: +// { id: '1', tags: [{id: 14, name: "UX"}] } +await nango.batchUpdate(updates, 'Issue'); +``` + +**Parameters** + + + + The list of partial records to persist. + + + The model type of the records to persist. + + + +### Get records + +Fetches records from the Nango cache by ID. Returns a Map where the keys are the requested IDs, and the values are the corresponding records. Any records that are not found will simply be absent from the map. + +Example usage: + +```ts +const records = await nango.getRecordsById(['1', '2', '3'], 'Issue'); + +if (records.has('1')) { + const record = records.get('1'); + await nango.log(record.title); +} else { + await nango.log('Record with id 1 not found.'); +} +``` + + + Fetching records by ID is useful when you need to update specific records with a more granular approach than [`nango.batchUpdate()`](/reference/functions/functions-sdk#update-records), which performs a deep merge. Note that `nango.batchUpdate()` is more performant than using `nango.getRecordsById()`, followed by `nango.batchSave()`. + + A common use case is when handling external webhooks, where only a partial update of a record is received from an API. + + +### Variant + +If you are using sync variants, you can access the current variant name via the `nango.variant` property. + +```ts +export default createSync({ + exec: async (nango) => { + await nango.log(`Running sync with variant: ${nango.variant}`); + + // Customize sync behavior based on variant + const res = await nango.get({ + endpoint: `/spreadsheet/${nango.variant}` + }); + + // Rest of sync implementation... + }, +}); +``` + +## Action-specific helper methods + +### `ActionError` + +You can use `ActionError` in an action function to return a descriptive error to your app when needed: + +```ts + +export default createAction({ + exec: async (nango) => { + // Something went wrong... + + throw new ActionError({ any_key: 'any_value' }); + }, +}); +``` + +In this case, the response to the trigger action call will be: + +```json +{ + "error_type": "action_script_failure", + "payload": { + "any_key": "any_value" + } +} +``` + +## Relative imports in functions + +You can import relative files into your functions to allow for code abstraction and to +maintain DRY (Don't Repeat Yourself) principles. This means you can reuse code across +different functions by importing it. The imported file must live in the `nango-integrations` +directory and can be imported in the following way: + +```ts +import { issueMapper } from '../mappers/issue-mappper'; + +export default createSync({ + exec: async (nango) => { + // Fetch issues from GitHub. + const res = await nango.get({ + endpoint: '/repos/NangoHQ/interactive-demo/issues?labels=demo&sort=created&direction=asc' + }); + + // Persist issues to the Nango cache. + await nango.batchSave(issueMapper(res.data), 'GithubIssueDemo'); + }, +}); +``` + +Note that you cannot import third-party modules at this time. Additionally, if there is a compilation error in an imported file, the entry point file will also fail to compile. + +## Pre-included Dependencies + +Some libraries are pre-included for usage in functions: + +- [zod](https://github.com/colinhacks/zod) +- [crypto / node:crypto](https://nodejs.org/api/crypto.html#crypto) +- [url / node:url](https://nodejs.org/api/url.html#url) + +Please reach out in the [community](https://nango.dev/slack) if you would like to request additional ones. + + + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + -If all goes well, you should see your new connection in the _Connections_ tab. Check the connection details and make sure that the credentials are valid. +## Overview -### Document the API +Source: https://nango.dev/docs/integrations/overview.md -Add a `.mdx` file (e.g. `github.mdx`) for your API to the `docs/integrations/all` folder. Check out [other examples](/integrations/overview) to fill out the content of the documentation page. +--- +title: Explore APIs & integrations +sidebarTitle: Overview +--- + + +Nango is the leading provider of **API access for AI agents & apps**. It is designed for developers building integrations for their users, with full flexibility. + + + + +800+ APIs & thousands of integrations. + + +We deliver them in <48h. + + +It's fast & easy. + + -Reference the page in the `docs/docs.json` file in the `800+ APIs & Integrations` group in alphabetical order. +## Api Configuration -### Submit a pull request +Source: https://nango.dev/docs/integrations/api-configuration.md -Verify your contribution against [examples of past contributions](https://github.com/NangoHQ/nango/pulls?q=is%3Apr+is%3Amerged+label%3Aapi+). +--- +title: 'API configuration (`providers.yaml`)' +sidebarTitle: 'API configuration' +--- + +API configurations are listed in the `providers.yaml` file, located in the [Nango GitHub repository](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml). + +# Examples + + + + +```yaml +hubspot: + display_name: HubSpot + categories: + - marketing + - support + - crm + auth_mode: OAUTH2 + authorization_url: https://app.hubspot.com/oauth/authorize + token_url: https://api.hubapi.com/oauth/v1/token + connection_configuration: + - portalId + post_connection_script: hubspotPostConnection + webhook_routing_script: hubspotWebhookRouting + proxy: + base_url: https://api.hubapi.com + decompress: true + paginate: + type: cursor + cursor_path_in_response: paging.next.after + limit_name_in_request: limit + cursor_name_in_request: after + response_path: results + docs: https://nango.dev/docs/api-integrations/hubspot +``` + + + + +```yaml +salesforce: + display_name: Salesforce + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://login.salesforce.com/services/oauth2/authorize + token_url: https://login.salesforce.com/services/oauth2/token + authorization_params: + prompt: consent + default_scopes: + - offline_access + token_response_metadata: + - instance_url + proxy: + base_url: ${connectionConfig.instance_url} + webhook_routing_script: salesforceWebhookRouting + post_connection_script: salesforcePostConnection + docs: https://nango.dev/docs/api-integrations/salesforce + connection_config: + instance_url: + type: string + title: Instance URL + description: The instance URL of your Salesforce account + format: uri + pattern: '^https?://.*$' +``` + + + + +```yaml +google: + display_name: Google + auth_mode: OAUTH2 + authorization_url: https://accounts.google.com/o/oauth2/v2/auth + token_url: https://oauth2.googleapis.com/token + authorization_params: + response_type: code + access_type: offline + prompt: consent + proxy: + base_url: https://www.googleapis.com + paginate: + type: cursor + cursor_path_in_response: nextPageToken + limit_name_in_request: maxSize + cursor_name_in_request: pageToken + response_path: items + docs: https://nango.dev/docs/api-integrations/google +``` + + + + +```yaml +notion: + display_name: Notion + categories: + - knowledge-base + - productivity + auth_mode: OAUTH2 + authorization_url: https://api.notion.com/v1/oauth/authorize + token_url: https://api.notion.com/v1/oauth/token + authorization_params: + response_type: code + owner: user + authorization_method: header + body_format: json + proxy: + retry: + after: 'Retry-After' + base_url: https://api.notion.com + headers: + 'Notion-Version': '2022-06-28' + paginate: + type: cursor + cursor_path_in_response: next_cursor + cursor_name_in_request: start_cursor + limit_name_in_request: page_size + response_path: results + docs: https://nango.dev/docs/api-integrations/notion +``` + + + + +```yaml +linear: + display_name: Linear + categories: + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://linear.app/oauth/authorize + token_url: https://api.linear.app/oauth/token + scope_separator: ',' + authorization_params: + prompt: consent + proxy: + base_url: https://api.linear.app + disable_pkce: true + webhook_routing_script: linearWebhookRouting + post_connection_script: linearPostConnection + webhook_user_defined_secret: true + docs: https://nango.dev/docs/api-integrations/linear +``` + + + + +```yaml +slack: + display_name: Slack + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://slack.com/oauth/v2/authorize + token_url: https://slack.com/api/oauth.v2.access + token_response_metadata: + - incoming_webhook.url + - incoming_webhook.channel + - incoming_webhook.channel_id + - bot_user_id + - team.id + proxy: + base_url: https://slack.com/api + paginate: + type: cursor + cursor_path_in_response: response_metadata.next_cursor + cursor_name_in_request: cursor + limit_name_in_request: limit + webhook_routing_script: slackWebhookRouting + docs: https://nango.dev/docs/api-integrations/slack +``` + + + + + +# All configuration fields + +Looking for the JSON Schema, find it in our [GitHub](https://github.com/NangoHQ/nango/blob/master/scripts/validation/providers/schema.json) + + + Allows to extend the configuration of another API. + + + + The display name of the provider, used in the UI. + + + + The authentication mode. Must be one of: "API_KEY", "APP", "APP_STORE", "BASIC", "NONE", "OAUTH1", "OAUTH2", "OAUTH2_CC", "CUSTOM", "TBA", "JWT", "BILL", "TWO_STEP", "SIGNATURE". + + + + Authentication configuration. + + + The response type for authentication. + + + + + + The authorization method. Must be `header` + + + + Query parameters of the authorization request. + + + Possible value: "offline" + + + Possible values: "auto", "force" + + + Possible value: "permanent" + + + Possible value: "never" + + + Whether to force verification + + + A unique string to be included in the request + + + Possible value: "consent" + + + The mode of the response + + + The type of the response + + + + + + The URL to get the OAuth 2 credentials from the external API. + + + + Should the `authorization_url` be encoded or not + + + + An object containing key-value pairs for replacements in the authorization URL. + + + + The format of the request body. e.g: `json` + + + + An array of strings representing the categories of the API. + + + + An array of strings representing the `connectionConfig` that are automatically populated by post-connection functions. + + + + Whether to decode the URL or not. + + + + The minimum list of scopes that are necessary to connect to the API. + + + + Disables the [PKCE](https://oauth.net/2/pkce/) extension to the Authorization Code flow. + + + + The URL to the developer API documentation. + + + + The URL to the end user documentation (e.g: how to connect). + + + + The name of the script to run after a connection is established. + + + + Proxy configuration for the API. + + + The base URL for the API. + + + Whether to decompress the response. + + + Headers to be sent with each request. + + + Pagination configuration. + + + The name of the cursor parameter in the request. + + + The path to the cursor value in the response. + + + The name of the limit parameter in the request. + + + The rel attribute of the link header for pagination. + + + The path to the link in the response body. + + + The name of the offset parameter in the request. + + + The method to calculate the offset in the request. Must be one of: "per-page" or "by-response-size". Optional parameter that defaults to "by-response-size". + + + The starting value for the offset. + + + The path to the paginated data in the response. + + + The type of pagination. Must be one of: "link", "cursor", "offset". + + + + + Query parameters to be sent with each request. + + + Retry configuration. + + + The name of the rate-limit header, e.g. `after: 'X-Rate-Limit-Reset'` + + + The name of the rate-limit header, e.g. `at: 'x-ratelimit-reset'` + + + + + Configure a HTTP call to verify if credentials are valid, only used for API Key and Basic auth. + + + The HTTP method for verification. Must be either "GET" or "POST". + + + The endpoint for verification. + + + Override the base URL for verification. + + + Headers for the verification request. + + + + + + + + The metadata to capture from the callback request. + + + + The URL used for refreshing the access token. Defaults to the `token_url` + + + + Parameters used for refreshing the access token. + + + The grant type for refreshing the token. Must be "refresh_token". + + + + + + An object containing request parameters to pass to an authorization request. + + + + The URL for making API an authorization request. + + + + The separator used between scopes in the authorization request. + Defaults to space, but some APIs sur `,` or `+`. + + + + The signature method used for OAuth 1.0. Must be either "HMAC-SHA1" or "PLAINTEXT". + + + + A buffer time (in seconds) before the token expiration to trigger a refresh. + + + + Parameters used for obtaining the access token. + + + The grant type for obtaining the token. Must be either "authorization_code" or "client_credentials". + + + Additional request information for obtaining the token. + + + + + + The authentication method used for token requests. Must be either "basic" or "custom". + + + + The unit of time for token expiration. Must be "milliseconds". + + + + An array of strings representing metadata from the token response that will be saved in `connection.metadata`. + + + + The URL to get the OAuth 2 credentials from the external API. + + + + Should the `token_url` be encoded or not + + + + + Wether the webhook secret is set by the user. + + + + Specifies a script to handle external [webhooks](/getting-started/use-cases/webhooks-from-external-apis). + + + + Specifies a fragment to be appended to the authorization URL, typically used to modify the redirection flow or pass additional information in the URL before the query parameters. + + + + The list of properties available in `${connectionConfig}` and their validation. + + + + + The type of this value. Must be "string". + + + The title of this value. + + + The description of this value. + + + An example of valid value to display in a UI. + + + A regex pattern for the credential. + + + The special format of this value (e.g: `hostname`, `uri`) + + + The order in which this field should be displayed in a UI + + + The documentation section relative to `docs_connect` + + + + + + + + The list of credentials and their validation, only filed if necessary (e.g: API_KEY, BASIC) + + + + + The type of the credential. Must be "string". + + + The title of the credential. + + + The description of the credential. + + + An example of the credential. + + + A pattern for the credential. + + + The format of the credential. + + + The documentation section for the credential. + + + + + + + +**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + -Submit a pull request with the new provider to the Nango repo. Please thoroughly test the integration\! +## Contribute Or Request Api -Thanks a lot for your contribution\!\! ❀️ +Source: https://nango.dev/docs/integrations/contribute-or-request-api.md - - **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). +--- +title: 'Contribute or request an API' +sidebarTitle: 'Contribute or request an API' +description: 'Add support for a new API to Nango' +--- + +## Option 1: Request a new API (most popular) + +The easiest way to add a new API is to request it from the Nango team. + +If you have a shared Slack channel with Nango, send your request there. Otherwise, post in the `#request-a-new-api` channel of the [community](https://nango.dev/slack). + +We'll deliver them according to the SLAs on our [pricing page](https://www.nango.dev/pricing). + +## Option 2: Contribute a new API yourself + +To contribute a new API, follow the steps below and check out past [PRs](https://github.com/NangoHQ/nango/pulls?q=is%3Apr+is%3Aclosed) starting with `feat(integrations)` for examples. + +### Pre-requisites + +- You have access to a test account for the API +- The API is publicly accessible +- The API is of type HTTP or SOAP + +Nango supports all authorization types (OAuth, API key, basic), including custom ones. + +### Add an API configuration + +Fork the [repo](https://github.com/NangoHQ/nango) and edit the API configurations file ([providers.yaml](https://nango.dev/providers-yaml)). See the [API configuration reference](/integrations/api-configuration) for the available fields. + +You can test the configuration of your new provider with this command: + +```sh +npx tsx scripts/validation/providers/validate.ts +``` + +### Test the API + +To test your new provider, go to the `nango` repo root and run: + +```bash +docker compose up +``` + + + You can modify the ports in the `docker-compose.yaml` file if there are conflicts with + other local services on your host machine. + + +When you are ready to test your API: + +**Create an integration** + +Open the [local Nango UI](http://localhost:3003) in your browser and add a new integration with your freshly added API. + +**Create a connection** + +Create a new connection for this API in the Nango UI, completing the authorization flow. + +**Verify the connection** + +If all goes well, you should see your new connection in the _Connections_ tab. Check the connection details and make sure that the credentials are valid. + +### Document the API + +Add a `.mdx` file (e.g. `github.mdx`) for your API to the `docs/integrations/all` folder. Check out [other examples](/integrations/overview) to fill out the content of the documentation page. + +Reference the page in the `docs/docs.json` file in the `800+ APIs & Integrations` group in alphabetical order. + +### Submit a pull request + +Verify your contribution against [examples of past contributions](https://github.com/NangoHQ/nango/pulls?q=is%3Apr+is%3Amerged+label%3Aapi+). + +Submit a pull request with the new provider to the Nango repo. Please thoroughly test the integration\! + +Thanks a lot for your contribution\!\! ❀️ + + + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). ## API and Integration Catalog diff --git a/docs/llms.txt b/docs/llms.txt index 25a5d3a23d..6e0024a652 100644 --- a/docs/llms.txt +++ b/docs/llms.txt @@ -11,135 +11,135 @@ Use provider URLs by replacing `{slug}` with a slug from the API catalog: ## Getting started -- [Introduction](https://nango.dev/docs/getting-started/intro-to-nango.md): Build product integrations with AI, using code you control and infrastructure built for scale. -- [Quickstart](https://nango.dev/docs/getting-started/quickstart.md): Authorize an API and run your first Nango function -- [Coding agent setup](https://nango.dev/docs/getting-started/coding-agent-setup.md): Give coding agents the Nango docs, core skill, and MCP tools. -- [Use cases: Tool calling for AI agents](https://nango.dev/docs/getting-started/use-cases/tool-calling.md): Give agents scoped, observable access to external APIs through Nango action functions. -- [Use cases: Sync external API data](https://nango.dev/docs/getting-started/use-cases/syncs.md): Keep external API data fresh for your product, RAG pipeline, or change-detection workflow. -- [Use cases: Run external API operations](https://nango.dev/docs/getting-started/use-cases/actions.md): Use Nango functions to read, write, and automate external APIs on demand. -- [Use cases: Process external webhooks](https://nango.dev/docs/getting-started/use-cases/webhooks-from-external-apis.md): Receive provider webhooks through Nango, then forward or process them with functions. -- [Use cases: Build a unified API](https://nango.dev/docs/getting-started/use-cases/unified-apis.md): Normalize several external APIs behind your own stable product interface. -- [Use cases: Customize per customer](https://nango.dev/docs/getting-started/use-cases/customer-configuration.md): Adapt integration behavior for each customer without forking code. -- [Use cases: React to connection lifecycle events](https://nango.dev/docs/getting-started/use-cases/implement-event-handler.md): Run integration logic when a connection is validated, created, or deleted. -- [Use cases: Sample app](https://nango.dev/docs/getting-started/use-cases/sample-app.md): A practical demonstration of integrating Nango in your codebase. +- [Intro To Nango](https://nango.dev/docs/getting-started/intro-to-nango.md) +- [Quickstart](https://nango.dev/docs/getting-started/quickstart.md) +- [Coding Agent Setup](https://nango.dev/docs/getting-started/coding-agent-setup.md) +- [Use cases: Tool Calling](https://nango.dev/docs/getting-started/use-cases/tool-calling.md) +- [Use cases: Syncs](https://nango.dev/docs/getting-started/use-cases/syncs.md) +- [Use cases: Actions](https://nango.dev/docs/getting-started/use-cases/actions.md) +- [Use cases: Webhooks From External Apis](https://nango.dev/docs/getting-started/use-cases/webhooks-from-external-apis.md) +- [Use cases: Unified Apis](https://nango.dev/docs/getting-started/use-cases/unified-apis.md) +- [Use cases: Customer Configuration](https://nango.dev/docs/getting-started/use-cases/customer-configuration.md) +- [Use cases: Implement Event Handler](https://nango.dev/docs/getting-started/use-cases/implement-event-handler.md) +- [Use cases: Sample App](https://nango.dev/docs/getting-started/use-cases/sample-app.md) ## Guides -- [Auth: Auth guide](https://nango.dev/docs/guides/auth/auth-guide.md): Let your users connect external APIs to your agents & apps. -- [Auth: Share a connect link](https://nango.dev/docs/guides/auth/share-connect-link.md): Generate a short-lived connect link and share it with your end user. +- [Auth: Auth Guide](https://nango.dev/docs/guides/auth/auth-guide.md) +- [Auth: Share Connect Link](https://nango.dev/docs/guides/auth/share-connect-link.md) - [Auth: Connection tags, configuration, and metadata](https://nango.dev/docs/guides/auth/connection-tags-configuration-metadata.md): Use tags, connection configuration, and metadata for the right connection-level data. -- [Auth: Customize Connect UI](https://nango.dev/docs/guides/auth/customize-connect-ui.md): Guide to branding Nango Connect UI, overriding setup links, or building a headless auth flow with your own UI. -- [Auth: Token refreshing & validity](https://nango.dev/docs/guides/auth/token-refreshing.md): How Nango handles OAuth token refresh and what to do when tokens are revoked. +- [Auth: Customize Connect Ui](https://nango.dev/docs/guides/auth/customize-connect-ui.md) +- [Auth: Token Refreshing](https://nango.dev/docs/guides/auth/token-refreshing.md) - [Functions: Functions guide](https://nango.dev/docs/guides/functions/functions-guide.md): Understand Nango Functions and choose the right way to start using them. -- [Functions: Sync functions: Sync function guide](https://nango.dev/docs/guides/functions/syncs/sync-functions.md): Build sync functions that keep external API data fresh and consumable by your app. -- [Functions: Sync functions: Sync efficiency](https://nango.dev/docs/guides/functions/syncs/sync-efficiency.md): Build sync functions that replicate external datasets without wasting API calls, memory, or compute. -- [Functions: Sync functions: Checkpoints](https://nango.dev/docs/guides/functions/syncs/checkpoints.md): Save progress mid-run, resume after failures, and turn full syncs into incremental ones. -- [Functions: Sync functions: Records cache](https://nango.dev/docs/guides/functions/syncs/records-cache.md): How Nango stores synced records, detects changes, and lets your app fetch deltas via cursors. -- [Functions: Sync functions: Deletion detection](https://nango.dev/docs/guides/functions/syncs/deletion-detection.md): Surface deletes from the external API β€” even when the API itself doesn't expose them cleanly. -- [Functions: Sync functions: Real-time syncs with webhooks](https://nango.dev/docs/guides/functions/syncs/realtime-syncs.md): Combine webhooks from external APIs with periodic polling for a reliable, real-time stream of changes. -- [Functions: Sync functions: Sync partitioning](https://nango.dev/docs/guides/functions/syncs/sync-partitioning.md): Spawn multiple independent sync processes inside a single connection β€” one per mailbox, drive folder, Slack channel, repo, or any other partition. -- [Functions: Action functions](https://nango.dev/docs/guides/functions/action-functions.md): Build Action functions that your app, backend jobs, or agents can call on demand. -- [Functions: Webhook functions](https://nango.dev/docs/guides/functions/webhook-functions.md): Process external API webhooks inside Nango functions. -- [Functions: Event functions](https://nango.dev/docs/guides/functions/event-functions.md): Run function logic automatically when Nango connection lifecycle events happen. -- [Functions: Tool calling & MCP](https://nango.dev/docs/guides/functions/tool-calling.md): Expose Nango action functions to agents, LLM SDKs, and MCP clients. -- [Functions: Storage](https://nango.dev/docs/guides/functions/storage.md): Use connection metadata as the default storage for function parameters and per-customer configuration. -- [Functions: Function logging](https://nango.dev/docs/guides/functions/logging.md): Use function logs for local debugging, cloud observability, and production troubleshooting. -- [Functions: Rate limits](https://nango.dev/docs/guides/functions/rate-limits.md): Guide on how to handle API rate limits from external APIs. -- [Functions: Data validation](https://nango.dev/docs/guides/functions/data-validation.md): How to validate data in your functions and in your app -- [Functions: Testing integrations](https://nango.dev/docs/guides/functions/testing.md): How to test your Nango integrations using dry runs, mocks, and snapshots -- [Functions: CI/CD for Nango Functions](https://nango.dev/docs/guides/functions/ci-cd.md): How to integrate Nango Function deployments into your CI/CD pipeline. -- [Functions: Unified APIs with functions](https://nango.dev/docs/guides/functions/unified-apis.md): Build provider-specific functions behind one stable model and operation surface. -- [Platform: Observability](https://nango.dev/docs/guides/platform/observability.md): How Nango helps you with observability for your integrations +- [Functions: Sync functions: Sync Functions](https://nango.dev/docs/guides/functions/syncs/sync-functions.md) +- [Functions: Sync functions: Sync Efficiency](https://nango.dev/docs/guides/functions/syncs/sync-efficiency.md) +- [Functions: Sync functions: Checkpoints](https://nango.dev/docs/guides/functions/syncs/checkpoints.md) +- [Functions: Sync functions: Records Cache](https://nango.dev/docs/guides/functions/syncs/records-cache.md) +- [Functions: Sync functions: Deletion Detection](https://nango.dev/docs/guides/functions/syncs/deletion-detection.md) +- [Functions: Sync functions: Realtime Syncs](https://nango.dev/docs/guides/functions/syncs/realtime-syncs.md) +- [Functions: Sync functions: Sync Partitioning](https://nango.dev/docs/guides/functions/syncs/sync-partitioning.md) +- [Functions: Action Functions](https://nango.dev/docs/guides/functions/action-functions.md) +- [Functions: Webhook Functions](https://nango.dev/docs/guides/functions/webhook-functions.md) +- [Functions: Event Functions](https://nango.dev/docs/guides/functions/event-functions.md) +- [Functions: Tool Calling](https://nango.dev/docs/guides/functions/tool-calling.md) +- [Functions: Storage](https://nango.dev/docs/guides/functions/storage.md) +- [Functions: Logging](https://nango.dev/docs/guides/functions/logging.md) +- [Functions: Rate Limits](https://nango.dev/docs/guides/functions/rate-limits.md) +- [Functions: Data Validation](https://nango.dev/docs/guides/functions/data-validation.md) +- [Functions: Testing](https://nango.dev/docs/guides/functions/testing.md) +- [Functions: Ci Cd](https://nango.dev/docs/guides/functions/ci-cd.md) +- [Functions: Unified Apis](https://nango.dev/docs/guides/functions/unified-apis.md) +- [Platform: Observability](https://nango.dev/docs/guides/platform/observability.md) - [Platform: Environments](https://nango.dev/docs/guides/platform/environments.md): Organize your integrations & data with environments -- [Platform: Limits](https://nango.dev/docs/guides/platform/limits.md): Overview of resource limits on Nango Cloud. -- [Platform: Security](https://nango.dev/docs/guides/platform/security.md): How Nango secures your API credentials and customer data. -- [Platform: Self-host Nango](https://nango.dev/docs/guides/platform/self-hosting.md): Overview of self-hosted deployments. -- [Platform: Proxy requests](https://nango.dev/docs/guides/platform/proxy-requests.md): How to use the requests proxy from Nango +- [Platform: Limits](https://nango.dev/docs/guides/platform/limits.md) +- [Platform: Security](https://nango.dev/docs/guides/platform/security.md) +- [Platform: Self Hosting](https://nango.dev/docs/guides/platform/self-hosting.md) +- [Platform: Proxy Requests](https://nango.dev/docs/guides/platform/proxy-requests.md) - [Platform: Receive webhooks from Nango](https://nango.dev/docs/guides/platform/webhooks-from-nango.md): Reference for the webhooks Nango sends to your app β€” setup, types, payloads, signature verification, and retries. -- [Platform: External webhook forwarding](https://nango.dev/docs/guides/platform/webhook-forwarding.md): Forward external API webhooks through Nango to your app, with connection attribution. -- [Platform: Common issues](https://nango.dev/docs/guides/platform/common-issues.md): Troubleshooting guide for frequent errors and how to fix them. -- [Platform: Migrations: Migrate to checkpoints](https://nango.dev/docs/guides/platform/migrations/migrate-to-checkpoints.md): Guide to migrate your sync functions from nango.lastSyncDate to the new checkpointing system. -- [Platform: Migrations: Migrate from end user](https://nango.dev/docs/guides/platform/migrations/migrate-from-end-user.md): Guide to migrate away from using end users in connections and connect sessions -- [Platform: Migrations: Migrate from public key](https://nango.dev/docs/guides/platform/migrations/migrate-from-public-key.md): Guide to migrate from using the public key (and HMAC) to a Connect session. -- [Platform: Migrations: Migrating to Zero YAML](https://nango.dev/docs/guides/platform/migrations/migrate-to-zero-yaml.md): Guide on how to migrate to Zero YAML in Nango. +- [Platform: Webhook Forwarding](https://nango.dev/docs/guides/platform/webhook-forwarding.md) +- [Platform: Common Issues](https://nango.dev/docs/guides/platform/common-issues.md) +- [Platform: Migrations: Migrate To Checkpoints](https://nango.dev/docs/guides/platform/migrations/migrate-to-checkpoints.md) +- [Platform: Migrations: Migrate From End User](https://nango.dev/docs/guides/platform/migrations/migrate-from-end-user.md) +- [Platform: Migrations: Migrate From Public Key](https://nango.dev/docs/guides/platform/migrations/migrate-from-public-key.md) +- [Platform: Migrations: Migrate To Zero Yaml](https://nango.dev/docs/guides/platform/migrations/migrate-to-zero-yaml.md) ## Reference -- [Frontend: Frontend SDK](https://nango.dev/docs/reference/frontend/frontend-sdk.md) +- [Frontend: Frontend Sdk](https://nango.dev/docs/reference/frontend/frontend-sdk.md) - [Backend: HTTP API: API keys](https://nango.dev/docs/reference/backend/http-api/api-keys.md): Manage API keys with scoped permissions for your Nango environments. - [Backend: HTTP API: Authentication](https://nango.dev/docs/reference/backend/http-api/authentication.md) -- [Backend: HTTP API: Rate limits](https://nango.dev/docs/reference/backend/http-api/rate-limits.md) -- [Backend: HTTP API: Integrations: List all integrations](https://nango.dev/docs/reference/backend/http-api/integration/list.md) -- [Backend: HTTP API: Integrations: Get an integration](https://nango.dev/docs/reference/backend/http-api/integration/get.md) -- [Backend: HTTP API: Integrations: Create an integration](https://nango.dev/docs/reference/backend/http-api/integration/create.md) -- [Backend: HTTP API: Integrations: Update an integration](https://nango.dev/docs/reference/backend/http-api/integration/update.md) -- [Backend: HTTP API: Integrations: Delete an integration](https://nango.dev/docs/reference/backend/http-api/integration/delete.md) -- [Backend: HTTP API: Connect: Create a connect session](https://nango.dev/docs/reference/backend/http-api/connect/sessions/create.md) -- [Backend: HTTP API: Connect: Create a reconnect session](https://nango.dev/docs/reference/backend/http-api/connect/sessions/reconnect.md) -- [Backend: HTTP API: Connect: Get a connect session](https://nango.dev/docs/reference/backend/http-api/connect/session/get.md) -- [Backend: HTTP API: Connect: Delete a connect session](https://nango.dev/docs/reference/backend/http-api/connect/session/delete.md) -- [Backend: HTTP API: Connections: Import a connection](https://nango.dev/docs/reference/backend/http-api/connections/post.md) -- [Backend: HTTP API: Connections: List connections](https://nango.dev/docs/reference/backend/http-api/connections/list.md) -- [Backend: HTTP API: Connections: Get connection & credentials](https://nango.dev/docs/reference/backend/http-api/connections/get.md) -- [Backend: HTTP API: Connections: Patch a connection](https://nango.dev/docs/reference/backend/http-api/connections/patch.md) -- [Backend: HTTP API: Connections: Set connection metadata](https://nango.dev/docs/reference/backend/http-api/connections/set-metadata.md) -- [Backend: HTTP API: Connections: Edit connection metadata](https://nango.dev/docs/reference/backend/http-api/connections/update-metadata.md) -- [Backend: HTTP API: Connections: Delete a connection](https://nango.dev/docs/reference/backend/http-api/connections/delete.md) +- [Backend: HTTP API: Rate Limits](https://nango.dev/docs/reference/backend/http-api/rate-limits.md) +- [Backend: HTTP API: Integrations: List](https://nango.dev/docs/reference/backend/http-api/integration/list.md) +- [Backend: HTTP API: Integrations: Get](https://nango.dev/docs/reference/backend/http-api/integration/get.md) +- [Backend: HTTP API: Integrations: Create](https://nango.dev/docs/reference/backend/http-api/integration/create.md) +- [Backend: HTTP API: Integrations: Update](https://nango.dev/docs/reference/backend/http-api/integration/update.md) +- [Backend: HTTP API: Integrations: Delete](https://nango.dev/docs/reference/backend/http-api/integration/delete.md) +- [Backend: HTTP API: Connect: Create](https://nango.dev/docs/reference/backend/http-api/connect/sessions/create.md) +- [Backend: HTTP API: Connect: Reconnect](https://nango.dev/docs/reference/backend/http-api/connect/sessions/reconnect.md) +- [Backend: HTTP API: Connect: Get](https://nango.dev/docs/reference/backend/http-api/connect/session/get.md) +- [Backend: HTTP API: Connect: Delete](https://nango.dev/docs/reference/backend/http-api/connect/session/delete.md) +- [Backend: HTTP API: Connections: Post](https://nango.dev/docs/reference/backend/http-api/connections/post.md) +- [Backend: HTTP API: Connections: List](https://nango.dev/docs/reference/backend/http-api/connections/list.md) +- [Backend: HTTP API: Connections: Get](https://nango.dev/docs/reference/backend/http-api/connections/get.md) +- [Backend: HTTP API: Connections: Patch](https://nango.dev/docs/reference/backend/http-api/connections/patch.md) +- [Backend: HTTP API: Connections: Set Metadata](https://nango.dev/docs/reference/backend/http-api/connections/set-metadata.md) +- [Backend: HTTP API: Connections: Update Metadata](https://nango.dev/docs/reference/backend/http-api/connections/update-metadata.md) +- [Backend: HTTP API: Connections: Delete](https://nango.dev/docs/reference/backend/http-api/connections/delete.md) - [Backend: HTTP API: Functions: List functions](https://nango.dev/docs/reference/backend/http-api/functions/list.md) - [Backend: HTTP API: Functions: Get a function](https://nango.dev/docs/reference/backend/http-api/functions/get.md) - [Backend: HTTP API: Functions: Get a function's source code](https://nango.dev/docs/reference/backend/http-api/functions/code.md) - [Backend: HTTP API: Functions: Delete a function](https://nango.dev/docs/reference/backend/http-api/functions/delete.md) -- [Backend: HTTP API: Functions: Compile a function](https://nango.dev/docs/reference/backend/http-api/functions/compile.md) -- [Backend: HTTP API: Functions: Dry run a function](https://nango.dev/docs/reference/backend/http-api/functions/dryruns-create.md) -- [Backend: HTTP API: Functions: Get dry run results](https://nango.dev/docs/reference/backend/http-api/functions/dryruns-get.md) -- [Backend: HTTP API: Functions: Create a function deployment](https://nango.dev/docs/reference/backend/http-api/functions/deployments.md) -- [Backend: HTTP API: Functions: Get integration functions config](https://nango.dev/docs/reference/backend/http-api/scripts/config.md) -- [Backend: HTTP API: Syncs: Get records](https://nango.dev/docs/reference/backend/http-api/sync/records-list.md) -- [Backend: HTTP API: Syncs: Prune records](https://nango.dev/docs/reference/backend/http-api/sync/prune-records.md) -- [Backend: HTTP API: Syncs: Trigger sync(s)](https://nango.dev/docs/reference/backend/http-api/sync/trigger.md) -- [Backend: HTTP API: Syncs: Start sync(s)](https://nango.dev/docs/reference/backend/http-api/sync/start.md) -- [Backend: HTTP API: Syncs: Pause sync(s)](https://nango.dev/docs/reference/backend/http-api/sync/pause.md) -- [Backend: HTTP API: Syncs: Sync status](https://nango.dev/docs/reference/backend/http-api/sync/status.md) -- [Backend: HTTP API: Syncs: Override sync connection frequency](https://nango.dev/docs/reference/backend/http-api/sync/update-connection-frequency.md) -- [Backend: HTTP API: Syncs: Get environment variables](https://nango.dev/docs/reference/backend/http-api/sync/environment-variables.md) -- [Backend: HTTP API: Syncs: Create sync variant](https://nango.dev/docs/reference/backend/http-api/sync/create-variant.md) -- [Backend: HTTP API: Syncs: Delete sync variant](https://nango.dev/docs/reference/backend/http-api/sync/delete-variant.md) -- [Backend: HTTP API: Actions: Trigger an action](https://nango.dev/docs/reference/backend/http-api/action/trigger.md) -- [Backend: HTTP API: Proxy: Proxy - GET requests](https://nango.dev/docs/reference/backend/http-api/proxy/get.md) -- [Backend: HTTP API: Proxy: Proxy - POST requests](https://nango.dev/docs/reference/backend/http-api/proxy/post.md) -- [Backend: HTTP API: Proxy: Proxy - PUT requests](https://nango.dev/docs/reference/backend/http-api/proxy/put.md) -- [Backend: HTTP API: Proxy: Proxy - PATCH requests](https://nango.dev/docs/reference/backend/http-api/proxy/patch.md) -- [Backend: HTTP API: Proxy: Proxy - DELETE requests](https://nango.dev/docs/reference/backend/http-api/proxy/delete.md) -- [Backend: HTTP API: Providers: List all providers](https://nango.dev/docs/reference/backend/http-api/providers/list.md) -- [Backend: HTTP API: Providers: Get a provider](https://nango.dev/docs/reference/backend/http-api/providers/get.md) +- [Backend: HTTP API: Functions: Compile](https://nango.dev/docs/reference/backend/http-api/functions/compile.md) +- [Backend: HTTP API: Functions: Dryruns Create](https://nango.dev/docs/reference/backend/http-api/functions/dryruns-create.md) +- [Backend: HTTP API: Functions: Dryruns Get](https://nango.dev/docs/reference/backend/http-api/functions/dryruns-get.md) +- [Backend: HTTP API: Functions: Deployments](https://nango.dev/docs/reference/backend/http-api/functions/deployments.md) +- [Backend: HTTP API: Functions: Config](https://nango.dev/docs/reference/backend/http-api/scripts/config.md) +- [Backend: HTTP API: Syncs: Records List](https://nango.dev/docs/reference/backend/http-api/sync/records-list.md) +- [Backend: HTTP API: Syncs: Prune Records](https://nango.dev/docs/reference/backend/http-api/sync/prune-records.md) +- [Backend: HTTP API: Syncs: Trigger](https://nango.dev/docs/reference/backend/http-api/sync/trigger.md) +- [Backend: HTTP API: Syncs: Start](https://nango.dev/docs/reference/backend/http-api/sync/start.md) +- [Backend: HTTP API: Syncs: Pause](https://nango.dev/docs/reference/backend/http-api/sync/pause.md) +- [Backend: HTTP API: Syncs: Status](https://nango.dev/docs/reference/backend/http-api/sync/status.md) +- [Backend: HTTP API: Syncs: Update Connection Frequency](https://nango.dev/docs/reference/backend/http-api/sync/update-connection-frequency.md) +- [Backend: HTTP API: Syncs: Environment Variables](https://nango.dev/docs/reference/backend/http-api/sync/environment-variables.md) +- [Backend: HTTP API: Syncs: Create Variant](https://nango.dev/docs/reference/backend/http-api/sync/create-variant.md) +- [Backend: HTTP API: Syncs: Delete Variant](https://nango.dev/docs/reference/backend/http-api/sync/delete-variant.md) +- [Backend: HTTP API: Actions: Trigger](https://nango.dev/docs/reference/backend/http-api/action/trigger.md) +- [Backend: HTTP API: Proxy: Get](https://nango.dev/docs/reference/backend/http-api/proxy/get.md) +- [Backend: HTTP API: Proxy: Post](https://nango.dev/docs/reference/backend/http-api/proxy/post.md) +- [Backend: HTTP API: Proxy: Put](https://nango.dev/docs/reference/backend/http-api/proxy/put.md) +- [Backend: HTTP API: Proxy: Patch](https://nango.dev/docs/reference/backend/http-api/proxy/patch.md) +- [Backend: HTTP API: Proxy: Delete](https://nango.dev/docs/reference/backend/http-api/proxy/delete.md) +- [Backend: HTTP API: Providers: List](https://nango.dev/docs/reference/backend/http-api/providers/list.md) +- [Backend: HTTP API: Providers: Get](https://nango.dev/docs/reference/backend/http-api/providers/get.md) - [Backend: HTTP API: Providers: List provider templates](https://nango.dev/docs/reference/backend/http-api/providers/templates.md) -- [Backend: HTTP API: Deprecated: List connections (deprecated)](https://nango.dev/docs/reference/backend/http-api/connection/list.md) -- [Backend: HTTP API: Deprecated: Get connection & credentials (deprecated)](https://nango.dev/docs/reference/backend/http-api/connection/get.md) -- [Backend: HTTP API: Deprecated: Import a connection (deprecated)](https://nango.dev/docs/reference/backend/http-api/connection/post.md) -- [Backend: HTTP API: Deprecated: Set connection metadata (deprecated)](https://nango.dev/docs/reference/backend/http-api/connection/set-metadata.md) -- [Backend: HTTP API: Deprecated: Set connection metadata (deprecated)](https://nango.dev/docs/reference/backend/http-api/connection/set-metadata-legacy.md) -- [Backend: HTTP API: Deprecated: Edit connection metadata (deprecated)](https://nango.dev/docs/reference/backend/http-api/connection/update-metadata.md) -- [Backend: HTTP API: Deprecated: Edit connection metadata (deprecated)](https://nango.dev/docs/reference/backend/http-api/connection/update-metadata-legacy.md) -- [Backend: HTTP API: Deprecated: Delete a connection (deprecated)](https://nango.dev/docs/reference/backend/http-api/connection/delete.md) +- [Backend: HTTP API: Deprecated: List](https://nango.dev/docs/reference/backend/http-api/connection/list.md) +- [Backend: HTTP API: Deprecated: Get](https://nango.dev/docs/reference/backend/http-api/connection/get.md) +- [Backend: HTTP API: Deprecated: Post](https://nango.dev/docs/reference/backend/http-api/connection/post.md) +- [Backend: HTTP API: Deprecated: Set Metadata](https://nango.dev/docs/reference/backend/http-api/connection/set-metadata.md) +- [Backend: HTTP API: Deprecated: Set Metadata Legacy](https://nango.dev/docs/reference/backend/http-api/connection/set-metadata-legacy.md) +- [Backend: HTTP API: Deprecated: Update Metadata](https://nango.dev/docs/reference/backend/http-api/connection/update-metadata.md) +- [Backend: HTTP API: Deprecated: Update Metadata Legacy](https://nango.dev/docs/reference/backend/http-api/connection/update-metadata-legacy.md) +- [Backend: HTTP API: Deprecated: Delete](https://nango.dev/docs/reference/backend/http-api/connection/delete.md) - [Backend: Backend SDK: Node](https://nango.dev/docs/reference/backend/backend-sdk/node.md) - [Backend: Backend SDK: Python](https://nango.dev/docs/reference/backend/backend-sdk/python.md) - [Backend: Backend SDK: Java](https://nango.dev/docs/reference/backend/backend-sdk/java.md) - [Backend: Backend SDK: Ruby](https://nango.dev/docs/reference/backend/backend-sdk/ruby.md) - [Backend: Backend SDK: Go](https://nango.dev/docs/reference/backend/backend-sdk/go.md) - [Backend: Backend SDK: Rust](https://nango.dev/docs/reference/backend/backend-sdk/rust.md) -- [Backend: Backend SDK: PHP](https://nango.dev/docs/reference/backend/backend-sdk/php.md) -- [Functions: Functions CLI](https://nango.dev/docs/reference/functions/functions-cli.md): Full reference of the CLI available to implement, test & deploy Nango Functions. -- [Functions: Functions SDK](https://nango.dev/docs/reference/functions/functions-sdk.md): Full reference of the SDK available in Nango Functions. +- [Backend: Backend SDK: Php](https://nango.dev/docs/reference/backend/backend-sdk/php.md) +- [Functions: Functions Cli](https://nango.dev/docs/reference/functions/functions-cli.md) +- [Functions: Functions Sdk](https://nango.dev/docs/reference/functions/functions-sdk.md) ## Overview -- [Explore APIs & integrations](https://nango.dev/docs/integrations/overview.md) -- [API configuration (`providers.yaml`)](https://nango.dev/docs/integrations/api-configuration.md) -- [Contribute or request an API](https://nango.dev/docs/integrations/contribute-or-request-api.md): Add support for a new API to Nango +- [Overview](https://nango.dev/docs/integrations/overview.md) +- [Api Configuration](https://nango.dev/docs/integrations/api-configuration.md) +- [Contribute Or Request Api](https://nango.dev/docs/integrations/contribute-or-request-api.md) ## APIs and integrations -- [API catalog](https://nango.dev/docs/api-catalog.txt): 889 provider slugs with canonical docs routes, auth modes, setup guides, and connect guides. +- [API catalog](https://nango.dev/docs/api-catalog.txt): 890 provider slugs with canonical docs routes, auth modes, setup guides, and connect guides. - Provider-specific pages are intentionally not expanded here so core Nango guides remain easy for agents to find. ## Resources @@ -151,5 +151,5 @@ Use provider URLs by replacing `{slug}` with a slug from the API catalog: ## Optional -- [Changelog](https://nango.dev/docs/updates/changelog.md): Important developer & product updates, including deprecations & breaking changes. +- [Changelog](https://nango.dev/docs/updates/changelog.md) diff --git a/docs/snippets/generated/attio-mcp/PreBuiltUseCases.mdx b/docs/snippets/generated/attio-mcp/PreBuiltUseCases.mdx deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/snippets/generated/humaans-io/PreBuiltTooling.mdx b/docs/snippets/generated/humaans-io/PreBuiltTooling.mdx new file mode 100644 index 0000000000..9d88b89f57 --- /dev/null +++ b/docs/snippets/generated/humaans-io/PreBuiltTooling.mdx @@ -0,0 +1,40 @@ +## Pre-built tooling + + +| Tools | Status | +| - | - | +| Pre-built authorization (API Key) | βœ… | +| Pre-built authorization UI | βœ… | +| Custom authorization UI | βœ… | +| End-user authorization guide | βœ… | +| Expired credentials detection | βœ… | + + +| Tools | Status | +| - | - | +| Pre-built integrations | 🚫 (time to contribute: <48h) | +| API unification | βœ… | +| 2-way sync | βœ… | +| Webhooks from Nango on data modifications | βœ… | +| Real-time webhooks from 3rd-party API | 🚫 (time to contribute: <48h) | +| Proxy requests | βœ… | + + +| Tools | Status | +| - | - | +| HTTP request logging | βœ… | +| End-to-end type safety | βœ… | +| Data runtime validation | βœ… | +| OpenTelemetry export | βœ… | +| Slack alerts on errors | βœ… | +| Integration status API | βœ… | + + +| Tools | Status | +| - | - | +| Create or customize use-cases | βœ… | +| Pre-configured pagination | 🚫 (time to contribute: <48h) | +| Pre-configured rate-limit handling | 🚫 (time to contribute: <48h) | +| Per-customer configurations | βœ… | + + \ No newline at end of file diff --git a/docs/snippets/generated/humaans-io/PreBuiltUseCases.mdx b/docs/snippets/generated/humaans-io/PreBuiltUseCases.mdx index 4c3a8de9e0..aa7f4345e3 100644 --- a/docs/snippets/generated/humaans-io/PreBuiltUseCases.mdx +++ b/docs/snippets/generated/humaans-io/PreBuiltUseCases.mdx @@ -1,3 +1,3 @@ _No pre-built syncs or actions available yet._ -Not seeing the integration you need? [Build your own](/guides/functions/functions-guide) independently. +Not seeing the integration you need? [Build your own](/guides/functions/functions-guide) independently. \ No newline at end of file diff --git a/docs/snippets/generated/veed/PreBuiltTooling.mdx b/docs/snippets/generated/veed/PreBuiltTooling.mdx new file mode 100644 index 0000000000..9d88b89f57 --- /dev/null +++ b/docs/snippets/generated/veed/PreBuiltTooling.mdx @@ -0,0 +1,40 @@ +## Pre-built tooling + + +| Tools | Status | +| - | - | +| Pre-built authorization (API Key) | βœ… | +| Pre-built authorization UI | βœ… | +| Custom authorization UI | βœ… | +| End-user authorization guide | βœ… | +| Expired credentials detection | βœ… | + + +| Tools | Status | +| - | - | +| Pre-built integrations | 🚫 (time to contribute: <48h) | +| API unification | βœ… | +| 2-way sync | βœ… | +| Webhooks from Nango on data modifications | βœ… | +| Real-time webhooks from 3rd-party API | 🚫 (time to contribute: <48h) | +| Proxy requests | βœ… | + + +| Tools | Status | +| - | - | +| HTTP request logging | βœ… | +| End-to-end type safety | βœ… | +| Data runtime validation | βœ… | +| OpenTelemetry export | βœ… | +| Slack alerts on errors | βœ… | +| Integration status API | βœ… | + + +| Tools | Status | +| - | - | +| Create or customize use-cases | βœ… | +| Pre-configured pagination | 🚫 (time to contribute: <48h) | +| Pre-configured rate-limit handling | 🚫 (time to contribute: <48h) | +| Per-customer configurations | βœ… | + + \ No newline at end of file diff --git a/docs/snippets/generated/veed/PreBuiltUseCases.mdx b/docs/snippets/generated/veed/PreBuiltUseCases.mdx index 4c3a8de9e0..aa7f4345e3 100644 --- a/docs/snippets/generated/veed/PreBuiltUseCases.mdx +++ b/docs/snippets/generated/veed/PreBuiltUseCases.mdx @@ -1,3 +1,3 @@ _No pre-built syncs or actions available yet._ -Not seeing the integration you need? [Build your own](/guides/functions/functions-guide) independently. +Not seeing the integration you need? [Build your own](/guides/functions/functions-guide) independently. \ No newline at end of file From ef85c9908e22a53edcb4dd0d3570802868b50de1 Mon Sep 17 00:00:00 2001 From: Sameersribot Date: Thu, 16 Jul 2026 01:09:22 +0530 Subject: [PATCH 8/8] fix(docs): restore LF line endings in llms-full.txt --- docs/llms-full.txt | 27336 +++++++++++++++++++++---------------------- 1 file changed, 13668 insertions(+), 13668 deletions(-) diff --git a/docs/llms-full.txt b/docs/llms-full.txt index 24baa3f84d..6c698fca5c 100644 --- a/docs/llms-full.txt +++ b/docs/llms-full.txt @@ -6,14850 +6,14850 @@ Source: https://nango.dev/docs/getting-started/intro-to-nango.md ---- -title: 'Introduction' -sidebarTitle: 'Introduction' -description: 'Build product integrations with AI, using code you control and infrastructure built for scale.' ---- - -## What is Nango? - -Nango is the integration layer for AI-built, code-owned product integrations. - -Your users connect external APIs through Nango. You generate and customize TypeScript functions with your favorite coding agent. Your app, backend jobs, or agents then consume those functions through Nango's API, SDKs, or MCP server. - -Nango supports [800+ APIs](/integrations/overview) and handles auth, credentials, execution, retries, rate limits, observability, environments, and tenant isolation so you can ship integrations without rebuilding the same infrastructure for every provider. - -## Why it matters - -Integration work used to mean choosing between slow custom builds and rigid pre-built connectors. - -With Nango, you can describe the integration you need, generate working code in seconds, extend coverage as customers ask for new APIs, and customize behavior per customer while keeping the implementation in code you can review, test, and version control. - -## How it works - - - - Embed Nango Auth in your product so users can connect accounts from external APIs. Nango handles OAuth, API keys, token refresh, scopes, permissions, and credential storage. - - - - Build the integration logic as Nango Functions: TypeScript functions that call provider APIs, transform data, sync records, process webhooks, or perform actions. Generate them with AI, then edit them like normal application code. - - - - Call functions from your backend, trigger them on schedules or webhooks, or expose selected action functions as tools for AI agents through schemas and MCP. - - - -Nango's two core primitives are **Auth** for connecting user accounts and **Functions** for running integration logic on production infrastructure. - -## What you can build - -Explore the main product integration use cases: - - - - Give agents scoped, observable access to external APIs through Nango action functions. - - - Keep external API data fresh for your product, RAG pipeline, or change-detection workflow. - - - Use Nango functions to read, write, and automate external APIs on demand. - - - Receive provider webhooks through Nango, then forward or process them with functions. - - - Normalize several external APIs behind your own stable product interface. - - - Adapt integration behavior for each customer without forking code. - - - -## What Nango handles - - - - OAuth flows, API keys, token refresh, scopes, provider quirks, and per-user access to external APIs. - - - Actions, syncs, webhooks, schedules, retries, rate-limit backoff, checkpoints, and resumable execution. - - - Tool schemas, MCP support, and scoped action functions your agents can call without handling provider credentials. - - - Logs, metrics, alerts, isolated environments, CI/CD workflows, tenant isolation, open-source deployment, and compliance controls. - - - -## Get started - - - - Connect your first API and make a request in minutes. - +--- +title: 'Introduction' +sidebarTitle: 'Introduction' +description: 'Build product integrations with AI, using code you control and infrastructure built for scale.' +--- + +## What is Nango? + +Nango is the integration layer for AI-built, code-owned product integrations. + +Your users connect external APIs through Nango. You generate and customize TypeScript functions with your favorite coding agent. Your app, backend jobs, or agents then consume those functions through Nango's API, SDKs, or MCP server. + +Nango supports [800+ APIs](/integrations/overview) and handles auth, credentials, execution, retries, rate limits, observability, environments, and tenant isolation so you can ship integrations without rebuilding the same infrastructure for every provider. + +## Why it matters + +Integration work used to mean choosing between slow custom builds and rigid pre-built connectors. + +With Nango, you can describe the integration you need, generate working code in seconds, extend coverage as customers ask for new APIs, and customize behavior per customer while keeping the implementation in code you can review, test, and version control. + +## How it works + + + + Embed Nango Auth in your product so users can connect accounts from external APIs. Nango handles OAuth, API keys, token refresh, scopes, permissions, and credential storage. + + + + Build the integration logic as Nango Functions: TypeScript functions that call provider APIs, transform data, sync records, process webhooks, or perform actions. Generate them with AI, then edit them like normal application code. + + + + Call functions from your backend, trigger them on schedules or webhooks, or expose selected action functions as tools for AI agents through schemas and MCP. + + + +Nango's two core primitives are **Auth** for connecting user accounts and **Functions** for running integration logic on production infrastructure. + +## What you can build + +Explore the main product integration use cases: + + + + Give agents scoped, observable access to external APIs through Nango action functions. + + + Keep external API data fresh for your product, RAG pipeline, or change-detection workflow. + + + Use Nango functions to read, write, and automate external APIs on demand. + + + Receive provider webhooks through Nango, then forward or process them with functions. + + + Normalize several external APIs behind your own stable product interface. + + + Adapt integration behavior for each customer without forking code. + + + +## What Nango handles + + + + OAuth flows, API keys, token refresh, scopes, provider quirks, and per-user access to external APIs. + + + Actions, syncs, webhooks, schedules, retries, rate-limit backoff, checkpoints, and resumable execution. + + + Tool schemas, MCP support, and scoped action functions your agents can call without handling provider credentials. + + + Logs, metrics, alerts, isolated environments, CI/CD workflows, tenant isolation, open-source deployment, and compliance controls. + + + +## Get started + + + + Connect your first API and make a request in minutes. + ## Quickstart Source: https://nango.dev/docs/getting-started/quickstart.md ---- -title: 'Quickstart' -sidebarTitle: 'πŸš€ Quickstart' -description: 'Authorize an API and run your first Nango function' ---- - -## AI-assisted quickstart - -Copy this prompt into Claude, Cursor, or another coding agent to get guided through signup, API key setup, connection authorization, and your first function call. - -
- - -
- -For skills, the docs MCP server, and other agent setup options, see [Coding agent setup](/getting-started/coding-agent-setup). - -## Manual quickstart - -The steps below show the flow end to end. This quickstart uses the GitHub API as an example, but you can choose any of the [800+ APIs](/integrations/overview). - - - - [Sign up](https://app.nango.dev/signup) for free. This quickstart uses GitHub (User OAuth), which is pre-created with integration ID `github-getting-started`. - - If you want to test another API, go to the Integrations tab > Set up new integration > pick an API. - - - - - Go to the Connections tab > Add Test Connection > pick your integration, and complete the auth flow. For the GitHub example, pick `github-getting-started`. - - Copy the connection ID and your [Nango API key](/reference/backend/http-api/api-keys) from the Environment settings tab > API Keys. For the GitHub example, the integration ID is `github-getting-started`. You will use these values in the next steps. - - - - - The fastest way to enable a function is to use a template. - - Go to the Integrations tab > open the `github-getting-started` integration > Functions sub-tab. In the functions table, turn on the toggle in the Enable column for `get-repository`. - - This is a Nango Function: it runs provider-specific code with the connected account's credentials, without exposing those credentials to your app or agent. - - - You can also [build a custom function](/guides/functions/functions-guide#build-locally-with-the-cli) in your codebase, or use the [Functions API](/guides/functions/functions-guide#build-with-the-functions-api) to let an agent turn text-defined behavior into deployed function code. - - - - - - Trigger the function from your backend: - - - - Install the SDK with `npm i @nangohq/node`, then run: - - ```typescript - import { Nango } from '@nangohq/node'; - - const nango = new Nango({ secretKey: process.env.NANGO_API_KEY! }); - - const result = await nango.triggerAction( - 'github-getting-started', - '', - 'get-repository', - { - owner: 'NangoHQ', - repo: 'nango' - } - ); - - console.log(result); - ``` - - - - ```bash - curl --request POST \ - --url https://api.nango.dev/action/trigger \ - --header 'Authorization: Bearer ' \ - --header 'Connection-Id: ' \ - --header 'Provider-Config-Key: github-getting-started' \ - --header 'Content-Type: application/json' \ - --data '{ - "action_name": "get-repository", - "input": { - "owner": "NangoHQ", - "repo": "nango" - } - }' - ``` - - - - You should receive GitHub repository details such as the repository ID, full name, visibility, default branch, and owner. - - - - - Open the Logs tab to inspect the function execution, provider request, response, and any errors. - - πŸŽ‰ You connected an API and ran your first integration function. - - - - - - - Let users connect external APIs from your product. - - - Generate, test, customize, and deploy integration code. - - - Keep external API data fresh for your product or RAG pipeline. - - - Use action functions through tool calling and MCP. - - - - - +--- +title: 'Quickstart' +sidebarTitle: 'πŸš€ Quickstart' +description: 'Authorize an API and run your first Nango function' +--- + +## AI-assisted quickstart + +Copy this prompt into Claude, Cursor, or another coding agent to get guided through signup, API key setup, connection authorization, and your first function call. + +
+ + +
+ +For skills, the docs MCP server, and other agent setup options, see [Coding agent setup](/getting-started/coding-agent-setup). + +## Manual quickstart + +The steps below show the flow end to end. This quickstart uses the GitHub API as an example, but you can choose any of the [800+ APIs](/integrations/overview). + + + + [Sign up](https://app.nango.dev/signup) for free. This quickstart uses GitHub (User OAuth), which is pre-created with integration ID `github-getting-started`. + + If you want to test another API, go to the Integrations tab > Set up new integration > pick an API. + + + + + Go to the Connections tab > Add Test Connection > pick your integration, and complete the auth flow. For the GitHub example, pick `github-getting-started`. + + Copy the connection ID and your [Nango API key](/reference/backend/http-api/api-keys) from the Environment settings tab > API Keys. For the GitHub example, the integration ID is `github-getting-started`. You will use these values in the next steps. + + + + + The fastest way to enable a function is to use a template. + + Go to the Integrations tab > open the `github-getting-started` integration > Functions sub-tab. In the functions table, turn on the toggle in the Enable column for `get-repository`. + + This is a Nango Function: it runs provider-specific code with the connected account's credentials, without exposing those credentials to your app or agent. + + + You can also [build a custom function](/guides/functions/functions-guide#build-locally-with-the-cli) in your codebase, or use the [Functions API](/guides/functions/functions-guide#build-with-the-functions-api) to let an agent turn text-defined behavior into deployed function code. + + + + + + Trigger the function from your backend: + + + + Install the SDK with `npm i @nangohq/node`, then run: + + ```typescript + import { Nango } from '@nangohq/node'; + + const nango = new Nango({ secretKey: process.env.NANGO_API_KEY! }); + + const result = await nango.triggerAction( + 'github-getting-started', + '', + 'get-repository', + { + owner: 'NangoHQ', + repo: 'nango' + } + ); + + console.log(result); + ``` + + + + ```bash + curl --request POST \ + --url https://api.nango.dev/action/trigger \ + --header 'Authorization: Bearer ' \ + --header 'Connection-Id: ' \ + --header 'Provider-Config-Key: github-getting-started' \ + --header 'Content-Type: application/json' \ + --data '{ + "action_name": "get-repository", + "input": { + "owner": "NangoHQ", + "repo": "nango" + } + }' + ``` + + + + You should receive GitHub repository details such as the repository ID, full name, visibility, default branch, and owner. + + + + + Open the Logs tab to inspect the function execution, provider request, response, and any errors. + + πŸŽ‰ You connected an API and ran your first integration function. + + + + + + + Let users connect external APIs from your product. + + + Generate, test, customize, and deploy integration code. + + + Keep external API data fresh for your product or RAG pipeline. + + + Use action functions through tool calling and MCP. + + + + + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). ## Coding Agent Setup Source: https://nango.dev/docs/getting-started/coding-agent-setup.md ---- -title: 'Coding agent setup' -sidebarTitle: '✨ Coding agent setup' -description: 'Give coding agents the Nango docs, core skill, and MCP tools.' ---- - -Coding agents can speed up Nango integration work in two places: wiring Nango into your product and building [Nango Functions](/guides/functions/functions-guide). - - -Getting started with Nango and want to use a coding agent? Check out the [AI-assisted quickstart](/getting-started/quickstart). - - -This page is about generating integrations with AI. To expose Nango integrations to your product's agents, see [Tool calling & MCP](/guides/functions/tool-calling). - - -## Docs MCP server - -Add Nango's documentation MCP server to your coding agent to allow it to research docs & examples: - -```text -https://nango.dev/docs/mcp -``` - -It is public and does not require authentication. - -## Skills - -Nango's public skills live in [NangoHQ/skills](https://github.com/NangoHQ/skills). - -Install the core skill to implement Nango integration functions: - -```bash -npx skills add NangoHQ/skills -s building-nango-functions -``` - -See the [functions guide](/guides/functions/functions-guide) for more details. - -## Just-in-time integrations - -Nango integrations are defined as code. Usually, you or your coding agent write functions in a Git repo, review them like application code, and deploy them to Nango. - -Nango also exposes a Functions API for creating integrations just in time, without asking the user to interact with a codebase. A user can describe the integration behavior in text, and an agent can turn that into function code, compile it, dry run it against a connection, and deploy it directly to Nango. - -This is useful for faster onboarding, prototypes, and dynamic product experiences where integration behavior depends on what the user needs at that moment. It blurs the line between creating and consuming integrations: at consumption time, an agent can define the behavior, validate it, and make it available through Nango. See [build with the Functions API](/guides/functions/functions-guide#build-with-the-functions-api) for the workflow and API references. - -## Other agent tools - -These resources help agents discover Nango docs, provider slugs, API shapes, and runtime tool-calling paths. - -| Tool | URL | Use it for | -| --- | --- | --- | -| Docs MCP server | `https://nango.dev/docs/mcp` | Live docs context inside coding agents. | -| `llms.txt` | `https://nango.dev/docs/llms.txt` | Compact index of core Nango docs for LLM context windows. | -| `llms-full.txt` | `https://nango.dev/docs/llms-full.txt` | Full generated docs text for deeper offline context. | -| `api-catalog.txt` | `https://nango.dev/docs/api-catalog.txt` | Provider and integration slug discovery. | +--- +title: 'Coding agent setup' +sidebarTitle: '✨ Coding agent setup' +description: 'Give coding agents the Nango docs, core skill, and MCP tools.' +--- + +Coding agents can speed up Nango integration work in two places: wiring Nango into your product and building [Nango Functions](/guides/functions/functions-guide). + + +Getting started with Nango and want to use a coding agent? Check out the [AI-assisted quickstart](/getting-started/quickstart). + + +This page is about generating integrations with AI. To expose Nango integrations to your product's agents, see [Tool calling & MCP](/guides/functions/tool-calling). + + +## Docs MCP server + +Add Nango's documentation MCP server to your coding agent to allow it to research docs & examples: + +```text +https://nango.dev/docs/mcp +``` + +It is public and does not require authentication. + +## Skills + +Nango's public skills live in [NangoHQ/skills](https://github.com/NangoHQ/skills). + +Install the core skill to implement Nango integration functions: + +```bash +npx skills add NangoHQ/skills -s building-nango-functions +``` + +See the [functions guide](/guides/functions/functions-guide) for more details. + +## Just-in-time integrations + +Nango integrations are defined as code. Usually, you or your coding agent write functions in a Git repo, review them like application code, and deploy them to Nango. + +Nango also exposes a Functions API for creating integrations just in time, without asking the user to interact with a codebase. A user can describe the integration behavior in text, and an agent can turn that into function code, compile it, dry run it against a connection, and deploy it directly to Nango. + +This is useful for faster onboarding, prototypes, and dynamic product experiences where integration behavior depends on what the user needs at that moment. It blurs the line between creating and consuming integrations: at consumption time, an agent can define the behavior, validate it, and make it available through Nango. See [build with the Functions API](/guides/functions/functions-guide#build-with-the-functions-api) for the workflow and API references. + +## Other agent tools + +These resources help agents discover Nango docs, provider slugs, API shapes, and runtime tool-calling paths. + +| Tool | URL | Use it for | +| --- | --- | --- | +| Docs MCP server | `https://nango.dev/docs/mcp` | Live docs context inside coding agents. | +| `llms.txt` | `https://nango.dev/docs/llms.txt` | Compact index of core Nango docs for LLM context windows. | +| `llms-full.txt` | `https://nango.dev/docs/llms-full.txt` | Full generated docs text for deeper offline context. | +| `api-catalog.txt` | `https://nango.dev/docs/api-catalog.txt` | Provider and integration slug discovery. | | OpenAPI spec | `https://nango.dev/docs/spec.yaml` | Exact HTTP API schemas for code generation or typed clients. | ## Tool Calling Source: https://nango.dev/docs/getting-started/use-cases/tool-calling.md ---- -title: 'Tool calling for AI agents' -sidebarTitle: 'Tool calling for AI agents' -description: 'Give agents scoped, observable access to external APIs through Nango action functions.' ---- - -AI agents become useful when they can act in the systems your users already use: HubSpot, Gmail, Slack, Linear, Notion, Salesforce, and the rest. The hard part is not just calling an API. It is OAuth, token refresh, per-user permissions, rate limits, logging, and keeping credentials out of the model loop. - -Nango handles that plumbing. Users authorize integrations through Nango, you expose selected action functions as tools, and agents call those action functions through the Nango API or the built-in MCP server. - -## When this fits - -Use Nango for AI tool calling when: - -- Your agent needs to fetch or change data in external APIs. -- Tool calls must run with each user's own credentials. -- You want logs, retries, rate-limit handling, and a deployable runtime. -- You need template action functions now, with room for custom action functions later. -- You want one MCP server URL for Nango-hosted tools. - -For RAG-style workflows where data should be replicated before the agent needs it, use [Sync external API data](/getting-started/use-cases/syncs). - -## How Nango fits in - -1. Your user authorizes an integration with Nango. -2. You enable template action functions or deploy custom action functions for allowed operations. -3. Your agent lists or receives those action functions as tools. -4. The agent asks Nango to execute an action function for the right connection. -5. Nango runs the external API call with the user's credentials and logs the execution. - -This keeps provider credentials in Nango and gives you a stable tool surface across frameworks. - -## Technical setup - -Nango supports both direct action function execution and MCP-based tool discovery. Use the technical [Tool calling & MCP](/guides/functions/tool-calling) guide for headers, transports, tool discovery, action execution, and client setup. - -## What to read next - -- [Tool calling & MCP](/guides/functions/tool-calling) - connect Nango action functions to agents, LLM SDKs, and MCP clients. -- [Action functions](/guides/functions/action-functions) - build the action functions agents can call. -- [Get integration functions config](/reference/backend/http-api/scripts/config) - list enabled action functions programmatically. -- [Functions guide](/guides/functions/functions-guide) - create, test, deploy, and trigger functions. +--- +title: 'Tool calling for AI agents' +sidebarTitle: 'Tool calling for AI agents' +description: 'Give agents scoped, observable access to external APIs through Nango action functions.' +--- + +AI agents become useful when they can act in the systems your users already use: HubSpot, Gmail, Slack, Linear, Notion, Salesforce, and the rest. The hard part is not just calling an API. It is OAuth, token refresh, per-user permissions, rate limits, logging, and keeping credentials out of the model loop. + +Nango handles that plumbing. Users authorize integrations through Nango, you expose selected action functions as tools, and agents call those action functions through the Nango API or the built-in MCP server. + +## When this fits + +Use Nango for AI tool calling when: + +- Your agent needs to fetch or change data in external APIs. +- Tool calls must run with each user's own credentials. +- You want logs, retries, rate-limit handling, and a deployable runtime. +- You need template action functions now, with room for custom action functions later. +- You want one MCP server URL for Nango-hosted tools. + +For RAG-style workflows where data should be replicated before the agent needs it, use [Sync external API data](/getting-started/use-cases/syncs). + +## How Nango fits in + +1. Your user authorizes an integration with Nango. +2. You enable template action functions or deploy custom action functions for allowed operations. +3. Your agent lists or receives those action functions as tools. +4. The agent asks Nango to execute an action function for the right connection. +5. Nango runs the external API call with the user's credentials and logs the execution. + +This keeps provider credentials in Nango and gives you a stable tool surface across frameworks. + +## Technical setup + +Nango supports both direct action function execution and MCP-based tool discovery. Use the technical [Tool calling & MCP](/guides/functions/tool-calling) guide for headers, transports, tool discovery, action execution, and client setup. + +## What to read next + +- [Tool calling & MCP](/guides/functions/tool-calling) - connect Nango action functions to agents, LLM SDKs, and MCP clients. +- [Action functions](/guides/functions/action-functions) - build the action functions agents can call. +- [Get integration functions config](/reference/backend/http-api/scripts/config) - list enabled action functions programmatically. +- [Functions guide](/guides/functions/functions-guide) - create, test, deploy, and trigger functions. - [Auth guide](/guides/auth/auth-guide) - let users authorize external APIs. ## Syncs Source: https://nango.dev/docs/getting-started/use-cases/syncs.md ---- -title: 'Sync external API data' -sidebarTitle: 'Sync external API data' -description: 'Keep external API data fresh for your product, RAG pipeline, or change-detection workflow.' ---- - -Many products need a local copy of customer data from CRMs, file stores, ticketing tools, billing systems, calendars, or communication apps. Doing this reliably means handling OAuth, polling, pagination, rate limits, retries, deletions, and missed webhooks for every provider. - -Nango gives you a function runtime for this pattern. A sync function fetches data from the external API, writes records into Nango's cache, and notifies your app when records change. Your app then reads the changed records by cursor. - -## When this fits - -Use Nango to sync external API data when you need to: - -- Keep a local database or search index updated from customer tools. -- Feed RAG pipelines with fresh external data. -- Detect changes from APIs that do not offer reliable webhooks. -- Combine polling with provider webhooks for near real-time updates. -- Sync large datasets without restarting from scratch after failures. - -For one-off reads or writes, use [Run external API operations](/getting-started/use-cases/actions). - -## How Nango fits in - -1. Your user authorizes an integration with Nango. -2. You enable a template sync function or deploy your own. -3. Nango runs the sync function on its schedule, or when a provider webhook arrives. -4. The function saves records into Nango's records cache. -5. Nango sends your app a webhook when records change. -6. Your app reads changed records with a cursor and stores them in your system. - -The same foundation works for classic data sync, indexing, RAG ingestion, and trigger-style workflows. - -## What to read next - -- [Sync functions](/guides/functions/syncs/sync-functions) - build, run, and consume sync functions end to end. -- [Records cache](/guides/functions/syncs/records-cache) - understand records, change metadata, and cursors. -- [Checkpoints](/guides/functions/syncs/checkpoints) - make long-running functions resumable and incremental. -- [Deletion detection](/guides/functions/syncs/deletion-detection) - surface deletes from external APIs. -- [Real-time syncs](/guides/functions/syncs/realtime-syncs) - combine provider webhooks with polling. -- [Sync partitioning](/guides/functions/syncs/sync-partitioning) - fan out one connection into multiple sync variants. - - - You can also pair sync functions with Action functions for two-way sync: sync reads from the external API, then call a function on demand to write changes back. +--- +title: 'Sync external API data' +sidebarTitle: 'Sync external API data' +description: 'Keep external API data fresh for your product, RAG pipeline, or change-detection workflow.' +--- + +Many products need a local copy of customer data from CRMs, file stores, ticketing tools, billing systems, calendars, or communication apps. Doing this reliably means handling OAuth, polling, pagination, rate limits, retries, deletions, and missed webhooks for every provider. + +Nango gives you a function runtime for this pattern. A sync function fetches data from the external API, writes records into Nango's cache, and notifies your app when records change. Your app then reads the changed records by cursor. + +## When this fits + +Use Nango to sync external API data when you need to: + +- Keep a local database or search index updated from customer tools. +- Feed RAG pipelines with fresh external data. +- Detect changes from APIs that do not offer reliable webhooks. +- Combine polling with provider webhooks for near real-time updates. +- Sync large datasets without restarting from scratch after failures. + +For one-off reads or writes, use [Run external API operations](/getting-started/use-cases/actions). + +## How Nango fits in + +1. Your user authorizes an integration with Nango. +2. You enable a template sync function or deploy your own. +3. Nango runs the sync function on its schedule, or when a provider webhook arrives. +4. The function saves records into Nango's records cache. +5. Nango sends your app a webhook when records change. +6. Your app reads changed records with a cursor and stores them in your system. + +The same foundation works for classic data sync, indexing, RAG ingestion, and trigger-style workflows. + +## What to read next + +- [Sync functions](/guides/functions/syncs/sync-functions) - build, run, and consume sync functions end to end. +- [Records cache](/guides/functions/syncs/records-cache) - understand records, change metadata, and cursors. +- [Checkpoints](/guides/functions/syncs/checkpoints) - make long-running functions resumable and incremental. +- [Deletion detection](/guides/functions/syncs/deletion-detection) - surface deletes from external APIs. +- [Real-time syncs](/guides/functions/syncs/realtime-syncs) - combine provider webhooks with polling. +- [Sync partitioning](/guides/functions/syncs/sync-partitioning) - fan out one connection into multiple sync variants. + + + You can also pair sync functions with Action functions for two-way sync: sync reads from the external API, then call a function on demand to write changes back. ## Actions Source: https://nango.dev/docs/getting-started/use-cases/actions.md ---- -title: 'Run external API operations' -sidebarTitle: 'Run external API operations' -description: 'Use Nango functions to read, write, and automate external APIs on demand.' ---- - -Some integration work needs to happen immediately: create a CRM contact, send a Slack message, fetch the latest account settings, or run a multi-step workflow after a user clicks a button. - -Nango handles these on-demand operations with Action functions. You write the API logic once, Nango runs it with the right connection credentials, and your app calls the function from any backend or agent framework. - -## When this fits - -Use Action functions when you need to: - -- Run reads or writes against an external API on demand. -- Hide multi-step provider workflows behind one stable interface. -- Normalize the same operation across several APIs. -- Execute bulk or rate-limited work in the background. -- Expose selected operations as tools for AI agents. - -For continuously replicated data, use [Sync external API data](/getting-started/use-cases/syncs) instead. - -## How Nango fits in - -1. Your user authorizes an integration with Nango. -2. You enable a template function or deploy your own. -3. Your app calls the function with an input payload. -4. Nango executes the provider API calls with the user's credentials. -5. Your app receives the result, or polls/listens for completion if the function runs asynchronously. - -These functions are the technical foundation behind on-demand API operations, unified APIs, and AI tool calls. - -## What to read next - -- [Functions guide](/guides/functions/functions-guide) - create, test, deploy, and trigger functions end to end. -- [Action functions](/guides/functions/action-functions) - synchronous calls, async execution, retries, and workflows. -- [Tool calling for AI agents](/getting-started/use-cases/tool-calling) - use functions as AI tools. -- [Build a unified API](/getting-started/use-cases/unified-apis) - use functions behind a normalized product API. -- [Functions SDK reference](/reference/functions/functions-sdk) - runtime methods available inside function code. - - - You can enable template functions from the [template catalog](https://www.nango.dev/templates) and skip writing code until you need custom behavior. +--- +title: 'Run external API operations' +sidebarTitle: 'Run external API operations' +description: 'Use Nango functions to read, write, and automate external APIs on demand.' +--- + +Some integration work needs to happen immediately: create a CRM contact, send a Slack message, fetch the latest account settings, or run a multi-step workflow after a user clicks a button. + +Nango handles these on-demand operations with Action functions. You write the API logic once, Nango runs it with the right connection credentials, and your app calls the function from any backend or agent framework. + +## When this fits + +Use Action functions when you need to: + +- Run reads or writes against an external API on demand. +- Hide multi-step provider workflows behind one stable interface. +- Normalize the same operation across several APIs. +- Execute bulk or rate-limited work in the background. +- Expose selected operations as tools for AI agents. + +For continuously replicated data, use [Sync external API data](/getting-started/use-cases/syncs) instead. + +## How Nango fits in + +1. Your user authorizes an integration with Nango. +2. You enable a template function or deploy your own. +3. Your app calls the function with an input payload. +4. Nango executes the provider API calls with the user's credentials. +5. Your app receives the result, or polls/listens for completion if the function runs asynchronously. + +These functions are the technical foundation behind on-demand API operations, unified APIs, and AI tool calls. + +## What to read next + +- [Functions guide](/guides/functions/functions-guide) - create, test, deploy, and trigger functions end to end. +- [Action functions](/guides/functions/action-functions) - synchronous calls, async execution, retries, and workflows. +- [Tool calling for AI agents](/getting-started/use-cases/tool-calling) - use functions as AI tools. +- [Build a unified API](/getting-started/use-cases/unified-apis) - use functions behind a normalized product API. +- [Functions SDK reference](/reference/functions/functions-sdk) - runtime methods available inside function code. + + + You can enable template functions from the [template catalog](https://www.nango.dev/templates) and skip writing code until you need custom behavior. ## Webhooks From External Apis Source: https://nango.dev/docs/getting-started/use-cases/webhooks-from-external-apis.md ---- -title: 'Process external webhooks' -sidebarTitle: 'Process external webhooks' -description: 'Receive provider webhooks through Nango, then forward or process them with functions.' ---- - -Many APIs can notify you when something changes, but each provider has its own webhook registration flow, payload shape, retries, and connection mapping. Nango gives external APIs one integration-specific webhook URL and attributes incoming events to the right connection. - -You can forward those webhooks to your app, process them in Nango functions, or combine them with sync functions for reliable near real-time data. - -## When this fits - -Use Nango for external webhooks when: - -- A provider can notify you about changes faster than polling alone. -- You need to map incoming provider webhooks to Nango connections. -- Webhooks should trigger follow-up API requests with the user's credentials. -- You want webhook events and related API calls visible in Nango logs. -- You need real-time sync behavior without relying only on provider webhooks. - -For outgoing webhooks from Nango to your app, see [Receive webhooks from Nango](/guides/platform/webhooks-from-nango). - -## How Nango fits in - -1. You register the Nango webhook URL in the provider's developer portal. -2. The provider sends events to Nango. -3. Nango attributes each event to the right integration and connection when possible. -4. Nango forwards the event to your app or routes it into a function. -5. If the event updates synced data, the function writes records to Nango's cache. - -## Common patterns - -- Forward the provider webhook payload to your app for custom handling. -- Use a webhook function to fetch the changed object and update the records cache. -- Keep a periodic sync function as reconciliation in case provider webhooks are missed. -- Register per-connection provider webhooks in an event function after authorization. - -## What to read next - -- [Webhook functions](/guides/functions/webhook-functions) - set up provider webhooks and process them in functions. -- [Webhook forwarding](/guides/platform/webhook-forwarding) - forward external API webhooks through Nango to your app. -- [Real-time syncs](/guides/functions/syncs/realtime-syncs) - combine provider webhooks with sync functions. -- [Event functions](/guides/functions/event-functions) - register provider webhooks after connection creation. -- [Receive webhooks from Nango](/guides/platform/webhooks-from-nango) - configure your app's webhook URL and verify signatures. +--- +title: 'Process external webhooks' +sidebarTitle: 'Process external webhooks' +description: 'Receive provider webhooks through Nango, then forward or process them with functions.' +--- + +Many APIs can notify you when something changes, but each provider has its own webhook registration flow, payload shape, retries, and connection mapping. Nango gives external APIs one integration-specific webhook URL and attributes incoming events to the right connection. + +You can forward those webhooks to your app, process them in Nango functions, or combine them with sync functions for reliable near real-time data. + +## When this fits + +Use Nango for external webhooks when: + +- A provider can notify you about changes faster than polling alone. +- You need to map incoming provider webhooks to Nango connections. +- Webhooks should trigger follow-up API requests with the user's credentials. +- You want webhook events and related API calls visible in Nango logs. +- You need real-time sync behavior without relying only on provider webhooks. + +For outgoing webhooks from Nango to your app, see [Receive webhooks from Nango](/guides/platform/webhooks-from-nango). + +## How Nango fits in + +1. You register the Nango webhook URL in the provider's developer portal. +2. The provider sends events to Nango. +3. Nango attributes each event to the right integration and connection when possible. +4. Nango forwards the event to your app or routes it into a function. +5. If the event updates synced data, the function writes records to Nango's cache. + +## Common patterns + +- Forward the provider webhook payload to your app for custom handling. +- Use a webhook function to fetch the changed object and update the records cache. +- Keep a periodic sync function as reconciliation in case provider webhooks are missed. +- Register per-connection provider webhooks in an event function after authorization. + +## What to read next + +- [Webhook functions](/guides/functions/webhook-functions) - set up provider webhooks and process them in functions. +- [Webhook forwarding](/guides/platform/webhook-forwarding) - forward external API webhooks through Nango to your app. +- [Real-time syncs](/guides/functions/syncs/realtime-syncs) - combine provider webhooks with sync functions. +- [Event functions](/guides/functions/event-functions) - register provider webhooks after connection creation. +- [Receive webhooks from Nango](/guides/platform/webhooks-from-nango) - configure your app's webhook URL and verify signatures. - [Sync functions](/guides/functions/syncs/sync-functions) - write changed records into Nango's cache. ## Unified Apis Source: https://nango.dev/docs/getting-started/use-cases/unified-apis.md ---- -title: 'Build a unified API' -sidebarTitle: 'Build a unified API' -description: 'Normalize several external APIs behind your own stable product interface.' ---- - -API unification means turning several provider-specific APIs into one interface your product can use consistently. For example, your app might expose one `create-contact` operation even though Salesforce, HubSpot, Attio, and Pipedrive each model contacts differently. - -Nango helps you build unified APIs with functions you control. You define the model that fits your product, then implement provider-specific functions that map to and from that model. - -## When this fits - -Use Nango for API unification when: - -- Your customers use different tools for the same business object. -- Your product wants one internal model for reads and writes. -- You need provider-specific logic without leaking it into your app. -- A pre-built unified API is too rigid for your schema, customers, or edge cases. - -Unification does not need to cover every provider feature. Often the useful path is a stable common model with explicit provider-specific extensions where needed. - -## Where unification is hard - -Some APIs expose concepts that do not map neatly to other providers. Notion's block model, customizable ATS hiring stages, or provider-specific accounting workflows may need special handling. - -Design the unified model around your product's needs, not around an abstract lowest common denominator. Expect optional fields, explicit fallbacks, and customer-specific configuration for custom fields or statuses. - -## How Nango fits in - -1. You define the model your product wants to use. -2. Each provider gets functions that translate between the provider API and that model. -3. Sync functions read external data into your model. -4. Action functions write changes back through provider-specific logic. -5. Your app calls the stable Nango function interface instead of branching across providers. - -Use [data validation](/guides/functions/data-validation) to keep provider mappings honest and catch drift close to the external API. - -## What to read next - -- [Unified APIs with functions](/guides/functions/unified-apis) - technical implementation guide for building unified models and functions. -- [Action functions](/guides/functions/action-functions) - implement unified write operations and on-demand reads. -- [Sync functions](/guides/functions/syncs/sync-functions) - read provider data into your unified model. -- [Data validation](/guides/functions/data-validation) - validate models and generate schemas. -- [Storage](/guides/functions/storage#customer-configuration-pattern) - handle custom fields and per-customer mapping. +--- +title: 'Build a unified API' +sidebarTitle: 'Build a unified API' +description: 'Normalize several external APIs behind your own stable product interface.' +--- + +API unification means turning several provider-specific APIs into one interface your product can use consistently. For example, your app might expose one `create-contact` operation even though Salesforce, HubSpot, Attio, and Pipedrive each model contacts differently. + +Nango helps you build unified APIs with functions you control. You define the model that fits your product, then implement provider-specific functions that map to and from that model. + +## When this fits + +Use Nango for API unification when: + +- Your customers use different tools for the same business object. +- Your product wants one internal model for reads and writes. +- You need provider-specific logic without leaking it into your app. +- A pre-built unified API is too rigid for your schema, customers, or edge cases. + +Unification does not need to cover every provider feature. Often the useful path is a stable common model with explicit provider-specific extensions where needed. + +## Where unification is hard + +Some APIs expose concepts that do not map neatly to other providers. Notion's block model, customizable ATS hiring stages, or provider-specific accounting workflows may need special handling. + +Design the unified model around your product's needs, not around an abstract lowest common denominator. Expect optional fields, explicit fallbacks, and customer-specific configuration for custom fields or statuses. + +## How Nango fits in + +1. You define the model your product wants to use. +2. Each provider gets functions that translate between the provider API and that model. +3. Sync functions read external data into your model. +4. Action functions write changes back through provider-specific logic. +5. Your app calls the stable Nango function interface instead of branching across providers. + +Use [data validation](/guides/functions/data-validation) to keep provider mappings honest and catch drift close to the external API. + +## What to read next + +- [Unified APIs with functions](/guides/functions/unified-apis) - technical implementation guide for building unified models and functions. +- [Action functions](/guides/functions/action-functions) - implement unified write operations and on-demand reads. +- [Sync functions](/guides/functions/syncs/sync-functions) - read provider data into your unified model. +- [Data validation](/guides/functions/data-validation) - validate models and generate schemas. +- [Storage](/guides/functions/storage#customer-configuration-pattern) - handle custom fields and per-customer mapping. - [Functions SDK reference](/reference/functions/functions-sdk) - runtime methods available inside provider-specific functions. ## Customer Configuration Source: https://nango.dev/docs/getting-started/use-cases/customer-configuration.md ---- -title: 'Customize per customer' -sidebarTitle: 'Customize per customer' -description: 'Adapt integration behavior for each customer without forking code.' ---- - -Many integrations need customer-specific behavior: custom field mappings, record filters, account IDs, feature flags, or provider-specific options. Large customers often have custom schemas in CRMs, ERPs, ticketing tools, and productivity apps, so one fixed integration path is rarely enough. - -Nango stores this configuration as metadata on each connection. Your functions read the metadata at runtime and adjust API requests, validation, transformations, or sync function schedules for that customer. - -## When this fits - -Use per-customer configuration when: - -- Customers need to map external custom fields to your product model. -- Different customers should sync different objects, folders, projects, or account scopes. -- A function needs provider-specific account context after authorization. -- You want one integration implementation with customer-specific behavior. - -Avoid adding configuration before you need it. Start with a default path, then add typed metadata when repeated customer needs appear. - -## How Nango fits in - -1. Your app collects the customer's choices during onboarding or settings. -2. Your app stores those choices on the Nango connection as metadata. -3. Nango functions read metadata while running for that connection. -4. The same function code adapts requests and transformations for each customer. - -Metadata is available to Action functions, sync functions, and event functions. - -## Common patterns - -- Fetch available custom fields with an action function, then store the customer's mapping. -- Store provider account IDs or workspace IDs discovered after authorization. -- Use metadata to filter which records a sync function should fetch. -- Start a sync function schedule only after required customer configuration exists. - -## What to read next - -- [Storage](/guides/functions/storage) - set, update, and read connection metadata from your app and functions. -- [Sync functions](/guides/functions/syncs/sync-functions) - use metadata to filter synced data. -- [Action functions](/guides/functions/action-functions) - fetch provider configuration options on demand. -- [Event functions](/guides/functions/event-functions) - initialize metadata when a connection is created. +--- +title: 'Customize per customer' +sidebarTitle: 'Customize per customer' +description: 'Adapt integration behavior for each customer without forking code.' +--- + +Many integrations need customer-specific behavior: custom field mappings, record filters, account IDs, feature flags, or provider-specific options. Large customers often have custom schemas in CRMs, ERPs, ticketing tools, and productivity apps, so one fixed integration path is rarely enough. + +Nango stores this configuration as metadata on each connection. Your functions read the metadata at runtime and adjust API requests, validation, transformations, or sync function schedules for that customer. + +## When this fits + +Use per-customer configuration when: + +- Customers need to map external custom fields to your product model. +- Different customers should sync different objects, folders, projects, or account scopes. +- A function needs provider-specific account context after authorization. +- You want one integration implementation with customer-specific behavior. + +Avoid adding configuration before you need it. Start with a default path, then add typed metadata when repeated customer needs appear. + +## How Nango fits in + +1. Your app collects the customer's choices during onboarding or settings. +2. Your app stores those choices on the Nango connection as metadata. +3. Nango functions read metadata while running for that connection. +4. The same function code adapts requests and transformations for each customer. + +Metadata is available to Action functions, sync functions, and event functions. + +## Common patterns + +- Fetch available custom fields with an action function, then store the customer's mapping. +- Store provider account IDs or workspace IDs discovered after authorization. +- Use metadata to filter which records a sync function should fetch. +- Start a sync function schedule only after required customer configuration exists. + +## What to read next + +- [Storage](/guides/functions/storage) - set, update, and read connection metadata from your app and functions. +- [Sync functions](/guides/functions/syncs/sync-functions) - use metadata to filter synced data. +- [Action functions](/guides/functions/action-functions) - fetch provider configuration options on demand. +- [Event functions](/guides/functions/event-functions) - initialize metadata when a connection is created. - [Connection metadata API](/reference/backend/http-api/connections/set-metadata) - API reference. ## Implement Event Handler Source: https://nango.dev/docs/getting-started/use-cases/implement-event-handler.md ---- -title: 'React to connection lifecycle events' -sidebarTitle: 'Connection lifecycle events' -description: 'Run integration logic when a connection is validated, created, or deleted.' ---- - -Some integration work should happen around the connection lifecycle rather than from a user action or schedule. For example, you may need to verify credentials before accepting a connection, register provider webhooks after authorization, or clean up subscriptions before a customer disconnects. - -Nango supports this with event functions. They run automatically for a specific integration and connection event. - -## When this fits - -Use event functions when you need to: - -- Validate credentials or provider permissions during connection creation. -- Register external webhook subscriptions after a connection is created. -- Fetch account context and store it as connection metadata. -- Clean up provider resources before a connection is deleted. - -These functions are not called by your app directly. Nango runs them when the configured lifecycle event occurs. - -## How Nango fits in - -1. Your user creates or deletes a connection. -2. Nango detects the lifecycle event. -3. Nango runs the event function with that connection's credentials. -4. The function validates, initializes, registers, or cleans up provider-side resources. -5. The execution appears in Nango logs. - -## What to read next - -- [Event functions](/guides/functions/event-functions) - supported events, function syntax, testing, and deployment. -- [Webhook functions](/guides/functions/webhook-functions) - register and process external webhooks. -- [Storage](/guides/functions/storage) - store account context on the connection. +--- +title: 'React to connection lifecycle events' +sidebarTitle: 'Connection lifecycle events' +description: 'Run integration logic when a connection is validated, created, or deleted.' +--- + +Some integration work should happen around the connection lifecycle rather than from a user action or schedule. For example, you may need to verify credentials before accepting a connection, register provider webhooks after authorization, or clean up subscriptions before a customer disconnects. + +Nango supports this with event functions. They run automatically for a specific integration and connection event. + +## When this fits + +Use event functions when you need to: + +- Validate credentials or provider permissions during connection creation. +- Register external webhook subscriptions after a connection is created. +- Fetch account context and store it as connection metadata. +- Clean up provider resources before a connection is deleted. + +These functions are not called by your app directly. Nango runs them when the configured lifecycle event occurs. + +## How Nango fits in + +1. Your user creates or deletes a connection. +2. Nango detects the lifecycle event. +3. Nango runs the event function with that connection's credentials. +4. The function validates, initializes, registers, or cleans up provider-side resources. +5. The execution appears in Nango logs. + +## What to read next + +- [Event functions](/guides/functions/event-functions) - supported events, function syntax, testing, and deployment. +- [Webhook functions](/guides/functions/webhook-functions) - register and process external webhooks. +- [Storage](/guides/functions/storage) - store account context on the connection. - [Functions SDK reference](/reference/functions/functions-sdk#createonevent) - `createOnEvent()` reference. ## Sample App Source: https://nango.dev/docs/getting-started/use-cases/sample-app.md ---- -title: 'Sample app' -sidebarTitle: 'Sample app' -description: 'A practical demonstration of integrating Nango in your codebase.' ---- - -The sample app contains: -- **A frontend**: lets users connect an integration using the Nango frontend SDK. -- **A backend**: listens to Nango webhooks and consumes the Nango API to read & write data. - - - - - -The sample app uses Slack, Google Drive, OneDrive for Business, and OneDrive Personal as example integrations and is showcased in this [demo video](https://youtu.be/oTpWlmnv7dM). - -### Access the repository - - - - - -
NangoHQ/sample-app
-
- - -### Run the sample app - - - - - Go to [nango.dev](https://app.nango.dev?source=sample-app) and create an account (free). - - - - Go to [Integrations](https://app.nango.dev/dev/integrations?source=sample-app) and create a Slack integration. - - Set up a Slack app: - 1. Go to [Slack Dev Center](https://api.slack.com/apps) and click **Create New App**. - 2. Select **From scratch** for a simpler flow. - 3. Enter your **App Name** and select a workspace to develop your app in, then click **Create App**. - 4. In the **Basic Information** tab, copy your **Client ID** and **Client Secret**. - 5. Go to **OAuth & Permissions** in the left sidebar. - 6. Under **Redirect URLs**, add `https://api.nango.dev/oauth/callback` and click **Save URLs**. - 7. Under **Scopes** > **Bot Token Scopes**, add: - - `users:read` - - `chat:write` - - Go back to Nango. In the _Authorization_ tab, add: - - `client_id`: from step 4 - - `client_secret`: from step 4 - - In the _Endpoints_ tab, activate `GET /users` and `POST /send-message`. - - - - Go to [Integrations](https://app.nango.dev/dev/integrations?source=sample-app) and create a Google Drive integration. - - Set up a Google Cloud project: - 1. Go to the [Google Cloud Console](https://console.cloud.google.com/) and create a new project (or select an existing one). - 2. Go to the [API Library](https://console.cloud.google.com/apis/library), search for **Google Drive API**, and click **Enable**. - 3. Go to **APIs & Services** > **OAuth consent screen** and configure it: - - Select **External** user type (or **Internal** for users within your Google Workspace organization). - - Fill in the required app information and contact information. - - Add the scope: `https://www.googleapis.com/auth/drive.readonly`. - - Add test users if using External user type. - 4. Go to **APIs & Services** > **Credentials** > **Create Credentials** > **OAuth client ID**. - 5. Select **Web application**, enter a name, and add `https://api.nango.dev/oauth/callback` under **Authorized redirect URIs**. - 6. Click **Create** and copy the **Client ID** and **Client Secret**. - 7. Copy the **Project Number** from the Google Cloud console under **IAM & Admin** > **Settings** > **Project Number**. - - Go back to the Google Drive integration in Nango. In the _Authorization_ tab, add: - - `client_id`: from step 6 - - `client_secret`: from step 6 - - `scopes`: `https://www.googleapis.com/auth/drive.readonly` - - In the _Endpoints_ tab, activate `GET /documents` endpoint. - - - - Go to [Integrations](https://app.nango.dev/dev/integrations?source=sample-app) and create a OneDrive for Business integration. - - Register an application in [Microsoft Entra admin center](https://entra.microsoft.com): - 1. Sign in to the Microsoft Entra admin center and search for **App registrations** > **New registration**. - 2. Enter a name (e.g., "Nango OneDrive Integration"). - 3. Under **Supported account types**, select **Accounts in any organizational directory** for multitenant apps. - 4. Click **Register** and note the **Application (client) ID** from the Overview page. - 5. Go to **Authentication** > **Add a platform** > **Web** and add `https://api.nango.dev/oauth/callback` as the Redirect URI. - 6. Go to **API permissions** > **Add a permission** > **Microsoft Graph** > **Delegated permissions** and add `Files.Read.All`. - 7. Go to **Certificates & secrets** > **New client secret**, create a secret, and copy the value immediately (you won't see it again). - - Go back to the OneDrive for Business integration in Nango. In the _Authorization_ tab, add: - - `client_id`: Application (client) ID from step 4 - - `client_secret`: Client secret value from step 7 - - `scopes`: Add `offline_access` and `.default` - - In the _Endpoints_ tab, activate `GET /user-files/selected` endpoint. - - - - Go to [Integrations](https://app.nango.dev/dev/integrations?source=sample-app) and create a OneDrive Personal integration. - - Register an application in [Microsoft Entra admin center](https://entra.microsoft.com): - 1. Sign in to the Microsoft Entra admin center and search for **App registrations** > **New registration**. - 2. Enter a name (e.g., "Nango OneDrive Personal Integration"). - 3. Under **Supported account types**, select **Accounts in any organizational directory and personal Microsoft accounts**. - 4. Click **Register** and note the **Application (client) ID** from the Overview page. - 5. Go to **Authentication** > **Add a platform** > **Web** and add `https://api.nango.dev/oauth/callback` as the Redirect URI. - 6. Go to **Certificates & secrets** > **New client secret**, create a secret, and copy the value immediately (you won't see it again). - - Go back to the OneDrive Personal integration in Nango. In the _Authorization_ tab, add: - - `client_id`: Application (client) ID from step 4 - - `client_secret`: Client secret value from step 6 - - `scopes`: Add `offline_access` and `onedrive.readonly` - - In the _Endpoints_ tab, activate `GET /user-files/selected` endpoint. - - - - Install: `NodeJS`, `Docker`. Then run: - - ```sh - git clone https://github.com/NangoHQ/sample-app.git - - cd sample-app - - nvm use - npm i - ``` - - Copy your Nango Secret Key, found in [Environment Settings > API Keys](https://app.nango.dev/dev/environment-settings#api-keys?source=sample-app). - - Create a file to store environment variables and fill in the Nango Secret Key: - ```sh - cp .env.example .env - ``` - - Paste the **Project Number** you copied in step 7 of the Google Drive integration setup into the .env file as `GOOGLE_PROJECT_NUMBER=your_project_number_here`: - ``` - cd front-end - cp .env.example .env - ``` - - - - This command should be running at all time: - - ```sh - npm run webhooks-proxy - ``` - - - Copy the URL the command gave you and go to [Environment Settings](https://app.nango.dev/dev/environment-settings?source=sample-app). Set Webhook URL to `${URL}/webhooks-from-nango`, e.g: `https://tame-socks-warn.loca.lt/webhooks-from-nango`. - - - - Run: - ```sh - npm run start - ``` - - Go to: [http://localhost:3011](http://localhost:3011) - - - The above sample app uses template functions, but you can also use custom ones. - - - Set up the Nango CLI: - ```sh - npm install -g nango - cd nango-integrations/ - nango init - ``` - - Add your Nango Secret Key in NANGO_SECRET_KEY_PROD in `./nango-integrations/.env`. - - Optionally customize the functions using [this guide](/guides/functions/functions-guide). - - Deploy the custom functions: - ```sh - nango deploy prod - ``` - - - -## File Integration Guide - -The sample app includes a complete implementation for integrating file storage providers (Google Drive, OneDrive) with your application. This guide walks you through using and understanding the file integration features. - -### Overview - -Nango's template file functions allow you to: - -1. **OAuth Flow**: Handle authentication using Nango's SDK -2. **File Picker**: Let users select specific files and folders to sync -3. **Document Sync**: Sync metadata for selected files and folders -4. **Document Fetching**: Download individual file contents as needed - -### Requirements - -- Docker (desktop) installed & running -- NodeJS & NPM installed -- A Nango account (sign up at [nango.dev](https://nango.dev)) -- Integration setup completed (see steps above) - -### Using the File Integration - -After setting up and running the sample app (see steps above), follow these instructions to test the file integration: - -1. **Access the sample app**: - - Open [http://localhost:3011](http://localhost:3011/) - - Click _Files_ to start the file integration - - Sample app home page with Files section highlighted - -2. **Connect your account** (Google Drive, OneDrive, etc.): - - Click the _Connect_ button on the provider's card - - In the connection popup, click the _Connect_ button - - Select your account and authorize the app - - Click the _Finish_ button to close the modal - - Connect popup with file provider account options - - Successfully connected to file provider - -3. **Select files and folders to sync**: - - Click the _Select Files from [Provider]_ button - - A file picker modal will appear - **note that each provider has its own native file picker**: - - **Google Drive**: Uses Google's Drive Picker UI - - **OneDrive for Business**: Uses Microsoft's file picker for organizational accounts - - **OneDrive Personal**: Uses Microsoft's file picker for personal accounts - - Select the files and folders you want to sync using the provider's file picker - - Click the _Select_ button to confirm your selection - - Select files and folders from provider - Select files and folders from provider - -4. **View synced files**: - - The files and folders will be synced to your Nango account and displayed in the UI - - Synced files and folders in the UI - -5. **Download a file**: - - Click the _Download_ button to download the file to your computer - -6. **Disconnect your account**: - - Click the _Disconnect_ button to disconnect your account and delete your connection from your Nango account - - Disconnect button - -### What Happens Under the Hood - -The sample app uses Nango to: - -1. **Authentication** - - Authenticate users with file storage providers - - Show the file picker - - Handle OAuth flow automatically - -2. **File Syncing** - - Sync selected files & folders - - Initial sync on selection - - Periodic updates - - Nango dashboard showing sync status and file list - -3. **File Download** - - Download raw file content - - Handle different file types - - Use Nango's proxy for reliable downloads - -### Key Components - -#### Frontend Implementation - -1. **Authorization Flow** - The authorization process is implemented in [`front-end/src/api.ts`](https://github.com/NangoHQ/sample-app/blob/main/front-end/src/api.ts): - - `postConnectSession`: Initiates the OAuth connection - - `getNangoCredentials`: Retrieves credentials after successful authorization - - The flow works as follows: - 1. Frontend initiates connection via `postConnectSession` - 2. Backend creates a Nango connection session - 3. User is redirected to provider OAuth consent screen - 4. After authorization, user is redirected back to the app - 5. User is shown the provider-specific file picker (Google Drive Picker, OneDrive for Business picker, or OneDrive Personal picker) - 6. Frontend can fetch credentials using `getNangoCredentials` - -#### Backend Implementation - -1. **Webhook Handler & Data Sync** - The webhook handling and data sync logic is implemented in [`back-end/src/routes/postWebhooks.ts`](https://github.com/NangoHQ/sample-app/blob/main/back-end/src/routes/postWebhooks.ts): - - Key components: - - Main webhook handler that verifies signatures and routes requests - - `handleNewConnectionWebhook`: Processes new file provider connections - - `handleSyncWebhook`: Handles sync completion and data processing - - The sync process: - 1. Nango syncs files from the provider - 2. Webhook notifies backend of sync completion - 3. Backend fetches records using `nango.listRecords` - 4. File metadata is stored in the database - 5. Deletions are tracked and handled appropriately - -2. **File Download with Proxy** - File download functionality is implemented in [`back-end/src/routes/downloadFile.ts`](https://github.com/NangoHQ/sample-app/blob/main/back-end/src/routes/downloadFile.ts): - - The download process: - 1. Frontend requests file download with file ID and connection ID - 2. Backend uses Nango proxy to fetch file from provider - 3. File is streamed to client with proper headers - 4. Error handling ensures graceful failure - - Key features: - - Uses Nango proxy for secure file access - - Proper content type and disposition headers - - Streaming response for efficient file transfer - - Comprehensive error handling - -### Nango Dashboard - -Explore these sections in your Nango account: - -1. **Integration Settings** - - [View Integrations](https://app.nango.dev/dev/integrations) - - Configure sync settings - - View integration status - -2. **Connections** - - [View Connections](https://app.nango.dev/dev/connections) - - Monitor sync status - - Check connection health - -3. **Logs** - - [View Logs](https://app.nango.dev/dev/logs) - - Track sync operations - - Debug issues - -### Common Issues and Solutions - -1. **Connection Issues** - - Check Docker is running - - Verify webhook URL is correct - - Ensure provider credentials are valid - -2. **Sync Problems** - - Check Nango logs - - Verify file permissions - - Monitor sync status - -### File Type Support - -The sample app supports all file types through Nango's proxy: - -- **Regular files** (PDFs, images, documents, etc.) -- **Google Workspace files** (Docs, Sheets, Slides) -- **Microsoft Office files** (Word, Excel, PowerPoint) -- **Other cloud storage file types** - - - **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - - -## Next steps - -- [Auth guide](/guides/auth/auth-guide) - understand the authorization flow used by the sample app. -- [Sync functions](/guides/functions/syncs/sync-functions) - customize the data sync logic. -- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - process sync and auth notifications. +--- +title: 'Sample app' +sidebarTitle: 'Sample app' +description: 'A practical demonstration of integrating Nango in your codebase.' +--- -## Auth Guide +The sample app contains: +- **A frontend**: lets users connect an integration using the Nango frontend SDK. +- **A backend**: listens to Nango webhooks and consumes the Nango API to read & write data. -Source: https://nango.dev/docs/guides/auth/auth-guide.md + + + ---- -title: 'Auth guide' -sidebarTitle: 'Auth guide' -description: 'Let your users connect external APIs to your agents & apps.' ---- - -## Overview - -Nango Auth lets your users connect 800+ external APIs to your product. You embed a Nango-managed auth flow in your application, and Nango handles authorization, credential storage, refresh, and validation. - -A **Connection** is created after each successful authorization. It stores one user's credentials for one external API and keeps them valid over time. Credentials can be retrieved at scale or used directly by other Nango primitives β€” without ever passing through your codebase. - -## How it works - -The end-to-end flow has four steps: - -1. **Backend** β€” your server asks Nango for a short-lived **session token**. -2. **Frontend** β€” your app opens the Nango **Connect UI** with that token. -3. **User** β€” authorizes the API. Nango stores the credentials. -4. **Backend** β€” Nango sends an **auth webhook** with the **connection ID**. You persist it alongside your user/org/project. - -Once you have the connection ID, fetch credentials whenever you need them: - - - - ```ts - await nango.getConnection(integrationId, connectionId); - ``` - - - ```bash - curl "https://api.nango.dev/connections/{connectionId}?provider_config_key={integrationId}" \ - -H "Authorization: Bearer {nangoSecretKey}" - ``` - - - -## Capabilities - -- **Auth schemes** β€” OAuth 2.0, OAuth 1.0a, API keys, basic auth, custom. 800+ APIs supported; new ones [added on demand](/integrations/contribute-or-request-api) within days, by request or self-contributed. -- **Pre-built UI** β€” Embedded Connect UI with API-specific guidance, input validation, and your branding. Or [customize Connect UI or build a custom UI](/guides/auth/customize-connect-ui). -- **Credential management** β€” Encrypted storage, automatic refresh, retrieval at scale. Combine with [Proxy](/guides/platform/proxy-requests) or [Functions](/guides/functions/functions-guide) to avoid handling credentials directly. -- **Observability** β€” Failure detection, reconnect flow, and per-connection logs. - -## Guide - - - **Using a coding agent?** Set up the [docs MCP](/getting-started/coding-agent-setup#docs-mcp-server) and [skills](/getting-started/coding-agent-setup#skills), then copy this page as prompt. - - - - - Sign up for free (no credit card): [![Try Nango Cloud](/images/nango-deploy-button.svg)](https://app.nango.dev/signup) - - - Signup cannot be automated. Ask the user to sign up at [app.nango.dev/signup](https://app.nango.dev/signup) and provide their Nango API key from the Environment settings tab > API Keys. Use it as `Authorization: Bearer ` in API requests. - - The default API key created on signup has full access and is the simplest option. - - If the user creates a scoped API key instead, this guide needs `environment:integrations:create` (step 2) and `environment:connect_sessions:write` (steps 5 and 8). See [API keys](/reference/backend/http-api/api-keys). - - - - - In the dashboard, open the [Integrations](https://app.nango.dev/dev/integrations) tab, click **Configure New Integration**, and pick the API. - - Each API has a dedicated [Nango documentation page](/integrations/overview) with setup notes and gotchas. - - - OAuth APIs require an OAuth developer app registered with the provider. Register one on the provider's developer portal, use the `Callback URL` shown in your Nango integration settings, then paste the `Client ID` and `Client Secret` back into Nango. Register any required scopes too. - - If this integration will be used in production, complete the optional custom callback URL step below before real users connect. Retrofitting a callback URL later requires updating the provider app and can break new authorization or reconnect flows until the provider and Nango settings match. - - For OAuth 2.0 providers, Nango shows **suggested scopes** β€” auto-discovered and refreshed at least monthly. They're suggestions; you can use any scope the provider supports. - - - For popular APIs, Nango ships a built-in shared developer app so you can test connections with zero setup. We strongly recommend registering your own OAuth app before going live β€” see [OAuth developer apps](#oauth-developer-apps) below. - - - - - Create the integration with the API. If you need the provider slug first, list providers and use the matching provider's `name` field: - - ```bash - curl --request GET \ - --url https://api.nango.dev/providers \ - --header 'Authorization: Bearer ' - ``` - - For OAuth providers, walk the user through registering an OAuth developer app on the provider's portal: link them to the provider's OAuth-app creation page, tell them which `Callback URL` to paste (visible in the Nango integration settings after creation), and ask them to send back the `client_id` and `client_secret` so you can pass them in the request body. - - - - ```bash - curl --request POST \ - --url https://api.nango.dev/integrations \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "unique_key": "", - "provider": "", - "credentials": { - "type": "OAUTH2", - "client_id": "", - "client_secret": "", - "scopes": "," - } - }' - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/integrations \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "unique_key": "", - "provider": "" - }' - ``` - - - - For all fields and response shapes, see the [List all providers API](/reference/backend/http-api/providers/list), [Create an integration API](/reference/backend/http-api/integration/create), and [Update an integration API](/reference/backend/http-api/integration/update). - - - - - In the [Connections](https://app.nango.dev/dev/connections) tab, click **Add Test Connection**, pick your integration, and authorize using a test account. The new connection's credentials appear in its *Authorization* tab β€” securely stored and automatically refreshed. - - - Skip the dashboard. Create a connect session and share the returned `connect_link` with the user β€” they authorize using their test account in the browser, no UI needed on your side: - - ```bash - curl --request POST \ - --url https://api.nango.dev/connect/sessions \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "tags": { - "end_user_id": "" - }, - "allowed_integrations": [""] - }' - ``` - - The response contains a `connect_link` (valid 30 minutes). Send it to the user; once they complete authorization, confirm with `GET /connections`. See [Share a connect link](/guides/auth/share-connect-link). - - - - - For production OAuth apps, a callback URL on your own domain is recommended. Some providers show the callback domain to users. - - - - To configure a custom callback URL: - 1. Add an endpoint on your domain (e.g. `https://example.com/oauth-callback`) that **308-redirects** to `https://api.nango.dev/oauth/callback`, preserving all query parameters. - 2. Update the registered callback URL with each API provider β€” otherwise they'll reject new authorization flows. - 3. After confirming steps 1 and 2, update the callback URL in Nango's **Environment Settings**. Settings are per-environment, so repeat for every environment. - - - Ask the user what production callback URL they want to use, then have them add a 308 redirect from that URL to `https://api.nango.dev/oauth/callback` before they register provider OAuth apps. The Nango environment setting is dashboard-only β€” ask the user to paste the final callback URL into **Environment Settings > Backend**. - - - - - Set up a backend endpoint that your frontend will call before each authorization attempt to retrieve a session token from Nango ([API](/reference/backend/http-api/connect/sessions/create) / [Node SDK](/reference/backend/backend-sdk/node#create-a-connect-session)). - - You'll need an [API key](/reference/backend/http-api/api-keys) with the `environment:connect_sessions:write` scope (find it in **Environment Settings > API Keys**). - - - - ```ts - import { Nango } from '@nangohq/node'; - - const nango = new Nango({ secretKey: process.env.NANGO_API_KEY! }); - - api.post('/sessionToken', async (req, res) => { - const { data } = await nango.createConnectSession({ - tags: { - end_user_id: '', - end_user_email: '', - organization_id: '' - }, - allowed_integrations: [''] - }); - - res.status(200).send({ sessionToken: data.token }); - }); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/connect/sessions \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "" - }, - "allowed_integrations": [""] - }' - ``` - - - - - Tags reconcile Nango's auth-success webhook with the right user, org, or entity in your system. Most apps start with: `end_user_id`, `end_user_email`, `organization_id`. - - Tags are also useful for filtering connections via the API and are displayed in the Nango UI. Set the reserved UI tag keys `end_user_display_name` and `end_user_email` to populate the connections list and connection detail page. - - See [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) for more. - - - `allowed_integrations` controls what the user sees: - - **Multiple integrations** β€” Connect UI shows a picker. - - **Single integration** β€” Connect UI sends the user straight to its auth flow. - - - - Load the Nango frontend SDK, fetch the session token from your backend, and open Connect UI: - - - ![](/images/screenshots/connect-ui.gif) - - - ```js - import Nango from '@nangohq/frontend'; - - const nango = new Nango(); - const connect = nango.openConnectUI({ - onEvent: (event) => { - if (event.type === 'close') { - // Modal closed. - } else if (event.type === 'connect') { - // Auth flow successful. - } - }, - }); - - const res = await fetch('/sessionToken', { method: 'POST' }); - connect.setSessionToken(res.sessionToken); // A loading indicator shows until this is set. - ``` - - See the [Frontend SDK reference](/reference/frontend/frontend-sdk#connect-using-nango-connect-ui) for more options. - - The pre-built Connect UI is recommended but optional β€” if you need full UX control, follow [Customize Connect UI](/guides/auth/customize-connect-ui). For email/cross-device flows, see [Share a connect link](/guides/auth/share-connect-link). - - - - When authorization succeeds, Nango generates a unique **connection ID**. You use this ID to manage the connection and retrieve its credentials. **You must store it on your side**, attached to the user/org/project that owns the connection β€” Nango doesn't model that ownership. - - Set up the webhook in **Environment Settings**: - 1. Specify a **Webhook URL** in the Nango UI. - 2. Enable **Send New Connection Creation Webhooks**. - 3. Handle `POST` requests on that route in your backend. - - - Webhook URL configuration is dashboard-only β€” there is no public API for environment settings. Ask the user to paste the webhook URL into **Environment Settings** and enable **Send New Connection Creation Webhooks**. - - - Webhook payload: - - ```json - { - "type": "auth", - "operation": "creation", - "success": true, - "connectionId": "", - "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "" - } - } - ``` - - Persist `connectionId` against whichever entity owns the connection in your app. - - - - Credentials can become invalid when users revoke access, providers rotate refresh tokens, scopes change, or an app moves from testing to production. Re-authorization updates an existing connection's credentials while preserving its data and config. Deleting and re-creating the connection wipes that data β€” prefer re-authorization. - - Before showing integration settings, check the connection with `GET /connections/{connectionId}`: - - - - ```ts - import { Nango } from '@nangohq/node'; - - const nango = new Nango({ secretKey: process.env.NANGO_API_KEY! }); - - try { - await nango.getConnection('', ''); - // Connection is valid. - } catch (error) { - if (error.response?.data?.error?.code === 'invalid_credentials') { - // Connection is invalid β€” show a Reconnect button. - displayReconnectUI(); - } - } - ``` - - - ```bash - curl --request GET \ - --url 'https://api.nango.dev/connections/?provider_config_key=' \ - --header 'Authorization: Bearer ' - ``` - - - - An `invalid_credentials` error means the connection failed credential refresh or validation β€” show an error state with a **Reconnect** button. - - To trigger re-authorization, use the same frontend flow as a new connection, but generate a reconnect session token on the backend. Pass the returned token to the Frontend SDK exactly like a normal session token. On success you'll receive an `auth` webhook with `operation = override`. - - - - ```ts - import { Nango } from '@nangohq/node'; - - const nango = new Nango({ secretKey: process.env.NANGO_API_KEY! }); - - api.post('/sessionToken', async (req, res) => { - const { data } = await nango.createReconnectSession({ - connection_id: '', - integration_id: '' - }); - - res.status(200).send({ sessionToken: data.token }); - }); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/connect/sessions/reconnect \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "connection_id": "", - "integration_id": "" - }' - ``` - - - - - - Test the auth flow from your app and verify a connection appears in the [Connections](https://app.nango.dev/dev/connections) tab. Failed attempts are inspectable in the **Logs** tab. - - - After the user runs the flow, confirm the connection was created with [`GET /connections`](/reference/backend/http-api/connections/list) β€” filter by the tags you set in step 5: - - ```bash - curl --request GET \ - --url 'https://api.nango.dev/connections?tags[end_user_id]=' \ - --header 'Authorization: Bearer ' - ``` - - Auth logs are dashboard-only β€” if the call returns no connection, ask the user to check the **Logs** tab for the failure reason. - - - πŸŽ‰ **You are connected!** Next: - - View connections and credentials in the **Connections** tab. - - Retrieve credentials via the [API](/reference/backend/http-api/connections/get) or [Node SDK](/reference/backend/backend-sdk/node#get-a-connection-with-credentials). - - Build with [sync functions](/guides/functions/syncs/sync-functions), [Action functions](/guides/functions/action-functions), [webhook functions](/guides/functions/webhook-functions), or any other Nango function type. - - - - - **Questions, problems, feedback?** Reach out in the [Slack community](https://nango.dev/slack). - - -## OAuth developer apps - -Nango ships built-in shared developer apps for some OAuth 2.0 APIs so you can test connections with zero setup. - -They work in production too, but we strongly recommend registering your own before going live. Most OAuth APIs have a step-by-step setup guide in [APIs & Integrations](/integrations/overview) β€” for example, [Gmail](/api-integrations/google-mail/how-to-register-your-own-gmail-api-oauth-app). - -Reasons to register your own: -- **Whitelabel auth** β€” with Nango's app, users authorize Nango instead of your product. -- **Scopes** β€” Nango developer apps have fixed scopes. Your own app supports any scope the provider exposes. -- **Callback URL** β€” Nango developer apps use Nango's callback. Your own app supports a [custom callback URL](#custom-oauth-callback-url-optional) on your domain. -- **Marketplace listings** β€” provider marketplaces require your own developer app. -- **Advanced API features** β€” some provider features are only available to first-party apps. -- **Revocation risk** β€” most providers don't allow shared credentials. Nango developer apps may be revoked by the provider at any time. -- **Portability** β€” only your own developer app lets you export access and refresh tokens and move off Nango without users re-authorizing. - -The same tradeoffs apply to shared OAuth apps provided by other auth platforms. - -## Related guides - -- [Share a connect link](/guides/auth/share-connect-link) - send authorization links by email, support tools, or cross-device flows. -- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - store the right connection-level data in the right field. -- [Customize Connect UI](/guides/auth/customize-connect-ui) - customize branding or build your own authorization UI. -- [Token refreshing and validity](/guides/auth/token-refreshing) - handle revoked or expired credentials. +The sample app uses Slack, Google Drive, OneDrive for Business, and OneDrive Personal as example integrations and is showcased in this [demo video](https://youtu.be/oTpWlmnv7dM). -## Share Connect Link +### Access the repository -Source: https://nango.dev/docs/guides/auth/share-connect-link.md + + + + +
NangoHQ/sample-app
+
---- -title: 'Share a connect link' -sidebarTitle: 'Share a connect link' -description: 'Generate a short-lived connect link and share it with your end user.' ---- - -Use a connect link when you want to trigger authorization without opening Connect UI immediately in your app (for example: email-based onboarding, support-assisted setup, or cross-device flows). - -## Option 1: Generate a link from your backend - -Create a connect session and return the `connect_link` to your frontend or internal tools: - - - - ```ts - import { Nango } from '@nangohq/node'; - - const nango = new Nango({ secretKey: process.env[''] }); - - api.post('/connectLink', async (req, res) => { - const { data } = await nango.createConnectSession({ - tags: { - end_user_id: '', - end_user_email: '', - organization_id: '' - }, - allowed_integrations: [''] - }); - - res.status(200).send({ - connectLink: data.connect_link, - expiresAt: data.expires_at - }); - }); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/connect/sessions \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "" - }, - "allowed_integrations": [ - "" - ] - }' - ``` - - - -The returned `connect_link` expires after 30 minutes. - -## Option 2: Generate a link from the dashboard - -In the Nango dashboard, open the Connections page and use the **Share connect link** button. This generates a link that you can share directly with the end user. - -## Notes - -- For the API details, see [Create a connect session](/reference/backend/http-api/connect/sessions/create). - -## Related guides - -- [Auth guide](/guides/auth/auth-guide) - embed the standard Connect UI flow. -- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - reconcile completed links with users and orgs. -- [Create a connect session API](/reference/backend/http-api/connect/sessions/create) - API details for generated links. -## Connection tags, configuration, and metadata +### Run the sample app -Source: https://nango.dev/docs/guides/auth/connection-tags-configuration-metadata.md -Description: Use tags, connection configuration, and metadata for the right connection-level data. + + + - Go to [nango.dev](https://app.nango.dev?source=sample-app) and create an account (free). + + + - Go to [Integrations](https://app.nango.dev/dev/integrations?source=sample-app) and create a Slack integration. + - Set up a Slack app: + 1. Go to [Slack Dev Center](https://api.slack.com/apps) and click **Create New App**. + 2. Select **From scratch** for a simpler flow. + 3. Enter your **App Name** and select a workspace to develop your app in, then click **Create App**. + 4. In the **Basic Information** tab, copy your **Client ID** and **Client Secret**. + 5. Go to **OAuth & Permissions** in the left sidebar. + 6. Under **Redirect URLs**, add `https://api.nango.dev/oauth/callback` and click **Save URLs**. + 7. Under **Scopes** > **Bot Token Scopes**, add: + - `users:read` + - `chat:write` + - Go back to Nango. In the _Authorization_ tab, add: + - `client_id`: from step 4 + - `client_secret`: from step 4 + - In the _Endpoints_ tab, activate `GET /users` and `POST /send-message`. + + + - Go to [Integrations](https://app.nango.dev/dev/integrations?source=sample-app) and create a Google Drive integration. + - Set up a Google Cloud project: + 1. Go to the [Google Cloud Console](https://console.cloud.google.com/) and create a new project (or select an existing one). + 2. Go to the [API Library](https://console.cloud.google.com/apis/library), search for **Google Drive API**, and click **Enable**. + 3. Go to **APIs & Services** > **OAuth consent screen** and configure it: + - Select **External** user type (or **Internal** for users within your Google Workspace organization). + - Fill in the required app information and contact information. + - Add the scope: `https://www.googleapis.com/auth/drive.readonly`. + - Add test users if using External user type. + 4. Go to **APIs & Services** > **Credentials** > **Create Credentials** > **OAuth client ID**. + 5. Select **Web application**, enter a name, and add `https://api.nango.dev/oauth/callback` under **Authorized redirect URIs**. + 6. Click **Create** and copy the **Client ID** and **Client Secret**. + 7. Copy the **Project Number** from the Google Cloud console under **IAM & Admin** > **Settings** > **Project Number**. + - Go back to the Google Drive integration in Nango. In the _Authorization_ tab, add: + - `client_id`: from step 6 + - `client_secret`: from step 6 + - `scopes`: `https://www.googleapis.com/auth/drive.readonly` + - In the _Endpoints_ tab, activate `GET /documents` endpoint. + + + - Go to [Integrations](https://app.nango.dev/dev/integrations?source=sample-app) and create a OneDrive for Business integration. + - Register an application in [Microsoft Entra admin center](https://entra.microsoft.com): + 1. Sign in to the Microsoft Entra admin center and search for **App registrations** > **New registration**. + 2. Enter a name (e.g., "Nango OneDrive Integration"). + 3. Under **Supported account types**, select **Accounts in any organizational directory** for multitenant apps. + 4. Click **Register** and note the **Application (client) ID** from the Overview page. + 5. Go to **Authentication** > **Add a platform** > **Web** and add `https://api.nango.dev/oauth/callback` as the Redirect URI. + 6. Go to **API permissions** > **Add a permission** > **Microsoft Graph** > **Delegated permissions** and add `Files.Read.All`. + 7. Go to **Certificates & secrets** > **New client secret**, create a secret, and copy the value immediately (you won't see it again). + - Go back to the OneDrive for Business integration in Nango. In the _Authorization_ tab, add: + - `client_id`: Application (client) ID from step 4 + - `client_secret`: Client secret value from step 7 + - `scopes`: Add `offline_access` and `.default` + - In the _Endpoints_ tab, activate `GET /user-files/selected` endpoint. + + + - Go to [Integrations](https://app.nango.dev/dev/integrations?source=sample-app) and create a OneDrive Personal integration. + - Register an application in [Microsoft Entra admin center](https://entra.microsoft.com): + 1. Sign in to the Microsoft Entra admin center and search for **App registrations** > **New registration**. + 2. Enter a name (e.g., "Nango OneDrive Personal Integration"). + 3. Under **Supported account types**, select **Accounts in any organizational directory and personal Microsoft accounts**. + 4. Click **Register** and note the **Application (client) ID** from the Overview page. + 5. Go to **Authentication** > **Add a platform** > **Web** and add `https://api.nango.dev/oauth/callback` as the Redirect URI. + 6. Go to **Certificates & secrets** > **New client secret**, create a secret, and copy the value immediately (you won't see it again). + - Go back to the OneDrive Personal integration in Nango. In the _Authorization_ tab, add: + - `client_id`: Application (client) ID from step 4 + - `client_secret`: Client secret value from step 6 + - `scopes`: Add `offline_access` and `onedrive.readonly` + - In the _Endpoints_ tab, activate `GET /user-files/selected` endpoint. + + + - Install: `NodeJS`, `Docker`. Then run: - - Pre-requisite: complete the [Set up an integration](/guides/auth/auth-guide#guide) section of the Auth guide. - + ```sh + git clone https://github.com/NangoHQ/sample-app.git -A Nango connection can store several kinds of information besides credentials. Use the right field depending on what the data does. + cd sample-app -| Field | Use it for | Example | -| --- | --- | --- | -| `tags` | Attribution, filtering, routing, and webhook reconciliation. | `end_user_id`, `organization_id`, `workspace_id` | -| `connection_config` | Provider-specific information required for the connection to be valid or usable. | `subdomain`, `tenantId`, `region`, API base URL | -| `metadata` | Your own application or function configuration stored on the connection. | field mappings, selected folder IDs, feature flags | + nvm use + npm i + ``` + - Copy your Nango Secret Key, found in [Environment Settings > API Keys](https://app.nango.dev/dev/environment-settings#api-keys?source=sample-app). + - Create a file to store environment variables and fill in the Nango Secret Key: + ```sh + cp .env.example .env + ``` + - Paste the **Project Number** you copied in step 7 of the Google Drive integration setup into the .env file as `GOOGLE_PROJECT_NUMBER=your_project_number_here`: + ``` + cd front-end + cp .env.example .env + ``` + + + - This command should be running at all time: -## Connection tags + ```sh + npm run webhooks-proxy + ``` -Tags are small key/value strings you attach to a Connect session. Nango copies them to the resulting connection and includes them in auth webhooks. + - Copy the URL the command gave you and go to [Environment Settings](https://app.nango.dev/dev/environment-settings?source=sample-app). Set Webhook URL to `${URL}/webhooks-from-nango`, e.g: `https://tame-socks-warn.loca.lt/webhooks-from-nango`. + + + - Run: + ```sh + npm run start + ``` + - Go to: [http://localhost:3011](http://localhost:3011) + + + The above sample app uses template functions, but you can also use custom ones. -Their primary purpose is **attribution**. Nango uses random UUIDs as connection IDs, so tags are the bridge between a Nango connection and the user, organization, workspace, or other entity in your system. + - Set up the Nango CLI: + ```sh + npm install -g nango + cd nango-integrations/ + nango init + ``` + - Add your Nango Secret Key in NANGO_SECRET_KEY_PROD in `./nango-integrations/.env`. + - Optionally customize the functions using [this guide](/guides/functions/functions-guide). + - Deploy the custom functions: + ```sh + nango deploy prod + ``` + + -Most apps start with these tags: +## File Integration Guide -- `end_user_id` -- `end_user_email` -- `organization_id` +The sample app includes a complete implementation for integrating file storage providers (Google Drive, OneDrive) with your application. This guide walks you through using and understanding the file integration features. -Then add whatever additional routing identifiers you need, such as `workspace_id`, `project_id`, or `plan`. +### Overview - - To make connections easier to identify in the Nango dashboard, set `end_user_display_name` and `end_user_email`. Nango uses these reserved UI tag keys to populate the connections list and connection detail page. - +Nango's template file functions allow you to: - - Tags are designed for identifiers and routing metadata. Avoid putting secrets or large/free-form payloads in tags. - +1. **OAuth Flow**: Handle authentication using Nango's SDK +2. **File Picker**: Let users select specific files and folders to sync +3. **Document Sync**: Sync metadata for selected files and folders +4. **Document Fetching**: Download individual file contents as needed -### Add tags when creating a Connect session +### Requirements -When requesting a new Connect session token from Nango, pass a `tags` object: +- Docker (desktop) installed & running +- NodeJS & NPM installed +- A Nango account (sign up at [nango.dev](https://nango.dev)) +- Integration setup completed (see steps above) - - - ```ts - import { Nango } from '@nangohq/node'; +### Using the File Integration - const nango = new Nango({ secretKey: process.env[''] }); +After setting up and running the sample app (see steps above), follow these instructions to test the file integration: - api.post('/sessionToken', async (req, res) => { - const { data } = await nango.createConnectSession({ - tags: { - end_user_id: '', - end_user_email: '', - organization_id: '' - }, - allowed_integrations: [''] - }); +1. **Access the sample app**: + - Open [http://localhost:3011](http://localhost:3011/) + - Click _Files_ to start the file integration - res.status(200).send({ sessionToken: data.token }); - }); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/connect/sessions \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "" - }, - "allowed_integrations": [ - "" - ] - }' - ``` - - + Sample app home page with Files section highlighted -### Read tags from the auth webhook +2. **Connect your account** (Google Drive, OneDrive, etc.): + - Click the _Connect_ button on the provider's card + - In the connection popup, click the _Connect_ button + - Select your account and authorize the app + - Click the _Finish_ button to close the modal -These tags appear in successful auth webhooks sent by Nango: + Connect popup with file provider account options -```json -{ - "type": "auth", - "operation": "creation", - "success": true, - "connectionId": "", - "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "" - } -} -``` + Successfully connected to file provider -Use these values to reconcile the generated `connectionId` with the user, organization, or workspace that initiated the flow in your application. +3. **Select files and folders to sync**: + - Click the _Select Files from [Provider]_ button + - A file picker modal will appear - **note that each provider has its own native file picker**: + - **Google Drive**: Uses Google's Drive Picker UI + - **OneDrive for Business**: Uses Microsoft's file picker for organizational accounts + - **OneDrive Personal**: Uses Microsoft's file picker for personal accounts + - Select the files and folders you want to sync using the provider's file picker + - Click the _Select_ button to confirm your selection -### Read and filter connections by tags + Select files and folders from provider + Select files and folders from provider -Nango stores tags on the connection itself. +4. **View synced files**: + - The files and folders will be synced to your Nango account and displayed in the UI - - - ```ts - import { Nango } from '@nangohq/node'; + Synced files and folders in the UI - const nango = new Nango({ secretKey: '' }); - const connection = await nango.getConnection('', ''); +5. **Download a file**: + - Click the _Download_ button to download the file to your computer - console.log(connection.tags); - ``` - - - ```ts - import { Nango } from '@nangohq/node'; +6. **Disconnect your account**: + - Click the _Disconnect_ button to disconnect your account and delete your connection from your Nango account - const nango = new Nango({ secretKey: '' }); + Disconnect button - const { connections } = await nango.listConnections({ - tags: { - end_user_id: '', - organization_id: '' - }, - limit: 100 - }); +### What Happens Under the Hood - console.log(connections); - ``` - - - ```bash - curl --request GET \ - --url 'https://api.nango.dev/connections?tags[end_user_id]=&tags[organization_id]=' \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' - ``` - - +The sample app uses Nango to: -Filtering uses an AND match: a connection must contain all provided tag keys and values. +1. **Authentication** + - Authenticate users with file storage providers + - Show the file picker + - Handle OAuth flow automatically -### Update tags on an existing connection +2. **File Syncing** + - Sync selected files & folders + - Initial sync on selection + - Periodic updates -If you need to update tags after a connection is created, patch the connection: + Nango dashboard showing sync status and file list - - - ```ts - import { Nango } from '@nangohq/node'; +3. **File Download** + - Download raw file content + - Handle different file types + - Use Nango's proxy for reliable downloads - const nango = new Nango({ secretKey: '' }); +### Key Components - await nango.patchConnection( - { - connectionId: '', - provider_config_key: '' - }, - { - tags: { - end_user_id: '', - end_user_email: '', - organization_id: '', - environment: '' - } - } - ); - ``` - - - ```bash - curl --request PATCH \ - --url 'https://api.nango.dev/connections/?provider_config_key=' \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "", - "environment": "" - } - }' - ``` - - +#### Frontend Implementation - - Updating tags replaces the whole tag object. If you want to add or remove a single tag, fetch the current connection first, merge locally, then patch. - +1. **Authorization Flow** + The authorization process is implemented in [`front-end/src/api.ts`](https://github.com/NangoHQ/sample-app/blob/main/front-end/src/api.ts): + - `postConnectSession`: Initiates the OAuth connection + - `getNangoCredentials`: Retrieves credentials after successful authorization -### Reserved UI tag keys + The flow works as follows: + 1. Frontend initiates connection via `postConnectSession` + 2. Backend creates a Nango connection session + 3. User is redirected to provider OAuth consent screen + 4. After authorization, user is redirected back to the app + 5. User is shown the provider-specific file picker (Google Drive Picker, OneDrive for Business picker, or OneDrive Personal picker) + 6. Frontend can fetch credentials using `getNangoCredentials` -Two tag keys are reserved for improving the Nango dashboard UI: +#### Backend Implementation -- `end_user_display_name` - shown instead of the connection ID in the connections list, making it easier to identify who a connection belongs to. -- `end_user_email` - shown alongside `end_user_display_name` in the connections list. The domain from the email address is also used to display the end user's company logo on the connection detail page. +1. **Webhook Handler & Data Sync** + The webhook handling and data sync logic is implemented in [`back-end/src/routes/postWebhooks.ts`](https://github.com/NangoHQ/sample-app/blob/main/back-end/src/routes/postWebhooks.ts): - - ![](/images/screenshots/connection-tags-1.png) - + Key components: + - Main webhook handler that verifies signatures and routes requests + - `handleNewConnectionWebhook`: Processes new file provider connections + - `handleSyncWebhook`: Handles sync completion and data processing - - ![](/images/screenshots/connection-tags-2.png) - + The sync process: + 1. Nango syncs files from the provider + 2. Webhook notifies backend of sync completion + 3. Backend fetches records using `nango.listRecords` + 4. File metadata is stored in the database + 5. Deletions are tracked and handled appropriately -### Tag rules +2. **File Download with Proxy** + File download functionality is implemented in [`back-end/src/routes/downloadFile.ts`](https://github.com/NangoHQ/sample-app/blob/main/back-end/src/routes/downloadFile.ts): -- `end_user_email` must be a valid email address, for example `user@example.com`. -- Tag keys are lowercased, so `End_User_Email` and `end_user_email` are treated as the same key. -- Keys are case-insensitive, and duplicate keys after normalization are rejected. -- Keys must start with a letter and contain only alphanumerics, underscores, hyphens, periods, or slashes. -- Keys can be up to 64 characters long. -- A connection can have up to 10 tag keys. -- Values must be non-empty strings up to 255 characters long. + The download process: + 1. Frontend requests file download with file ID and connection ID + 2. Backend uses Nango proxy to fetch file from provider + 3. File is streamed to client with proper headers + 4. Error handling ensures graceful failure -## Connection configuration + Key features: + - Uses Nango proxy for secure file access + - Proper content type and disposition headers + - Streaming response for efficient file transfer + - Comprehensive error handling -Connection configuration is provider-specific information stored on a connection because the connection needs it to work. +### Nango Dashboard -It can be required to: +Explore these sections in your Nango account: -- build an OAuth authorization URL, such as a Zendesk subdomain -- choose the correct API base URL, such as a region or account-specific host -- call API endpoints later, such as a tenant ID, account ID, portal ID, or workspace ID -- store values Nango discovers during authorization, such as an API instance URL or provider account ID +1. **Integration Settings** + - [View Integrations](https://app.nango.dev/dev/integrations) + - Configure sync settings + - View integration status -Use connection configuration when the value is part of the connection's validity. If the value is missing, the connection may fail to authorize, fail credential checks, or be unusable for API requests. +2. **Connections** + - [View Connections](https://app.nango.dev/dev/connections) + - Monitor sync status + - Check connection health -When you use the pre-built [Connect UI](/guides/auth/auth-guide), Nango generates the required forms for the integration and stores the submitted values as connection configuration. +3. **Logs** + - [View Logs](https://app.nango.dev/dev/logs) + - Track sync operations + - Debug issues -When you use [headless auth with a custom UI](/guides/auth/customize-connect-ui#build-your-own-auth-ui), you must collect required connection configuration in your own UI and pass it to `nango.auth()`: +### Common Issues and Solutions -```js -nango.auth('zendesk', { - params: { subdomain: '' } -}); -``` +1. **Connection Issues** + - Check Docker is running + - Verify webhook URL is correct + - Ensure provider credentials are valid -You can also set defaults when creating a Connect session: +2. **Sync Problems** + - Check Nango logs + - Verify file permissions + - Monitor sync status - - - ```ts - const { data } = await nango.createConnectSession({ - allowed_integrations: [''], - integrations_config_defaults: { - '': { - connection_config: { - '': '' - } - } - } - }); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/connect/sessions \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "allowed_integrations": [""], - "integrations_config_defaults": { - "": { - "connection_config": { - "": "" - } - } - } - }' - ``` - - +### File Type Support -Read connection configuration from the connection: +The sample app supports all file types through Nango's proxy: -```ts -const connection = await nango.getConnection('', ''); +- **Regular files** (PDFs, images, documents, etc.) +- **Google Workspace files** (Docs, Sheets, Slides) +- **Microsoft Office files** (Word, Excel, PowerPoint) +- **Other cloud storage file types** -console.log(connection.connection_config); -``` + + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + -For the REST API response shape, see [Get a connection](/reference/backend/http-api/connections/get). For the Node SDK method, see [Get a connection with credentials](/reference/backend/backend-sdk/node#get-a-connection-with-credentials). +## Next steps -## Connection metadata +- [Auth guide](/guides/auth/auth-guide) - understand the authorization flow used by the sample app. +- [Sync functions](/guides/functions/syncs/sync-functions) - customize the data sync logic. +- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - process sync and auth notifications. -Metadata is arbitrary JSON storage on the connection. Use it for information your app or Nango functions need, but that is not a condition for the connection itself to exist. +## Auth Guide -Good metadata examples: +Source: https://nango.dev/docs/guides/auth/auth-guide.md -- field mappings chosen by a customer -- folder, project, board, or object IDs selected during onboarding -- filters and feature flags used by sync functions -- tenant-specific identifiers discovered by your setup flow -- provider webhook subscription IDs used by webhook functions +--- +title: 'Auth guide' +sidebarTitle: 'Auth guide' +description: 'Let your users connect external APIs to your agents & apps.' +--- -Do not use metadata for credentials or values required to make the provider connection valid. Use connection configuration for that. Do not use metadata for synced datasets or large lists of records; use the [records cache](/guides/functions/syncs/records-cache) for sync output. +## Overview -Set metadata after a connection is created: +Nango Auth lets your users connect 800+ external APIs to your product. You embed a Nango-managed auth flow in your application, and Nango handles authorization, credential storage, refresh, and validation. + +A **Connection** is created after each successful authorization. It stores one user's credentials for one external API and keeps them valid over time. Credentials can be retrieved at scale or used directly by other Nango primitives β€” without ever passing through your codebase. + +## How it works + +The end-to-end flow has four steps: + +1. **Backend** β€” your server asks Nango for a short-lived **session token**. +2. **Frontend** β€” your app opens the Nango **Connect UI** with that token. +3. **User** β€” authorizes the API. Nango stores the credentials. +4. **Backend** β€” Nango sends an **auth webhook** with the **connection ID**. You persist it alongside your user/org/project. + +Once you have the connection ID, fetch credentials whenever you need them: - - ```ts - await nango.setMetadata( - '', - '', - { - syncArchived: false, - fieldMapping: { - companyName: 'Account_Name__c' - } - } - ); - ``` + + ```ts + await nango.getConnection(integrationId, connectionId); + ``` - ```bash - curl --request POST \ - --url https://api.nango.dev/connections/metadata \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "connection_id": "", - "provider_config_key": "", - "metadata": { - "syncArchived": false, - "fieldMapping": { - "companyName": "Account_Name__c" - } - } - }' - ``` + ```bash + curl "https://api.nango.dev/connections/{connectionId}?provider_config_key={integrationId}" \ + -H "Authorization: Bearer {nangoSecretKey}" + ``` -Functions can read metadata for the connection they run for: +## Capabilities -```ts -const metadata = await nango.getMetadata(); -``` +- **Auth schemes** β€” OAuth 2.0, OAuth 1.0a, API keys, basic auth, custom. 800+ APIs supported; new ones [added on demand](/integrations/contribute-or-request-api) within days, by request or self-contributed. +- **Pre-built UI** β€” Embedded Connect UI with API-specific guidance, input validation, and your branding. Or [customize Connect UI or build a custom UI](/guides/auth/customize-connect-ui). +- **Credential management** β€” Encrypted storage, automatic refresh, retrieval at scale. Combine with [Proxy](/guides/platform/proxy-requests) or [Functions](/guides/functions/functions-guide) to avoid handling credentials directly. +- **Observability** β€” Failure detection, reconnect flow, and per-connection logs. -For deeper function patterns, see [Storage](/guides/functions/storage). +## Guide -**Related guides** + + **Using a coding agent?** Set up the [docs MCP](/getting-started/coding-agent-setup#docs-mcp-server) and [skills](/getting-started/coding-agent-setup#skills), then copy this page as prompt. + -- [Auth guide](/guides/auth/auth-guide) - create connections with Connect UI. -- [Customize Connect UI](/guides/auth/customize-connect-ui) - customize branding or pass connection configuration without Connect UI. -- [Share a connect link](/guides/auth/share-connect-link) - include tags in link-based flows. -- [Storage](/guides/functions/storage) - use metadata inside functions. -- [List connections API](/reference/backend/http-api/connections/list) - filter connections by tags. + + + Sign up for free (no credit card): [![Try Nango Cloud](/images/nango-deploy-button.svg)](https://app.nango.dev/signup) -## Customize Connect Ui + + Signup cannot be automated. Ask the user to sign up at [app.nango.dev/signup](https://app.nango.dev/signup) and provide their Nango API key from the Environment settings tab > API Keys. Use it as `Authorization: Bearer ` in API requests. -Source: https://nango.dev/docs/guides/auth/customize-connect-ui.md + The default API key created on signup has full access and is the simplest option. ---- -title: 'Customize Connect UI' -sidebarTitle: 'Customize Connect UI' -description: 'Guide to branding Nango Connect UI, overriding setup links, or building a headless auth flow with your own UI.' ---- - - -Pre-requisites: -- complete the [Set up an integration](/guides/auth/auth-guide#guide) section of the Auth guide -- generate a [Connect session token](/guides/auth/auth-guide#guide) - - -Nango's pre-built [Connect UI](/guides/auth/auth-guide) is the recommended way to let users authorize integrations. It generates the right form for each API, validates required inputs, tests credentials when supported, and shows users where to find API keys or other required values. - -You can customize that pre-built UI with your own branding. If you need full control over every screen, you can also skip Connect UI and use Nango in a **headless auth** mode. - -## Customize the pre-built Connect UI - -You can customize the Connect UI theme from the Nango dashboard: - -1. Open **Environment Settings**. -2. Go to the **Connect UI** tab. -3. Choose the theme: light, dark, or system. -4. Set the primary color for the light theme. -5. Set the primary color for the dark theme. -6. Optionally remove the **Secured by Nango** mention. - -These settings apply to the pre-built Connect UI that you open with [`nango.openConnectUI()`](/reference/frontend/frontend-sdk#connect-using-nango-connect-ui). - -Connect UI branding customization is available on the [Growth plan](https://www.nango.dev/pricing). - -## Override documentation links - -By default, the Connect UI displays info icons that link to the Nango documentation. If you are embedding Connect UI in a customer-facing application and want these links to point to your own documentation instead, override them per integration using the `overrides` parameter when [creating a Connect session](/reference/backend/http-api/connect/sessions/create). - -This feature is available on the [Growth plan](https://www.nango.dev/pricing). - - - - -See the full [SDK reference](/reference/backend/backend-sdk/node#create-a-connect-session) for all available parameters. - -```js -const { data } = await nango.createConnectSession({ - // Recommended: copied onto the connection and included in auth webhooks. - tags: { - end_user_id: '', - end_user_email: '', - organization_id: '' - }, - - allowed_integrations: ['', ''], - integrations_config_defaults: { - '': { - connection_config: { - '': '' - } - } - }, - overrides: { - '': { - docs_connect: 'https://your-docs.com/how-to-connect' - } - } -}); -``` - - - -See the full [API reference](/reference/backend/http-api/connect/sessions/create) for all available parameters. - -```bash -curl --request POST \ - --url https://api.nango.dev/connect/sessions \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "tags": { - "end_user_id": "", - "end_user_email": "" - }, - "overrides": { - "": { - "docs_connect": "https://your-docs.com/how-to-connect" - } - } -}' -``` - - - - -Replace `` with the unique name of the integration, for example `jira` or `slack`, and set `docs_connect` to the URL you want the info icons to link to. - -## Build your own auth UI - -Headless auth means you build the user-facing setup UI yourself and use the frontend SDK to pass the required values to Nango. - -Headless auth still uses Nango for the backend parts of auth: Nango stores credentials, refreshes OAuth tokens, manages connection records, sends auth webhooks, and lets you call APIs through the proxy or from functions. What changes is the setup experience your user sees before the connection is created. - -## What changes with headless auth - -For OAuth APIs, calling `nango.auth()` opens the external API's login popup directly. Your user skips the Nango pre-authorization screen. This is useful when you want a shorter flow, but it also means you must collect any provider-specific inputs that the Nango Connect UI would normally ask for first. - -For API key, Basic Auth, and other non-OAuth flows, there is no external login popup. You must build the form that collects the user's credentials, validate field formats in your own UI, and pass the credentials to `nango.auth()`. Nango can still reject invalid credentials when the integration supports credential checks, but your UI owns the input fields, error messages, and setup guidance. - -Some APIs also require **connection configuration** in addition to credentials. For example, an API might need a subdomain, domain, tenant ID, region, or account-specific base URL to build the authorization URL or make future API requests. Connect UI collects these fields automatically. With headless auth, your UI must collect them and pass them programmatically. - -See [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) for the difference between connection configuration, metadata, and tags. - -## Use the frontend SDK for headless auth - -In your frontend, initiate Nango ([reference](/reference/frontend/frontend-sdk#instantiate-the-frontend-sdk)): - -```ts -import Nango from '@nangohq/frontend'; - -const nango = new Nango({ connectSessionToken: '' }); -``` - -Then create the connection with `nango.auth()` ([reference](/reference/frontend/frontend-sdk#connect-using-the-headless-client)): - - - - - -For OAuth, `nango.auth()` opens the external API's login popup directly. - -```js -nango - .auth('') - .then((result) => { - // Show success UI. - }) - .catch((error) => { - // Show failure UI. - }); -``` - - - - - -For API key auth, collect the API key in your own UI, then pass it to Nango. - -```js -nango - .auth('', { - credentials: { - apiKey: '' - } - }) - .then((result) => { - // Show success UI. - }) - .catch((error) => { - // Show failure UI. - }); -``` - - - - - -For Basic Auth, collect the username and password in your own UI, then pass them to Nango. - -```js -nango - .auth('', { - credentials: { - username: '', - password: '' - } - }) - .then((result) => { - // Show success UI. - }) - .catch((error) => { - // Show failure UI. - }); -``` - - - - -## Pass connection configuration - -Some APIs require connection-specific configuration to authorize or make API requests later. Zendesk is a common example: the OAuth authorization URL includes the user's Zendesk subdomain: - -`https://.zendesk.com/oauth/authorizations/new` - -With Connect UI, Nango asks for this value in an automatically generated form. With headless auth, collect it in your own UI and pass it as `params`: - -```js -nango.auth('zendesk', { - params: { subdomain: '' } -}); -``` - -You can also set default connection configuration when you create the Connect session. This is useful when your backend already knows a required value: - - - - - -```js -const { data } = await nango.createConnectSession({ - allowed_integrations: [''], - integrations_config_defaults: { - '': { - connection_config: { - '': '' - } - } - } -}); -``` - - - - -```bash -curl --request POST \ - --url https://api.nango.dev/connect/sessions \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "allowed_integrations": [""], - "integrations_config_defaults": { - "": { - "connection_config": { - "": "" - } - } - } - }' -``` - - - - -In some cases, you might want to override scopes at the connection level. Pass the scopes to `nango.auth()`: - -```js -nango.auth('', { - params: { oauth_scopes_override: 'custom-connection-scope' } -}); -``` - -Nango stores this connection configuration on the connection. You can retrieve it with the SDK ([reference](/reference/backend/backend-sdk/node#get-a-connection-with-credentials)) or API ([reference](/reference/backend/http-api/connections/get)), or see it in connection details in the Nango UI. - -## Next - -Once authorization succeeds, [_save the connection ID_](/guides/auth/auth-guide#guide). - - - **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - - -## Related guides - -- [Auth guide](/guides/auth/auth-guide) - compare the managed Connect UI flow. -- [Frontend SDK reference](/reference/frontend/frontend-sdk#connect-using-the-headless-client) - headless authorization methods and parameters. -- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - understand connection-level storage. + If the user creates a scoped API key instead, this guide needs `environment:integrations:create` (step 2) and `environment:connect_sessions:write` (steps 5 and 8). See [API keys](/reference/backend/http-api/api-keys). + + -## Token Refreshing + + In the dashboard, open the [Integrations](https://app.nango.dev/dev/integrations) tab, click **Configure New Integration**, and pick the API. -Source: https://nango.dev/docs/guides/auth/token-refreshing.md + Each API has a dedicated [Nango documentation page](/integrations/overview) with setup notes and gotchas. ---- -title: "Token refreshing & validity" -sidebarTitle: "Token refreshing & validity" -description: "How Nango handles OAuth token refresh and what to do when tokens are revoked." ---- - -## Automatic token refresh - -Nango automatically refreshes OAuth access tokens before they expire. You don't need to implement any refresh logic in your application. - -To prevent token revocation due to inactivity (some APIs revoke unused refresh tokens), Nango refreshes each access token at least once every 24 hours. - -## Handling refresh failures - -Token refresh can fail for various reasons: -- The user revoked access in the external application -- The external API revoked the refresh token -- The external API experienced an outage - -When a refresh fails, Nango can [notify your app via webhook](/guides/platform/webhooks-from-nango) so you can prompt the user to reconnect. - -## Best practices - -Revoked access tokens and refresh failures happen to all integrations. To handle them gracefully: - -1. **Monitor for failures**: Set up [webhooks from Nango](/guides/platform/webhooks-from-nango) to receive notifications when token refresh fails -2. **Handle revoked tokens**: Follow our [guide on handling revoked access tokens](/guides/platform/common-issues#token-refresh-error-from-the-external-api) -3. **Implement re-authorization**: Make sure you have the [re-authorization flow](/guides/auth/auth-guide#re-authorize-an-existing-connection) in place so users can easily reconnect broken connections - -## Related guides - -- [Auth guide](/guides/auth/auth-guide#re-authorize-an-existing-connection) - implement reconnect sessions for invalid credentials. -- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - receive refresh failure notifications. -- [Common issues](/guides/platform/common-issues#token-refresh-error-from-the-external-api) - troubleshoot revoked tokens. - - -**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - + + OAuth APIs require an OAuth developer app registered with the provider. Register one on the provider's developer portal, use the `Callback URL` shown in your Nango integration settings, then paste the `Client ID` and `Client Secret` back into Nango. Register any required scopes too. -## Functions guide + If this integration will be used in production, complete the optional custom callback URL step below before real users connect. Retrofitting a callback URL later requires updating the provider app and can break new authorization or reconnect flows until the provider and Nango settings match. -Source: https://nango.dev/docs/guides/functions/functions-guide.md -Description: Understand Nango Functions and choose the right way to start using them. + For OAuth 2.0 providers, Nango shows **suggested scopes** β€” auto-discovered and refreshed at least monthly. They're suggestions; you can use any scope the provider supports. -## Overview + + For popular APIs, Nango ships a built-in shared developer app so you can test connections with zero setup. We strongly recommend registering your own OAuth app before going live β€” see [OAuth developer apps](#oauth-developer-apps) below. + + -**Functions** are Nango's runtime for custom integration logic. + + Create the integration with the API. If you need the provider slug first, list providers and use the matching provider's `name` field: -When you build integrations directly, every provider forces you to solve the same hard problems: OAuth credentials, token refresh, per-customer permissions, retries, rate limits, data freshness, observability, and safe execution. Nango handles that infrastructure, and functions let you write the provider-specific logic that is unique to your product. + ```bash + curl --request GET \ + --url https://api.nango.dev/providers \ + --header 'Authorization: Bearer ' + ``` -You write functions in TypeScript and deploy them to Nango. Your app can call them from any language, framework, backend job, or agent workflow. Each execution runs for a specific integration and connection, so the function has scoped access to the right customer's credentials without exposing those credentials to your app or agent. + For OAuth providers, walk the user through registering an OAuth developer app on the provider's portal: link them to the provider's OAuth-app creation page, tell them which `Callback URL` to paste (visible in the Nango integration settings after creation), and ask them to send back the `client_id` and `client_secret` so you can pass them in the request body. + + + + ```bash + curl --request POST \ + --url https://api.nango.dev/integrations \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "unique_key": "", + "provider": "", + "credentials": { + "type": "OAUTH2", + "client_id": "", + "client_secret": "", + "scopes": "," + } + }' + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/integrations \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "unique_key": "", + "provider": "" + }' + ``` + + + + For all fields and response shapes, see the [List all providers API](/reference/backend/http-api/providers/list), [Create an integration API](/reference/backend/http-api/integration/create), and [Update an integration API](/reference/backend/http-api/integration/update). + + -## How functions fit + + In the [Connections](https://app.nango.dev/dev/connections) tab, click **Add Test Connection**, pick your integration, and authorize using a test account. The new connection's credentials appear in its *Authorization* tab β€” securely stored and automatically refreshed. -1. Your user authorizes an external API through [Nango Auth](/guides/auth/auth-guide). -2. Your app stores the resulting `connectionId`. -3. You enable or deploy functions for the integration. -4. Nango runs the function on demand, on a schedule, from an external webhook, or after a connection lifecycle event. -5. Your app receives the function result, sync records, or webhooks from Nango. + + Skip the dashboard. Create a connect session and share the returned `connect_link` with the user β€” they authorize using their test account in the browser, no UI needed on your side: -Functions are the right layer when you need custom API logic, data syncing, webhook processing, AI tools, or per-customer integration behavior. + ```bash + curl --request POST \ + --url https://api.nango.dev/connect/sessions \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "tags": { + "end_user_id": "" + }, + "allowed_integrations": [""] + }' + ``` -## Capabilities + The response contains a `connect_link` (valid 30 minutes). Send it to the user; once they complete authorization, confirm with `GET /connections`. See [Share a connect link](/guides/auth/share-connect-link). + + -- **Scoped external API access** β€” run API calls with the credentials and scopes of one connection. -- **Any app stack** β€” trigger functions through HTTP APIs or SDKs from any backend language. -- **Multiple trigger types** β€” call functions on demand, run them on a schedule, route external webhooks into them, or react to connection lifecycle events. -- **Agent-ready tools** β€” expose selected functions to agents through the API or Nango's MCP server while keeping provider credentials out of the model loop. -- **Built-in integration infrastructure** β€” retries, rate-limit handling, logs, OpenTelemetry export, records storage, checkpoints, and per-connection metadata. -- **Flexible development workflows** β€” enable a template, build headlessly through the Functions API, or keep function code in a local CLI project. + + For production OAuth apps, a callback URL on your own domain is recommended. Some providers show the callback domain to users. - -## Guide + -### Ways to enable functions + To configure a custom callback URL: + 1. Add an endpoint on your domain (e.g. `https://example.com/oauth-callback`) that **308-redirects** to `https://api.nango.dev/oauth/callback`, preserving all query parameters. + 2. Update the registered callback URL with each API provider β€” otherwise they'll reject new authorization flows. + 3. After confirming steps 1 and 2, update the callback URL in Nango's **Environment Settings**. Settings are per-environment, so repeat for every environment. -There are three ways to enable or develop Nango functions. Start with the path that matches how much control and dynamism you need. + + Ask the user what production callback URL they want to use, then have them add a 308 redirect from that URL to `https://api.nango.dev/oauth/callback` before they register provider OAuth apps. The Nango environment setting is dashboard-only β€” ask the user to paste the final callback URL into **Environment Settings > Backend**. + + -| Path | Best for | How it works | -| --- | --- | --- | -| [Option 1: Use function templates](#use-function-templates) | Getting started quickly when Nango already has the provider operation in the catalog. | Enable a pre-built function on an integration, then call it from your app, backend job, or agent workflow. | -| [Option 2: Build locally with the CLI](#build-locally-with-the-cli) | Serious production use cases where you want reviewable diffs, tests, CI/CD, and source control. | Write TypeScript functions in your repo, dry run them against real connections, and deploy with the Nango CLI. | -| [Option 3: Build with the Functions API](#build-with-the-functions-api) | Prototypes, provider operations not covered by templates, and just-in-time integrations where an agent creates behavior dynamically. | Send generated TypeScript source to Nango, compile it, dry run it, and deploy it without a local functions project. | + + Set up a backend endpoint that your frontend will call before each authorization attempt to retrieve a session token from Nango ([API](/reference/backend/http-api/connect/sessions/create) / [Node SDK](/reference/backend/backend-sdk/node#create-a-connect-session)). - - - -### Option 1: Use function templates + You'll need an [API key](/reference/backend/http-api/api-keys) with the `environment:connect_sessions:write` scope (find it in **Environment Settings > API Keys**). -Function templates are pre-built Nango functions for common provider operations. Use them when the catalog already covers what you need and you want the shortest path to a working integration. + + + ```ts + import { Nango } from '@nangohq/node'; -You can find templates in the [template catalog](https://www.nango.dev/templates), in the integration page of the Nango dashboard, and in the [Nango integration templates repository](https://github.com/NangoHQ/integration-templates). + const nango = new Nango({ secretKey: process.env.NANGO_API_KEY! }); -When a template matches your use case, enable it on the integration and call it from your app. If it is close but not exact, [pull it into a local functions project and customize it](#extend-a-template). + api.post('/sessionToken', async (req, res) => { + const { data } = await nango.createConnectSession({ + tags: { + end_user_id: '', + end_user_email: '', + organization_id: '' + }, + allowed_integrations: [''] + }); + + res.status(200).send({ sessionToken: data.token }); + }); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/connect/sessions \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "tags": { + "end_user_id": "", + "end_user_email": "", + "organization_id": "" + }, + "allowed_integrations": [""] + }' + ``` + + - -#### Extend a template + + Tags reconcile Nango's auth-success webhook with the right user, org, or entity in your system. Most apps start with: `end_user_id`, `end_user_email`, `organization_id`. -Use the CLI to pull a template's code into your local functions project from the public catalog: + Tags are also useful for filtering connections via the API and are displayed in the Nango UI. Set the reserved UI tag keys `end_user_display_name` and `end_user_email` to populate the connections list and connection detail page. -```bash -nango pull github list-repos --catalog -``` + See [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) for more. + -`nango pull` writes a single function and its dependencies. After pulling, review the source and schemas, import the function from `index.ts` if needed, adjust inputs, outputs, record models, metadata, or provider mapping logic, then run `nango dryrun` and deploy with `nango deploy`. + `allowed_integrations` controls what the user sees: + - **Multiple integrations** β€” Connect UI shows a picker. + - **Single integration** β€” Connect UI sends the user straight to its auth flow. + - - Pull template code when you need custom fields, a smaller output shape, customer-specific filtering, different retry behavior, or a provider workflow that is close to a template function but not identical. - + + Load the Nango frontend SDK, fetch the session token from your backend, and open Connect UI: - -### Option 2: Build locally with the CLI + + ![](/images/screenshots/connect-ui.gif) + -Local development is the default path for production integrations. Use it when your engineering team wants function code in source control, reviewable diffs, local tests, CI/CD, and a stable project layout. + ```js + import Nango from '@nangohq/frontend'; + + const nango = new Nango(); + const connect = nango.openConnectUI({ + onEvent: (event) => { + if (event.type === 'close') { + // Modal closed. + } else if (event.type === 'connect') { + // Auth flow successful. + } + }, + }); -
- -
+ const res = await fetch('/sessionToken', { method: 'POST' }); + connect.setSessionToken(res.sessionToken); // A loading indicator shows until this is set. + ``` - - - Install the Nango CLI globally: + See the [Frontend SDK reference](/reference/frontend/frontend-sdk#connect-using-nango-connect-ui) for more options. - ```bash - npm install -g nango - ``` + The pre-built Connect UI is recommended but optional β€” if you need full UX control, follow [Customize Connect UI](/guides/auth/customize-connect-ui). For email/cross-device flows, see [Share a connect link](/guides/auth/share-connect-link). + - Initialize your integrations folder at the root of your repo and commit it to source control: + + When authorization succeeds, Nango generates a unique **connection ID**. You use this ID to manage the connection and retrieve its credentials. **You must store it on your side**, attached to the user/org/project that owns the connection β€” Nango doesn't model that ownership. - ```bash - nango init nango-integrations - ``` + Set up the webhook in **Environment Settings**: + 1. Specify a **Webhook URL** in the Nango UI. + 2. Enable **Send New Connection Creation Webhooks**. + 3. Handle `POST` requests on that route in your backend. - This creates a `nango-integrations/` folder with example configuration. The `.nango` subdirectory must be committed because the CLI uses it to track deployed state. - + + Webhook URL configuration is dashboard-only β€” there is no public API for environment settings. Ask the user to paste the webhook URL into **Environment Settings** and enable **Send New Connection Creation Webhooks**. + - - Add your [API keys](/reference/backend/http-api/api-keys) to a `.env` file inside `nango-integrations/`. The CLI currently reads these API keys from `NANGO_SECRET_KEY_` variables: + Webhook payload: - ```bash - NANGO_SECRET_KEY_PROD='' - NANGO_SECRET_KEY_DEV='' + ```json + { + "type": "auth", + "operation": "creation", + "success": true, + "connectionId": "", + "tags": { + "end_user_id": "", + "end_user_email": "", + "organization_id": "" + } + } ``` - Get your [API keys](/reference/backend/http-api/api-keys) from **Environment Settings > API Keys**. Despite the variable name, each value stores a [Nango API key](/reference/backend/http-api/api-keys). The CLI picks up the matching key for whichever environment you deploy to. + Persist `connectionId` against whichever entity owns the connection in your app. + - `nango init` creates `nango-integrations/.gitignore` with `.env` ignored. Keep the `.env` file untracked so [Nango API keys](/reference/backend/http-api/api-keys) are not committed. + + Credentials can become invalid when users revoke access, providers rotate refresh tokens, scopes change, or an app moves from testing to production. Re-authorization updates an existing connection's credentials while preserving its data and config. Deleting and re-creating the connection wipes that data β€” prefer re-authorization. - - Keys are matched by environment name: `NANGO_SECRET_KEY_`. If you rename an environment in the UI, update the variable name in `.env` to match. + Before showing integration settings, check the connection with `GET /connections/{connectionId}`: - For example, an environment named `staging` needs: + + + ```ts + import { Nango } from '@nangohq/node'; + + const nango = new Nango({ secretKey: process.env.NANGO_API_KEY! }); + try { + await nango.getConnection('', ''); + // Connection is valid. + } catch (error) { + if (error.response?.data?.error?.code === 'invalid_credentials') { + // Connection is invalid β€” show a Reconnect button. + displayReconnectUI(); + } + } + ``` + + ```bash - NANGO_SECRET_KEY_STAGING='' + curl --request GET \ + --url 'https://api.nango.dev/connections/?provider_config_key=' \ + --header 'Authorization: Bearer ' ``` - + + - - Use a shared environment (usually `dev`) for day-to-day collaboration. Create personal test connections with [per-connection webhook URL overrides](/guides/platform/webhooks-from-nango#override-webhook-urls-per-connection) pointing at your local webhook endpoint, and deploy functions granularly (`nango deploy --sync` / `--action` / `--integration`) so teammates don't overwrite each other. See [Engineering collaboration](/guides/platform/environments#engineering-collaboration). - Use CI to do full deploys across stable environments (like `staging` or `prod`). See the [CI/CD guide](/guides/functions/ci-cd). - + An `invalid_credentials` error means the connection failed credential refresh or validation β€” show an error state with a **Reconnect** button. - - Run `nango init nango-integrations` to scaffold the folder. Ask the user for their [Nango API key](/reference/backend/http-api/api-keys) from **Environment Settings > API Keys** and write it to the matching `NANGO_SECRET_KEY_` variable in `nango-integrations/.env`. Confirm that `nango-integrations/.gitignore` ignores `.env`. + To trigger re-authorization, use the same frontend flow as a new connection, but generate a reconnect session token on the backend. Pass the returned token to the Frontend SDK exactly like a normal session token. On success you'll receive an `auth` webhook with `operation = override`. - For additional context while building, add Nango's documentation MCP server (`https://nango.dev/docs/mcp`) and install the local builder skill: + + + ```ts + import { Nango } from '@nangohq/node'; + + const nango = new Nango({ secretKey: process.env.NANGO_API_KEY! }); + + api.post('/sessionToken', async (req, res) => { + const { data } = await nango.createReconnectSession({ + connection_id: '', + integration_id: '' + }); + res.status(200).send({ sessionToken: data.token }); + }); + ``` + + ```bash - npx skills add NangoHQ/skills -s building-nango-functions-locally + curl --request POST \ + --url https://api.nango.dev/connect/sessions/reconnect \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "connection_id": "", + "integration_id": "" + }' ``` - + + - - A Nango integrations folder is a small TypeScript project. The root contains shared project files, and each integration gets its own folder named after the integration ID. - - Inside each integration folder, keep function files grouped by type. Sync functions live in `syncs/`, action functions in `actions/`, and event functions in `on-events/`. This keeps the trigger model visible from the file path and matches how the CLI discovers function code. - - The root `index.ts` is the deployment entry point. It should import every function file you want Nango to compile and deploy, for example `import './github/syncs/github-issues';`. Files that are not imported from `index.ts` are not part of the deployed function set. - - The `.nango/` folder stores CLI-managed project state, including deployment tracking. Commit it so teammates and CI deploy from the same baseline. + + Test the auth flow from your app and verify a connection appears in the [Connections](https://app.nango.dev/dev/connections) tab. Failed attempts are inspectable in the **Logs** tab. - ``` - nango-integrations/ - β”œβ”€β”€ .nango/ # auto-managed state, commit it - β”œβ”€β”€ .env # API keys per environment - β”œβ”€β”€ .gitignore # keeps .env and dist untracked - β”œβ”€β”€ index.ts # imports every function file - β”œβ”€β”€ package.json - └── / # one folder per integration, e.g. github - β”œβ”€β”€ syncs/ - β”‚ └── github-issues.ts - β”œβ”€β”€ actions/ - β”‚ └── github-create-issue.ts - └── on-events/ - └── post-connection-creation.ts - ``` - + + After the user runs the flow, confirm the connection was created with [`GET /connections`](/reference/backend/http-api/connections/list) β€” filter by the tags you set in step 5: - - Keep dev mode running while you write code: + ```bash + curl --request GET \ + --url 'https://api.nango.dev/connections?tags[end_user_id]=' \ + --header 'Authorization: Bearer ' + ``` - ```bash - nango dev - ``` + Auth logs are dashboard-only β€” if the call returns no connection, ask the user to check the **Logs** tab for the failure reason. + - `nango dev` continuously type-checks and compiles your function files, surfacing errors immediately. + πŸŽ‰ **You are connected!** Next: + - View connections and credentials in the **Connections** tab. + - Retrieve credentials via the [API](/reference/backend/http-api/connections/get) or [Node SDK](/reference/backend/backend-sdk/node#get-a-connection-with-credentials). + - Build with [sync functions](/guides/functions/syncs/sync-functions), [Action functions](/guides/functions/action-functions), [webhook functions](/guides/functions/webhook-functions), or any other Nango function type. + - - Choose the right function type for your integration use case: + + **Questions, problems, feedback?** Reach out in the [Slack community](https://nango.dev/slack). + - +## OAuth developer apps - | If you need to... | Use | Common trigger | Guide | - | --- | --- | --- | --- | - | Keep external API data fresh, replicate records, or reconcile changes | Sync function | Schedule, manual sync trigger, or external webhook reconciliation | [Sync functions](/guides/functions/syncs/sync-functions) | - | Run an operation when your app, backend job, or agent asks for it | Action function | HTTP API, SDK, async action queue, or MCP/tool call | [Action functions](/guides/functions/action-functions) | - | Process an external provider webhook inside Nango | Webhook function | External API webhook | [Webhook functions](/guides/functions/webhook-functions) | - | React to Nango connection lifecycle events | Event function | Connection creation, validation, or deletion | [Event functions](/guides/functions/event-functions) | +Nango ships built-in shared developer apps for some OAuth 2.0 APIs so you can test connections with zero setup. - For shared primitives, use [Storage](/guides/functions/storage) for connection metadata and [Data validation](/guides/functions/data-validation) for function input, output, and provider response validation. - +They work in production too, but we strongly recommend registering your own before going live. Most OAuth APIs have a step-by-step setup guide in [APIs & Integrations](/integrations/overview) β€” for example, [Gmail](/api-integrations/google-mail/how-to-register-your-own-gmail-api-oauth-app). - - Dry run a function against a real connection: +Reasons to register your own: +- **Whitelabel auth** β€” with Nango's app, users authorize Nango instead of your product. +- **Scopes** β€” Nango developer apps have fixed scopes. Your own app supports any scope the provider exposes. +- **Callback URL** β€” Nango developer apps use Nango's callback. Your own app supports a [custom callback URL](#custom-oauth-callback-url-optional) on your domain. +- **Marketplace listings** β€” provider marketplaces require your own developer app. +- **Advanced API features** β€” some provider features are only available to first-party apps. +- **Revocation risk** β€” most providers don't allow shared credentials. Nango developer apps may be revoked by the provider at any time. +- **Portability** β€” only your own developer app lets you export access and refresh tokens and move off Nango without users re-authorizing. - ```bash - nango dryrun '' -e dev - ``` +The same tradeoffs apply to shared OAuth apps provided by other auth platforms. - If the function reads connection metadata, pass test metadata: +## Related guides - ```bash - nango dryrun '' -e dev --metadata '{"accountRegion":"eu"}' - ``` +- [Share a connect link](/guides/auth/share-connect-link) - send authorization links by email, support tools, or cross-device flows. +- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - store the right connection-level data in the right field. +- [Customize Connect UI](/guides/auth/customize-connect-ui) - customize branding or build your own authorization UI. +- [Token refreshing and validity](/guides/auth/token-refreshing) - handle revoked or expired credentials. - Deploy the function you changed: +## Share Connect Link - ```bash - nango deploy --sync dev - # or - nango deploy --action dev - # or - nango deploy --integration dev - ``` +Source: https://nango.dev/docs/guides/auth/share-connect-link.md - A bare `nango deploy` reconciles every function in the environment and can overwrite teammates' work on a shared collaborative environment. See [Engineering collaboration](/guides/platform/environments#engineering-collaboration). +--- +title: 'Share a connect link' +sidebarTitle: 'Share a connect link' +description: 'Generate a short-lived connect link and share it with your end user.' +--- - For function-type-specific commands, see the [Sync function guide](/guides/functions/syncs/sync-functions#test-and-deploy), [Action function guide](/guides/functions/action-functions#test-and-deploy), and [Testing](/guides/functions/testing). - -
+Use a connect link when you want to trigger authorization without opening Connect UI immediately in your app (for example: email-based onboarding, support-assisted setup, or cross-device flows). - - -### Option 3: Build with the Functions API +## Option 1: Generate a link from your backend -Use the Functions API when an agent should create or change an integration without the user working in a codebase. The agent might be Codex, Claude Code, Cursor, or a product agent running inside your app or sandbox. +Create a connect session and return the `connect_link` to your frontend or internal tools: -This is useful for prototypes, onboarding flows, provider operations not covered by templates, and just-in-time integrations where users describe behavior in text and an agent publishes the matching function to Nango. + + + ```ts + import { Nango } from '@nangohq/node'; -
- -
+ const nango = new Nango({ secretKey: process.env[''] }); -At a high level, the flow is: + api.post('/connectLink', async (req, res) => { + const { data } = await nango.createConnectSession({ + tags: { + end_user_id: '', + end_user_email: '', + organization_id: '' + }, + allowed_integrations: [''] + }); -1. Give the agent the integration ID, a connection ID for validation, the intended behavior, input and output shape, and any provider API context. -2. The agent generates a self-contained TypeScript function using the right function type. -3. Compile the source with `POST /functions/compile`. Send the TypeScript source as `code` and use compiler errors to improve it. -4. Start a dry run with `POST /functions/dryruns`. Send the integration ID, function type, source `code`, connection ID, and any action input, sync metadata, or checkpoint payload needed for the run. -5. Poll `GET /functions/dryruns/{id}` until the dry run reaches `success` or `failed`, then inspect the result, logs, records, or error. -6. Deploy it with `POST /functions/deployments`. Send `type: "function"`, the integration ID, function name, function type, and final source `code`. After deployment, your app can call or trigger the function like any other Nango function. - -Resolve these endpoints against `NANGO_SERVER_URL`, or `https://api.nango.dev` by default. Send `Authorization: Bearer ` and `Content-Type: application/json`. Scoped API keys need `environment:functions:compile` for compile, `environment:functions:dryrun` for dry run creation and polling, and `environment:deploy` for deployment. + res.status(200).send({ + connectLink: data.connect_link, + expiresAt: data.expires_at + }); + }); + ``` +
+ + ```bash + curl --request POST \ + --url https://api.nango.dev/connect/sessions \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "tags": { + "end_user_id": "", + "end_user_email": "", + "organization_id": "" + }, + "allowed_integrations": [ + "" + ] + }' + ``` + +
-The Functions API is powerful, but it intentionally skips a local Git workflow. For production integrations that need code review, tests, ownership, and CI/CD, prefer [local development with the CLI](#build-locally-with-the-cli). +The returned `connect_link` expires after 30 minutes. - -### Take ownership of a deployed function +## Option 2: Generate a link from the dashboard -Pull the source of a function that is already deployed to an environment so you can manage it in your own repository: +In the Nango dashboard, open the Connections page and use the **Share connect link** button. This generates a link that you can share directly with the end user. -```bash -nango pull github list-repos --env dev -``` +## Notes -This works for any deployed function β€” a template you enabled from the dashboard, or code deployed through [`POST /functions/deployments`](/reference/backend/http-api/functions/deployments). The CLI writes the function's TypeScript source locally; from there, `nango deploy` redeploys it as a repo-managed function, so it lives in your Git workflow with code review, tests, and CI/CD. +- For the API details, see [Create a connect session](/reference/backend/http-api/connect/sessions/create). ## Related guides -- [Function tool calling](/guides/functions/tool-calling) β€” expose action functions to agents, LLM SDKs, and MCP clients. -- [Unified APIs](/guides/functions/unified-apis) β€” build provider-specific functions behind one stable model. -- [Logging](/guides/functions/logging) β€” control custom function logs locally and in cloud environments. -- [Storage](/guides/functions/storage) β€” store per-connection metadata and read it inside functions. -- [Data validation](/guides/functions/data-validation) β€” validate function input, output, and provider API responses. -- [Testing](/guides/functions/testing) β€” dry runs, mocks, and snapshot tests. -- [Rate limits](/guides/functions/rate-limits) β€” handle provider `429` responses and long-running retries. -- [CI/CD](/guides/functions/ci-cd) β€” deploy functions with your application pipeline. +- [Auth guide](/guides/auth/auth-guide) - embed the standard Connect UI flow. +- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - reconcile completed links with users and orgs. +- [Create a connect session API](/reference/backend/http-api/connect/sessions/create) - API details for generated links. -## Sync Functions +## Connection tags, configuration, and metadata -Source: https://nango.dev/docs/guides/functions/syncs/sync-functions.md +Source: https://nango.dev/docs/guides/auth/connection-tags-configuration-metadata.md +Description: Use tags, connection configuration, and metadata for the right connection-level data. ---- -title: 'Sync function guide' -sidebarTitle: 'Sync function guide' -description: 'Build sync functions that keep external API data fresh and consumable by your app.' ---- - -Sync functions keep external API data fresh in your app. They run on a recurring cadence, write records to Nango's records cache, and let your app consume changes reliably. - -Use sync functions when your app needs to replicate a dataset from an external system for sync, indexing, RAG, reporting, or change-detection workflows. - -## Create the function - -Add a file under the integration's `syncs/` folder: - -```typescript crm/syncs/contacts.ts -import { createSync } from 'nango'; -import * as z from 'zod'; - -const Contact = z.object({ - id: z.string(), - email: z.string().email().optional(), - updatedAt: z.string() -}); - -const Metadata = z.object({ - accountRegion: z.string().optional() -}); - -const Checkpoint = z.object({ - lastUpdatedAt: z.string() -}); - -export default createSync({ - description: 'Syncs contacts', - version: '1.0.0', - frequency: 'every hour', - autoStart: true, - models: { Contact }, - metadata: Metadata, - checkpoint: Checkpoint, - exec: async (nango) => { - const metadata = await nango.getMetadata(); - const checkpoint = await nango.getCheckpoint(); - const since = checkpoint?.lastUpdatedAt; - - for await (const page of nango.paginate({ - endpoint: '/contacts', - params: { - ...(since ? { updated_after: since } : {}), - ...(metadata?.accountRegion ? { region: metadata.accountRegion } : {}) - }, - paginate: { - type: 'cursor', - cursor_path_in_response: 'pagination.next_cursor', - cursor_name_in_request: 'cursor', - response_path: 'contacts', - limit_name_in_request: 'limit', - limit: 100 - } - })) { - const contacts = page.map((contact) => ({ - id: contact.id, - email: contact.email, - updatedAt: contact.updated_at - })); - - await nango.batchSave(contacts, 'Contact'); - - const lastContact = contacts[contacts.length - 1]; - if (lastContact) { - await nango.saveCheckpoint({ lastUpdatedAt: lastContact.updatedAt }); - } - } - } -}); -``` - -Import the function from `index.ts`: - -```typescript index.ts -import './crm/syncs/contacts'; -``` - - - Sync implementation quality matters. Suboptimal syncs can consume far more API calls, compute, memory, and storage than needed; they can also become expensive, crash, behave unreliably, or hit provider rate limits. Before deploying a sync to production, review the [Sync efficiency guide](/guides/functions/syncs/sync-efficiency). - - - - Before generating a sync, collect the integration ID, connection ID for testing, target records, provider pagination style, incremental filter, deletion strategy, required metadata, and expected sync frequency. - - Prefer incremental syncs when the provider supports them. Save records page by page, checkpoint after successful writes, and keep the record model limited to fields the app actually needs. - - -## Pass parameters with metadata - -Use [connection metadata](/guides/functions/storage#connection-metadata) for any value the sync needs on scheduled runs: - -- Customer configuration, such as selected folders, projects, accounts, regions, or custom field mappings. -- Provider context discovered after authorization. -- Feature flags or filters that change what the sync fetches. - -If the sync should not run before configuration exists, set `autoStart: false`, save the required metadata from your app, then start the schedule after configuration is complete. - -From your app, call the Node SDK [`nango.startSync()` method](/reference/backend/backend-sdk/node#start-schedule-for-syncs): - -```ts -await nango.startSync('crm', ['contacts'], ''); -``` - -Or call the [Start sync API](/reference/backend/http-api/sync/start) from any backend. Starting a sync schedule also triggers an immediate first run. - -## Test and deploy - -Dry run the function against a real connection: - -```bash -nango dryrun contacts '' -e dev -``` - -If the sync reads connection metadata, pass test metadata to the dry run: - -```bash -nango dryrun contacts '' -e dev --metadata '{"accountRegion":"eu"}' -``` - -Or load metadata from a file: - -```bash -nango dryrun contacts '' -e dev --metadata @fixtures/metadata.json -``` - -Simulate resuming from a checkpoint: - -```bash -nango dryrun contacts '' -e dev --checkpoint '{"lastUpdatedAt":"2026-01-01T00:00:00.000Z"}' -``` - -Print local diagnostics for memory and CPU behavior: - -```bash -nango dryrun contacts '' -e dev --diagnostics -``` - -Deploy your functions: - -```bash -nango deploy -``` - -To deploy only this sync function: - -```bash -nango deploy --sync contacts dev -``` - -## Start or trigger runs - -If `autoStart: true`, Nango starts the schedule for new connections automatically. Otherwise, start it after the connection is ready and required metadata is saved: - -```typescript -await nango.startSync('crm', ['contacts'], ''); -``` - -`nango.startSync()` is a [Node SDK method](/reference/backend/backend-sdk/node#start-schedule-for-syncs). Use the [Start sync API](/reference/backend/http-api/sync/start) if you are starting schedules from another backend language. - -Trigger a run immediately: - -```typescript -await nango.triggerSync('crm', ['contacts'], ''); -``` - -`nango.triggerSync()` is a [Node SDK method](/reference/backend/backend-sdk/node#trigger-syncs). Use the [Trigger sync API](/reference/backend/http-api/sync/trigger) for one-off sync runs from another backend language. - -## Consume records - -Configure your app's Nango webhook URL in **Environment Settings > Webhook URLs**. After a run, Nango sends a sync webhook with the connection, integration, sync name, model, and change counts. Your app should then read records by cursor: - - - - ```typescript - import { Nango } from '@nangohq/node'; - - const nango = new Nango({ secretKey: process.env.NANGO_SECRET_KEY! }); - - const result = await nango.listRecords({ - providerConfigKey: 'crm', - connectionId: '', - model: 'Contact', - cursor: '' - }); - ``` - - - ```bash - curl -G https://api.nango.dev/records \ - --header 'Authorization: Bearer ' \ - --header 'Provider-Config-Key: crm' \ - --header 'Connection-Id: ' \ - --data-urlencode 'model=Contact' \ - --data-urlencode 'cursor=' - ``` - - - -The consumer loop is: receive a sync webhook from Nango, look up the last cursor processed for that connection and model, fetch records with that cursor, process them, then store the cursor from the last record fetched. - -## Two-way syncs - -You can implement two-way syncs by combining sync functions with [action functions](/guides/functions/action-functions): - -- Use a sync function to replicate external data into your app and keep your local state fresh. -- Use action functions for writes back to the external API, such as creating, updating, or deleting records. -- After a write action succeeds, update your local state optimistically or trigger the relevant sync so the records cache catches up with the external source of truth. - -This keeps the read path and write path explicit. The sync owns ongoing data freshness, checkpoints, record storage, and change delivery. Actions own user-initiated writes and provider-specific validation or side effects. - -For unified models, use the same schema for synced records and write action input where possible. This keeps your app from branching on each provider while still letting each provider implementation handle API-specific fields and edge cases. - -## Deep dives - -- [Sync efficiency](/guides/functions/syncs/sync-efficiency) -- [Checkpoints](/guides/functions/syncs/checkpoints) -- [Records cache](/guides/functions/syncs/records-cache) -- [Deletion detection](/guides/functions/syncs/deletion-detection) -- [Real-time syncs](/guides/functions/syncs/realtime-syncs) -- [Sync partitioning](/guides/functions/syncs/sync-partitioning) + + Pre-requisite: complete the [Set up an integration](/guides/auth/auth-guide#guide) section of the Auth guide. + -## Sync Efficiency +A Nango connection can store several kinds of information besides credentials. Use the right field depending on what the data does. -Source: https://nango.dev/docs/guides/functions/syncs/sync-efficiency.md +| Field | Use it for | Example | +| --- | --- | --- | +| `tags` | Attribution, filtering, routing, and webhook reconciliation. | `end_user_id`, `organization_id`, `workspace_id` | +| `connection_config` | Provider-specific information required for the connection to be valid or usable. | `subdomain`, `tenantId`, `region`, API base URL | +| `metadata` | Your own application or function configuration stored on the connection. | field mappings, selected folder IDs, feature flags | ---- -title: 'Sync efficiency' -sidebarTitle: 'Sync efficiency' -description: 'Build sync functions that replicate external datasets without wasting API calls, memory, or compute.' ---- - -Sync functions are often used to replicate external datasets into your app or to notify your app when external data changes. Efficient syncs fetch only what changed, save records in batches, and let your app consume changes promptly. - -## Prefer incremental syncs - -An **incremental sync** fetches only records that changed since the previous run. The function stores progress in a [checkpoint](/guides/functions/syncs/checkpoints), then passes that progress back to the external API on the next run. - -A **full sync** fetches the whole dataset every run, then saves or compares the complete result. - -Incremental syncs are usually an order of magnitude more efficient than full syncs. They reduce provider API calls, function runtime, memory usage, Nango compute, records churn, and downstream writes in your app. - -Full syncs can be acceptable for small datasets or low-frequency jobs. For large datasets, they can become plainly unrealistic: expensive to run, slow to finish, more likely to crash, more likely to hit provider rate limits, and less reliable when a run needs to process thousands or millions of records every time. - -| Approach | Best for | Tradeoff | -| --- | --- | --- | -| Incremental sync | Large datasets, frequent polling, APIs with `updated_after`, cursor, or sequence filters | Requires checkpoint logic and provider support | -| Full refresh | Small datasets or APIs without incremental filters | Simpler, but uses more API calls, memory, and compute as data grows | - -This choice is constrained by the external API shape. To benefit from incremental syncing, the provider usually needs a parameter such as `updated_at`, `updated_since`, `modified_after`, a cursor, a sequence ID, or an event stream that lets you ask for only changed records. - -The hardest case is a large dataset where the API does not support incremental filters. Often, that happens because the provider expects you to use webhooks instead. In Nango, use [webhook functions](/guides/functions/webhook-functions), [webhook forwarding](/guides/platform/webhook-forwarding), or [real-time syncs](/guides/functions/syncs/realtime-syncs) to process provider events and avoid polling the entire dataset. - -The risky combination is: **large dataset + no incremental API + high freshness requirement**. If you need to run a full sync frequently to keep data fresh, the design is usually unrealistic in terms of cost, runtime, reliability, and rate limits. Look for a webhook strategy, reduce freshness requirements, partition the dataset, or narrow the scope of synced data. - -## Save page by page - -Do not accumulate the full dataset in memory before calling `batchSave()`. Save each page as soon as it is mapped, then checkpoint after the save succeeds. - -```typescript -const checkpoint = await nango.getCheckpoint(); - -for await (const page of nango.paginate({ - endpoint: '/contacts', - params: checkpoint ? { updated_after: checkpoint.lastModifiedISO } : {}, - paginate: { - type: 'cursor', - cursor_path_in_response: '', - cursor_name_in_request: 'cursor', - response_path: '', - limit_name_in_request: 'limit', - limit: 100 - } -})) { - const contacts = page.map(mapContact); - - await nango.batchSave(contacts, 'Contact'); - - const lastContact = contacts[contacts.length - 1]; - if (lastContact) { - await nango.saveCheckpoint({ lastModifiedISO: lastContact.updatedAt }); - } -} -``` - -This pattern keeps memory bounded and lets the next run resume from the last saved page if the function stops midway. - -## Keep records small - -Only fetch and save fields your app needs. Smaller records reduce external API usage, Nango compute, cache size, downstream processing, and cost. - -Keep records steady too. During full syncs, Nango can process unchanged records faster when the saved record payload stays identical between runs. Avoid adding fields that change on every fetch even when the underlying external record did not change, such as `lastFetchedAt`, request timestamps, random IDs, or transient API metadata. Volatile fields make the record look changed every run, which forces extra processing and downstream updates. - -## Filter unnecessary data early - -Filter data as early as possible, either by using filters provided by the external API or by discarding records before calling `batchSave()`. This keeps the external system as the source of truth while reducing provider API usage, Nango compute, cache size, and downstream processing. - -Prefer provider-side filters such as selected folders, projects, accounts, regions, statuses, or `updated_after` parameters. If the provider cannot filter server-side, map and filter each page before saving so Nango and your app only process records that matter. - -Use [connection metadata](/guides/functions/storage#connection-metadata) for per-customer filters. For example, store selected project IDs, folder IDs, regions, pipelines, or custom field mappings on the connection, then read that metadata inside the sync and pass it to the provider API. - -```typescript -const metadata = await nango.getMetadata(); -const checkpoint = await nango.getCheckpoint(); - -for await (const page of nango.paginate({ - endpoint: '/tasks', - params: { - project_id: metadata?.projectId, - updated_after: checkpoint?.lastModifiedISO - }, - paginate: { - type: 'cursor', - cursor_path_in_response: 'next_cursor', - cursor_name_in_request: 'cursor', - response_path: 'tasks' - } -})) { - const tasks = page.filter((task) => !metadata?.status || task.status === metadata.status).map(mapTask); - - await nango.batchSave(tasks, 'Task'); -} -``` - -If you need additional data later, update the sync function and trigger a run with `reset: true` to backfill historical data with the new shape or broader filter. - -## Consume changes promptly - -Nango's records cache is a delivery mechanism, not your app's long-term data store. Configure [webhooks from Nango](/guides/platform/webhooks-from-nango), fetch changed records from the [records API](/reference/backend/http-api/sync/records-list), store them in your system, and persist the last processed cursor. - -When reading records from Nango, keep page sizes modest. A page size around `100` records is a good default: it keeps payloads quick to transfer, reduces memory spikes in your worker, and makes retries less expensive when a downstream write fails. - -Read [Records cache](/guides/functions/syncs/records-cache) for cursor behavior, payload shape, and retention details. - -## Related guides - -- [Functions guide](/guides/functions/syncs/sync-functions) -- [Checkpoints](/guides/functions/syncs/checkpoints) -- [Records cache](/guides/functions/syncs/records-cache) -- [Real-time syncs](/guides/functions/syncs/realtime-syncs) -- [Sync partitioning](/guides/functions/syncs/sync-partitioning) +## Connection tags -## Checkpoints +Tags are small key/value strings you attach to a Connect session. Nango copies them to the resulting connection and includes them in auth webhooks. -Source: https://nango.dev/docs/guides/functions/syncs/checkpoints.md +Their primary purpose is **attribution**. Nango uses random UUIDs as connection IDs, so tags are the bridge between a Nango connection and the user, organization, workspace, or other entity in your system. ---- -title: 'Checkpoints' -sidebarTitle: 'Checkpoints' -description: 'Save progress mid-run, resume after failures, and turn full syncs into incremental ones.' ---- - -Checkpoints let sync functions save their progress and resume from where they left off. This enables a function to fetch only new or changed data instead of re-fetching everything on each run. Checkpoints are what make sync functions **resilient to failures** and enable **incremental syncing**, the recommended approach for any non-trivial dataset. - -Define a `checkpoint` schema in your sync function to enable checkpoint support. If you are migrating from `nango.lastSyncDate`, see the [migration guide](/guides/platform/migrations/migrate-to-checkpoints). - -## Why checkpointing matters - -Without checkpoints, every sync run fetches the entire dataset from the external API. This works for small datasets, but quickly becomes unsustainable as data grows. Consider a Salesforce account with 500,000 contacts syncing every 15 minutes: without checkpoints, each run re-fetches all 500,000 records even if only a handful changed β€” consuming orders of magnitude more API calls, compute time, and memory than necessary. - -Checkpoints solve this by tracking how far your sync has progressed. The benefits compound: - -- **Performance** β€” Only fetch what changed. A 15-minute incremental sync processes minutes of changes, not years of history. -- **Resilience** β€” If a sync fails mid-execution, the next run resumes from the last checkpoint instead of restarting from scratch. -- **Lower costs** β€” Less compute time on Nango, fewer API calls against the external API's rate limits, and lower bandwidth consumption. -- **Higher freshness** β€” Faster syncs mean you can run them more frequently, keeping your data closer to real-time. - -## Function interruption and resumption - -Nango reserves the right to cap the duration of a function execution. When an execution reaches the limit, Nango interrupts it gracefully and schedules the next execution to start immediately. - -Checkpoints are what make this seamless: the next execution should call `getCheckpoint()` and resumes from where the previous one stopped. **Without checkpoints, each execution starts from scratch**, meaning any function that takes longer than the execution cap will loop indefinitely without ever completing. - - -If your sync processes a large dataset, you must call `saveCheckpoint()` after every `batchSave`. A sync without checkpoints that exceeds the execution duration will restart from the beginning on every run and never finish. - - -The interrupt-and-resume flow: - -1. Sync runs, processes records, saves a checkpoint after each page. -2. Nango interrupts the sync gracefully when the execution cap is reached (ie: after the current `saveCheckpoint()` call completes). -3. The next execution starts immediately, calls `getCheckpoint()`, and continues from that point. -4. This repeats until the sync finishes naturally. - -## How checkpoints work - -A checkpoint is a small payload, defined by a schema you control, that your sync saves after processing each batch of data. On the next execution, the sync reads the checkpoint to know where it left off. - -The typical flow is: - -1. Read the current checkpoint with `nango.getCheckpoint()` (returns `null` on first run). -2. Fetch a page of data from the external API, starting from the checkpoint. -3. Save the records to Nango's cache with `nango.batchSave()`. -4. Save a new checkpoint with `nango.saveCheckpoint()`. -5. Repeat until there is no more data. - -## Defining a checkpoint schema - -You define your checkpoint schema in the `createSync()` declaration using [Zod](https://zod.dev), just like your data models. The schema describes the shape of the progress marker your sync will save. - -Most commonly, the checkpoint is a timestamp indicating how far you've synced: - -```ts -import { createSync } from 'nango'; -import * as z from 'zod'; - -export default createSync({ - description: 'Sync contacts from Salesforce', - frequency: 'every hour', - checkpoint: z.object({ - lastModifiedISO: z.string(), - }), - models: { Contact: ContactSchema }, - exec: async (nango) => { - // Implementation below - }, -}); -``` - -The checkpoint payload can be anything the external API gives you to track progress: a timestamp, a cursor, a page token, or any combination. You control the schema. - -```ts -// Timestamp-based checkpoint -checkpoint: z.object({ lastModifiedISO: z.string() }) - -// Cursor-based checkpoint -checkpoint: z.object({ nextCursor: z.string() }) - -// Composite checkpoint -checkpoint: z.object({ lastModifiedISO: z.string(), pageToken: z.string().optional() }) -``` - -## Implementing an incremental sync with checkpoints - -Here is a complete example syncing Salesforce contacts incrementally: - -```ts -import { createSync } from 'nango'; -import * as z from 'zod'; - -const ContactSchema = z.object({ - id: z.string(), - first_name: z.string(), - last_name: z.string(), - email: z.string(), - last_modified_date: z.string(), -}); - -export default createSync({ - description: 'Sync contacts from Salesforce', - frequency: 'every hour', - checkpoint: z.object({ - lastModifiedISO: z.string(), - }), - models: { Contact: ContactSchema }, - - exec: async (nango) => { - // 1. Read the checkpoint (null on first run) - const checkpoint = await nango.getCheckpoint(); - - let query = 'SELECT Id, FirstName, LastName, Email, LastModifiedDate FROM Contact'; - if (checkpoint) { - // Only fetch records modified since the last checkpoint - query += ` WHERE LastModifiedDate > ${checkpoint.lastModifiedISO}`; - } - query += ' ORDER BY LastModifiedDate ASC'; - - for await (const records of nango.paginate({ - endpoint: '/services/data/v53.0/query', - params: { q: query }, - paginate: { - type: 'link', - response_path: 'records', - link_path_in_response_body: 'nextRecordsUrl', - }, - })) { - const contacts = mapContacts(records); - - // 2. Save records to the cache - await nango.batchSave(contacts, 'Contact'); - - // 3. Save checkpoint after each page - const lastContact = contacts[contacts.length - 1]; - await nango.saveCheckpoint({ - lastModifiedISO: lastContact.last_modified_date, - }); - } - }, -}); -``` - -The key pattern: **save records and checkpoint after every page**. This ensures that if the sync fails on page 50 of 100, the next run resumes from page 50 β€” not page 1. - -## The first sync run - -Even with checkpoints, the very first execution has no previous progress to resume from β€” `getCheckpoint()` returns `null`. This initial run fetches the entire historical dataset and is inherently more resource-intensive than subsequent runs. - -One strategy to manage this is to limit the backfill window. For example, if you are syncing a Notion workspace, you might only fetch pages modified in the last three months, assuming older pages are less relevant: - -```ts -const checkpoint = await nango.getCheckpoint(); -const since = checkpoint?.lastModifiedISO ?? threeMonthsAgo(); -``` - -After the initial run completes, subsequent runs are fast and incremental β€” only processing changes since the last checkpoint. - -## Implementing a full sync with checkpoints - -Not every sync can be incremental. Some APIs don't support filtering by modification date, so you must fetch all records on every run. Such syncs can still benefit from checkpoints for resilience: if a run is interrupted mid-dataset, the next run resumes from the last page instead of starting over. - -Call `clearCheckpoint()` at the end of a successful run so the next scheduled run starts from the first page. - -```ts -export default createSync({ - description: 'Sync all contacts', - frequency: 'every hour', - checkpoint: z.object({ - nextCursor: z.string(), - }), - models: { Contact: ContactSchema }, - - exec: async (nango) => { - // Resume from the last page if this run was interrupted - const checkpoint = await nango.getCheckpoint(); - let nextCursor: string | undefined = checkpoint?.nextCursor; - - do { - const res = await nango.get({ - endpoint: '/contacts', - params: { cursor: nextCursor }, - }); - - const contacts = mapContacts(res.data.records); - await nango.batchSave(contacts, 'Contact'); - - nextCursor = res.data.nextCursor; - - if (nextCursor) { - await nango.saveCheckpoint({ nextCursor }); - } - } while (nextCursor); - - // All pages fetched, clear checkpoint so the next run starts from the first page - await nango.clearCheckpoint(); - }, -}); -``` - -## When to sync without checkpoints - -For small datasets (e.g., a list of Slack users for an organization with fewer than 100 employees), a sync without checkpoint can be perfectly fine. - -As datasets grow, full syncs become unscalable β€” taking longer to run, triggering rate limits, and consuming more compute and memory. If your dataset has more than a few thousand records and the API supports pagination and/or filtering by date or cursor, use checkpoints. - - -`deleteRecordsFromPreviousExecutions()` is incompatible with checkpoints because it requires comparing the full dataset between consecutive runs. Use `trackDeletesStart`/`trackDeletesEnd` instead β€” see [Deletion detection](/guides/functions/syncs/deletion-detection). - - -## Checkpoints vs. cursors - -Both checkpoints and [cursors](/guides/functions/syncs/records-cache#cursors-and-sync-progress) are markers of sync progress, but they track different relationships: - -| | Checkpoint | Cursor | -| --- | --- | --- | -| **Direction** | Nango β†’ external API | Your app β†’ Nango | -| **What it tracks** | How far Nango has synced from the external API | How far your app has fetched from Nango's records cache | -| **Who manages it** | Your sync function, via `saveCheckpoint()` | Your application, via the `cursor` parameter on [GET /records](/reference/backend/http-api/sync/records-list) | -| **Typical payload** | A timestamp or API cursor from the external system | An opaque string returned by Nango | - -Both are important: checkpoints keep your sync efficient, and cursors keep your application's data consumption efficient. - -## Re-syncing: resetting checkpoints and the cache - -When you [trigger a sync](/reference/backend/http-api/sync/trigger) manually (from the UI or API), you can control whether to preserve or reset progress: - -| Option | Default | What it does | -| --- | --- | --- | -| `reset` | `false` | When `true`, clears the checkpoint and re-fetches the full dataset from the external API. The cache is preserved, so Nango can still distinguish new records from updated ones. | -| `emptyCache` | `false` | When `true`, deletes all cached records before the sync runs. Must be used with `reset: true`. The sync starts completely fresh. | - -**Leave both off** for a standard incremental sync. - -**Use `reset: true`** when you want to re-fetch everything from the external API but preserve the cache for accurate change detection. This is useful when you suspect data may have been missed. - -**Use `reset: true` with `emptyCache: true`** when you need to start from scratch β€” for example, after a breaking change to your data model. - - -Resetting the checkpoint triggers a full re-sync from the external API, which takes longer and may incur higher compute costs. Clearing the cache additionally means every record will be reported as `ADDED`, your previously persisted [cursors](/guides/functions/syncs/records-cache#cursors-and-sync-progress) become invalid, and you will need to reprocess the entire dataset on your side. - - -```ts -// Preserve checkpoint (standard incremental sync) -await nango.triggerSync('', ['contacts'], ''); - -// Reset checkpoint, re-fetch everything, preserve cache for change detection -await nango.triggerSync('', ['contacts'], '', { reset: true }); - -// Full reset β€” re-fetch everything and clear the cache -await nango.triggerSync('', ['contacts'], '', { reset: true, emptyCache: true }); -``` - -## Observability - -Checkpoints are exposed in several places to help you monitor sync progress: - -- **Sync webhooks** β€” The [sync completion webhook](/guides/platform/webhooks-from-nango) includes checkpoint information, so your application knows how far the sync has progressed. -- **Sync status API** β€” The [GET /sync/status](/reference/backend/http-api/sync/status) endpoint returns the current checkpoint for each sync, letting you check progress programmatically. -- **Logs** β€” Checkpoint-related details are visible in the Nango dashboard logs. *(We are actively improving checkpoint visibility in the dashboard.)* - -## Testing checkpoints locally - -When developing locally with the Nango CLI, you can pass a checkpoint value to `dryrun` to simulate resuming from a previous run: - -```bash -nango dryrun salesforce-contacts '' --checkpoint '{"lastModifiedISO": "2024-01-15T00:00:00Z"}' -``` - -This lets you test that your sync correctly resumes from a checkpoint without needing to run a full initial sync first. See the [testing guide](/guides/functions/testing) for more details, including how to write unit tests for checkpoint logic. - - -**Migrating from `nango.lastSyncDate`?** Checkpoints replace it with a schema you control, mid-run granularity, and failure-resumption. Follow the [migration guide](/guides/platform/migrations/migrate-to-checkpoints) for step-by-step instructions. - - -## Reference - -| Function | Description | -| --- | --- | -| [`nango.getCheckpoint()`](/reference/functions/functions-sdk#getcheckpoint) | Retrieves the current checkpoint. Returns `null` on first run or after a reset. | -| [`nango.saveCheckpoint()`](/reference/functions/functions-sdk#savecheckpoint) | Saves progress. Call after each batch of data. | -| [`nango.clearCheckpoint()`](/reference/functions/functions-sdk#clearcheckpoint) | Clears the checkpoint. Use at the end of a full sync so the next run starts from the first page. Checkpoints are also automatically cleared when triggering a sync with `reset: true`. | +Most apps start with these tags: -## Records Cache +- `end_user_id` +- `end_user_email` +- `organization_id` -Source: https://nango.dev/docs/guides/functions/syncs/records-cache.md +Then add whatever additional routing identifiers you need, such as `workspace_id`, `project_id`, or `plan`. ---- -title: 'Records cache' -sidebarTitle: 'Records cache' -description: 'How Nango stores synced records, detects changes, and lets your app fetch deltas via cursors.' ---- - -Sync functions replicate records from an external API to your system continuously. To do this reliably, Nango uses a **records cache** β€” an intermediate store that sits between the external API and your application. - -Every time you call [`nango.batchSave()`](/reference/functions/functions-sdk#save-records) or [`nango.batchDelete()`](/reference/functions/functions-sdk#delete-records) inside a sync function, you are writing to this cache. Your application then reads from the cache using the [GET /records](/reference/backend/http-api/sync/records-list) endpoint or the [Node SDK](/reference/backend/backend-sdk/node#get-records). - -## What the cache does - -The records cache fulfils three roles: - -**Change detection** β€” By tracking every record that has been synced, Nango can tell you which records are new, which have been updated, and which have been deleted. Your application only needs to fetch the delta, reducing bandwidth and processing on your side. - -**Reliable data availability** β€” Fetching from external APIs is inherently unreliable: rate limits, timeouts, and transient errors are common. The cache decouples this unreliable step from your application. Once data lands in the cache, you can fetch it quickly and reliably. - -**Observability** β€” The cache gives you visibility into the state of synced data directly from the Nango dashboard and API, including record counts, last sync times, and change history. - -## How records are identified and compared - -Each record in the cache is uniquely identified by two things: - -- **Record ID** β€” The `id` field you set on each record in your sync function. This should match the unique identifier of the record in the external system (e.g. the external API's primary key). -- **Payload hash** β€” Nango computes a hash of the full record payload. When a record with the same ID is saved again, Nango compares hashes to determine whether the record has actually changed. - -If the ID already exists and the hash is identical, the record is considered unchanged and no update is emitted. If the hash differs, Nango marks it as updated. - - -Be careful with fields that change on every fetch but don't represent a meaningful change to the record, such as a `fetched_at` timestamp. Including such fields in the payload will cause Nango to report spurious updates on every sync run. If possible, exclude or normalize these fields before calling `batchSave()`. - - -## How records are stored - -The cache only keeps the **latest version** of each record β€” there is no versioning or history of payloads. When you call `batchSave()` with an existing ID, the previous payload is overwritten. - -When you call `batchDelete()`, you only need to pass the record's `id`. This does **not** remove the record from the cache. Instead, it marks the record as deleted (a soft delete), so your application can react to the deletion event. The last-known payload is preserved. - -```ts -// Saving records to the cache -await nango.batchSave(contacts, 'Contact'); - -// Marking records as deleted (soft delete) -const toDelete = [{ id: 'record-123' }, { id: 'record-456' }]; -await nango.batchDelete(toDelete, 'Contact'); -``` - -## Fetching records: the change stream - -The [GET /records](/reference/backend/http-api/sync/records-list) endpoint returns a **chronologically ordered stream of record changes**. Each entry in the stream includes: - -- The full record payload -- Metadata indicating whether the record was `ADDED`, `UPDATED`, or `DELETED` -- A cursor for tracking your sync progress - -```json -{ - "records": [ - { - "id": "contact-1", - "name": "Alice", - "_nango_metadata": { - "first_seen_at": "2024-01-15T10:00:00.000Z", - "last_modified_at": "2024-01-15T10:00:00.000Z", - "last_action": "ADDED", - "deleted_at": null, - "cursor": "MjAyNC0wMS0xNVQxMDowMDowMC..." - } - }, - { - "id": "contact-2", - "name": "Bob (updated)", - "_nango_metadata": { - "first_seen_at": "2024-01-10T08:00:00.000Z", - "last_modified_at": "2024-01-15T10:05:00.000Z", - "last_action": "UPDATED", - "deleted_at": null, - "cursor": "MjAyNC0wMS0xNVQxMDowNTowMC..." - } - } - ], - "next_cursor": "MjAyNC0wMS0xNVQxMDowNTowMC..." -} -``` - -You can filter the stream to only return records with a specific `last_action` (`added`, `updated`, or `deleted`) using the `filter` query parameter. - -## Cursors and sync progress - -Every record change in the cache has a **cursor** attached to it. Cursors are opaque, ordered strings that let you: - -1. **Track how far you've synced** β€” After fetching records, persist the cursor of the last record you processed. On the next fetch, pass it back to only receive changes that happened after that point. -2. **Paginate through large result sets** β€” The same cursor is used for pagination when there are more records than the page `limit`. - - -You must persist the cursor on your side for each combination of **connection** and **sync function**. This is how you keep track of your sync progress and avoid reprocessing records. - - - - -```ts -import { Nango } from '@nangohq/node'; - -const nango = new Nango({ secretKey: '' }); - -// Fetch only records that changed since your last cursor -const result = await nango.listRecords({ - providerConfigKey: '', - connectionId: '', - model: 'Contact', - cursor: '' -}); - -// Process records... - -// Persist the cursor of the last record for next time -if (result.records.length > 0) { - const lastCursor = result.records[result.records.length - 1]._nango_metadata.cursor; - await saveToDatabase(connectionId, syncName, lastCursor); -} -``` - - -```bash -curl -G https://api.nango.dev/records \ - --header 'Authorization: Bearer ' \ - --header 'Provider-Config-Key: ' \ - --header 'Connection-Id: ' \ - --data-urlencode 'model=Contact' \ - --data-urlencode 'cursor=' -``` - - - -## Re-syncing: preserve vs. clear the cache - -See [Re-syncing: resetting checkpoints and the cache](/guides/functions/syncs/checkpoints#re-syncing-resetting-checkpoints-and-the-cache) in the Checkpoints guide for the `reset` / `emptyCache` options and their implications. - -## Cache summary - -| Concept | Details | -| --- | --- | -| **Writing to the cache** | `nango.batchSave()` and `nango.batchDelete()` in sync functions | -| **Reading from the cache** | `GET /records` endpoint or `nango.listRecords()` SDK method | -| **Record identity** | Determined by the `id` field you set on each record | -| **Change detection** | Based on comparing payload hashes for the same `id` | -| **Versioning** | None β€” only the latest payload is kept | -| **Deletions** | Soft delete β€” record is marked as deleted, payload is preserved | -| **Cursor** | Opaque ordered string for tracking sync progress and pagination | -| **Payload TTL** | 30 days without update β†’ payload pruned | -| **Full record TTL** | 60 days without sync execution β†’ all records hard-deleted | - -## Related guides - -- [Sync functions](/guides/functions/syncs/sync-functions) - write records into the cache. -- [Sync efficiency](/guides/functions/syncs/sync-efficiency) - keep records small and consume changes promptly. -- [Deletion detection](/guides/functions/syncs/deletion-detection) - mark records deleted in the cache. -- [Get records API](/reference/backend/http-api/sync/records-list) - fetch changed records from your app. + + To make connections easier to identify in the Nango dashboard, set `end_user_display_name` and `end_user_email`. Nango uses these reserved UI tag keys to populate the connections list and connection detail page. + -## Deletion Detection + + Tags are designed for identifiers and routing metadata. Avoid putting secrets or large/free-form payloads in tags. + -Source: https://nango.dev/docs/guides/functions/syncs/deletion-detection.md +### Add tags when creating a Connect session ---- -title: 'Deletion detection' -sidebarTitle: 'Deletion detection' -description: 'Surface deletes from the external API β€” even when the API itself doesn''t expose them cleanly.' ---- - -Sometimes you need to know when a record you are syncing has been deleted in the external system. Deletion detection works differently depending on whether your sync function is incremental or full β€” pick the strategy that matches your sync approach. - -For incremental syncs, you must actively tell Nango which IDs have been removed. For full syncs (which fetch all records on every run), Nango can compute deletes for you automatically. - -## Detecting deletes in incremental syncs - -When your sync only fetches changed data since the previous run, Nango has no built-in way to know which records disappeared on the provider side. - -You must actively tell Nango which IDs have been removed by calling `nango.batchDelete()` ([full reference](/reference/functions/functions-sdk#delete-records)) inside the sync function. - -### When can you use this? - -You can use `nango.batchDelete()` if the external API supports one of the following: - -- A dedicated "recently deleted" endpoint (e.g. `GET /entities/deleted?since=...`) -- The ability to filter or sort by a deletion timestamp -- The ability to filter or sort by last-modified timestamp and records include a flag like `is_deleted`, `archived`, etc. - -If none of these are available, you cannot detect deletes in an incremental sync. You'll either need to switch to a full sync or skip deletion detection. - -### Example - -```ts -import { createSync } from 'nango'; -import * as z from 'zod'; - -const AccountSchema = z.object({ - id: z.string(), - name: z.string() -}); - -export default createSync({ - description: 'Sync Accounts incrementally and handle deletions', - frequency: 'every 2 hours', - endpoints: [{ method: 'GET', path: '/accounts', group: 'Accounts' }], - models: { Account: AccountSchema }, - checkpoint: z.object({ - lastSyncedISO: z.string(), - }), - - exec: async (nango) => { - const checkpoint = await nango.getCheckpoint(); - const now = new Date().toISOString(); - - // (1) Fetch newly created / updated accounts - const res = await nango.get({ - endpoint: '/accounts', - params: { ...(checkpoint && { since: checkpoint.lastSyncedISO }) } - }); - await nango.batchSave(res.data, 'Account'); - - // (2) Fetch deletions since the last run (if this is not the first run) - if (checkpoint) { - const deletedRes = await nango.get({ - endpoint: '/accounts/deleted', - params: { since: checkpoint.lastSyncedISO } - }); - - // (3) Tell Nango which IDs have been deleted in the external system - const toDelete = deletedRes.data.map((row: any) => ({ id: row.id })); - if (toDelete.length) { - await nango.batchDelete(toDelete, 'Account'); - } - } - - // (4) Save checkpoint for next run - await nango.saveCheckpoint({ lastSyncedISO: now }); - } -}); -``` - -## Detecting deletes in full syncs - -Sync functions that fetch all records on every run can automatically detect deletions. - -Nango detects removals by computing the diff between what existed before `trackDeletesStart` and what was saved between `trackDeletesStart` and `trackDeletesEnd` ([full reference](/reference/functions/functions-sdk#detect-deletions-automatically)). - -This works whether your full sync uses checkpoints for resilience or not. If it does, `trackDeletesStart` should be called before fetching any data and `trackDeletesEnd` after all records are saved and the checkpoint is cleared. - -### Example - -```ts -import { createSync } from 'nango'; -import * as z from 'zod'; - -const TicketSchema = z.object({ - id: z.string(), - subject: z.string(), - status: z.string() -}); - -export default createSync({ - description: 'Fetch all help-desk tickets', - frequency: 'every day', - endpoints: [{ method: 'GET', path: '/tickets', group: 'Tickets' }], - models: { Ticket: TicketSchema }, - - exec: async (nango) => { - // Mark the start of deletion tracking - await nango.trackDeletesStart('Ticket'); - - const tickets = nango.paginate<{ id: string; subject: string; status: string }>({ - endpoint: '/tickets', - paginate: { type: 'cursor', cursor_path_in_response: 'next', cursor_name_in_request: 'cursor', response_path: 'tickets' } - }); - - for await (const page of tickets) { - await nango.batchSave(page, 'Ticket'); - } - - // Detect and mark deleted records - await nango.trackDeletesEnd('Ticket'); - } -}); -``` - -### How the algorithm works - -1. When `trackDeletesStart` is called, Nango marks the beginning of the deletion tracking window for the model. -2. Records saved with `batchSave` between `trackDeletesStart` and `trackDeletesEnd` are tracked. -3. When `trackDeletesEnd` is called, Nango compares what existed before `trackDeletesStart` with what was saved in the window. -4. Any records missing from the new dataset are marked as deleted (soft delete). They remain accessible from the Nango cache, but with `record._metadata.deleted === true`. - - -**Be careful with exception handling when using** `trackDeletesStart`/`trackDeletesEnd` - -Nango only performs deletion detection (the "diff") if a sync run completes successfully without any uncaught exceptions. - -Exception handling is critical: -- If your sync doesn't fetch the full dataset between the two calls (e.g. you catch and swallow an exception), Nango will attempt the diff on an incomplete dataset. -- This leads to false positives, where valid records are mistakenly considered deleted. - -**What You Should Do** - -If a failure prevents full data retrieval, make sure the sync run fails and `trackDeletesEnd` is not being called: -- Let exceptions bubble up and interrupt the run. -- If you're using `try/catch`, re-throw exceptions that indicate incomplete data. - - - -**How to use** `trackDeletesStart`/`trackDeletesEnd` **safely** - -If some records are incorrectly marked as deleted, you can trigger a full resync (via the UI or API) to restore the correct data state. - -We strongly recommend not performing irreversible destructive actions (like hard-deleting records in your system) based solely on deletions reported by Nango. A full resync should always be able to recover from issues. - - -## Troubleshooting deletion detection issues - -| Symptom | Likely cause | -| --- | --- | -| Records that still exist in the source API are shown as `deleted` in Nango | Sync didn't save all records (silent failures) between `trackDeletesStart` and `trackDeletesEnd` | -| You never see deleted records | Check if deletion detection is implemented for the sync. | - -## Related guides - -- [Sync functions](/guides/functions/syncs/sync-functions) - implement full and incremental syncs. -- [Records cache](/guides/functions/syncs/records-cache) - understand how deleted records are exposed to your app. -- [Sync efficiency](/guides/functions/syncs/sync-efficiency) - reduce API work during delete detection. -- [Functions SDK reference](/reference/functions/functions-sdk#delete-records) - deletion helper methods. +When requesting a new Connect session token from Nango, pass a `tags` object: -## Realtime Syncs + + + ```ts + import { Nango } from '@nangohq/node'; -Source: https://nango.dev/docs/guides/functions/syncs/realtime-syncs.md + const nango = new Nango({ secretKey: process.env[''] }); ---- -title: 'Real-time syncs with webhooks' -sidebarTitle: 'Real-time syncs' -description: 'Combine webhooks from external APIs with periodic polling for a reliable, real-time stream of changes.' ---- - -Nango supports real-time syncs using [webhook functions](/guides/functions/webhook-functions). You can rely entirely on webhooks or combine them with polling to ensure you never miss data. - -## What is a real-time sync - -Real-time sync involves receiving webhooks from external APIs and processing them inside a sync function. By default, sync functions poll data at a set frequency, but they can also be configured to handle webhooks for real-time updates. - -When processed in a sync: -- The webhook triggers the execution of a Nango sync script -- The script extracts data from the webhook and optionally fetches additional data from the external API -- The modified data is stored in the Nango cache - -Whenever the cache is updated, Nango sends a [sync completion webhook](/guides/platform/webhooks-from-nango#sync-webhooks) to notify your application of new data. This entire process happens in real-time. - -### Webhooks & periodic polling - -Webhooks can fail due to external API outages or unordered events. Periodic polling ensures data consistency by reconciling any missed updates. - -If you use webhooks for real-time syncs, we recommend always combining them with a polling sync function. - -### Near real-time syncing - -As an alternative to real-time syncing, consider **near**-real-time syncing by polling at a higher frequency, which is simpler. Sync functions can run as frequently as every 30 seconds. - -This is more resource intensive, but can be a good compromise if you are only syncing data for a handful of [Connections](/guides/auth/auth-guide#overview). - -## Implement a real-time sync - -### Step 1 β€” Setup prerequisites - -To create a real-time sync, you need: -- Webhooks from the external API enabled. Follow [Webhook functions](/guides/functions/webhook-functions). -- A sync function for the object you want to sync. See [Sync functions](/guides/functions/syncs/sync-functions). - -### Step 2 β€” Enable webhooks processing - -To enable the real-time sync, define `webhookSubscriptions` and `onWebhook` in your sync function: - -```typescript -export default createSync({ - exec: async (nango) => { - // Use for periodic polling. - }, - - webhookSubscriptions: ['contact.propertyChange'], // Webhook event type to listen to - - // Webhook handler - onWebhook: async (nango, payload) => { - if (payload.subscriptionType === 'contact.propertyChange') { - const updatedObject = { - id: payload.objectId, - [payload.propertyName]: payload.propertyValue - }; - - // Use nango.batchSave() or nango.batchUpdate() to save/update records. - } - } -}); -``` - -To check if a sync supports webhooks, navigate to the _Integrations_ tab > select an integration > _Endpoints_ sub-tab > check the function settings for webhook subscriptions. - -## Sync concurrency considerations - -When a polling run and a webhook race to update the same record, the later write wins by default β€” which can clobber a fresher webhook update with stale polled data. To prevent that, set a merging strategy at the start of your function: - -```typescript -export default createSync({ - exec: async (nango) => { - // Don't overwrite records that were modified after this batch was fetched - await nango.setMergingStrategy({ strategy: 'ignore_if_modified_after' }, 'Contact'); - - const contacts: Contact[] = []; - await nango.batchSave(contacts, 'Contact'); - } -}); -``` - -Two strategies are available: - -- **`override`** (default) β€” applies updates regardless of last modification time. May overwrite real-time webhook updates with older polled data. -- **`ignore_if_modified_after`** β€” preserves records that were modified after the current batch was fetched. **Recommended** when you combine polling with webhooks. - -Run `batchSave` / `batchUpdate` / `batchDelete` calls sequentially (not in parallel), and persist data promptly after fetching β€” concurrent batch operations can race against each other. - -## Related guides - -- [Webhook functions](/guides/functions/webhook-functions) - process external API webhooks in Nango. -- [Webhook forwarding](/guides/platform/webhook-forwarding) - forward provider webhooks to your app. -- [Sync functions](/guides/functions/syncs/sync-functions) - keep a polling sync as reconciliation. -- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - consume sync completion notifications. + api.post('/sessionToken', async (req, res) => { + const { data } = await nango.createConnectSession({ + tags: { + end_user_id: '', + end_user_email: '', + organization_id: '' + }, + allowed_integrations: [''] + }); -## Sync Partitioning + res.status(200).send({ sessionToken: data.token }); + }); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/connect/sessions \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "tags": { + "end_user_id": "", + "end_user_email": "", + "organization_id": "" + }, + "allowed_integrations": [ + "" + ] + }' + ``` + + -Source: https://nango.dev/docs/guides/functions/syncs/sync-partitioning.md +### Read tags from the auth webhook ---- -title: 'Sync partitioning' -sidebarTitle: 'Sync partitioning' -description: 'Spawn multiple independent sync processes inside a single connection β€” one per mailbox, drive folder, Slack channel, repo, or any other partition.' ---- - -Sync variants let you spawn multiple independent sync processes **inside a single connection** β€” one per mailbox, file folder, Slack channel, repo, or any other sub-resource the end-user has access to. Each variant runs on its own schedule, with its own checkpoint and records cache, so a slow partition doesn't block a fast one. - -Nango is already multi-tenant by default β€” every sync function executes in the context of an end-user [Connection](/guides/auth/auth-guide#overview), and runs independently for each connection. Variants are for the next level down: fan-out *within* one connection. - -## Overview - -Traditionally, a sync function is defined once and executed once per connection. With variants, you can create multiple instances of the same function that share the base configuration but run independently. Each variant has its own execution schedule, checkpoint, and data storage. - -Key benefits: -- **Parallel execution** β€” variants run independently, so a slow mailbox or folder doesn't block the others. -- **Custom filtering** β€” each variant can target a different sub-resource (e.g., a specific Gmail label, a specific Drive folder). -- **Per-partition state** β€” each variant has its own checkpoint and cache, so failures and re-syncs are isolated. -- **Dynamic scale** β€” create or delete variants programmatically as the end-user adds/removes sub-resources. - -## How sync variants work - -- By default, a sync is associated with a base variant. -- You can create additional sync variants programmatically using the API or SDK. -- Each variant is treated as a separate sync in the Nango UI. -- Sync webhooks include a variant field to identify which variant was executed. -- External webhooks (e.g., from Airtable) are always processed by the base variant. -- If a sync variant needs additional context (e.g., filtering parameters), store/retrieve it using the connection metadata, namespaced with the variant ID. - -## Creating a sync variant - - -Each sync can have a maximum of **100 variants** per connection. For heavier workloads, reach out to increase this limit. - - -To create a sync variant, use the Nango API or SDK. The variant must have a unique name and cannot be "base" (reserved). - - - - ```ts - // Create a sync variant - await nango.createSyncVariant({ - provider_config_key: 'my-integration', - connection_id: 'customer-123', - name: 'sync-orders', - variant: 'high-value-orders' - }); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/sync/sync-orders/variant/high-value-orders \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "provider_config_key": "my-integration", - "connection_id": "customer-123" - }' - ``` - - - -This creates a new variant named `high-value-orders` for the `sync-orders` sync. It will run separately from the base variant. - -## Running & managing sync variants - -Once created, a variant can be managed just like a regular sync. All sync operations (triggering, pausing, resuming, etc.) support the variant parameter. - -Check out the [HTTP API reference](/reference/backend/http-api/sync/trigger) or [Node SDK reference](/reference/backend/backend-sdk/node#trigger-syncs) for details. - -## Accessing the variant in a sync script - -When a sync script runs, the variant name is available via `nango.variant`. You can use this to customize the behavior of your sync. - -```ts example-partitioned-sync-script.ts -export default createSync({ - exec: async (nango) => { - await nango.log(`Running sync with variant: ${nango.variant}`); - - // Use the variant name to namespace the metadata and/or customize API calls. - const res = await nango.get({ - endpoint: `/orders?filter=${nango.variant}` - }); - - // Records are saved in the context of this specific variant. - await nango.batchSave(res.data.orders, 'Order'); - }, -}); -``` - -## Fetching data for a variant - -Use the `variant` query parameter when retrieving records from the Nango API. - - - - ```ts - const records = await nango.listRecords({ - providerConfigKey: 'my-integration', - connectionId: 'customer-123', - model: 'Order', - variant: 'high-value-orders' - }); - ``` - - - ```bash - curl --request GET \ - --url "https://api.nango.dev/records?model=Order&variant=high-value-orders" \ - --header 'Authorization: Bearer ' - ``` - - - -This fetches only the records for the `high-value-orders` variant. - -## Storing variant-specific context - -If a sync variant requires custom parameters (e.g., a filtering threshold), store them in the connection metadata, namespaced by the variant ID. - -Storing metadata: - - - - ```ts - await nango.setMetadata('my-integration', 'customer-123', { - 'high-value-orders.threshold': 500 - }); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/metadata \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "connection_id": "customer-123", - "metadata": { - "high-value-orders.threshold": 500 - } - }' - ``` - - - -Retrieving metadata in a sync script: - -```ts example-partitioned-sync-script.ts -const metadata = await nango.getMetadata(); -const threshold = metadata[`${nango.variant}.threshold`] || 100; - -await nango.log(`Filtering orders above ${threshold}`); -``` - -Keep variants non-overlapping in data scope (unless intentional), store variant-specific settings in connection metadata rather than hardcoding them, and avoid creating one variant per row of data β€” variants are best for partitioning, not row-level fan-out. - -## Related guides - -- [Sync functions](/guides/functions/syncs/sync-functions) - build the base sync before adding variants. -- [Checkpoints](/guides/functions/syncs/checkpoints) - track progress per variant. -- [Records cache](/guides/functions/syncs/records-cache) - fetch data for each variant. -- [Create sync variant API](/reference/backend/http-api/sync/create-variant) - manage variants programmatically. +These tags appear in successful auth webhooks sent by Nango: -## Action Functions +```json +{ + "type": "auth", + "operation": "creation", + "success": true, + "connectionId": "", + "tags": { + "end_user_id": "", + "end_user_email": "", + "organization_id": "" + } +} +``` -Source: https://nango.dev/docs/guides/functions/action-functions.md +Use these values to reconcile the generated `connectionId` with the user, organization, or workspace that initiated the flow in your application. ---- -title: 'Action functions' -sidebarTitle: 'Action functions' -description: 'Build Action functions that your app, backend jobs, or agents can call on demand.' ---- - -Action functions run when your app, backend job, or agent explicitly calls them. In SDK and API names, this function type is often called an **action** because it receives an input and returns an output. - -Use action functions for reads, writes, multi-step provider workflows, unified API operations, and AI tools. - -## Create the function - -Add a file under the integration's `actions/` folder: - -```typescript github/actions/create-issue.ts -import { createAction } from 'nango'; -import * as z from 'zod'; - -export default createAction({ - description: 'Creates a GitHub issue', - version: '1.0.0', - input: z.object({ - owner: z.string(), - repo: z.string(), - title: z.string(), - body: z.string().optional() - }), - output: z.object({ - id: z.number(), - url: z.string().url() - }), - exec: async (nango, input) => { - const response = await nango.post({ - endpoint: `/repos/${input.owner}/${input.repo}/issues`, - data: { - title: input.title, - body: input.body - } - }); - - return { - id: response.data.id, - url: response.data.html_url - }; - } -}); -``` - -Import it from `index.ts`: - -```typescript index.ts -import './github/actions/create-issue'; -``` - - - The output of an action function cannot exceed 2 MB. Return only the fields your app needs. For larger payloads, use the [requests proxy](/guides/platform/proxy-requests) to fetch data directly from your app. - - - - Before generating an action function, collect the integration ID, connection ID for testing, provider endpoint, required input fields, expected output shape, and whether the operation is safe to retry. - - Prefer explicit Zod schemas and short provider response mapping. If the action performs writes, make the logic idempotent before using async execution or retries. - - -## Test and deploy - -Dry run the function with realistic input: - -```bash -nango dryrun create-issue '' -e dev --input '{"owner":"NangoHQ","repo":"interactive-demo","title":"Bug report","body":"Created from a Nango action"}' -``` - -Deploy your functions: - -```bash -nango deploy -``` - -To deploy only this action function: - -```bash -nango deploy --action create-issue dev -``` - -For broader test coverage, see the [testing guide](/guides/functions/testing). To deploy from CI, see [CI/CD](/guides/functions/ci-cd). - -## Trigger synchronously - -Synchronous execution is the default. The API or SDK call returns the function output. - - - - ```typescript - import { Nango } from '@nangohq/node'; - - const nango = new Nango({ secretKey: process.env.NANGO_SECRET_KEY! }); - - const result = await nango.triggerAction( - 'github', - '', - 'create-issue', - { - owner: 'NangoHQ', - repo: 'interactive-demo', - title: 'Bug report', - body: 'Created from a Nango action' - } - ); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/action/trigger \ - --header 'Authorization: Bearer ' \ - --header 'Connection-Id: ' \ - --header 'Provider-Config-Key: github' \ - --header 'Content-Type: application/json' \ - --data '{ - "action_name": "create-issue", - "input": { - "owner": "NangoHQ", - "repo": "interactive-demo", - "title": "Bug report", - "body": "Created from a Nango action" - } - }' - ``` - - - -## Trigger asynchronously - -Use async execution for bulk writes, bursty work, or provider endpoints with tight rate limits. Nango queues the execution, applies retries, and lets you poll or receive a webhook when it completes. - - - Execution timing for asynchronous actions is not guaranteed. Async actions are currently processed sequentially per environment, so completion time depends on how many actions are queued and how long each one runs. Design callers to handle delays by polling the result endpoint or listening for the completion webhook. - - - - - ```typescript - const { id, statusUrl } = await nango.triggerActionAsync( - 'github', - '', - 'create-issue', - { - owner: 'NangoHQ', - repo: 'interactive-demo', - title: 'Bug report', - body: 'Created from an async Nango action' - } - ); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/action/trigger \ - --header 'Authorization: Bearer ' \ - --header 'Connection-Id: ' \ - --header 'Provider-Config-Key: github' \ - --header 'X-Async: true' \ - --header 'X-Max-Retries: 3' \ - --header 'Content-Type: application/json' \ - --data '{ - "action_name": "create-issue", - "input": { - "owner": "NangoHQ", - "repo": "interactive-demo", - "title": "Bug report", - "body": "Created from an async Nango action" - } - }' - ``` - - - -Poll the result: - -```typescript -const result = await nango.getAsyncActionResult({ id }); -``` - -The async trigger response includes a `statusUrl` and `id`. Poll `GET /action/` for the result: `404` means the execution is still running, `200` returns the function output, and `500` returns the execution error. - -To receive completion events instead of polling, configure [webhooks from Nango to your app](/guides/platform/webhooks-from-nango) and enable the `Async action completed` webhook. - - - Use retries only for idempotent function logic. Retried writes can otherwise create duplicate side effects in the external API. - - -## Related guides - -- [Function tool calling](/guides/functions/tool-calling) -- [Data validation](/guides/functions/data-validation) -- [Rate limits](/guides/functions/rate-limits) -- [Trigger action API](/reference/backend/http-api/action/trigger) -- [Functions SDK reference](/reference/functions/functions-sdk) +### Read and filter connections by tags -## Webhook Functions +Nango stores tags on the connection itself. -Source: https://nango.dev/docs/guides/functions/webhook-functions.md + + + ```ts + import { Nango } from '@nangohq/node'; ---- -title: 'Webhook functions' -sidebarTitle: 'Webhook functions' -description: 'Process external API webhooks inside Nango functions.' ---- - -Webhook functions run when an external API sends a webhook to Nango. Use them when the webhook should execute Nango-hosted logic, update records, normalize events, or mark data for later reconciliation. - -If your app should handle the webhook directly, use [webhook forwarding](/guides/platform/webhook-forwarding) instead. - -## Processing or forwarding - -Webhook functions and webhook forwarding both start with the same external event: a provider sends a webhook to Nango. - -Use a webhook function when: - -- Nango should run function code as soon as the provider webhook arrives. -- The webhook should update the records cache. -- The webhook payload needs normalization before your app sees it. -- The event should trigger reconciliation logic inside a sync function. - -Use [webhook forwarding](/guides/platform/webhook-forwarding) when: - -- Your app already has webhook handling logic. -- You want Nango to attribute the event to a connection and forward it. -- The event should not run Nango function code. - -## How routing works - -External APIs send webhooks to the integration's Nango webhook URL. Find it in **Integrations > [Integration] > Webhooks**. - -When the provider has a webhook routing script, Nango reads the incoming payload, headers, or allowed query parameters and tries to map the event to one or more Nango connections. Provider-specific guides explain the exact routing fields when extra setup is required. - -If Nango can map the webhook to a connection, the webhook function runs in that connection context. If Nango cannot map the event, the event cannot safely run connection-scoped function logic; use provider-specific setup or webhook forwarding for that case. - -Some providers require one global webhook registration. Others require one webhook subscription per connected account, which you can automate with an [event function](/guides/functions/event-functions). - - - Before implementing a webhook function, inspect the provider-specific Nango docs for webhook routing requirements. Some providers need the Nango connection ID embedded in the provider webhook payload, while others route automatically from account, team, tenant, or installation identifiers. - - Do not assume an external webhook payload is already trusted or complete. Keep `onWebhook` short, idempotent, and resilient to duplicates or out-of-order delivery. - - -## Create the function - -Webhook function logic usually lives on a sync function with `webhookSubscriptions` and `onWebhook`: - -```typescript crm/syncs/contacts.ts -import { createSync } from 'nango'; -import * as z from 'zod'; - -const Contact = z.object({ - id: z.string(), - email: z.string().email().optional(), - updatedAt: z.string().optional() -}); - -export default createSync({ - description: 'Sync contacts and process contact webhooks', - version: '1.0.0', - frequency: 'every hour', - webhookSubscriptions: ['contact.updated', 'contact.deleted'], - models: { Contact }, - exec: async (nango) => { - // Periodic reconciliation logic. Keep this as the source of truth - // when provider webhooks can be missed, delayed, or partial. - }, - onWebhook: async (nango, payload) => { - if (payload.body.event === 'contact.deleted') { - await nango.batchDelete([{ id: payload.body.contactId }], 'Contact'); - return; - } - - if (payload.body.event === 'contact.updated' && payload.body.contact) { - await nango.batchSave( - [ - { - id: payload.body.contact.id, - email: payload.body.contact.email, - updatedAt: payload.body.contact.updated_at - } - ], - 'Contact' - ); - } - } -}); -``` - -Import it from `index.ts`: - -```typescript index.ts -import './crm/syncs/contacts'; -``` - -## Register the provider webhook URL - -Register the integration's Nango webhook URL in the external API's developer portal. If the provider requires per-connection registration, use an event function after connection creation. - -For example, an event function can call the provider's webhook subscription API with the connection's credentials and store the provider webhook subscription ID in connection metadata for cleanup later. - -## Test and deploy - -Dry run the sync function's `exec` logic: - -```bash -nango dryrun contacts '' -e dev -``` - -Deploy your functions: - -```bash -nango deploy -``` - -To deploy only this webhook-backed sync function: - -```bash -nango deploy --sync contacts dev -``` - -Then send a test webhook from the provider dashboard, CLI, or webhook testing tool to the Nango webhook URL. Check Nango logs for the incoming webhook, routing result, and function execution. - -## Keep webhook processing lightweight - -Avoid making slow provider API calls directly from `onWebhook` unless the provider's webhook is explicitly designed for that flow. Webhooks can arrive in bursts, be retried, or arrive out of order. - -Prefer lightweight, idempotent handling in `onWebhook`, and let the sync function's `exec` reconcile full state. - -## Related guides - -- [Webhook forwarding](/guides/platform/webhook-forwarding) -- [Process external webhooks](/getting-started/use-cases/webhooks-from-external-apis) -- [Real-time syncs](/guides/functions/syncs/realtime-syncs) -- [Event functions](/guides/functions/event-functions) -- [Records cache](/guides/functions/syncs/records-cache) + const nango = new Nango({ secretKey: '' }); + const connection = await nango.getConnection('', ''); -## Event Functions + console.log(connection.tags); + ``` + + + ```ts + import { Nango } from '@nangohq/node'; -Source: https://nango.dev/docs/guides/functions/event-functions.md + const nango = new Nango({ secretKey: '' }); ---- -title: 'Event functions' -sidebarTitle: 'Event functions' -description: 'Run function logic automatically when Nango connection lifecycle events happen.' ---- - -Event functions run automatically when Nango reaches a connection lifecycle event. They are defined with `createOnEvent()`. - -Use them to validate credentials, register provider webhooks, seed connection-specific metadata, or clean up external resources before a connection is deleted. - -## Choose the lifecycle event - -Supported events: - -| Event | When it runs | Common use | -| --- | --- | --- | -| `post-connection-creation` | Immediately after a connection is created | Register provider webhooks, seed metadata, run setup checks | -| `validate-connection` | During connection creation and reconnect | Reject invalid credentials, missing provider permissions, or policy violations (e.g. same-account enforcement) | -| `pre-connection-deletion` | Before a connection is deleted | Delete provider webhook subscriptions or external resources | - - - Before generating an event function, identify the lifecycle event, provider endpoint, required metadata, and desired failure behavior. - - For `validate-connection`, throwing rejects the auth attempt. On first connect, the connection is deleted. On reconnect, the connection is marked as an auth error (`refresh_exhausted`) and the user must reconnect explicitly. For cleanup functions, make the provider call idempotent because the external resource may already be gone. - - For same-account enforcement on reconnect, store the provider account identifier in **connection metadata** during `post-connection-creation`, then compare it to a live identity API call in `validate-connection`. Do not compare `connection_config` fields: reconnect upserts new credentials before validation runs, so config values already reflect the newly authenticated account. - - -## Create a setup function - -Add a file under the integration's `on-events/` folder: - -```typescript salesforce/on-events/post-connection-setup.ts -import { createOnEvent } from 'nango'; -import * as z from 'zod'; - -const Metadata = z.object({ - organization_id: z.string().optional(), - webhookId: z.string().optional() -}); - -export default createOnEvent({ - description: 'Register a Salesforce webhook after a successful connection', - event: 'post-connection-creation', - metadata: Metadata, - exec: async (nango) => { - const response = await nango.post({ - endpoint: '/webhooks', - data: { - url: 'https://api.myapp.com/webhooks/salesforce', - events: ['contact.updated'] - } - }); - - await nango.setMetadata({ - webhookId: response.data.id - }); - } -}); -``` - -Import it from `index.ts`: - -```typescript index.ts -import './salesforce/on-events/post-connection-setup'; -``` - -## Create a connection validation function - -Add a file under the integration's `on-events/` folder: - -```typescript salesforce/on-events/validate-connection.ts -import { createOnEvent } from 'nango'; -import * as z from 'zod'; - -const Metadata = z.object({ - organizationId: z.string().optional(), - webhookId: z.string().optional() -}); - -export default createOnEvent({ - description: 'Validate connection against saved organization id to prevent changing account on reconnect', - event: 'validate-connection', - metadata: Metadata, - exec: async (nango) => { - const metadata = await nango.getMetadata(); - const lockedOrganizationId = metadata?.organizationId; - - const response = await nango.get<{organization_id: string}>({ - endpoint: '/services/oauth2/userinfo' - }); - const organizationId = response.data?.organization_id; - if (!organizationId) { - throw new nango.ActionError('Salesforce connection missing organization_id from /services/oauth2/userinfo'); - } - - // On initial connection, save organization id to connection metadata - if (!lockedOrganizationId) { - await nango.setMetadata({organizationId}); - return; - } - - // On subsequent connections, check if new organization id matches stored value - if (lockedOrganizationId !== organizationId) { - throw new nango.ActionError( - `Salesforce org mismatch: expected ${lockedOrganizationId}, got ${organizationId}` - ); - } - } -}); -``` - -Import it from `index.ts`: - -```typescript index.ts -import './salesforce/on-events/validate-connection'; -``` - -On first connect, validation passes when metadata has no locked org yet; the setup function records `organization_id` after auth succeeds. On reconnect, validation compares the new credentials against the saved org ID and rejects the attempt if they differ. - - -Compare the locked value in **metadata** to a live value from the provider API. Do not compare `connection_config` fields: on reconnect, Nango upserts the new credentials and overwrites `connection_config` **before** `validate-connection` runs, so config already reflects the account the user just authenticated with. - - -## Create a cleanup function - -If the provider webhook is registered per connection, clean it up before the Nango connection is deleted: - -```typescript salesforce/on-events/pre-connection-cleanup.ts -import { createOnEvent } from 'nango'; -import * as z from 'zod'; - -const Metadata = z.object({ - organization_id: z.string().optional(), - webhookId: z.string().optional() -}); - -export default createOnEvent({ - description: 'Delete the Salesforce webhook before connection deletion', - event: 'pre-connection-deletion', - metadata: Metadata, - exec: async (nango) => { - const metadata = await nango.getMetadata(); - if (!metadata?.webhookId) { - return; - } - - await nango.delete({ - endpoint: `/webhooks/${metadata.webhookId}` - }); - } -}); -``` - -Import it from `index.ts`: - -```typescript index.ts -import './salesforce/on-events/pre-connection-cleanup'; -``` - -## Test and deploy - -Dry run an event function against an existing connection: - -```bash -nango dryrun post-connection-setup '' -e dev -``` - -Deploy your functions: - -```bash -nango deploy -``` - -Event functions run automatically when their configured event occurs. Your app does not trigger them directly. - -## Related guides - -- [Webhook functions](/guides/functions/webhook-functions) -- [Webhook forwarding](/guides/platform/webhook-forwarding) -- [Storage](/guides/functions/storage) -- [Functions SDK reference](/reference/functions/functions-sdk) + const { connections } = await nango.listConnections({ + tags: { + end_user_id: '', + organization_id: '' + }, + limit: 100 + }); -## Tool Calling + console.log(connections); + ``` + + + ```bash + curl --request GET \ + --url 'https://api.nango.dev/connections?tags[end_user_id]=&tags[organization_id]=' \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' + ``` + + -Source: https://nango.dev/docs/guides/functions/tool-calling.md +Filtering uses an AND match: a connection must contain all provided tag keys and values. ---- -title: 'Tool calling & MCP' -sidebarTitle: 'Tool calling & MCP' -description: 'Expose Nango action functions to agents, LLM SDKs, and MCP clients.' ---- - -Tool calling in Nango happens through [action functions](/guides/functions/action-functions). Each tool is an action function that an agent, LLM SDK, or MCP client can call on demand for a specific connection. - -The agent chooses a tool, your application asks Nango to execute the action function for that connection, and Nango handles the external API credentials, retries, rate limits, and logs. - -## Prerequisites - -- A Nango integration configured for the external API. -- A connection for the user whose credentials should be used. -- One or more enabled action functions for the operations the agent may call. - -Build custom tools with [action functions](/guides/functions/action-functions), or enable template action functions from the [template catalog](/guides/functions/functions-guide#template-catalog). - -## Common auth and execution - -Keep provider credentials out of the agent runtime. Your app should resolve the Nango connection for the current user, then pass only the connection ID and selected tool to Nango. - -```ts -import { Nango } from '@nangohq/node'; - -const nango = new Nango({ secretKey: process.env.NANGO_SECRET_KEY! }); - -const integrationId = 'hubspot'; - -async function getConnectionIdForUser(userId: string) { - const connections = await nango.listConnections({ - integrationId, - tags: { end_user_id: userId } - }); - - let connectionId = connections.connections[0]?.connection_id; - - if (!connectionId) { - const session = await nango.createConnectSession({ - allowed_integrations: [integrationId], - tags: { end_user_id: userId } - }); - - // Send this URL to the user in your app, then wait for authorization. - console.log(session.data.connect_link); - - const connection = await nango.waitForConnection(integrationId, userId); - connectionId = connection!.connection_id; - } - - return connectionId; -} - -async function executeNangoTool(actionName: string, input?: unknown) { - const connectionId = await getConnectionIdForUser('user_123'); - - return await nango.triggerAction(integrationId, connectionId, actionName, input); -} -``` - -The examples below focus on framework-specific tool syntax and call the shared `executeNangoTool()` helper. - -## Framework examples - -These examples expose a HubSpot `whoami` action function as a `who_am_i` tool. - - - - ```ts - import OpenAI from 'openai'; - - const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY! }); - - const tools = [ - { - type: 'function' as const, - name: 'who_am_i', - description: 'Get the current HubSpot user information.', - strict: true, - parameters: { - type: 'object', - properties: {}, - required: [], - additionalProperties: false - } - } - ]; - - const input: any[] = [ - { - role: 'user', - content: 'Use who_am_i and summarize the current HubSpot user.' - } - ]; - - const response = await client.responses.create({ - model: 'gpt-5', - input, - tools - }); - - for (const item of response.output) { - if (item.type !== 'function_call' || item.name !== 'who_am_i') { - continue; - } - - const result = await executeNangoTool('whoami', JSON.parse(item.arguments || '{}')); - - input.push(item); - input.push({ - type: 'function_call_output', - call_id: item.call_id, - output: JSON.stringify(result) - }); - } - - const finalResponse = await client.responses.create({ - model: 'gpt-5', - input, - tools - }); - - console.log(finalResponse.output_text); - ``` - - - ```ts - import Anthropic from '@anthropic-ai/sdk'; - - const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY! }); - - const tools = [ - { - name: 'who_am_i', - description: 'Get the current HubSpot user information.', - input_schema: { - type: 'object', - properties: {}, - required: [] - } - } - ]; - - const messages: Anthropic.MessageParam[] = [ - { - role: 'user', - content: 'Use who_am_i and summarize the current HubSpot user.' - } - ]; - - const message = await client.messages.create({ - model: 'claude-sonnet-4-5', - max_tokens: 1024, - messages, - tools - }); - - const toolUse = message.content.find((block) => block.type === 'tool_use'); - - if (toolUse?.type === 'tool_use' && toolUse.name === 'who_am_i') { - const result = await executeNangoTool('whoami', toolUse.input); - - messages.push({ role: 'assistant', content: message.content }); - messages.push({ - role: 'user', - content: [ - { - type: 'tool_result', - tool_use_id: toolUse.id, - content: JSON.stringify(result) - } - ] - }); - - const finalMessage = await client.messages.create({ - model: 'claude-sonnet-4-5', - max_tokens: 1024, - messages, - tools - }); - - console.log(finalMessage.content); - } - ``` - - - ```ts - import { generateText, stepCountIs, tool } from 'ai'; - import { openai } from '@ai-sdk/openai'; - import { z } from 'zod'; - - const { text, toolResults } = await generateText({ - model: openai('gpt-4o'), - prompt: 'Use who_am_i and summarize the current HubSpot user.', - tools: { - who_am_i: tool({ - description: 'Get the current HubSpot user information.', - inputSchema: z.object({}), - execute: async () => { - return await executeNangoTool('whoami'); - } - }) - }, - stopWhen: stepCountIs(5) - }); - - console.log(text); - console.log(toolResults); - ``` - - - ```ts - import { createAgent, tool } from 'langchain'; - import { z } from 'zod'; - - const whoAmI = tool( - async () => { - const result = await executeNangoTool('whoami'); - return JSON.stringify(result); - }, - { - name: 'who_am_i', - description: 'Get the current HubSpot user information.', - schema: z.object({}) - } - ); - - const agent = createAgent({ - model: 'openai:gpt-5.4', - tools: [whoAmI] - }); - - const result = await agent.invoke({ - messages: [ - { - role: 'user', - content: 'Use who_am_i and summarize the current HubSpot user.' - } - ] - }); - - console.log(result.messages.at(-1)?.content); - ``` - - - ```ts - import { openai } from '@ai-sdk/openai'; - import { Agent } from '@mastra/core/agent'; - import { createTool } from '@mastra/core/tools'; - import { z } from 'zod'; - - const whoAmI = createTool({ - id: 'who_am_i', - description: 'Get the current HubSpot user information.', - inputSchema: z.object({}), - execute: async () => { - return await executeNangoTool('whoami'); - } - }); - - const agent = new Agent({ - name: 'HubSpot Agent', - instructions: 'Use available tools to answer HubSpot account questions.', - model: openai('gpt-4o'), - tools: { - who_am_i: whoAmI - } - }); - - const response = await agent.generate('Use who_am_i and summarize the current HubSpot user.'); - - console.log(response.text); - ``` - - - -## Programmatic tool discovery - -The [Get integration functions config API](/reference/backend/http-api/scripts/config) returns enabled action function definitions. Use it when an agent or orchestration layer should discover available tools at runtime. - -```bash -curl --request GET \ - --url 'https://api.nango.dev/scripts/config?provider_config_key=&format=openai' \ - --header 'Authorization: Bearer ' -``` - -Use `format=nango` for Nango's native configuration shape, or `format=openai` when you want OpenAI-compatible function definitions. - -## Direct tool execution - -For SDKs that let you provide your own tool executor, define the tool schema in your app and call Nango from the executor. - -```ts -import { Nango } from '@nangohq/node'; - -const nango = new Nango({ secretKey: process.env.NANGO_SECRET_KEY! }); - -async function executeTool(connectionId: string, input: { owner: string; repo: string; title: string }) { - return await nango.triggerAction('github', connectionId, 'create-issue', input); -} -``` - -Keep these values explicit: - -- `providerConfigKey` / integration ID - which integration owns the action function. -- `connectionId` - which user's credentials the call uses. -- Action function name - the enabled action function to execute. -- Input payload - validated by the action function schema when configured. - -## MCP server - -Nango exposes enabled action functions through a hosted MCP server: - -```text -https://api.nango.dev/mcp -``` - -The server supports Streamable HTTP transport. Requests must include: - -| Header | Value | -| --- | --- | -| `Authorization` | `Bearer ` | -| `connection-id` | The connection whose credentials should be used | -| `provider-config-key` | The integration ID | - -Example client setup with the MCP TypeScript SDK: - -```ts -import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'; - -const transport = new StreamableHTTPClientTransport(new URL('https://api.nango.dev/mcp'), { - requestInit: { - headers: { - Authorization: `Bearer ${process.env.NANGO_SECRET_KEY}`, - 'connection-id': '', - 'provider-config-key': '' - } - } -}); -``` - -For desktop clients that only support stdio, use a bridge such as `mcp-remote` and pass the same headers. Keep the header spacing exactly as required by the bridge you choose. - -## Auth flow for agents - -Agents should not receive provider credentials. Your app should: - -1. Check whether the user already has a Nango connection. -2. Create a Connect session if they need to authorize. -3. Store the resulting `connectionId` in your app. -4. Use that `connectionId` for future tool calls. - -See the [Auth guide](/guides/auth/auth-guide) and [Create Connect Session API](/reference/backend/http-api/connect/sessions/create) for the end-to-end auth flow. - - - If you are implementing this flow programmatically, first list or create the user's connection, then call `GET /scripts/config` to discover enabled action functions, and finally execute tools with `POST /action/trigger` or the MCP server. - - Required values for every execution are the Nango secret key, integration ID, connection ID, action function name, and input payload. - - -## Observability and safety - -Every action function execution appears in Nango logs. Use logs to debug failed tool calls, inspect provider requests, and review agent behavior. - -Keep tool names and descriptions specific. Expose only action functions the agent is allowed to call for the current user and workflow. For write operations, make action function logic idempotent before using async execution or retries. - -## Related references - -- [Action functions](/guides/functions/action-functions) -- [Template catalog](/guides/functions/functions-guide#template-catalog) -- [Get integration functions config API](/reference/backend/http-api/scripts/config) -- [Trigger action API](/reference/backend/http-api/action/trigger) -- [Functions SDK reference](/reference/functions/functions-sdk) -- [Observability](/guides/platform/observability) +### Update tags on an existing connection -## Storage +If you need to update tags after a connection is created, patch the connection: -Source: https://nango.dev/docs/guides/functions/storage.md + + + ```ts + import { Nango } from '@nangohq/node'; ---- -title: 'Storage' -sidebarTitle: 'Storage' -description: 'Use connection metadata as the default storage for function parameters and per-customer configuration.' ---- - -Functions have access to storage that is scoped to the connection they run for. Use it to keep integration behavior tied to the customer, account, workspace, or tenant that authorized the connection. - -For the product-level workflow, see [Customize per customer](/getting-started/use-cases/customer-configuration). - -## Connection metadata - -Connection metadata is the default blob storage for Nango Functions. It is a JSON object stored on a Nango connection and available to action functions, sync functions, webhook functions, and event functions. - -Use metadata for: - -- Customer-specific settings, such as field mappings, filters, folders, projects, account IDs, or feature flags. -- Function configuration values that should persist across executions. -- Values discovered during setup, such as provider webhook subscription IDs or tenant-specific identifiers. -- Configuration shared across multiple functions for the same connection. - -Do not use metadata for synced datasets or large lists of records. For data replicated by sync functions, use the [records cache](/guides/functions/syncs/records-cache). - -## Set and update metadata from your app - -Set metadata after the customer chooses integration settings during onboarding or in your app's settings UI. - - - - ```ts - await nango.setMetadata( - '', - '', - { - accountRegion: 'eu', - syncArchived: false, - fieldMapping: { - companyName: 'Account_Name__c' - } - } - ); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/connection//metadata \ - --header 'Authorization: Bearer ' \ - --header 'Provider-Config-Key: ' \ - --header 'Content-Type: application/json' \ - --data '{ - "accountRegion": "eu", - "syncArchived": false, - "fieldMapping": { - "companyName": "Account_Name__c" - } - }' - ``` - - - ```ts - await nango.updateMetadata( - '', - '', - { syncArchived: true } - ); - ``` - - - ```bash - curl --request PATCH \ - --url https://api.nango.dev/connection//metadata \ - --header 'Authorization: Bearer ' \ - --header 'Provider-Config-Key: ' \ - --header 'Content-Type: application/json' \ - --data '{ "syncArchived": true }' - ``` - - - -`setMetadata` replaces the metadata object. `updateMetadata` merges the provided fields into the existing object. - -For exact parameters and response shapes, see the [set metadata API](/reference/backend/http-api/connections/set-metadata), [update metadata API](/reference/backend/http-api/connections/update-metadata), [Node SDK set metadata method](/reference/backend/backend-sdk/node#set-connection-metadata), and [Node SDK edit metadata method](/reference/backend/backend-sdk/node#edit-connection-metadata). - -## Read metadata from your app - -Read metadata from your app when you need to render saved settings, pre-fill a configuration UI, or decide whether a connection is ready for syncs: - -```ts -const metadata = await nango.getMetadata('', ''); -``` - -You can also fetch the connection with the REST API: - -```bash -curl --request GET \ - --url 'https://api.nango.dev/connection/?provider_config_key=' \ - --header 'Authorization: Bearer ' -``` - -## Read metadata inside a function - -Define a metadata schema on the function, then call `nango.getMetadata()`: - -```ts crm/syncs/contacts.ts -import { createSync } from 'nango'; -import * as z from 'zod'; - -const Metadata = z.object({ - accountRegion: z.string().optional(), - syncArchived: z.boolean().default(false) -}); - -export default createSync({ - description: 'Sync contacts', - frequency: 'every hour', - metadata: Metadata, - exec: async (nango) => { - const metadata = await nango.getMetadata(); - - await nango.get({ - endpoint: '/contacts', - params: { - region: metadata.accountRegion, - archived: metadata.syncArchived - } - }); - } -}); -``` - -Inside a function, `nango.getMetadata()` automatically reads metadata for the connection being executed. - - - When a sync function reads metadata with `nango.getMetadata()`, metadata can be cached for up to 60 seconds during that execution. The next execution always reads the latest metadata. - - -## Customer configuration pattern - -A common customer configuration pattern is to ask the customer how their external custom fields map to your product model, then store that mapping as connection metadata. - -```json -{ - "fieldMapping": { - "internal_customer_id": "External_Customer_ID__c", - "plan": "Plan__c" - } -} -``` - -Use an action function to fetch available custom fields from the provider, save the customer's choices as metadata, then read the mapping inside the sync function that fetches records. - -If a sync function should start only after the required configuration exists, start it after saving metadata: - -```ts -await nango.startSync('', ['contacts'], ''); -``` - -## Records cache - -The records cache is the storage layer for sync output. Sync functions write records with `nango.batchSave()`, `nango.batchUpdate()`, and `nango.batchDelete()`. Your app reads changed records through the records API or SDK. - -Use the records cache for synced external data, not for function configuration. See [Records cache](/guides/functions/syncs/records-cache). - -## Related guides - -- [Customize per customer](/getting-started/use-cases/customer-configuration) - design the product workflow for customer-specific integration settings. -- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - distinguish tags, connection configuration, and runtime metadata. -- [Set connection metadata API](/reference/backend/http-api/connections/set-metadata) - replace metadata from your app. -- [Update connection metadata API](/reference/backend/http-api/connections/update-metadata) - patch metadata from your app. + const nango = new Nango({ secretKey: '' }); -## Logging + await nango.patchConnection( + { + connectionId: '', + provider_config_key: '' + }, + { + tags: { + end_user_id: '', + end_user_email: '', + organization_id: '', + environment: '' + } + } + ); + ``` + + + ```bash + curl --request PATCH \ + --url 'https://api.nango.dev/connections/?provider_config_key=' \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "tags": { + "end_user_id": "", + "end_user_email": "", + "organization_id": "", + "environment": "" + } + }' + ``` + + -Source: https://nango.dev/docs/guides/functions/logging.md + + Updating tags replaces the whole tag object. If you want to add or remove a single tag, fetch the current connection first, merge locally, then patch. + ---- -title: 'Function logging' -sidebarTitle: 'Logging' -description: 'Use function logs for local debugging, cloud observability, and production troubleshooting.' ---- - -Nango records function executions in the Logs tab. You can also add custom logs from action, sync, webhook, and event functions with `nango.log()`. - -Use custom logs for information that helps you understand function behavior: selected filters, page counts, checkpoint values, provider identifiers, branch decisions, and recoverable errors. - -## Add custom logs - -```ts -await nango.log('Starting contacts sync'); -await nango.log('Applying region filter', { level: 'debug' }); -await nango.log('Provider returned a partial response', { level: 'warn' }); -await nango.log('Failed to map contact', { level: 'error' }); -``` - -If you do not pass a level, `nango.log()` uses `info`. - -## Log levels - -Nango supports these levels, from most to least verbose: - -| Level | Use for | -| --- | --- | -| `debug` | Local diagnostics, pagination details, temporary investigation logs | -| `info` | Normal execution milestones you may want during development | -| `warn` | Unexpected but recoverable behavior | -| `error` | Failed operations, invalid provider responses, or errors you catch and continue from | -| `off` | Disable custom logs | - -Only logs at or above the configured logger level are ingested into the Nango UI Logs tab. - -For example, when the logger level is `warn`, only `warn` and `error` custom logs are visible in the cloud logs. - -## Cloud vs local behavior - -| Runtime | Default custom log level | Where custom logs appear | -| --- | --- | --- | -| Cloud environments | `warn` | Nango UI Logs tab for logs at `warn` or `error` | -| `nango dryrun` | `debug` | Local console for all custom log levels | - -This means `await nango.log('message')` is visible during local dry runs, because local dry runs default to `debug`. The same call defaults to `info`, so it is not visible in cloud logs unless you lower the configured logger level to `info` or `debug`. - - - Cloud custom logs can affect log volume and billing. Prefer `debug` and `info` for local investigation, and use `warn` or `error` for production signals you want retained by default. - - -## Configure the logger - -Set the default logger level for an environment with `NANGO_LOGGER_LEVEL` in **Environment Settings > Environment Variables**: - -```bash -NANGO_LOGGER_LEVEL=info -``` - -Valid values are `debug`, `info`, `warn`, `error`, and `off`. - -You can also change the logger level inside a function. This applies to `nango.log()` calls after the setting is changed: - -```ts -nango.setLogger({ level: 'debug' }); - -await nango.log('Detailed investigation log'); - -nango.setLogger({ level: 'warn' }); -``` - -Use function-level configuration when one run or one branch needs additional visibility. Use the environment variable when all functions in that environment should share the same threshold. - -## What to log - -Good function logs are specific and bounded: - -- Log the connection-specific configuration that changes behavior, such as selected folder IDs, regions, or pipeline IDs. -- Log provider pagination progress with counts, cursors, or checkpoints, but avoid logging every record. -- Log warnings when the provider omits optional data or returns a shape you can recover from. -- Log errors when you catch an exception and continue, so the run is still inspectable. - -Avoid logging secrets, access tokens, refresh tokens, full request headers, or raw payloads that may contain sensitive customer data. - -## Related guides - -- [Observability](/guides/platform/observability) -- [Functions SDK reference](/reference/functions/functions-sdk#logging) -- [Testing](/guides/functions/testing) -- [Sync efficiency](/guides/functions/syncs/sync-efficiency) +### Reserved UI tag keys -## Rate Limits +Two tag keys are reserved for improving the Nango dashboard UI: -Source: https://nango.dev/docs/guides/functions/rate-limits.md +- `end_user_display_name` - shown instead of the connection ID in the connections list, making it easier to identify who a connection belongs to. +- `end_user_email` - shown alongside `end_user_display_name` in the connections list. The domain from the email address is also used to display the end user's company logo on the connection detail page. ---- -title: 'Rate limits' -sidebarTitle: 'Rate limits' -description: 'Guide on how to handle API rate limits from external APIs.' ---- - -External APIs often enforce rate limits to prevent excessive use. When these limits are reached, you'll start receiving HTTP `429 Too Many Requests` errors, blocking further requests until the limit resets. - -To maintain data freshness and avoid disruptions in your integration functions, it's crucial to manage your API call volume and handle rate limits effectively. Nango simplifies this process significantly. - -## Strategy 1: Retry with exponential backoff - -The simplest strategy involves retrying failed requests after waiting: - -When you configure HTTP requests using Nango's helper ([reference](/reference/functions/functions-sdk#http-requests)), you can specify the number of retries: - -```ts -await nango.get({ endpoint: '/some-endpoint', retries: 10 }); -``` - -This configuration enables automatic retries on receiving a `429` status code, with the retries spaced out using exponential backoff. This method is efficient because: - -- It uses exponential backoff to wait out the rate-limit period -- Nango [sync functions](/guides/functions/syncs/sync-functions) can run for up to 24 hours, allowing retries to occur within this window (note that action functions and webhook functions have shorter lifespans; see [Resource limits](/guides/platform/limits)) -- It works for APIs without requiring any API-specific configurations - -Find details about HTTP request retries in the [reference](/reference/functions/functions-sdk#http-request-retries). - -## Strategy 2: Leverage rate-limit headers - -Most of the time, the first strategy is sufficient to handle rate limits. - -For APIs with stringent limits, Nango provides a more refined and customized approach by automatically parsing API-specific rate-limit headers from responses and scheduling retries only after the rate limit period has reset: - -This is set up in the same way as the first strategy: - -```ts -await nango.get({ endpoint: '/some-endpoint', retryHeader: { at: "x-ratelimit-reset" } }); -``` - - -If rate-limit headers are not already configured for an API you are using, you can request their inclusion by reaching out to the Nango team via the [community](https://nango.dev/slack)β€”typically within 24 hours. - -## Related guides - -- [Sync efficiency](/guides/functions/syncs/sync-efficiency) - avoid unnecessary provider requests. -- [Action functions](/guides/functions/action-functions) - design retries for idempotent actions. -- [Resource limits](/guides/platform/limits) - understand runtime constraints. -- [Functions SDK reference](/reference/functions/functions-sdk#http-request-retries) - configure request retries. - - -**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - + + ![](/images/screenshots/connection-tags-1.png) + -## Data Validation + + ![](/images/screenshots/connection-tags-2.png) + -Source: https://nango.dev/docs/guides/functions/data-validation.md +### Tag rules ---- -title: 'Data validation' -sidebarTitle: 'Data validation' -description: 'How to validate data in your functions and in your app' ---- - -Nango offers data validation at two levels: inside your [Nango functions](/guides/functions/functions-guide) (when calling external APIs) and in your application code (when consuming function responses). - -## Validate API responses in Nango functions - -Use Zod to validate data you receive from and send to external APIs. The CLI will also surface *type* errors during dry runs when using the `--validation` option. - -```typescript -import * as z from 'zod'; - -const dataFromAPI = z.object({ - ticketId: z.string(), -}); - -export default createSync({ - exec: async (nango) => { - const response = await nango.get({ endpoint: '/tickets' }); - const isValid = dataFromAPI.parse(response.json); - if (isValid) { - [...] - } - }, -}); -``` - -## Validate Nango function responses in your app - -### TypeScript types (compile-time) - -Use `z.infer` to derive TypeScript types from your Zod schemas and export them from your sync/action files: - -```ts -// In: github/syncs/fetchIssues.ts (Nango function) -export type GithubIssue = z.infer; -``` - -Then import the types in your application code: - -```ts -import type { GithubIssue } from './nango-integrations/github/syncs/fetchIssues'; - -const issues = await nango.listRecords({ ... }); -``` - -### JSON Schema (runtime, language-agnostic) - -When you run `nango compile` or `nango deploy`, Nango generates a `nango.json` file in the `.nango` folder. Each sync/action entry includes a `json_schema` property with the JSON Schema for its models: - -```json -// .nango/nango.json (simplified) -[ - { - "providerConfigKey": "github", - "syncs": [ - { - "name": "fetchIssues", - "output": ["GithubIssue"], - "json_schema": { - "definitions": { - "GithubIssue": { - "type": "object", - "properties": { - "id": { "type": "string" }, - "title": { "type": "string" }, - "state": { "type": "string" } - }, - "required": ["id", "title", "state"], - "additionalProperties": false - } - } - } - } - ] - } -] -``` - -You can extract the `json_schema` object for a given sync or action and use it with any JSON Schema validator in your language of choice (e.g., `ajv` in TypeScript, `jsonschema` in Python, `jsonschema` in Rust, `santhosh-tekuri/jsonschema` in Go). - -Alternatively, Zod v4 supports JSON Schema conversion natively with [`z.toJSONSchema()`](https://zod.dev/json-schema?id=ztojsonschema): - -```ts -import { z } from 'zod'; -import { issueSchema } from './nango-integrations/github/syncs/fetchIssues'; - -const jsonSchema = z.toJSONSchema(issueSchema); -``` - -## Related guides - -- [Action functions](/guides/functions/action-functions) - validate action inputs and outputs. -- [Sync functions](/guides/functions/syncs/sync-functions) - validate synced record models. -- [Unified APIs](/guides/functions/unified-apis) - normalize provider data behind stable schemas. -- [Testing](/guides/functions/testing) - cover validation behavior in tests. +- `end_user_email` must be a valid email address, for example `user@example.com`. +- Tag keys are lowercased, so `End_User_Email` and `end_user_email` are treated as the same key. +- Keys are case-insensitive, and duplicate keys after normalization are rejected. +- Keys must start with a letter and contain only alphanumerics, underscores, hyphens, periods, or slashes. +- Keys can be up to 64 characters long. +- A connection can have up to 10 tag keys. +- Values must be non-empty strings up to 255 characters long. -## Testing +## Connection configuration -Source: https://nango.dev/docs/guides/functions/testing.md +Connection configuration is provider-specific information stored on a connection because the connection needs it to work. ---- -title: 'Testing integrations' -sidebarTitle: 'Testing' -description: 'How to test your Nango integrations using dry runs, mocks, and snapshots' ---- - -Nango provides a comprehensive testing framework that combines dry runs with mock-based snapshot testing. This guide will walk you through testing your integrations effectively. - -## Testing approach - -Nango's testing framework is built on three core concepts: - -1. **Dry runs**: Test your integrations against live API connections without affecting production data -2. **Mocks**: Save API responses during dry runs to create reproducible test fixtures -3. **Snapshot testing**: Automatically compare integration outputs against saved snapshots using Vitest - -This approach ensures your integrations work correctly while providing fast, reliable tests that don't depend on external APIs. - -## Dry run testing - -Dry runs allow you to execute your sync functions and action functions against real API connections without saving data to your database. This is essential for: - -- Testing integration logic before deployment -- Debugging issues with live data -- Generating test fixtures (mocks) -- Validating data transformations - -### Basic dry run - -Execute a sync or action against an existing connection: - -```bash -nango dryrun -``` - -**Example:** -```bash -nango dryrun fetch-tickets abc-123-connection -``` - -### Dry run options - -Common options for testing: - -```bash -# Specify environment (dev or prod) -nango dryrun fetch-tickets abc-123 -e prod - -# For action functions: pass input data -nango dryrun create-ticket abc-123 --input '{"title": "Test ticket"}' - -# For sync functions: specify an initial checkpoint -nango dryrun fetch-tickets abc-123 --checkpoint '{ "lastModifiedAt": "2026-02-01T01:00:00.000Z" }' - -# Use a specific integration when sync names overlap -nango dryrun fetch-tickets abc-123 --integration-id github - -# Execute a specific variant -nango dryrun fetch-tickets abc-123 --variant premium -``` - -## Data validation - -Validation ensures your integration inputs and outputs match your defined schemas. This catches data transformation errors early. - -### Enable validation during dry runs - -Use the `--validate` flag to enforce validation: - -```bash -nango dryrun fetch-tickets abc-123 --validate -``` - -When validation is enabled: -- **Action inputs** are validated before execution -- **Action outputs** are validated after execution -- **Sync records** are validated before they would be saved -- **Validation failures** halt execution and display detailed error messages - -### Validation with Zod - -You can also validate data directly in your integration code using Zod: - -```typescript -import { z } from 'zod'; - -const TicketSchema = z.object({ - id: z.string(), - title: z.string(), - status: z.enum(['open', 'closed']), - createdAt: z.string().datetime(), -}); - -export default createSync({ - exec: async (nango) => { - const response = await nango.get({ endpoint: '/tickets' }); - - // Validate the API response - const tickets = response.data.map(ticket => { - return TicketSchema.parse(ticket); // Throws if validation fails - }); - - await nango.batchSave(tickets, 'Ticket'); - }, -}); -``` - -### Validation error output - -When validation fails, you'll see detailed error information: - -``` -Invalid sync record. Use `--validate` option to see the details (invalid_sync_record) -{ - "validation": [ - { - "path": "createdAt", - "message": "Invalid datetime string! Must be UTC.", - "code": "invalid_string" - } - ], - "model": "Ticket" -} -``` - -## Saving mocks for tests - -Mocks are saved API responses that allow you to run tests without hitting external APIs. This makes tests faster and more reliable. - -### Generate mocks with dry run - -Use the `--save` flag to save all API responses: - -```bash -nango dryrun fetch-tickets abc-123 --save -``` - -**Important**: When using `--save`, validation is automatically enabled. Mocks are only saved if validation passes, ensuring your test fixtures contain valid data. - -### Mock file structure - -Mocks are saved in a single `.test.json` file that can be used alongside your test file: - -``` -github/ -β”œβ”€β”€ tests/ -β”‚ β”œβ”€β”€ fetch-tickets.test.ts -β”‚ └── fetch-tickets.test.json -``` - -The `test.json` file contains all the necessary mock data for a given test: - -```json -{ - "input": { "title": "Test ticket" }, - "output": { "id": "TKT-123", "status": "created" }, - "nango": { - "getConnection": { "connectionId": "abc-123", "provider": "github" }, - "getMetadata": { "accountId": "test-123" }, - "batchSave": { - "Ticket": [{ "id": "TKT-123", "title": "Test ticket" }] - }, - "batchDelete": { - "Ticket": [{ "_nango_id": "del-456" }] - } - }, - "api": { - "GET": { - "/tickets": { - "response": [{ "id": "TKT-123", "title": "Test ticket" }] - } - }, - "POST": { - "/issues": { - "response": { "id": "ISS-789" } - } - } - } -} -``` - -### Using stubbed metadata - -For sync functions that rely on connection metadata, you can provide test metadata: - -```bash -nango dryrun fetch-tickets abc-123 --save --metadata '{"accountId": "test-123"}' -``` - -Or load from a file: - -```bash -nango dryrun fetch-tickets abc-123 --save --metadata @fixtures/metadata.json -``` - -## Testing with Vitest - -Nango uses [Vitest](https://vitest.dev/) as its testing framework. Vitest is fast, has a great developer experience, and provides snapshot testing out of the box. - -### Setup - -Install Vitest as a dev dependency: - -```bash -npm install -D vitest -``` - -Generate tests for your integrations: - -```bash -nango generate:tests -``` - -You can also generate tests for specific integrations, sync functions, or action functions: - -```bash -# Generate tests for a specific integration -nango generate:tests -i github - -# Generate tests for a specific sync function -nango generate:tests -s fetch-tickets - -# Generate tests for a specific action function -nango generate:tests -a create-ticket - -# Combine flags for more specific targeting -nango generate:tests -i github -s fetch-tickets -``` - -Run your tests: - -```bash -npm test -``` - -### Auto-generated tests - -When you run `nango generate:tests`, Nango creates test files for all your integrations: - -**Sync test example:** -```typescript -import { vi, expect, it, describe, beforeAll } from 'vitest'; -import createSync from '../syncs/fetch-tickets.js'; - -describe('github fetch-tickets tests', () => { - let nangoMock; - - beforeAll(async () => { - nangoMock = new global.vitest.NangoSyncMock({ - dirname: __dirname, - name: "fetch-tickets", - Model: "Ticket" - }); - }); - - const models = 'Ticket'.split(','); - const batchSaveSpy = vi.spyOn(nangoMock, 'batchSave'); - - it('should get, map correctly the data and batchSave the result', async () => { - await createSync.exec(nangoMock); - - for (const model of models) { - const expectedBatchSaveData = await nangoMock.getBatchSaveData(model); - const spiedData = batchSaveSpy.mock.calls.flatMap(call => { - if (call[1] === model) { - return call[0]; - } - return []; - }); - - const spied = JSON.parse(JSON.stringify(spiedData)); - expect(spied).toStrictEqual(expectedBatchSaveData); - } - }); - - it('should get, map correctly the data and batchDelete the result', async () => { - await createSync.exec(nangoMock); - - for (const model of models) { - const batchDeleteData = await nangoMock.getBatchDeleteData(model); - if (batchDeleteData && batchDeleteData.length > 0) { - expect(nangoMock.batchDelete).toHaveBeenCalledWith(batchDeleteData, model); - } - } - }); -}); -``` - -**Action test example:** -```typescript -import { vi, expect, it, describe, beforeAll } from 'vitest'; -import createAction from '../actions/create-ticket.js'; - -describe('github create-ticket tests', () => { - let nangoMock; - - beforeAll(async () => { - nangoMock = new global.vitest.NangoActionMock({ - dirname: __dirname, - name: "create-ticket", - Model: "Ticket" - }); - }); - - it('should output the action output that is expected', async () => { - const input = await nangoMock.getInput(); - const response = await createAction.exec(nangoMock, input); - const output = await nangoMock.getOutput(); - - expect(response).toEqual(output); - }); -}); -``` - -### How mocks work in tests - -The `NangoSyncMock` and `NangoActionMock` classes automatically load your saved mocks from the `.test.json` file: - -1. **API requests** are intercepted and return saved mock responses from the `api` section. -2. **Input data** is loaded from the `input` property for action functions. -3. **Expected outputs** are loaded from the `output` property. -4. **Tests compare** actual outputs against expected outputs. - -This means: -- Tests run **instantly** (no API calls) -- Tests are **deterministic** (same input = same output) -- Tests work **offline** - -### Migrating from the old format - -If you have tests using the old multi-file mock format, you can automatically migrate them to the new unified format. - -Set the `MIGRATE_MOCKS` environment variable to `2026-01` and run your tests: - -```bash -MIGRATE_MOCKS=2026-01 npm test -``` - -This will: -1. Run your tests using the old mock files. -2. Intercept all mock data accessed during the test run. -3. Save the data into a new `.test.json` file. -4. The old mock directory (`mocks` and `fixtures`) can then be safely deleted once a clean green test run is achieved. - -> **Note:** This migration tool works by intercepting the mock data loaded by your existing tests. It requires that your tests are using the standard Nango mock utilities (`NangoSyncMock` or `NangoActionMock`) imported from `nango/test`. - - -**Pagination Bug in Legacy Test Utilities** - -The legacy test utilities had a bug where pagination would sometimes stop after the first page. This means: - -1. **Tests appeared to pass** but were only testing the first page of results -2. **Mock files may exist** for subsequent pages, but might be incorrect (hashes or params were never checked) -3. **Some mock files may be missing entirely** if they were never recorded - -**How the migration handles this:** - -The migration tool performs a **best-effort recovery**: -- It first tries to match mock files by their exact request hash -- If that fails, it scans all available mock files and matches by comparing the actual request parameters (endpoint, query params, headers) -- This handles cases where the hash in the filename is wrong but the request data inside the file is correct - -**What to do if tests fail after migration:** - -If your tests fail after running the migration, it means one of: -- The mock file for a paginated request doesn't exist at all (it was never recorded due to the bug) -- The request parameters stored in the mock file don't match what Nango's pagination now sends - -**To fix failing tests, re-record your mocks:** - -```bash -nango dryrun --save -``` - -This will generate a complete `.test.json` file with all paginated responses using Nango's actual pagination implementation. - - -### Running tests - -```bash -# Run all tests -npm test - -# Run tests in watch mode -npm test -- --watch - -# Run tests for a specific integration -npm test github - -# Run a specific test file -npm test github-fetch-tickets.test.ts - -# Run with coverage -npm test -- --coverage -``` - -### Test configuration - -Vitest is configured via `vite.config.ts` in your project root: - -```typescript -import { defineConfig } from 'vite'; - -export default defineConfig({ - test: { - globals: true, - environment: 'node', - setupFiles: ['./vitest.setup.ts'], - }, -}); -``` - -The `vitest.setup.ts` file makes Nango mocks available globally: - -```typescript -import { NangoActionMock, NangoSyncMock } from "nango/test"; - -globalThis.vitest = { - NangoActionMock, - NangoSyncMock, -}; -``` - -## Customizing tests with business logic - -While auto-generated tests validate basic data flow, you often need custom tests for business logic. - -### Adding custom assertions - -Extend the generated tests with additional assertions: - -```typescript -import { vi, expect, it, describe, beforeAll } from 'vitest'; -import createSync from '../syncs/fetch-tickets.js'; - -describe('github fetch-tickets tests', () => { - let nangoMock; - - beforeAll(async () => { - nangoMock = new global.vitest.NangoSyncMock({ - dirname: __dirname, - name: "fetch-tickets", - Model: "Ticket" - }); - }); - - it('should correctly transform ticket priorities', async () => { - await createSync.exec(nangoMock); - - const savedTickets = await nangoMock.getBatchSaveData('Ticket'); - - // Custom business logic validation - savedTickets.forEach(ticket => { - // Ensure priority is normalized - expect(['low', 'medium', 'high', 'critical']).toContain(ticket.priority); - - // Ensure dates are ISO 8601 - expect(ticket.createdAt).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/); - - // Ensure ticket numbers are prefixed correctly - if (ticket.source === 'github') { - expect(ticket.id).toMatch(/^GH-\d+$/); - } - }); - }); - - it('should filter out spam tickets', async () => { - await createSync.exec(nangoMock); - - const savedTickets = await nangoMock.getBatchSaveData('Ticket'); - - // Verify spam filtering logic - const spamTickets = savedTickets.filter(t => - t.title.toLowerCase().includes('spam') - ); - expect(spamTickets).toHaveLength(0); - }); -}); -``` - -### Testing error handling - -Test how your integration handles errors: - -```typescript -it('should handle API errors gracefully', async () => { - // Create a mock that will throw an error - const errorMock = new global.vitest.NangoSyncMock({ - dirname: __dirname, - name: "fetch-tickets-error", - Model: "Ticket" - }); - - // Mock the get method to throw - vi.spyOn(errorMock, 'get').mockRejectedValue( - new Error('API rate limit exceeded') - ); - - // Verify error is logged - const logSpy = vi.spyOn(errorMock, 'log'); - - await expect(async () => { - await createSync.exec(errorMock); - }).rejects.toThrow('API rate limit exceeded'); - - expect(logSpy).toHaveBeenCalledWith( - expect.stringContaining('rate limit'), - { level: 'error' } - ); -}); -``` - -### Testing pagination - -Verify pagination logic works correctly: - -```typescript -it('should fetch all pages of results', async () => { - await createSync.exec(nangoMock); - - const savedTickets = await nangoMock.getBatchSaveData('Ticket'); - - // Verify we got results from multiple pages - // (based on your pagination implementation) - expect(savedTickets.length).toBeGreaterThan(100); // Assuming page size is 100 -}); -``` - -### Testing sync functions with checkpoints - -Test that checkpoint logic works: - -```typescript -it('should only fetch tickets after checkpoint date', async () => { - const getSpy = vi.spyOn(nangoMock, 'get'); - const saveCheckpointSpy = vi.spyOn(nangoMock, 'saveCheckpoint'); - - // Mock getCheckpoint to return a previous checkpoint - vi.spyOn(nangoMock, 'getCheckpoint').mockResolvedValue({ - lastModifiedISO: '2024-01-01T00:00:00Z' - }); - - await createSync.exec(nangoMock); - - // Verify the API request used the checkpoint value - expect(getSpy).toHaveBeenCalledWith( - expect.objectContaining({ - params: expect.objectContaining({ - since: '2024-01-01T00:00:00Z' - }) - }) - ); - - // Verify checkpoint was saved - expect(saveCheckpointSpy).toHaveBeenCalled(); -}); -``` - -### Parameterized tests - -Test multiple scenarios with different inputs: - -```typescript -import { it, describe, expect, beforeAll } from 'vitest'; - -describe.each([ - { priority: 'P0', expected: 'critical' }, - { priority: 'P1', expected: 'high' }, - { priority: 'P2', expected: 'medium' }, - { priority: 'P3', expected: 'low' }, -])('priority mapping for $priority', ({ priority, expected }) => { - let nangoMock; - - beforeAll(async () => { - nangoMock = new global.vitest.NangoSyncMock({ - dirname: __dirname, - name: `fetch-tickets-${priority}`, - Model: "Ticket" - }); - }); - - it(`should map ${priority} to ${expected}`, async () => { - await createSync.exec(nangoMock); - - const savedTickets = await nangoMock.getBatchSaveData('Ticket'); - const ticket = savedTickets.find(t => t.rawPriority === priority); - - expect(ticket?.priority).toBe(expected); - }); -}); -``` - -## Related resources - -- [Data Validation](/guides/functions/data-validation) - Learn more about schema validation -- [Vitest Documentation](https://vitest.dev/) - Official Vitest docs -- [Action functions](/guides/functions/action-functions) - Building and testing on-demand functions -- [Sync functions](/guides/functions/syncs/sync-functions) - Building and testing sync functions +It can be required to: -## Ci Cd +- build an OAuth authorization URL, such as a Zendesk subdomain +- choose the correct API base URL, such as a region or account-specific host +- call API endpoints later, such as a tenant ID, account ID, portal ID, or workspace ID +- store values Nango discovers during authorization, such as an API instance URL or provider account ID -Source: https://nango.dev/docs/guides/functions/ci-cd.md +Use connection configuration when the value is part of the connection's validity. If the value is missing, the connection may fail to authorize, fail credential checks, or be unusable for API requests. ---- -title: 'CI/CD for Nango Functions' -sidebarTitle: 'CI/CD' -description: 'How to integrate Nango Function deployments into your CI/CD pipeline.' ---- - -CI/CD for Nango is about keeping your [Functions](/guides/functions/functions-guide) β€” sync functions, action functions, webhook functions, and event functions β€” in sync with your application across environments. - -The core principle: **deploy to Nango as part of the same pipeline step as your application**. Deploying them separately risks your app and your Functions going out of sync, which can cause subtle bugs that are hard to trace. - -## Authentication - -To deploy from CI, you need a scoped API key for each Nango environment. - -1. **Create API keys**: In the Nango UI, go to **Environment Settings > API Keys** and create a key for each environment (e.g., `dev` and `prod`). For CI/CD pipelines, use a key scoped to `environment:deploy` only β€” see the [CI/CD Deploy profile](/reference/backend/http-api/api-keys#cicd-deploy). -2. **Store the keys**: Add them as secrets in your CI/CD provider. The Nango CLI reads them from these environment variables: - - `NANGO_SECRET_KEY_DEV` - - `NANGO_SECRET_KEY_PROD` - -## Recommended pipeline - -Treat Nango Functions like application code: validate on every PR, deploy to each environment in the same step as your application. - -| Pipeline stage | What to do | -|---|---| -| **Pull request** | Run `nango compile` and `npm test` as required checks. Block merge on failure. | -| **Merge to main** | Deploy to your dev/staging Nango environment alongside your app. | -| **Release to production** | Deploy to your prod Nango environment in the same step as your app release. | - -The Nango CLI `deploy` command targets a specific environment: - -```bash -nango deploy -``` - -If you don't specify an environment, it defaults to `dev`. - -**If you don't have a staging environment**, wire the prod Nango deploy directly to your production release step β€” use a `workflow_dispatch` trigger or equivalent manual approval. This keeps production deploys intentional, and ensures they always happen through CI using the prod API key rather than from a local machine. - - -Add the `dist/` folder inside your `nango-integrations` directory to `.gitignore`. The CLI writes compiled JS artifacts there, and committing them creates noisy diffs and risks deploying stale bundles. - - -## Example: GitHub Actions - -Two workflow files implement the pipeline above. - - - -```yaml -name: Validate Nango Functions - -on: - pull_request: - branches: - - main - -jobs: - validate: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Install dependencies - run: npm ci - - - name: Compile - run: npx nango@latest compile --no-dependency-update - - - name: Test - run: npm test -``` - - - -```yaml -name: Deploy Nango Functions - -on: - # Manual trigger to deploy to a specific environment - workflow_dispatch: - inputs: - stage: - type: choice - description: 'Environment to deploy to' - required: true - default: 'dev' - options: - - dev - - prod - allowDestructive: - type: boolean - description: 'Allow destructive changes' - required: true - default: false - - # Automatic deploy to dev on merge to main - push: - branches: - - main - -jobs: - deploy: - runs-on: ubuntu-latest - env: - NANGO_SECRET_KEY_DEV: ${{ secrets.NANGO_SECRET_KEY_DEV }} - NANGO_SECRET_KEY_PROD: ${{ secrets.NANGO_SECRET_KEY_PROD }} - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Install dependencies - run: npm ci - - - name: Deploy to Nango - run: | - if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then - stage="${{ inputs.stage }}" - else - stage="dev" - fi - - secret_key_var="NANGO_SECRET_KEY_$(echo "$stage" | tr '[:lower:]' '[:upper:]')" - secret_key="${!secret_key_var}" - - if [ -z "$secret_key" ]; then - echo "Error: ${secret_key_var} is not set" - exit 1 - fi - - destructive_flag="" - if [ "${{ github.event_name }}" == "workflow_dispatch" ] && [ "${{ inputs.allowDestructive }}" == "true" ]; then - destructive_flag="--allow-destructive" - fi - - npx nango@latest deploy "$stage" --secret-key "$secret_key" --no-dependency-update $destructive_flag -``` - - - - - **Destructive Changes** - - A destructive change removes an integration, sync function, or action function. To prevent accidental deletions, `nango deploy` will prompt for confirmation when it detects one. - - In CI, use `--auto-confirm` or `--allow-destructive` to bypass the prompt. We recommend only doing this on a manual trigger, as shown above. - - -## Testing in CI - -Run your test suite in CI before every deployment. Nango's testing framework uses dry runs and snapshot testing to validate your Functions without affecting live data: - -```bash -npm test -``` - -See the [Testing integrations guide](/guides/functions/testing) for details. - -## Ephemeral preview environments (e.g. Vercel) - -If you use ephemeral preview environments β€” such as Vercel preview deployments β€” as your staging layer, you'll run into a challenge: each preview has a unique URL, but Nango webhook URLs must be registered in advance and point to a stable destination. - - -Nango doesn't currently support creating environments programmatically. This is on the roadmap and will make ephemeral environment setups much cleaner when available. - - -For now, the simplest approach is to designate a fixed, long-lived Nango environment (e.g., `dev`) specifically for Nango-related changes, and use that consistently across preview deployments rather than trying to create a new Nango environment per preview. - -If you need previews to receive live webhook events, a proxy server is the current workaround: register a stable URL in Nango, and have the proxy forward incoming webhooks to the correct preview URL. - -## Dependency-safe CI and monorepos - -When running Nango in CI or monorepos, you often want to avoid modifying `package.json` or running extra installs from within Nango commands. Use `--no-dependency-update` on CLI commands, or set `NANGO_CLI_DEPENDENCY_UPDATE=false` as an environment variable: - -```bash -npx nango@latest deploy dev --no-dependency-update -``` - - -With `--no-dependency-update`, Nango will not install dependencies. Make sure your pipeline does so first (e.g. `npm ci`, `pnpm install --frozen-lockfile`, `yarn install --immutable`, or `bun install --frozen-lockfile`). - - - -In CI environments, Nango automatically disables dependency updates to prevent modifying `package.json`. Passing `--no-dependency-update` explicitly silences the related warning. - - -## Related resources - -- [Testing integrations](/guides/functions/testing) - A comprehensive guide to testing your Nango Functions. -- [API Keys reference](/reference/backend/http-api/api-keys) - Available scopes and advised profiles for CI/CD and other use cases. +When you use the pre-built [Connect UI](/guides/auth/auth-guide), Nango generates the required forms for the integration and stores the submitted values as connection configuration. -## Unified Apis +When you use [headless auth with a custom UI](/guides/auth/customize-connect-ui#build-your-own-auth-ui), you must collect required connection configuration in your own UI and pass it to `nango.auth()`: -Source: https://nango.dev/docs/guides/functions/unified-apis.md +```js +nango.auth('zendesk', { + params: { subdomain: '' } +}); +``` ---- -title: 'Unified APIs with functions' -sidebarTitle: 'Unified APIs' -description: 'Build provider-specific functions behind one stable model and operation surface.' ---- - -API unification is the process of standardizing multiple provider APIs behind one interface that your product can use consistently. - -In Nango, unification is optional and code-first. You define the models and operations that fit your product, then implement provider-specific functions that translate to and from each external API. - -## When to unify - -Unification is useful when your customers use different systems for the same business object: - -- CRMs with contacts, companies, deals, and custom fields. -- ATS platforms with candidates, jobs, stages, and applications. -- Accounting systems with invoices, customers, transactions, and accounts. -- Support tools with tickets, comments, users, and organizations. - -It is less useful when the provider exposes concepts that are deeply unique. For example, Notion's block model can be partially normalized for simple document export, but advanced block behavior usually needs provider-specific logic. - -Unification does not need to be perfect to be valuable. A stable common model with explicit provider extensions is often better than trying to force every API into a lowest-common-denominator shape. - -## Design principles - -Design the unified model around your product, not around the external APIs. - -If your app already has a `Contact`, `Invoice`, or `Candidate` model, use that as the starting point. Keep the fields your workflows actually need, and resist carrying every provider field into the common model. - -Expect optional fields. Providers rarely expose the same data with the same semantics, and some customers may rely on custom fields or custom statuses. Model those gaps intentionally with nullable fields, fallbacks, metadata, or provider-specific extensions. - -Use the same model for reads and writes when possible. If a sync writes `UnifiedContact` records into your app, the corresponding create or update action should accept the same shape unless the write operation truly needs a different contract. - -Validate close to the external API. Use [data validation](/guides/functions/data-validation) in your functions so mapping drift, malformed provider responses, and invalid write inputs fail at the integration boundary. - -## Define the model - -Put shared schemas in a common file and import them from each provider implementation: - -```ts models.ts -import * as z from 'zod'; - -export const UnifiedUser = z.object({ - id: z.string().optional(), - name: z.string().optional(), - email: z.string().email().optional(), - externalUrl: z.string().url().optional(), - raw: z.unknown().optional() -}); - -export const CreateUnifiedUser = z.object({ - name: z.string(), - email: z.string().email() -}); - -export type UnifiedUser = z.infer; -``` - -Keep provider-specific fields explicit: - -```ts models.ts -export const JiraUser = UnifiedUser.extend({ - accountType: z.string().optional() -}); -``` - -## Implement unified actions - -Each provider gets an action with the same input and output contract: - - - - ```ts jira/actions/create-user.ts - import { createAction } from 'nango'; - import { CreateUnifiedUser, UnifiedUser } from '../../models'; - - export default createAction({ - description: 'Creates a user in Jira', - input: CreateUnifiedUser, - output: UnifiedUser, - exec: async (nango, input) => { - const response = await nango.post({ - endpoint: '/rest/api/3/user', - data: { - emailAddress: input.email, - displayName: input.name - } - }); - - return { - id: response.data.accountId, - name: response.data.displayName ?? input.name, - email: input.email, - raw: response.data - }; - } - }); - ``` - - - ```ts zendesk/actions/create-user.ts - import { createAction } from 'nango'; - import { CreateUnifiedUser, UnifiedUser } from '../../models'; - - export default createAction({ - description: 'Creates a user in Zendesk', - input: CreateUnifiedUser, - output: UnifiedUser, - exec: async (nango, input) => { - const response = await nango.post({ - endpoint: '/api/v2/users.json', - data: { - user: { - name: input.name, - email: input.email - } - } - }); - - return { - id: String(response.data.user.id), - name: response.data.user.name, - email: response.data.user.email, - externalUrl: response.data.user.url, - raw: response.data.user - }; - } - }); - ``` - - - -Your app can choose the integration ID at runtime and call the same action name for each provider: - -```ts -await nango.triggerAction(integrationId, connectionId, 'create-user', { - name: 'Ada Lovelace', - email: 'ada@example.com' -}); -``` - -## Implement unified syncs - -Sync functions are where read-side unification usually lives. Fetch provider records, map each page into your unified model, then save those records to Nango's records cache: - -```ts hubspot/syncs/users.ts -import { createSync } from 'nango'; -import { UnifiedUser } from '../../models'; - -export default createSync({ - description: 'Syncs users into the unified user model', - frequency: 'every hour', - models: { UnifiedUser }, - exec: async (nango) => { - for await (const page of nango.paginate({ - endpoint: '/crm/v3/objects/contacts', - params: { properties: 'email,firstname,lastname' }, - paginate: { - type: 'cursor', - cursor_path_in_response: 'paging.next.after', - cursor_name_in_request: 'after', - response_path: 'results', - limit_name_in_request: 'limit', - limit: 100 - } - })) { - const users = page.map((contact) => ({ - id: contact.id, - name: [contact.properties.firstname, contact.properties.lastname].filter(Boolean).join(' '), - email: contact.properties.email, - raw: contact - })); - - await nango.batchSave(users, 'UnifiedUser'); - } - } -}); -``` - -## Handle provider-specific behavior - -Use one of these patterns when the common model is not enough: - -- Extend the common model with provider-specific fields for integrations that need them. -- Store raw provider data under a `raw` field for debugging or advanced workflows. -- Use connection metadata for customer-specific mappings, such as custom fields, custom statuses, or selected pipelines. -- Create provider-specific actions for operations that do not map cleanly to the unified interface. - -## Related guides - -- [Action functions](/guides/functions/action-functions) -- [Sync functions](/guides/functions/syncs/sync-functions) -- [Data validation](/guides/functions/data-validation) -- [Storage](/guides/functions/storage) +You can also set defaults when creating a Connect session: -## Observability + + + ```ts + const { data } = await nango.createConnectSession({ + allowed_integrations: [''], + integrations_config_defaults: { + '': { + connection_config: { + '': '' + } + } + } + }); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/connect/sessions \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "allowed_integrations": [""], + "integrations_config_defaults": { + "": { + "connection_config": { + "": "" + } + } + } + }' + ``` + + -Source: https://nango.dev/docs/guides/platform/observability.md +Read connection configuration from the connection: ---- -title: 'Observability' -sidebarTitle: 'Observability' -description: 'How Nango helps you with observability for your integrations' ---- - -Nango's logs are comprehensive and give you a detailed picture of what happens in your integrations. - -## Our approach - -Since integrations rely on third-party APIs, production issues are bound to happen. - -When you encounter a problem, great observability is the difference between a week-long needle-in-a-haystack hunt and a timely resolution. - -We built Nango's logs based on three principles: - -- **Comprehensive**: Everything that happens in Nango for your integrations produces an "operation" in the logs -- **Detailed**: Every operation and every log message contains detailed information about the integration, [connection](/guides/auth/auth-guide#overview), and [function](/guides/functions/functions-guide). Error messages are as detailed as the external APIs allow. -- **Customizable**: You can easily log your own messages from functions you write ([learn more](/reference/functions/functions-sdk#logging)). To consume logs, you can either use our built-in interface or export them with our [OpenTelemetry exporter](#opentelemetry-export) - -## Overview of Nango logs - - - ![](/images/screenshots/nango-logs-overview.png) - - -Logs are structured into: -- Operations: High-level actions happening in your Nango account (e.g., sync executed, connection created, webhook processed) -- Log messages: Nested in operations, these provide details on what happened (e.g., HTTP request executed, data validation warning, custom log message) - -Nango provides detailed filtering and searching of log messages by integration, connection, operation type, status, etc. - -We recommend exploring the logs in your own Nango account under **Logs**. - -## OpenTelemetry export - -Nango supports exporting OpenTelemetry traces so you can monitor and analyze integration activity in your own observability stack. - -Use this for: -- Advanced custom metrics -- Advanced alerting and escalation paths (e.g., segment sync errors by customer account for customized escalation paths) - -### Supported operations - -The following operations are exported as traces: -- Sync executions -- Action executions -- Third-party API webhook executions -- Proxied requests - - - If you need support for other operations please reach out. We can enable support for them. - - -### Configuration - - - - Log into the Nango dashboard and navigate to the Environment settings page. - - - In the Environment Settings, provide the following information: - - OpenTelemetry endpoint: The endpoint URL of your OpenTelemetry collector. Ex: https://my.otlp.collector:4318 - - Headers (Optional): Any authorization headers or additional headers required to access your collector. - - - -## Related guides - -- [Function logging](/guides/functions/logging) - add custom logs from function code. -- [Webhooks from Nango](/guides/platform/webhooks-from-nango#webhook-retries-debugging) - debug webhook delivery. -- [Common issues](/guides/platform/common-issues) - troubleshoot failed auth, sync, and proxy operations. +```ts +const connection = await nango.getConnection('', ''); -## Environments +console.log(connection.connection_config); +``` -Source: https://nango.dev/docs/guides/platform/environments.md -Description: Organize your integrations & data with environments +For the REST API response shape, see [Get a connection](/reference/backend/http-api/connections/get). For the Node SDK method, see [Get a connection with credentials](/reference/backend/backend-sdk/node#get-a-connection-with-credentials). -Environments help you segment your integration configuration and customer data across different stages of your development lifecycle. +## Connection metadata -## Overview +Metadata is arbitrary JSON storage on the connection. Use it for information your app or Nango functions need, but that is not a condition for the connection itself to exist. -Each environment in your Nango account is completely isolated with its own: +Good metadata examples: -- Integration configurations -- [Functions](/guides/functions/functions-guide) -- [Connections](/guides/auth/auth-guide) -- Environment-specific settings +- field mappings chosen by a customer +- folder, project, board, or object IDs selected during onboarding +- filters and feature flags used by sync functions +- tenant-specific identifiers discovered by your setup flow +- provider webhook subscription IDs used by webhook functions - -Each Nango account comes with **dev** and **prod** environments by default. Additional environments are available depending on your [pricing plan](https://www.nango.dev/pricing). - +Do not use metadata for credentials or values required to make the provider connection valid. Use connection configuration for that. Do not use metadata for synced datasets or large lists of records; use the [records cache](/guides/functions/syncs/records-cache) for sync output. -## Production environments +Set metadata after a connection is created: -Any environment can be designated as a production environment. This affects how team members interact with it based on their [role](/guides/platform/security#team-and-roles). + + + ```ts + await nango.setMetadata( + '', + '', + { + syncArchived: false, + fieldMapping: { + companyName: 'Account_Name__c' + } + } + ); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/connections/metadata \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "connection_id": "", + "provider_config_key": "", + "metadata": { + "syncArchived": false, + "fieldMapping": { + "companyName": "Account_Name__c" + } + } + }' + ``` + + -**To mark an environment as production:** +Functions can read metadata for the connection they run for: -1. Open the environment settings (gear icon in the top navigation) -2. Toggle the **Production environment** switch +```ts +const metadata = await nango.getMetadata(); +``` + +For deeper function patterns, see [Storage](/guides/functions/storage). + +**Related guides** + +- [Auth guide](/guides/auth/auth-guide) - create connections with Connect UI. +- [Customize Connect UI](/guides/auth/customize-connect-ui) - customize branding or pass connection configuration without Connect UI. +- [Share a connect link](/guides/auth/share-connect-link) - include tags in link-based flows. +- [Storage](/guides/functions/storage) - use metadata inside functions. +- [List connections API](/reference/backend/http-api/connections/list) - filter connections by tags. + +## Customize Connect Ui + +Source: https://nango.dev/docs/guides/auth/customize-connect-ui.md + +--- +title: 'Customize Connect UI' +sidebarTitle: 'Customize Connect UI' +description: 'Guide to branding Nango Connect UI, overriding setup links, or building a headless auth flow with your own UI.' +--- -Only **Full Access** team members can toggle the production flag. Once an environment is marked as production, **Support** members get read-only access to it, and **Contributor** members lose access entirely. +Pre-requisites: +- complete the [Set up an integration](/guides/auth/auth-guide#guide) section of the Auth guide +- generate a [Connect session token](/guides/auth/auth-guide#guide) -By default, the `prod` environment created with your account is already marked as production. +Nango's pre-built [Connect UI](/guides/auth/auth-guide) is the recommended way to let users authorize integrations. It generates the right form for each API, validates required inputs, tests credentials when supported, and shows users where to find API keys or other required values. -## Engineering collaboration +You can customize that pre-built UI with your own branding. If you need full control over every screen, you can also skip Connect UI and use Nango in a **headless auth** mode. -Use a **shared non-production environment** (usually `dev`) for day-to-day engineering work. The team shares integrations and the baseline function set. For local webhook testing, each engineer creates their own connections with a webhook URL override (see below). +## Customize the pre-built Connect UI -### Local webhooks on a shared environment +You can customize the Connect UI theme from the Nango dashboard: -Keep the environment webhook URL pointed at your shared app (or staging backend). To receive webhooks from Nango locally, create connections with a [per-connection `webhook_url` override](/guides/platform/webhooks-from-nango#override-webhook-urls-per-connection) pointing at your local webhook endpoint (for example via [ngrok](https://ngrok.com/)). +1. Open **Environment Settings**. +2. Go to the **Connect UI** tab. +3. Choose the theme: light, dark, or system. +4. Set the primary color for the light theme. +5. Set the primary color for the dark theme. +6. Optionally remove the **Secured by Nango** mention. -One convenient pattern is to read the override from an optional env var, so the same connect-session code works locally and when the var is unset. For example, set `NANGO_CONNECTION_WEBHOOK_URL` in your local `.env` to that URL and leave it unset elsewhere: +These settings apply to the pre-built Connect UI that you open with [`nango.openConnectUI()`](/reference/frontend/frontend-sdk#connect-using-nango-connect-ui). -```ts -const webhookUrl = process.env.NANGO_CONNECTION_WEBHOOK_URL; // e.g. https://.ngrok.app/webhooks-from-nango +Connect UI branding customization is available on the [Growth plan](https://www.nango.dev/pricing). -const session = await nango.createConnectSession({ +## Override documentation links + +By default, the Connect UI displays info icons that link to the Nango documentation. If you are embedding Connect UI in a customer-facing application and want these links to point to your own documentation instead, override them per integration using the `overrides` parameter when [creating a Connect session](/reference/backend/http-api/connect/sessions/create). + +This feature is available on the [Growth plan](https://www.nango.dev/pricing). + + + + +See the full [SDK reference](/reference/backend/backend-sdk/node#create-a-connect-session) for all available parameters. + +```js +const { data } = await nango.createConnectSession({ + // Recommended: copied onto the connection and included in auth webhooks. tags: { - end_user_id: '' + end_user_id: '', + end_user_email: '', + organization_id: '' }, - allowed_integrations: [''], - ...(webhookUrl && { - integrations_config_defaults: { - '': { - connection_config: { webhook_url: webhookUrl } + + allowed_integrations: ['', ''], + integrations_config_defaults: { + '': { + connection_config: { + '': '' } } - }) + }, + overrides: { + '': { + docs_connect: 'https://your-docs.com/how-to-connect' + } + } }); ``` + -When the var is set, new connections from that session route webhooks to your machine without changing the environment webhook URLs. - -### Local function deploys on a shared environment - -A full `nango deploy` reconciles every function in the environment. On a shared collaborative environment, that can overwrite teammates' deploys. Deploy only what you changed: + +See the full [API reference](/reference/backend/http-api/connect/sessions/create) for all available parameters. ```bash -nango deploy --sync -nango deploy --action -nango deploy --integration # all functions for one integration, including event functions +curl --request POST \ + --url https://api.nango.dev/connect/sessions \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "tags": { + "end_user_id": "", + "end_user_email": "" + }, + "overrides": { + "": { + "docs_connect": "https://your-docs.com/how-to-connect" + } + } +}' ``` + -Reserve full deploys for environments where the repo is the sole source of truth (for example staging or prod). See the [CI/CD guide](/guides/functions/ci-cd). + -### One environment per engineer +Replace `` with the unique name of the integration, for example `jira` or `slack`, and set `docs_connect` to the URL you want the info icons to link to. -You can give each engineer their own environment for full isolation. You then need to recreate integrations, connections, and settings in each environment yourself; that also means more API keys to manage and config that tends to drift over time. A shared `dev` environment avoids that overhead for most teams. +## Build your own auth UI -## Best practices +Headless auth means you build the user-facing setup UI yourself and use the frontend SDK to pass the required values to Nango. -**Mirror your application environments** +Headless auth still uses Nango for the backend parts of auth: Nango stores credentials, refreshes OAuth tokens, manages connection records, sends auth webhooks, and lets you call APIs through the proxy or from functions. What changes is the setup experience your user sees before the connection is created. -We recommend creating Nango environments that match your application's deployment stages. For example: -- Development / local β†’ dev environment -- Staging β†’ staging environment -- Production β†’ prod environment -- Demo β†’ demo environment +## What changes with headless auth -**Deploy to specific environments** +For OAuth APIs, calling `nango.auth()` opens the external API's login popup directly. Your user skips the Nango pre-authorization screen. This is useful when you want a shorter flow, but it also means you must collect any provider-specific inputs that the Nango Connect UI would normally ask for first. -When you deploy [Functions](/guides/functions/functions-guide), you always target a specific environment. This ensures changes are tested before reaching production. +For API key, Basic Auth, and other non-OAuth flows, there is no external login popup. You must build the form that collects the user's credentials, validate field formats in your own UI, and pass the credentials to `nango.auth()`. Nango can still reject invalid credentials when the integration supports credential checks, but your UI owns the input fields, error messages, and setup guidance. -## Related guides +Some APIs also require **connection configuration** in addition to credentials. For example, an API might need a subdomain, domain, tenant ID, region, or account-specific base URL to build the authorization URL or make future API requests. Connect UI collects these fields automatically. With headless auth, your UI must collect them and pass them programmatically. -- [API keys](/reference/backend/http-api/api-keys) - scope keys per environment. -- [CI/CD](/guides/functions/ci-cd) - deploy functions safely across environments. -- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - environment and per-connection webhook URLs. -- [Self-host Nango](/guides/platform/self-hosting) - plan environments for self-hosted deployments. +See [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) for the difference between connection configuration, metadata, and tags. -## Limits +## Use the frontend SDK for headless auth -Source: https://nango.dev/docs/guides/platform/limits.md +In your frontend, initiate Nango ([reference](/reference/frontend/frontend-sdk#instantiate-the-frontend-sdk)): ---- -title: 'Limits' -sidebarTitle: 'Limits' -description: 'Overview of resource limits on Nango Cloud.' ---- - -Nango Cloud has several resource limits to ensure platform stability and fair usage across all customers. - - -For plan-specific limits, refer to the [pricing page](https://www.nango.dev/pricing) and the Usage & Billing page in your account. - - -## API rate limits - -Rate limits apply to API requests from your application to Nango: - -| Plan | Requests per Minute | -| - | - | -| Free tier | 200 | -| Starter | 1,000 | -| Growth | 2,000 | -| Enterprise | Custom | - - -If you exceed the rate limit, use the standard rate-limit headers to determine when to resume requests. - - -## Function execution limits - -Different function types have varying execution and enqueuing time limits: - -| Function Type | Max Execution Time | -| - | - | -| [Sync functions](/guides/functions/syncs/sync-functions) | 24 hours | -| [Action functions](/guides/functions/action-functions) | 15 minutes | -| [Webhook functions](/guides/functions/webhook-functions) | 1 hour | - -### Minimum sync frequency - -For polling syncs, the minimum frequency is **30 seconds**, available on all plans. You can set the frequency in the sync definition or override it per connection using the [SDK](/reference/backend/backend-sdk/node#override-sync-connection-frequency) or [API](/reference/backend/http-api/sync/update-connection-frequency). - -For real-time updates, use [real-time syncs](/guides/functions/syncs/realtime-syncs) which trigger from external API webhooks instead of polling. - -### Sync variant limits - -Each sync can have a maximum of **100 variants** per connection. For heavier workloads, reach out to increase this limit. See the [sync partitioning guide](/guides/functions/syncs/sync-partitioning) for more details. - -### Action function output limits - -Action functions have a maximum output payload size of **2MB**. For large payloads, use the [Proxy](/guides/platform/proxy-requests) instead. - -## Data retention policies - -Nango automatically manages data retention for records in the sync cache: - -### Payload pruning (30 days) - -If a record hasn't been updated for **30 days**, Nango automatically prunes its payload while preserving: -- Record ID -- Sync state -- Payload hash (for change detection) - -The record still exists and Nango can detect future changes, but the data fields are no longer retrievable from the cache. - -### Hard deletion (60 days) - -If a sync hasn't executed for **60 days**, all associated records (payload + metadata) are permanently deleted. - - -These policies ensure sensitive data isn't stored indefinitely. If you need to access record payloads long after updates (30+ days), please reach out in the [Slack community](https://nango.dev/slack). - - -## Webhook limits - -Webhooks sent from Nango to your application have the following limits: - -- **Timeout**: 20 seconds -- **Retries**: 2 attempts - -These limits apply to all webhook types: auth, sync function completion, async action function completion, and webhook forwards. - -## Related guides - -- [Rate limits](/guides/functions/rate-limits) - handle provider throttling in functions. -- [Sync efficiency](/guides/functions/syncs/sync-efficiency) - stay within payload and runtime limits. -- [Security](/guides/platform/security) - review retention and access constraints. - - -**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - +```ts +import Nango from '@nangohq/frontend'; -## Security +const nango = new Nango({ connectSessionToken: '' }); +``` -Source: https://nango.dev/docs/guides/platform/security.md +Then create the connection with `nango.auth()` ([reference](/reference/frontend/frontend-sdk#connect-using-the-headless-client)): ---- -title: 'Security' -sidebarTitle: 'Security' -description: 'How Nango secures your API credentials and customer data.' ---- - -Nango is designed with security as a core principle. This page provides technical details about how Nango stores, encrypts, and manages API credentials. - -## Compliance - -Nango is **SOC 2 Type II** certified, **GDPR** compliant, and **HIPAA** compliant. - -| Certification | Details | -| - | - | -| SOC 2 Type II | Annual audit covering security, availability, and confidentiality. [View report β†’](https://trust.nango.dev) | -| GDPR | Data Processing Agreement (DPA) automatically applies to all cloud accounts. [View DPA β†’](https://nango.dev/terms#dpa) | -| HIPAA | Business Associate Agreement (BAA) available on request. [Contact us β†’](https://nango.dev/demo) | - -Our security practices include: - -- Regular security assessments and penetration testing -- Secure development lifecycle -- Incident response procedures -- Continuous monitoring and alerting - -Visit our [Trust Center](https://trust.nango.dev) for the latest compliance documentation, security policies, and audit reports. - -## Credential storage - -### What credentials are stored - -Nango stores the following credential types depending on your API integrations: - -- **OAuth tokens**: Access tokens, refresh tokens, and associated metadata -- **API keys**: For APIs using key-based authentication -- **Client credentials**: OAuth client IDs and secrets for your integrations -- **Connection configuration**: OAuth scopes, authorization parameters, and provider-specific settings - -### Storage infrastructure - -Nango Cloud stores all data in **AWS Aurora PostgreSQL** databases hosted in AWS. The database infrastructure includes: - -- Encryption at rest using AWS-managed keys -- Automated backups with point-in-time recovery -- Multi-AZ deployment for high availability -- Network isolation within a private VPC - -For self-hosted deployments, you control the database infrastructure and can apply your own security policies. - -## Encryption - -### Encryption at rest - -All sensitive credentials are encrypted before being stored in the database using **AES-256-GCM** (Advanced Encryption Standard with Galois/Counter Mode). - -| Property | Value | -| - | - | -| Algorithm | AES-256-GCM | -| Key size | 256 bits (32 bytes) | -| IV size | 12 bytes (generated per encryption) | -| Auth tag size | 16 bytes | - -### What is encrypted - -The following data types are encrypted at rest: - -- Connection credentials (OAuth tokens, API keys, etc.) -- OAuth client secrets (your integration credentials) -- Environment secret keys -- Environment variables - -### Key management - -- **Nango Cloud**: Encryption keys are securely managed by Nango. All credentials are encrypted at rest. -- **Self-hosted**: You must provide your own encryption key to enable encryption at rest. - -### Encryption in transit - -All data transmitted to and from Nango is encrypted using TLS 1.2+. This includes: - -- API requests between your application and Nango -- Requests from Nango to external APIs (using each provider's TLS configuration) -- Dashboard access - -## Data retention - -### Active connections - -Credentials are stored for as long as the connection exists. You have full control over connection lifecycle: - -- Create connections when users authorize integrations -- Delete connections at any time via the API or dashboard -- Connections can be programmatically managed through your application - -#### Retention after deletion - -When a connection is deleted: - -1. **Immediate soft delete**: Connection is marked as deleted and becomes inaccessible -2. **Associated data cleanup**: Sync functions are stopped, and scheduled tasks are cancelled -3. **Hard delete after retention period**: Credentials and associated data are permanently removed from the database - -The default retention period is **31 days**. For self-hosted deployments, this is configurable. - -This retention period allows for: -- Recovery from accidental deletions -- Compliance with audit requirements -- Graceful handling of in-flight operations - -#### What is deleted - -When a connection is permanently deleted, the following data is removed: - -- All stored credentials (tokens, keys, secrets) -- Connection metadata and configuration -- Sync records associated with the connection -- Related job history and logs - -### Synced records retention - - -This section only applies if you are using Functions of type Sync, e.g. for replicating data or receiving trigger notifications from an external API. - - -Nango automatically manages data retention for records stored in the Nango records cache to ensure that sensitive user data is not stored indefinitely when it's no longer needed. - -#### Automated payload pruning (30 days) - -If a record has not been updated for **30 days**, Nango will automatically empty its payload. - -**Impact:** -After pruning, the record's data fields are no longer retrievable from the Nango cache via the API or SDK. However, Nango retains the metadata needed for change detection (record ID and payload hash). Your sync functions will continue to work normally. This pruning does not impact sync execution or delta-detection capabilities. - -#### Automated hard deletion (60 days) - -If a sync has not executed for **60 days**, all records belonging to that sync will be permanently deleted. - -**Impact:** -Complete removal of all records from the inactive sync, including metadata and payload hashes used for delta-detection. The sync itself remains configured but starts fresh on the next execution. Nango will no longer be able to detect changes against previously synced records. - -#### When do retention policies apply? - -- **30-day pruning countdown**: Starts from the last time a specific record was updated. -- **60-day deletion countdown**: Starts from the last time a sync successfully executed. - -#### Best practices - -To work optimally with Nango's retention policies: - -**1. Fetch records promptly** - -Set up [webhooks from Nango](/guides/platform/webhooks-from-nango) to be notified when new data is available. Fetch the updated records immediately after receiving a sync webhook. - -**2. Use cursor-based synchronization** - -Track your sync progress using cursors to ensure you never miss records, even if webhooks are occasionally missed. Store the cursor of the last-fetched record and use it on subsequent fetches. - -**3. Store data in your own system** - -Don't use Nango's cache as your primary data store. Instead: -- Store synced records in your own database -- Use Nango as a synchronization pipeline -- Keep your own copy of all critical data - -#### Longer retention requirements - -If your use case requires accessing record payloads from Nango's cache beyond the 30-day window, please reach out to the Nango team. We can work with you to ensure you don't experience breaking changes. - -## Deletion procedures - -### User-initiated deletion - -You can delete connections through: - -- **Dashboard**: Navigate to the connection and click "Delete" -- **API**: Call the [delete connection endpoint](/reference/backend/http-api/connections/delete) -- **SDK**: Use the `deleteConnection` method in any of our backend SDKs - -### Automatic cleanup - -Nango automatically cleans up: - -- Expired OAuth sessions -- Expired connect session tokens -- Orphaned data from deleted integrations - -### Data purge requests - -For compliance requirements (e.g., GDPR), contact Nango support to request immediate data purges. We can expedite the deletion process when required by regulation. - -## Access controls - -### API authentication - -Nango supports multiple authentication methods: - -| Method | Use case | Token lifetime | -| - | - | - | -| Secret key | Server-to-server API access | Long-lived (until rotated) | -| Connect session token | Frontend auth flows | 30 minutes | -| Session cookie | Dashboard access | Session-based | - -### Secret key security - -- Secret keys are environment-specific (dev, prod, etc.) -- Keys can be rotated via the dashboard -- All API requests require a valid secret key in the `Authorization` header - -### Environment isolation - -Each [environment](/guides/platform/environments) in your Nango account is completely isolated: - -- Separate credentials and connections -- Separate integration configurations -- Separate secret keys - -This ensures your production data is never accessible from development environments. - -### Audit logging - -All credential access and modifications are logged: - -- Connection creation and deletion -- Credential refresh operations -- API requests using credentials - -Logs are available in the Nango dashboard and can be exported via [OpenTelemetry](/guides/platform/observability#opentelemetry-export). - - -## Team & roles - -Nango supports multiple team members per account with role-based access control (RBAC). Roles determine what each member can view and modify, particularly in production environments. - -### Role overview - -There are three roles: - -| | **Full Access** | **Support** | **Contributor** | -| - | - | - | - | -| **Summary** | Unrestricted access across all environments. The only role that can manage account settings, billing, and the team. | Designed for monitoring production without being able to change it. Full access in non-production environments. | Designed for developers who work exclusively in non-production environments. No production access at all. | - -**Full Access is the default role** for just-in-time (JIT) provisioning when using SSO. When inviting members manually, you choose their role during the invitation flow. - - -At least one Full Access member is required per account. - - -### Permissions - -| | **Full Access** | **Support** | **Contributor** | -| - | - | - | - | -| Non-production: read (integrations, connections, syncs, logs) | βœ“ | βœ“ | βœ“ | -| Non-production: write / delete | βœ“ | βœ“ | βœ“ | -| Production: read (integrations, connections, syncs, logs) | βœ“ | βœ“ | β€” | -| Production: trigger syncs | βœ“ | βœ“ | β€” | -| Production: write / delete | βœ“ | β€” | β€” | -| Production: view secret key | βœ“ | β€” | β€” | -| Production: view integration credentials | βœ“ | β€” | β€” | -| Production: view connection credentials | βœ“ | β€” | β€” | -| Invite / update / remove team members | βœ“ | β€” | β€” | -| Manage billing & plan | βœ“ | β€” | β€” | -| Configure Connect UI | βœ“ | β€” | β€” | -| Create environments / toggle production flag | βœ“ | β€” | β€” | - - -All environments appear in the dashboard switcher regardless of role, but access is enforced server-side β€” users are blocked from entering environments their role does not permit. Permissions cannot be bypassed by manipulating URLs or API parameters. - - -### Production environment flag - -Whether an environment is considered production is configured in **Environment Settings β†’ General**. The production status of the current environment is also visible in the environment dropdown at the top left of the dashboard. - -The flag can be set on any environment regardless of its name β€” not just `prod`. This lets you protect environments like `prod-eu`, `production`, or `live` the same way. - -Only **Full Access** members can toggle this flag. Once set, Support members get read-only access (without sensitive credentials) and Contributor members lose access entirely. - - -The production flag currently governs role-based access. In the future it may also control additional environment traits to differentiate production-grade environments from development or staging ones. - - - -These roles apply to dashboard access only. They do not affect API authentication β€” any caller with a valid secret key retains full API access regardless of their dashboard role. - - - -## Single sign-on (SSO) - -Nango Cloud uses [WorkOS](https://workos.com) to power SSO. - -### Availability - -| Plan | SSO support | -| - | - | -| Free / Starter | Google SSO only | -| Growth | SSO with 20+ identity providers (add-on) | -| Enterprise (Cloud) | SSO with 20+ identity providers (included) | -| Enterprise (Self-hosted) | Not yet available (planned) | - -### Supported providers - -Through WorkOS, Nango supports the main SSO providers, including **Okta**, **Entra ID**, **OneLogin** and 20+ other identity providers. - -### How to enable SSO - -1. To enable SSO for your account, contact the Nango team (on our shared Slack channel or the [community](https://nango.dev/slack)). -2. If you are on the Growth plan, we will subscribe your workspace to the SSO add-on. -3. We will invite an admin from your company to complete the SSO setup flow. - -### Setup flow - -During setup, your company admin can configure the **domains allowed to sign in**. User accounts are created automatically through just-in-time (JIT) provisioning. - -### How users log in - -Once SSO is configured, users sign in through your company's identity provider (IdP). Nango currently does not provide a dedicated SSO button on the login page β€” login must be initiated from the IdP side. - -## IP Allowlist - -Some integrations require network-level access controls that only allow inbound traffic from known IP addresses. -This page lists the **public IP addresses used by Nango services** when making outbound requests. - - -### When is IP allowlisting required? - -IP allowlisting is only required if **your customers' systems** restrict inbound network traffic. - -Common examples include: -- Private or self-hosted APIs behind a firewall -- Enterprise systems that only accept traffic from approved IPs -- Third-party services with IP-based access controls - -If a system is publicly accessible without IP restrictions, **no allowlist configuration is needed**. - - -### Nango public IP addresses - -Allowlist the following IP addresses to permit inbound traffic from Nango: - -- `52.34.139.153` -- `54.69.127.183` -- `44.247.133.183` -- `52.26.211.56` - - -### IP address changes - -While we aim to keep IP addresses stable, they **may change over time** as we scale or improve reliability. - -To minimize disruption: -- Ensure all listed IPs are allowlisted -- Periodically review this page for updates - -We will make reasonable efforts to communicate breaking changes in advance. - -## API Key Scoping - -Nango supports scoped API keys, allowing you to follow the principle of least privilege when granting programmatic access to your environments. Each API key can be restricted to specific operations β€” for example, a CI/CD pipeline key that can only deploy, or a backend service key that can read connections but not manage integrations. - -For details on available scopes, advised profiles, and key management, see the [API Keys reference](/reference/backend/http-api/api-keys). - - -**Questions about security?** Please reach out in the [Slack community](https://nango.dev/slack) or contact security@nango.dev. - - -## Related guides - -- [API keys](/reference/backend/http-api/api-keys) - create scoped keys for production access. -- [Auth guide](/guides/auth/auth-guide) - keep provider credentials out of your app. -- [Token refreshing and validity](/guides/auth/token-refreshing) - handle revoked OAuth credentials. -- [Self-host Nango](/guides/platform/self-hosting) - review deployment and data ownership options. + -## Self Hosting + -Source: https://nango.dev/docs/guides/platform/self-hosting.md +For OAuth, `nango.auth()` opens the external API's login popup directly. ---- -title: 'Self-host Nango' -sidebarTitle: 'Self-hosting' -description: 'Overview of self-hosted deployments.' ---- - -Nango offers a self-hosted deployment option for Enterprise customers. This guide covers deployment, scaling, updates, and other key operational details. - -## Architecture overview - - - - - -## Architecture components - -Nango consists of several core services, each handling specific responsibilities: - -- **Server (Node service)**: Powers the dashboard, API, proxy requests, and incoming/outgoing webhooks. -- **Orchestrator (Node service)**: Manages task scheduling and state tracking. -- **Jobs (Node service)**: Processes tasks and dispatches them to the Runner. -- **Runner (Node service)**: Executes integration code and interacts with external APIs. -- **Persist (Node service)**: Stores synced records and logs. -- **Postgres**: Stores data for the control plane, API credentials, scheduled tasks, and synced records. -- **Object Storage (e.g. S3)**: Stores compiled integration code for execution by the Runner. -- **ElasticSearch**: Stores execution data. -- **Redis**: Caches system data, including socket information, token refresh locks, and rate limits. - -## Cloud vs. self-hosted architecture - -The Nango architecture is largely the same for both Cloud and Enterprise self-hosting. This ensures self-hosted instances benefit from continuous dogfooding and load testing. - -The primary differences are: -- In the Cloud version, the Runner service runs as isolated instances per customer. -- The Postgres database is segmented by use case (control plane, task scheduling, synced records). - -## Features - -All paid features available on Nango Cloud are also included in the Enterprise self-hosted edition. - -## Plan requirement - -An [Enterprise plan](https://www.nango.dev/pricing) subscription is required. - -Enterprise Self-Hosted pricing contain a fixed annual license and maintenance fee, plus a fraction of the cloud usage-based fees since infrastructure is on the customer side. - -## Intended users - -Inteded for large and/or regulated enterprises. - -## Deployment - -By default, Nango is deployed using [Helm charts](https://github.com/NangoHQ/nango-helm-charts). Custom deployments (e.g., ECS) are possible with our guidance. - -## Updates - -Managed image updates are published on a **two-month cadence**, with occasional **hotfixes** as needed. Notifications about new releases will be posted to your dedicated Nango Slack channel. - -You can also subscribe to release notifications on the [`NangoHQ/managed-image-releases`](https://github.com/NangoHQ/managed-image-releases) repository: - -- **GitHub:** watch the repository, select **Custom**, and enable **Releases**. -- **RSS/Atom:** subscribe to `https://github.com/NangoHQ/managed-image-releases/releases.atom`, which can be wired into Slack, Microsoft Teams, RSS readers, or internal automation. - -Each release includes the managed image tag, application version, source commit hash, release date, Docker pull reference, a GitHub compare link to the previous managed release, and a generated changelog of changes since the previous managed release. - -### Image tags - -Managed image tags follow this format: - -``` -nangohq/nango:managed-{managed-release-version}-{application-version}-{commit-sha} -``` - -* `managed-release-version`: Semantic version for the managed image lifecycle (major = breaking, minor/patch = features/fixes) -* `application-version`: Semantic version of the Nango application baked into the image -* `commit-sha`: Full Git commit hash of the released source - -For example, pull a release from Docker Hub with: - -```bash -docker pull nangohq/nango:managed-1.5.4-0.70.4-0fe07a6d83aea0becc4cea382c5cead2f555718d -``` - -Customers should **pin their CLI version to the `application-version`** specified in the tag for compatibility. - -### Versions and policy - -You can find the latest version in [`managed-manifest.json`](https://github.com/NangoHQ/managed-image-releases/blob/main/managed-manifest.json) on `managed-image-releases` (mirrored from [`NangoHQ/nango`](https://github.com/NangoHQ/nango/blob/master/managed-manifest.json) on each release). The in-repo [`CHANGELOG.md`](https://github.com/NangoHQ/managed-image-releases/blob/main/CHANGELOG.md) tracks release history. - -Each managed release maps to a specific source commit, and published image tags are never changed after release. Customers are encouraged to stay reasonably current with managed image releases. - -See the full [changelog](/updates/changelog) for details on each release. - -## Cloud provider support - -Supports all major cloud providers (AWS, GCP, Azure). - -## Recommended configuration - -- **5 Node services** (Server, Persist, Runner, Jobs, Orchestrator): 1 CPU, 2GB RAM per service -- **Postgres database**: 2 CPU, 8GB RAM, 128GB storage -- **Redis data store**: 128MB -- **ElasticSearch data store**: 2 vCPU, 1GB RAM, 30GB storage -- **Object storage (e.g. S3)**: less than 500MB of storage - -## Scaling - -The default configuration supports 1M+ sync/action executions per day (assuming ~2s execution time per action/sync). - -Auto-scaling is not provided out-of-the-box yet, but the default configuration scales far. We can guide you on configuring auto-scaling when needed. - -Bottlenecks mostly depend on: -- **Action/sync execution time**: solved by scaling the Runner service vertically, then horizontally. -- **Cached records & size (for sync functions only)**: solved by scaling Postgres vertically. - -## Data storage - -- **Postgres**: Stores data for the control plane, API credentials, scheduled tasks, and synced records. -- **Object Storage (e.g. S3)**: Stores compiled integration code for execution by the Runner. -- **ElasticSearch**: Stores execution data. -- **Redis**: Caches system data, including socket information, token refresh locks, and rate limits. - -## Using existing data stores - -Yes, Nango is flexible with data store setups. However, we recommend a separate instance for independent scaling. - -## Internet access requirements - -- **Server:** Required for proxy requests, credential management, and incoming/outgoing webhooks (inbound & outbound traffic). -- **Runner:** Required for reading/writing data from external APIs during sync and action executions (outbound traffic only). - -## Exporting metrics & logs - -Yes, metrics and logs can be exported to any monitoring tool using our OpenTelemetry Export add-on. Additional metrics and logs can be added upon request. - -## Email service - -Nango uses emails for account verification, password reset, and sending invitations, etc... - -Any SMTP server can be configured to be used by Nango for these email communications. - -## Encryption key - -You must provide your own encryption key via the `NANGO_ENCRYPTION_KEY` environment variable to enable encryption at rest. It encrypts credentials in the control-plane database as well as data in the records cache. Without this key, credentials are stored unencrypted. - -The records cache always requires this key. If you run sync functions that persist records, the persist and records services fail to store or retrieve records when `NANGO_ENCRYPTION_KEY` is not setβ€”they do not fall back to plaintext. - - -The encryption key must be a base64-encoded 256-bit (32-byte) key. Key rotation is not supported yetβ€”changing the key after initial setup will cause decryption failures. Plan your key management accordingly. - - -## Data retention configuration - -The default retention period for deleted connections is 31 days. You can configure this via the `CRON_DELETE_OLD_CONNECTIONS_MAX_DAYS` environment variable. - -## Free self-hosting - -A limited free self-hosting option is available for hobby projects. It is intended for lightweight deployments that need Auth and Proxy, without the managed features and support included with Enterprise self-hosting or Nango Cloud. - -For more details, see the [pricing page](https://nango.dev/pricing) or [schedule a call](https://nango.dev/demo) to discuss the Enterprise self-hosted version. - -### Feature availability - -| Feature | Free self-hosted | Enterprise self-hosted / Nango Cloud | -| --- | --- | --- | -| Auth | Yes | Yes | -| Proxy | Yes | Yes | -| Observability | Auth + proxy only | Full | -| OpenTelemetry export | No | Yes | -| Functions | No | Yes | -| Webhooks | No | Yes | -| MCP server | No | Yes | -| Customize auth branding | No | Yes | -| Role-based permissions | No | Yes | -| SAML SSO | No | On the roadmap | -| Support SLA | No | Yes | - -### Server URL, callback URL, and custom domains - -Add server environment variables for the instance URL and port in the `.env` file or directly in your hosting provider: - -```sh -NANGO_SERVER_URL= -SERVER_PORT= -``` - -The resulting OAuth callback URL is `/oauth/callback`. - -You can customize the callback URL by updating the "Callback URL" field in the "Environment Settings" tab in the Nango admin. - - -If you are using a custom domain, update `NANGO_SERVER_URL` to match it. - - -### Connect UI - -Nango Connect is available for self-hosted deployments in the main Docker image. - -```sh -FLAG_SERVE_CONNECT_UI=true -NANGO_CONNECT_UI_PORT=3009 -NANGO_PUBLIC_CONNECT_URL= -``` - -Nango Connect is available by default at `http://localhost:3009`. - - -If you are using a custom domain, update `NANGO_PUBLIC_CONNECT_URL` to match it. - - -See [Auth](/guides/auth/auth-guide) for the end-user connection flow. - -### Persistent storage - -If you deploy with Docker Compose, the bundled database uses local container storage. This is not appropriate for production. - -Connect Nango to an external Postgres database by setting the database environment variables: - -```sh -NANGO_DB_USER= -NANGO_DB_PASSWORD= -NANGO_DB_HOST= -NANGO_DB_PORT= -NANGO_DB_NAME= -NANGO_DB_SSL=true -``` - -You can also use a database URL: - -```sh -NANGO_DATABASE_URL=postgresql://user:password@host:port/dbname -``` - -Special characters in `NANGO_DATABASE_URL` must be URL encoded. - - -Nango is incompatible with connection poolers using `pool_mode=transaction`. Use a direct database connection or configure the pooler to use a different mode. - - -Records saved by sync functions can be persisted in a dedicated database. To use a dedicated records database, set `RECORDS_DATABASE_URL`: - -```sh -RECORDS_DATABASE_URL=postgresql://user:password@host:port/dbname -``` - -Special characters in `RECORDS_DATABASE_URL` must be URL encoded. If it is not specified, records are stored in the main database. - - -Deploying with Render or Heroku automatically generates a persistent database connected to your Nango instance. - - -### External Redis - -The bundled Redis is fine for local use but not for production. Connect Nango to an external Redis (or Valkey) with either a full URL or discrete variables: - -```sh -NANGO_REDIS_URL=rediss://:@: -# or -NANGO_REDIS_HOST= -NANGO_REDIS_PORT= -NANGO_REDIS_AUTH= -``` - -Use the `rediss://` scheme (or discrete variables, which default to TLS) to enable in-transit encryption. - -#### IAM / short-lived token authentication - -Managed Redis with IAM authentication (for example GCP Memorystore for Valkey) uses a short-lived token as the password and requires the token to be refreshed before it expires. Instead of a static `NANGO_REDIS_AUTH`, point Nango at a file that an external process (such as a sidecar) keeps up to date: - -```sh -NANGO_REDIS_HOST= -NANGO_REDIS_PORT= -NANGO_REDIS_AUTH_TOKEN_FILE=/path/to/token # re-read on every (re)connect -NANGO_REDIS_USERNAME= # optional; defaults to "default" -``` - -Nango reads the token file on every connection and reconnection, so a rotated token is always picked up without a restart. This is cloud-agnostic: anything that writes the current token to the file works. The writer must update the file atomically β€” write a temporary file and `rename()` it into place β€” so a reconnect never reads a half-written token and fails authentication. When `NANGO_REDIS_AUTH_TOKEN_FILE` is set, do not embed credentials in `NANGO_REDIS_URL`. - -The runner boundary has the same set of variables prefixed with `NANGO_CUSTOMER_REDIS_` (for example `NANGO_CUSTOMER_REDIS_AUTH_TOKEN_FILE`); it falls back to the system Redis when unset. - -### Securing your instance - -#### Proxy base URL override hardening - -The [proxy](/guides/platform/proxy-requests) can send authenticated requests to external APIs. Some proxy calls accept a **base URL override** (HTTP header `Base-Url-Override`, SDK `baseUrlOverride`, or an integration `custom.baseUrl`) to target a host that differs from the provider's default API base URL. - -Because the proxy makes outbound HTTP requests from your Nango server (and from the runner for sync and action scripts), a caller with permission to use the proxy could use an override to reach hosts that were not meant to be exposedβ€”such as cloud metadata services or `localhost` on the host making the request. This is a classic **SSRF** risk. - -By default, Nango keeps base URL override **enabled** and blocks override targets and redirect hops whose hostnames match a built-in denylist (cloud metadata and loopback addresses). Configure these environment variables and restart the **server** and **runners** after changes: - -```sh -NANGO_PROXY_BASE_URL_OVERRIDE_ENABLED=true -NANGO_PROXY_BASE_URL_OVERRIDE_DENYLIST='["169.254.169.254","metadata.google.internal","localhost","127.0.0.1","[::1]"]' -``` - -| Variable | Default | Purpose | -| - | - | - | -| `NANGO_PROXY_BASE_URL_OVERRIDE_ENABLED` | `true` | Set to `false` to reject all base URL overrides | -| `NANGO_PROXY_BASE_URL_OVERRIDE_DENYLIST` | Secure defaults when unset | JSON array of hostnames or URLs to block; custom entries are merged with defaults | -| `NANGO_OUTBOUND_URL_POLICY` | Secure defaults when unset | JSON object controlling SSRF protection for proxy, customer webhooks, and `uncontrolledFetch` | - -**Operator guidance:** - -- **Production:** keep the default denylist. Add environment-specific hosts if your deployment exposes additional internal endpoints. -- **Legitimate localhost overrides (dev only):** set `NANGO_PROXY_BASE_URL_OVERRIDE_DENYLIST='[]'` to restore fail-open behavior. -- **No overrides at all:** set `NANGO_PROXY_BASE_URL_OVERRIDE_ENABLED=false`. - -Denylist matching is hostname-based and applies to redirect hops as well as the initial override target. - -#### Outbound URL policy (DNS rebinding, private IPs, redirects) - -Beyond the hostname denylist, Nango routes every outbound connection on the **proxy**, **customer webhook delivery**, and **`uncontrolledFetch`** paths through DNS-pinning agents that re-validate the *resolved* IP address β€” closing DNS-rebinding and redirect-to-internal-address SSRF holes. The behavior is controlled by `NANGO_OUTBOUND_URL_POLICY`, a JSON object (applied on top of the denylist). It propagates automatically to runners. - -The `mode` field selects how hostnames are filtered: - -- **`denylist`** (default): every destination is reachable except hostnames on the denylist (plus the IP-based protections below). This is the out-of-the-box mode, since the denylist always carries the secure defaults. -- **`allowlist`**: only hostnames in `allowlist` are reachable (a leading `.` matches subdomains); everything else is rejected. The denylist and the IP-based protections still apply on top, so allowlist is strictly *more* restrictive β€” a listed hostname that resolves to a blocked IP is still rejected. -- **`permissive`**: no hostname-based filtering (the IP-based protections below still apply). You only reach this mode deliberately β€” either by emptying the server denylist with no explicit mode (see below), or by setting `mode: "permissive"`. - - -The IP-based protections apply in **every** mode, including `permissive`. Loopback (`127.0.0.0/8`, `::1`) and unspecified addresses are **always** blocked; private/RFC1918/CGNAT addresses (`blockPrivateIps`) and link-local addresses β€” including the cloud-metadata IP `169.254.169.254` (`blockLinkLocal`) β€” are blocked by default. - -The denylist is **never empty by default** β€” it is always seeded with the secure defaults (`localhost`, `metadata.google.internal`, `169.254.169.254`, …). It only becomes empty if you explicitly opt out: either `NANGO_PROXY_BASE_URL_OVERRIDE_DENYLIST='[]'` (server only, which then selects `permissive`) or `mode: "permissive"`. Even then, only hostname string matches such as `localhost` are dropped β€” literal or resolved internal IPs stay blocked unless you also set `blockPrivateIps`/`blockLinkLocal` to `false`. Runners re-apply the secure denylist defaults even when the server has emptied its denylist; note an explicit `mode: "permissive"` empties the denylist everywhere, runners included. - - -```sh -# Block private/link-local IPs (default) and cap redirects at 3 -NANGO_OUTBOUND_URL_POLICY='{"blockPrivateIps":true,"blockLinkLocal":true,"maxRedirects":3}' - -# Allowlist mode: only the listed hostnames (and their subdomains) are reachable -NANGO_OUTBOUND_URL_POLICY='{"mode":"allowlist","allowlist":[".hubspot.com","api.github.com"]}' -``` - -| Field | Default | Purpose | -| - | - | - | -| `mode` | `denylist` (auto-`permissive` only if you empty the denylist) | `denylist`, `allowlist`, or `permissive` (see above) | -| `allowlist` | `[]` | In `allowlist` mode, hostnames (a leading `.` matches subdomains) that may be reached | -| `blockPrivateIps` | `true` | Block RFC1918 / CGNAT addresses (all modes) | -| `blockLinkLocal` | `true` | Block link-local addresses incl. `169.254.169.254` (all modes) | -| `maxRedirects` | `5` | Maximum redirect hops followed | - -Each resolved address (including on every redirect hop) is validated; in `allowlist` mode, only listed hostnames are reachable regardless of IP. - -#### Securing the dashboard - -By default, the dashboard of your Nango instance is open to anyone who can access your instance URL. - -You can secure it with Basic Auth by setting the following environment variables and restarting the server: - -```bash -FLAG_AUTH_ENABLED=false -NANGO_DASHBOARD_USERNAME= -NANGO_DASHBOARD_PASSWORD= -``` - -#### Encrypting sensitive data - -You can enforce encryption of sensitive data, including tokens, secret keys, and app secrets, by setting a 256-bit base64-encoded key: - -```sh -openssl rand -base64 32 -``` - -Set the generated value as `NANGO_ENCRYPTION_KEY`: - -```sh -NANGO_ENCRYPTION_KEY= -``` - -After you restart the Nango server, database encryption happens automatically. The encryption key cannot currently be modified after it is set. - - -`NANGO_ENCRYPTION_KEY` is also required for Connect UI. It is used to generate sessions for [Connect UI](/reference/frontend/frontend-sdk#connect-using-nango-connect-ui). Without this key, Connect UI will not work. - - -#### Custom websockets path - -The Nango server serves websockets from `/` by default for use by `@nangohq/frontend` during the login flow. - -To isolate websockets from the dashboard, set `NANGO_SERVER_WEBSOCKETS_PATH`: - -```sh -NANGO_SERVER_WEBSOCKETS_PATH= -``` - -If you set a custom path, configure `websocketsPath` when initializing the `Nango` object in the `@nangohq/frontend` SDK: - -```js -import Nango from '@nangohq/frontend'; - -let nango = new Nango({ host: 'https://', websocketsPath: '' }); -``` - -### Telemetry - -Self-hosted instances do not automatically send telemetry back to Nango. Operational metrics and logs stay within your own infrastructure and are only exported if you configure the OpenTelemetry Export add-on described above. - -### Logs - -Nango stores execution logs and powers the logs UI with either Elasticsearch or OpenSearch. To keep free self-hosted deployments lighter, this stack is optional. - -To enable logs: - -- Host an Elasticsearch or OpenSearch cluster. -- Set `NANGO_LOGS_ENABLED=true`. -- Configure the relevant `NANGO_LOGS_ES_*` environment variables (these apply to both providers). - -Nango uses Elasticsearch by default. To use OpenSearch instead, set: - -```sh -NANGO_LOGS_PROVIDER=opensearch -``` - -Elasticsearch hosting options include: - -- Local: uncomment the service in [`docker-compose.yaml`](https://github.com/NangoHQ/nango/blob/master/docker-compose.yaml#L63) and run `docker-compose up`. -- Elastic Cloud: use [elastic.co](https://www.elastic.co/). -- Render: deploy an Elasticsearch instance with [Render](https://docs.render.com/deploy-elasticsearch). - -If `NANGO_LOGS_ENABLED` is `false`, logs are sent to stdout and can be viewed in your host logs. - -### Run and update Nango - -To install Nango on a VM: - -```bash -mkdir nango && cd nango -wget https://raw.githubusercontent.com/NangoHQ/nango/master/docker-compose.yaml -docker-compose up -d -``` - -To update Nango: - -```bash -docker-compose stop -docker-compose rm -f -docker-compose pull -docker-compose up -d -``` - - -If you are interested in the Enterprise self-hosting version, please get in touch with us in the [community](https://nango.dev/slack) or [book a demo](https://nango.dev/demo). - - -## Related guides - -- [Security](/guides/platform/security) - review data, encryption, and access controls. -- [Environments](/guides/platform/environments) - organize dev, staging, and production setups. -- [Changelog](/updates/changelog) - track changes that affect self-hosted upgrades. +```js +nango + .auth('') + .then((result) => { + // Show success UI. + }) + .catch((error) => { + // Show failure UI. + }); +``` -## Proxy Requests + -Source: https://nango.dev/docs/guides/platform/proxy-requests.md + ---- -title: 'Proxy requests' -sidebarTitle: 'Proxy requests' -description: 'How to use the requests proxy from Nango' ---- - -Use the requests proxy to make authenticated API requests to the external API. - -## How to use the proxy - -Make sure you have an [integration configured](/guides/auth/auth-guide#guide) in your environment, and at least one [connection](/guides/auth/auth-guide#overview) available for it. - -You can use the proxy with the [Node SDK](/reference/backend/backend-sdk/node#proxy) or [REST API](/reference/backend/http-api/proxy/get): - - - - ```typescript - try { - const res = await nango.proxy({ - method: 'POST', - baseUrlOverride: 'https://api.example.com', - endpoint: '/external-endpoint', - providerConfigKey: '', - connectionId: '', - retries: 5, // Retries with exponential backoff (optional, default 0) - data: { - id: 1, - colorId: 'blue', - selected: true - } - }); - - // Response was 200! - // See https://axios-http.com/docs/res_schema - console.log(res.data); - } catch (error) { - // Status of response != 200 - // See https://axios-http.com/docs/handling_errors - console.log(error.response.data); - console.log(error.response.status); - console.log(error.response.headers); - } - ``` - - - - ```bash - curl -X POST -H 'Content-Type: application/json' \ - -H 'Authorization: Bearer ' \ - -H 'Provider-Config-Key: ' \ - -H 'Connection-Id: ' \ - -d '{"colorId: "blue"}' \ - 'https://api.nango.dev/proxy/' - ``` - - - -## Related guides - -- [Auth guide](/guides/auth/auth-guide) - create the connection used by proxy requests. -- [Node SDK reference](/reference/backend/backend-sdk/node#proxy) - proxy helper methods. -- [Proxy API reference](/reference/backend/http-api/proxy/get) - REST endpoints for proxied requests. -- [Rate limits](/guides/functions/rate-limits) - handle provider throttling. +For API key auth, collect the API key in your own UI, then pass it to Nango. -## Receive webhooks from Nango +```js +nango + .auth('', { + credentials: { + apiKey: '' + } + }) + .then((result) => { + // Show success UI. + }) + .catch((error) => { + // Show failure UI. + }); +``` -Source: https://nango.dev/docs/guides/platform/webhooks-from-nango.md -Description: Reference for the webhooks Nango sends to your app β€” setup, types, payloads, signature verification, and retries. + -Nango POSTs webhooks to your app to notify it of important events: a new connection was created, a sync run finished, an async action completed, or an external webhook was forwarded. This page covers how to receive and verify webhooks from Nango, plus the payloads for auth, sync, and async action webhooks. + - -To process webhooks coming **from external APIs** (not from Nango), see [Process external webhooks](/getting-started/use-cases/webhooks-from-external-apis). To forward external API webhooks through Nango to your app, see [Webhook forwarding](/guides/platform/webhook-forwarding). - +For Basic Auth, collect the username and password in your own UI, then pass them to Nango. -## Set up webhooks from Nango +```js +nango + .auth('', { + credentials: { + username: '', + password: '' + } + }) + .then((result) => { + // Show success UI. + }) + .catch((error) => { + // Show failure UI. + }); +``` + - - Webhook settings in Nango are specific to each [environment](/guides/platform/environments). - + -To subscribe to Nango webhooks: +## Pass connection configuration -1. Set up a `POST` endpoint in your app to receive the Nango webhooks -2. Input the endpoint's URL in your _Environment Settings_, under _Webhook URLs_ ([direct link for your dev environment](https://app.nango.dev/dev/environment-settings#notification)) -3. Implement [verify incoming webhooks](#verifying-webhooks-from-nango) to ensure sure only authentic Nango webhooks are processed -4. Implement processing logic for each [webhook type](#types-of-nango-webhooks) from Nango you want to handle - - Make sure your processing logic handles the webhooks you have enabled in the environment settings +Some APIs require connection-specific configuration to authorize or make API requests later. Zendesk is a common example: the OAuth authorization URL includes the user's Zendesk subdomain: -You can configure up to two webhook URLs per environment. Nango webhooks will be sent to both. A single connection can [override these with its own URL](#override-webhook-urls-per-connection). +`https://.zendesk.com/oauth/authorizations/new` -To test webhooks locally, use a webhook forwarding service like [ngrok](https://dev.to/mmascioni/testing-and-debugging-webhooks-with-ngrok-4alp), or [webhook.site](https://webhook.site/). +With Connect UI, Nango asks for this value in an automatically generated form. With headless auth, collect it in your own UI and pass it as `params`: -## Override webhook URLs per connection +```js +nango.auth('zendesk', { + params: { subdomain: '' } +}); +``` -A single connection can override the environment's webhook URLs with its own `webhook_url`. The connection still receives all the same [webhook types](#types-of-nango-webhooks), with the same signing, retries, and logs. +You can also set default connection configuration when you create the Connect session. This is useful when your backend already knows a required value: -When a connection sets `webhook_url`, its webhooks are sent **only** to that URL β€” the environment's primary and secondary webhook URLs are both bypassed for that connection. It does not add a third destination. + -Set `webhook_url` when creating a [connect session](/reference/backend/http-api/connect/sessions/create), under `integrations_config_defaults..connection_config`: + - - - ```ts - const session = await nango.createConnectSession({ - allowed_integrations: [''], - integrations_config_defaults: { - '': { - connection_config: { - webhook_url: 'https://.ngrok.app/webhooks-from-nango' - } +```js +const { data } = await nango.createConnectSession({ + allowed_integrations: [''], + integrations_config_defaults: { + '': { + connection_config: { + '': '' } } - }); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/connect/sessions \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "allowed_integrations": [""], - "integrations_config_defaults": { - "": { - "connection_config": { - "webhook_url": "https://.ngrok.app/webhooks-from-nango" - } - } + } +}); +``` + + + + +```bash +curl --request POST \ + --url https://api.nango.dev/connect/sessions \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "allowed_integrations": [""], + "integrations_config_defaults": { + "": { + "connection_config": { + "": "" } - }' - ``` - + } + } + }' +``` + + -You can also set `webhook_url` from the **Create connection** flow in the Nango dashboard, under the connection's advanced configuration. +In some cases, you might want to override scopes at the connection level. Pass the scopes to `nango.auth()`: - - `webhook_url` can only be set at connect-session creation time β€” the trusted actor that creates the session. The same key passed to `nango.auth()` `params` from the client is ignored. - +```js +nango.auth('', { + params: { oauth_scopes_override: 'custom-connection-scope' } +}); +``` + +Nango stores this connection configuration on the connection. You can retrieve it with the SDK ([reference](/reference/backend/backend-sdk/node#get-a-connection-with-credentials)) or API ([reference](/reference/backend/http-api/connections/get)), or see it in connection details in the Nango UI. + +## Next + +Once authorization succeeds, [_save the connection ID_](/guides/auth/auth-guide#guide). - **Local development:** create a connection with `webhook_url` pointing at your local webhook endpoint (for example via [ngrok](https://ngrok.com/) or [webhook.site](https://webhook.site/)) to receive that connection's webhooks on your machine β€” without changing the shared environment webhook URLs. See [Engineering collaboration](/guides/platform/environments#engineering-collaboration) for the shared-environment workflow. + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). -## Verifying webhooks from Nango +## Related guides -Validate webhooks from Nango by looking at the `X-Nango-Hmac-Sha256` header. +- [Auth guide](/guides/auth/auth-guide) - compare the managed Connect UI flow. +- [Frontend SDK reference](/reference/frontend/frontend-sdk#connect-using-the-headless-client) - headless authorization methods and parameters. +- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - understand connection-level storage. -It's an HMAC-SHA256 hash of the webhook payload, using the webhook signing key found in **Environment Settings > Webhooks > Signing key** in the Nango UI. +## Token Refreshing - -Nango webhook requests include an `X-Nango-Hmac-Sha256` header for secure verification. A legacy `X-Nango-Signature` header (using plain SHA-256) is also sent for backwards compatibility but should not be used. If you're currently using `X-Nango-Signature`, migrate to `X-Nango-Hmac-Sha256` for improved security. - +Source: https://nango.dev/docs/guides/auth/token-refreshing.md -The webhook signature can be verified with the following code: +--- +title: "Token refreshing & validity" +sidebarTitle: "Token refreshing & validity" +description: "How Nango handles OAuth token refresh and what to do when tokens are revoked." +--- - -Verify the signature with the **webhook signing key** from **Environment Settings > Webhooks > Signing key** β€” not your API secret key. These are two distinct keys. With the Node SDK, pass it as `webhookSigningKey`; for raw HMAC verification, use it as the HMAC secret. Using the API secret key will cause verification to fail on any environment where the keys differ. - +## Automatic token refresh - - - Pass the webhook signing key as `webhookSigningKey` so a single client can make API calls with the API key and verify webhooks with the signing key. `webhookSigningKey` falls back to `secretKey` when omitted. +Nango automatically refreshes OAuth access tokens before they expire. You don't need to implement any refresh logic in your application. - ```typescript - const nango = new Nango({ - apiKey: process.env.NANGO_API_KEY, // used for API calls - webhookSigningKey: process.env.NANGO_WEBHOOK_SIGNING_KEY // used to verify webhooks - }); +To prevent token revocation due to inactivity (some APIs revoke unused refresh tokens), Nango refreshes each access token at least once every 24 hours. - async (req, res) => { - const isValid = nango.verifyIncomingWebhookRequest(req.body, req.headers); - } - ``` - - - ```typescript - import crypto from 'crypto'; +## Handling refresh failures - // From Environment Settings > Webhooks > Signing key - const webhookSigningKey = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'; - const body = // raw request body as string - const hash = crypto.createHmac('sha256', webhookSigningKey).update(body).digest('hex'); - ``` - - - ```python - import hmac - import hashlib +Token refresh can fail for various reasons: +- The user revoked access in the external application +- The external API revoked the refresh token +- The external API experienced an outage - # From Environment Settings > Webhooks > Signing key - webhook_signing_key = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' - body = # raw request body as bytes - hash = hmac.new(webhook_signing_key.encode('utf-8'), body, hashlib.sha256).hexdigest() - ``` - - - ```java - import javax.crypto.Mac; - import javax.crypto.spec.SecretKeySpec; - import java.nio.charset.StandardCharsets; +When a refresh fails, Nango can [notify your app via webhook](/guides/platform/webhooks-from-nango) so you can prompt the user to reconnect. - public class Main { - public static void main(String[] args) throws Exception { - // From Environment Settings > Webhooks > Signing key - String webhookSigningKey = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; - String body = // raw request body as string +## Best practices - Mac mac = Mac.getInstance("HmacSHA256"); - SecretKeySpec secretKey = new SecretKeySpec(webhookSigningKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); - mac.init(secretKey); - byte[] hashBytes = mac.doFinal(body.getBytes(StandardCharsets.UTF_8)); +Revoked access tokens and refresh failures happen to all integrations. To handle them gracefully: - StringBuilder hexString = new StringBuilder(); - for (byte b : hashBytes) { - hexString.append(String.format("%02x", b)); - } - String hash = hexString.toString(); - } - } - ``` - - - ```ruby - require 'openssl' +1. **Monitor for failures**: Set up [webhooks from Nango](/guides/platform/webhooks-from-nango) to receive notifications when token refresh fails +2. **Handle revoked tokens**: Follow our [guide on handling revoked access tokens](/guides/platform/common-issues#token-refresh-error-from-the-external-api) +3. **Implement re-authorization**: Make sure you have the [re-authorization flow](/guides/auth/auth-guide#re-authorize-an-existing-connection) in place so users can easily reconnect broken connections - # From Environment Settings > Webhooks > Signing key - webhook_signing_key = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' - body = # raw request body - hash = OpenSSL::HMAC.hexdigest('SHA256', webhook_signing_key, body) - ``` - - - ```go - package main +## Related guides - import ( - "crypto/hmac" - "crypto/sha256" - "encoding/hex" - "io" - "net/http" - ) +- [Auth guide](/guides/auth/auth-guide#re-authorize-an-existing-connection) - implement reconnect sessions for invalid credentials. +- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - receive refresh failure notifications. +- [Common issues](/guides/platform/common-issues#token-refresh-error-from-the-external-api) - troubleshoot revoked tokens. - func main() { - // From Environment Settings > Webhooks > Signing key - webhookSigningKey := "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" - var body []byte // raw request body + +**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + - h := hmac.New(sha256.New, []byte(webhookSigningKey)) - h.Write(body) - hash := hex.EncodeToString(h.Sum(nil)) - } - ``` - - - ```rust - use hmac::{Hmac, Mac}; - use sha2::Sha256; +## Functions guide - type HmacSha256 = Hmac; +Source: https://nango.dev/docs/guides/functions/functions-guide.md +Description: Understand Nango Functions and choose the right way to start using them. - // From Environment Settings > Webhooks > Signing key - let webhook_signing_key = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; - let body = // raw request body as string or bytes - let mut mac = HmacSha256::new_from_slice(webhook_signing_key.as_bytes()).unwrap(); - mac.update(body.as_bytes()); - let hash = format!("{:x}", mac.finalize().into_bytes()); - ``` - - - ```php - Webhooks > Signing key - $webhookSigningKey = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'; - $body = // raw request body as string - $hash = hash_hmac('sha256', $body, $webhookSigningKey); - ?> - ``` - - +## Overview -Only accept a webhook if the `X-Nango-Hmac-Sha256` header value matches the webhook signature. +**Functions** are Nango's runtime for custom integration logic. -## Types of Nango webhooks +When you build integrations directly, every provider forces you to solve the same hard problems: OAuth credentials, token refresh, per-customer permissions, retries, rate limits, data freshness, observability, and safe execution. Nango handles that infrastructure, and functions let you write the provider-specific logic that is unique to your product. - - New Nango webhook types are added regularly, without considering this a breaking change. Your webhook handling logic should gracefully support receiving new types of webhooks by simply ignoring them. - +You write functions in TypeScript and deploy them to Nango. Your app can call them from any language, framework, backend job, or agent workflow. Each execution runs for a specific integration and connection, so the function has scoped access to the right customer's credentials without exposing those credentials to your app or agent. -All webhooks from Nango are POST requests. +## How functions fit -The exact webhook type definitions can be found [here](https://github.com/NangoHQ/nango/blob/master/packages/types/lib/webhooks/api.ts). +1. Your user authorizes an external API through [Nango Auth](/guides/auth/auth-guide). +2. Your app stores the resulting `connectionId`. +3. You enable or deploy functions for the integration. +4. Nango runs the function on demand, on a schedule, from an external webhook, or after a connection lifecycle event. +5. Your app receives the function result, sync records, or webhooks from Nango. -### Auth webhooks +Functions are the right layer when you need custom API logic, data syncing, webhook processing, AI tools, or per-customer integration behavior. -New connection webhooks have `"type": "auth"` and `"operation": "creation"`. They are sent after a connection has been successfully created. +## Capabilities -Payload received following a connection creation: +- **Scoped external API access** β€” run API calls with the credentials and scopes of one connection. +- **Any app stack** β€” trigger functions through HTTP APIs or SDKs from any backend language. +- **Multiple trigger types** β€” call functions on demand, run them on a schedule, route external webhooks into them, or react to connection lifecycle events. +- **Agent-ready tools** β€” expose selected functions to agents through the API or Nango's MCP server while keeping provider credentials out of the model loop. +- **Built-in integration infrastructure** β€” retries, rate-limit handling, logs, OpenTelemetry export, records storage, checkpoints, and per-connection metadata. +- **Flexible development workflows** β€” enable a template, build headlessly through the Functions API, or keep function code in a local CLI project. -```json -{ - "type": "auth", - "operation": "creation", - "connectionId": "", - "authMode": "OAUTH2 | BASIC | API_KEY | ...", - "providerConfigKey": "", - "provider": "", - "environment": "DEV | PROD | ...", - "success": true, - "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "" - } -} -``` - - - Processing webhooks with `"type": "auth"` and `"operation": "creation"` is **necessary**. After a connection is created, these webhooks give you the generated connection ID which lets you access the connection later on. - - Use `tags` to reconcile and save the connection ID with the user/org/workspace that initiated the connection. - + +## Guide -All `authMode` values can be found [here](https://github.com/NangoHQ/nango/blob/master/packages/types/lib/auth/api.ts). The `authMode` value depends on the `provider` value. +### Ways to enable functions -All `operation` values are: +There are three ways to enable or develop Nango functions. Start with the path that matches how much control and dynamism you need. -- `creation`: a new connection has been created -- `override`: a connection has been re-authorized -- `refresh`: an OAuth connection's access token has failed to refresh +| Path | Best for | How it works | +| --- | --- | --- | +| [Option 1: Use function templates](#use-function-templates) | Getting started quickly when Nango already has the provider operation in the catalog. | Enable a pre-built function on an integration, then call it from your app, backend job, or agent workflow. | +| [Option 2: Build locally with the CLI](#build-locally-with-the-cli) | Serious production use cases where you want reviewable diffs, tests, CI/CD, and source control. | Write TypeScript functions in your repo, dry run them against real connections, and deploy with the Nango CLI. | +| [Option 3: Build with the Functions API](#build-with-the-functions-api) | Prototypes, provider operations not covered by templates, and just-in-time integrations where an agent creates behavior dynamically. | Send generated TypeScript source to Nango, compile it, dry run it, and deploy it without a local functions project. | -Payload received following a refresh token error: + + + +### Option 1: Use function templates -```json -{ - "type": "auth", - "operation": "refresh", - "connectionId": "", - "authMode": "OAUTH2 | BASIC | API_KEY | ...", - "providerConfigKey": "", - "provider": "", - "environment": "DEV | PROD | ...", - "success": false, - "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "" - }, - "error": { - "type": "", - "description": "" - } -} -``` +Function templates are pre-built Nango functions for common provider operations. Use them when the catalog already covers what you need and you want the shortest path to a working integration. - - Webhooks are only sent for certain connection creation errors. For example, during the OAuth flow, some errors are reported locally in the OAuth modal by the external API. Since Nango does not receive these errors, it cannot trigger a webhook for them. - +You can find templates in the [template catalog](https://www.nango.dev/templates), in the integration page of the Nango dashboard, and in the [Nango integration templates repository](https://github.com/NangoHQ/integration-templates). -### Sync webhooks +When a template matches your use case, enable it on the integration and call it from your app. If it is close but not exact, [pull it into a local functions project and customize it](#extend-a-template). -Sync webhooks are sent when a [sync function](/guides/functions/syncs/sync-functions) execution finishes, whether successful or not. + +#### Extend a template -Payload received following a successful sync execution: +Use the CLI to pull a template's code into your local functions project from the public catalog: -```json -{ - "type": "sync", - "connectionId": "", - "providerConfigKey": "", - "syncName": "", - "model": "", - "syncType": "INCREMENTAL | INITIAL | WEBHOOK", // DEPRECATED β€” use checkpoints instead - "success": true, - "modifiedAfter": "", - "responseResults": { - "added": number, - "updated": number, - "deleted": number - }, - // checkpoints itself may be missing or null if the sync doesn't use checkpoints β€” - // always guard against that before reading `from`/`to`. - "checkpoints": { - "from": { "": "" }, // or null if no prior checkpoint - "to": { "": "" } // or null if the sync didn't save one - } -} +```bash +nango pull github list-repos --catalog ``` -`modifiedAfter` is an ISO-8601 timestamp marking the start of the last run. To read the changed records, use cursor-based fetching as described in [Records cache β†’ Cursors and sync progress](/guides/functions/syncs/records-cache#cursors-and-sync-progress). +`nango pull` writes a single function and its dependencies. After pulling, review the source and schemas, import the function from `index.ts` if needed, adjust inputs, outputs, record models, metadata, or provider mapping logic, then run `nango dryrun` and deploy with `nango deploy`. -**Distinguishing full vs incremental syncs:** use `checkpoints` instead of the deprecated `syncType` field. `checkpoints.from`/`checkpoints.to` are checkpoint objects (`Record`) as saved by the sync function via `saveCheckpoint()` β€” not strings β€” and either can be `null`. The `checkpoints` field itself can also be missing or `null`, so guard against that before reading nested fields: + + Pull template code when you need custom fields, a smaller output shape, customer-specific filtering, different retry behavior, or a provider workflow that is close to a template function but not identical. + -```javascript -const { checkpoints } = payload; -const isFullSync = !checkpoints || checkpoints.from === null; -``` + +### Option 2: Build locally with the CLI -- `checkpoints` is missing/`null`, or `checkpoints.from === null` β€” the run started with no prior state. This happens on the first run, after a manual reset, or when the sync explicitly cleared its checkpoint. Treat this as a full sync and overwrite your data. -- `checkpoints.from` is a non-null checkpoint object β€” the run continued from a previously saved checkpoint. This is an incremental sync; merge the new records into your existing data. -- **Webhook-triggered runs** (deprecated `syncType: "WEBHOOK"`): always treat these as incremental merges, regardless of `checkpoints.from`. A webhook-triggered run processes a single incoming external event on top of already-synced data β€” it never represents a full resync. +Local development is the default path for production integrations. Use it when your engineering team wants function code in source control, reviewable diffs, local tests, CI/CD, and a stable project layout. - -**Fetch records promptly**: Due to Nango's [data retention policies](/guides/platform/security#synced-records-retention), you should fetch and store synced records in your own system promptly after receiving webhook notifications. Records not updated for 30 days will have their payload pruned, and sync functions not executed for 60 days will have all records deleted. - +
+ +
-By default, Nango sends a webhook even if no modified data was detected in the last sync execution (referred as an "empty" sync), but this is configurable in your _Environment Settings_. In case of an empty sync, the `responseResults` would be: -```json -{ - "added": 0, - "updated": 0, - "deleted": 0 -} -``` + + + Install the Nango CLI globally: -Payload received following a failed sync execution: + ```bash + npm install -g nango + ``` -```json -{ - "type": "sync", - "connectionId": "", - "providerConfigKey": "", - "syncName": "", - "model": "", - "syncType": "INCREMENTAL | INITIAL | WEBHOOK", // DEPRECATED β€” use checkpoints instead - "success": false, - "error": { - "type": "", - "description": "" - }, - "startedAt": "", - "failedAt": "", - // checkpoints itself may be missing or null β€” see the note above. - "checkpoints": { - "from": { "": "" }, // or null - "to": { "": "" } // or null - } -} -``` + Initialize your integrations folder at the root of your repo and commit it to source control: -### External webhook forwarding + ```bash + nango init nango-integrations + ``` -Forwarded external webhooks use the same webhook URLs, signing, retries, and logs as other Nango webhooks. See [Webhook forwarding](/guides/platform/webhook-forwarding) for setup, routing behavior, and payload shapes. + This creates a `nango-integrations/` folder with example configuration. The `.nango` subdirectory must be committed because the CLI uses it to track deployed state. + -## Webhook retries & debugging + + Add your [API keys](/reference/backend/http-api/api-keys) to a `.env` file inside `nango-integrations/`. The CLI currently reads these API keys from `NANGO_SECRET_KEY_` variables: -Nango retries each webhook with non-2xx responses 2 times with exponential backoff (starting delay: 100ms, time multiple: 2, view details in the [code](https://github.com/NangoHQ/nango/blob/master/packages/webhooks/lib/utils.ts)). + ```bash + NANGO_SECRET_KEY_PROD='' + NANGO_SECRET_KEY_DEV='' + ``` -Webhooks time out after 20 seconds. + Get your [API keys](/reference/backend/http-api/api-keys) from **Environment Settings > API Keys**. Despite the variable name, each value stores a [Nango API key](/reference/backend/http-api/api-keys). The CLI picks up the matching key for whichever environment you deploy to. -Each webhook attempt is logged in Nango's [logs](/guides/platform/observability). + `nango init` creates `nango-integrations/.gitignore` with `.env` ignored. Keep the `.env` file untracked so [Nango API keys](/reference/backend/http-api/api-keys) are not committed. -You can also use the [OpenTelemetry exporter](/guides/platform/observability#opentelemetry-export) to monitor Nango webhooks in your own observability stack. + + Keys are matched by environment name: `NANGO_SECRET_KEY_`. If you rename an environment in the UI, update the variable name in `.env` to match. - - **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - + For example, an environment named `staging` needs: -## Related guides + ```bash + NANGO_SECRET_KEY_STAGING='' + ``` + -- [Webhook forwarding](/guides/platform/webhook-forwarding) - forward external provider webhooks through Nango. -- [Webhook functions](/guides/functions/webhook-functions) - process provider webhooks inside Nango. -- [Event functions](/guides/functions/event-functions) - react to connection lifecycle events. -- [Observability](/guides/platform/observability) - monitor webhook operations and retries. + + Use a shared environment (usually `dev`) for day-to-day collaboration. Create personal test connections with [per-connection webhook URL overrides](/guides/platform/webhooks-from-nango#override-webhook-urls-per-connection) pointing at your local webhook endpoint, and deploy functions granularly (`nango deploy --sync` / `--action` / `--integration`) so teammates don't overwrite each other. See [Engineering collaboration](/guides/platform/environments#engineering-collaboration). + Use CI to do full deploys across stable environments (like `staging` or `prod`). See the [CI/CD guide](/guides/functions/ci-cd). + -## Webhook Forwarding + + Run `nango init nango-integrations` to scaffold the folder. Ask the user for their [Nango API key](/reference/backend/http-api/api-keys) from **Environment Settings > API Keys** and write it to the matching `NANGO_SECRET_KEY_` variable in `nango-integrations/.env`. Confirm that `nango-integrations/.gitignore` ignores `.env`. -Source: https://nango.dev/docs/guides/platform/webhook-forwarding.md + For additional context while building, add Nango's documentation MCP server (`https://nango.dev/docs/mcp`) and install the local builder skill: ---- -title: 'External webhook forwarding' -sidebarTitle: 'External webhook forwarding' -description: 'Forward external API webhooks through Nango to your app, with connection attribution.' ---- - -Webhook forwarding lets Nango receive webhooks from external APIs and forward them to your app's webhook URL. Use it when your app should own the webhook handling logic, but you still want Nango to provide the provider-specific webhook URL, routing, signing, retries, and logs. - -For processing the webhook inside Nango function code, use [webhook functions](/guides/functions/webhook-functions). - -## How forwarding works - -1. You configure your app's webhook URL in **Environment Settings > Webhook URLs**. -2. You register the integration's Nango webhook URL in the provider's developer portal. Find it in **Integrations > [Integration] > Webhooks**. -3. The provider sends a webhook to Nango. -4. Nango runs the provider-specific routing logic and tries to map the event to one or more Nango connections. -5. Nango forwards the payload to your app's webhook URL and signs the request like other Nango webhooks. - -Nango forwards webhooks asynchronously after accepting the provider webhook, so slow app endpoints do not block the provider response. - -## Forwarded payloads - -When Nango can attribute the webhook to a connection, your app receives a Nango wrapper: - -```json -{ - "from": "hubspot", - "providerConfigKey": "", - "type": "forward", - "connectionId": "", - "payload": { - "...": "raw provider payload" - } -} -``` - -If a provider webhook maps to multiple connections, Nango sends one forwarded webhook per connection. - -If Nango cannot map the webhook to a connection, Nango forwards the raw provider payload without the wrapper. Your consumer should handle both shapes when the provider can emit unattributed events. - -## Headers and signatures - -Nango forwards safe provider headers when possible, excluding headers that should not be replayed such as `authorization`, `cookie`, `host`, `content-length`, `content-type`, `user-agent`, and similar transport-sensitive headers. - -Every forwarded webhook is signed with the same headers used by other Nango webhooks: - -- `X-Nango-Hmac-Sha256` -- `X-Nango-Signature` for backwards compatibility - -Verify forwarded webhooks the same way you verify other webhooks from Nango. See [Verifying webhooks from Nango](/guides/platform/webhooks-from-nango#verifying-webhooks-from-nango). - -## When to use forwarding - -Use forwarding when: - -- Your app already has webhook handling logic. -- You want app code to decide what to do with the provider event. -- You need Nango to attribute the event to a connection when possible. -- You want webhook delivery logs and retries without running Nango function code. - -Use [webhook functions](/guides/functions/webhook-functions) when Nango should update records, normalize the payload, or run connection-scoped integration logic immediately. - -## Configure forwarding - - - - In Nango, open **Environment Settings > Webhook URLs** and add your app's endpoint. - - Nango sends forwarded webhooks to the same URLs used for auth, sync, and async action webhooks. - - - - In the integration page, copy the Nango webhook URL from **Integrations > [Integration] > Webhooks** and register it in the provider's developer portal. - - Some providers use one global webhook registration. Others require one webhook registration per connected account. Provider-specific docs explain the required setup. - - - - If the payload has `"type": "forward"`, read `connectionId`, `providerConfigKey`, and `payload`. - - If the payload does not have `"type": "forward"`, handle it as the raw provider payload. This can happen when the provider event cannot be attributed to a Nango connection. - - - - - When implementing webhook forwarding, first find the provider-specific Nango webhook guide. Confirm whether the provider routes automatically or requires embedding the Nango connection ID, tenant ID, team ID, installation ID, or another identifier in the provider webhook subscription. - - Implement signature verification with `X-Nango-Hmac-Sha256`, then branch on whether the incoming body has `type: "forward"`. Store and use `connectionId` only when it is present. - - -## Retries and debugging - -Nango retries forwarded webhooks when your app returns a non-2xx response or has a network failure. Forwarded attempts appear in Nango logs as webhook forwarding operations. - -For retry behavior, timeout limits, and local testing tips, see [Webhook retries & debugging](/guides/platform/webhooks-from-nango#webhook-retries-debugging) and [Webhook limits](/guides/platform/limits#webhook-limits). - -## Related guides - -- [Webhook functions](/guides/functions/webhook-functions) -- [Process external webhooks](/getting-started/use-cases/webhooks-from-external-apis) -- [Receive webhooks from Nango](/guides/platform/webhooks-from-nango) -- [Observability](/guides/platform/observability) + ```bash + npx skills add NangoHQ/skills -s building-nango-functions-locally + ``` + + -## Common Issues + + A Nango integrations folder is a small TypeScript project. The root contains shared project files, and each integration gets its own folder named after the integration ID. -Source: https://nango.dev/docs/guides/platform/common-issues.md + Inside each integration folder, keep function files grouped by type. Sync functions live in `syncs/`, action functions in `actions/`, and event functions in `on-events/`. This keeps the trigger model visible from the file path and matches how the CLI discovers function code. ---- -title: 'Common issues' -sidebarTitle: 'Common issues' -description: 'Troubleshooting guide for frequent errors and how to fix them.' ---- - -If you encounter an issue not documented here, reach out on the [Slack community](https://nango.dev/slack). - -## I just run `nango migrate-to-zero-yaml`, can I change the folder structure? - -Yes, you can change the folder structure. You can move files, zod definitions, types, rename files, folders, etc. -The results of the migration is just an example of how you can structure your project. - -## I'm getting `ZodXX is missing the following properties` errors - -If you are getting Zod errors, it's most likely because you are using a different version of Zod than the one we use in our CLI. We currently require zod `4.0.5`. - -If you have an overrides in your package.json or something that is changing the version of Zod, you will need to remove that. - -NB: `nango compile` will automatically update your dependencies to the version we use in our CLI. - -## Token refresh error from the external API - -Indications of the error: - -- Nango logs may show: - -```json -{ - "error": { - "message": "An error occurred during an HTTP call", - "payload": { - "error": { - "code": "invalid_credentials", - "payload": { [...] }, - "message": "The refresh limit has been reached for this connection." - } - } - } -} -``` - -- Or in `Token refresh` log operations: - -```json -{ - "payload": { - "dataMessage": { - "error_description": "Token has been expired or revoked.", - "error": "invalid_grant" - } - }, - "type": "refresh_token_external_error", - "status": 400 -} -``` - - -The `error` and `error_description` fields may differ by API, but typically include `invalid_grant` and mention the token being expired or revoked. - - -### How to debug - -- This error means the external API (e.g., Google, Salesforce) rejected the refresh token as expired or revoked. Nango retries several times, but if the error persists, the credentials are considered permanently broken. -- The only solution is to ask the user to re-authenticate. See: [How to trigger a re-authorization flow in Nango](/guides/auth/auth-guide#re-authorize-an-existing-connection) -- We recommend enabling [Nango's revoked token webhooks](/guides/platform/webhooks-from-nango#auth-webhooks) for real-time notifications. - -Revoked refresh tokens are a normal part of integrations. Ensure your app provides a good re-authorization experience for users. - -APIs may revoke tokens for unpredictable reasons. Only investigate if you observe an unusual increase of connection revocations for an API. Achieving a 0% revocation rate is not realistic. - -Known API-specific behaviors: -- Google: All tokens are revoked after 7 days if your OAuth app is in test mode ([detailed guide](https://www.nango.dev/blog/google-oauth-invalid-grant-token-has-been-expired-or-revoked)). To go to production, read our [guide for Google's OAuth app review](/api-integrations/google-shared/google-security-review). -- Salesforce: See [Salesforce refresh token issues](https://nango.dev/blog/salesforce-oauth-refresh-token-invalid-grant/). - - -## Connection not found (unknown_connection / 404) - -Indications of the error: - -- Request failed with status code `404` -- code `unknown_connection` -- error message: "No connection matching the provided params of 'connection_id' and 'provider_config_key'" - -```json -{ - "error": { - "message": "Request failed with status code 404", - "data": { - "error": { - "message": "No connection matching the provided params of 'connection_id' and 'provider_config_key'.Please make sure these values exist in the Nango dashboard [...]", - "code": "unknown_connection" - } - } - } -} -``` - -### How to debug - -1. Confirm the environment and secret key - - The `secretKey` in the API or SDK is specific to the environment. Make sure you pass the key that corresponds to the environment you are using (e.g., dev vs prod). - - Open [Environment Settings > API Keys](https://app.nango.dev/dev/environment-settings#api-keys) and verify the key matches. - -2. Verify the Integration ID (aka `providerConfigKey`) - - Go to [Integrations](https://app.nango.dev/dev/integrations), open the integration, and copy the `Integration ID` exactly. - - Ensure the value you send as `providerConfigKey` matches this ID. - -3. Verify the Connection ID - - Go to [Connections](https://app.nango.dev/dev/connections), find the connection, and copy its `Connection ID`. - - Ensure the value you send as `connectionId` (header `Connection-Id` when using HTTP, or `connectionId` in the SDK) matches exactly. - -## Related guides - -- [Observability](/guides/platform/observability) - inspect logs and exported traces. -- [Auth guide](/guides/auth/auth-guide#re-authorize-an-existing-connection) - repair broken connections with re-authorization. -- [Token refreshing and validity](/guides/auth/token-refreshing) - understand refresh failures. -- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - receive failure notifications. + The root `index.ts` is the deployment entry point. It should import every function file you want Nango to compile and deploy, for example `import './github/syncs/github-issues';`. Files that are not imported from `index.ts` are not part of the deployed function set. -## Migrate To Checkpoints + The `.nango/` folder stores CLI-managed project state, including deployment tracking. Commit it so teammates and CI deploy from the same baseline. -Source: https://nango.dev/docs/guides/platform/migrations/migrate-to-checkpoints.md + ``` + nango-integrations/ + β”œβ”€β”€ .nango/ # auto-managed state, commit it + β”œβ”€β”€ .env # API keys per environment + β”œβ”€β”€ .gitignore # keeps .env and dist untracked + β”œβ”€β”€ index.ts # imports every function file + β”œβ”€β”€ package.json + └── / # one folder per integration, e.g. github + β”œβ”€β”€ syncs/ + β”‚ └── github-issues.ts + β”œβ”€β”€ actions/ + β”‚ └── github-create-issue.ts + └── on-events/ + └── post-connection-creation.ts + ``` + ---- -title: 'Migrate to checkpoints' -sidebarTitle: 'Migrate to checkpoints' -description: 'Guide to migrate your sync functions from nango.lastSyncDate to the new checkpointing system.' ---- - -
- -
- -# Who is impacted - -If any of your sync functions read `nango.lastSyncDate` to determine where to resume syncing, you are impacted by this migration. - -To check, search your sync files for `lastSyncDate`. If you find references like `nango.lastSyncDate` or destructured equivalents, those syncs should be migrated to use checkpoints. - -If you want your syncs to be resilient to failures, ensuring that a failed run resumes from where it left off instead of starting over, you should also migrate any sync that paginates through large datasets, even if it doesn't currently use `lastSyncDate`. - -# What is changing - -`nango.lastSyncDate` is deprecated and replaced by checkpoints β€” a more flexible and resilient way to track sync progress. - -With `lastSyncDate`, Nango automatically tracked the timestamp of the last completed sync run. Your function could read it but not set it, and it was always a timestamp. With checkpoints, you define the schema, you control when it's saved, and you can store any type of progress marker β€” not just a date. - -| | `lastSyncDate` (deprecated) | Checkpoints | -| --- | --- | --- | -| **Type** | Always a `Date` | Any schema you define with Zod | -| **Control** | Managed by Nango, read-only | You set it explicitly with `saveCheckpoint()` | -| **Granularity** | Updated once per completed run | Updated mid-execution, after each batch | -| **Resilience** | If a run fails, no progress is saved | Progress is saved incrementally β€” the next run resumes from the last checkpoint | - - -Checkpoints also replace the `syncType: 'incremental'` field in your sync declaration. Whether the dataset is fetched from scratch or incrementally depends on how you use the checkpoint in your function code, not just whether you declared a checkpoint schema. - - -# Why this deprecation - -`lastSyncDate` had two significant limitations: - -1. **No mid-run resilience.** If a sync fetched 90% of its data and then failed, all progress was lost. The next run started over from the previous `lastSyncDate`, re-fetching everything. - -2. **Rigid type.** The value was always a timestamp managed by Nango. Some APIs use cursors, page tokens, or composite markers to track progress β€” `lastSyncDate` couldn't accommodate these. - -Checkpoints solve both problems. For a full overview, see the [checkpoints guide](/guides/functions/syncs/checkpoints). - -# Migration steps - - -## Migrate with the migrating-to-checkpoints skill - -You can migrate syncs to checkpoints with the **`migrating-to-checkpoints`** skill from [NangoHQ/skills](https://github.com/NangoHQ/skills). The skill guides a coding agent through converting `createSync()` implementations from `nango.lastSyncDate`, legacy `syncType: 'incremental'`, and non-resumable full refreshes to checkpoint-based syncs. - -Install it in your functions repo: - -```bash -npx skills add NangoHQ/skills -s migrating-to-checkpoints -``` - -Then ask your agent to migrate a specific sync using the `migrating-to-checkpoints` skill. The skill covers checkpoint schema selection, replacing `lastSyncDate` with `getCheckpoint()` and `saveCheckpoint()`, full-refresh recovery with `clearCheckpoint()`, and validating with `nango dryrun --checkpoint`. - -The manual steps below walk through the same migration if you prefer to do it by hand or want to review what the skill changes. - -## Step 1: Add a checkpoint schema to your sync declaration - -Add a `checkpoint` field to your `createSync()` call. In most cases, this is a single string field holding a timestamp: - -**Before:** -```typescript -export default createSync({ - description: 'Sync contacts from Salesforce', - frequency: 'every hour', - models: { Contact: ContactSchema }, - exec: async (nango) => { - // ... - }, -}); -``` - -**After:** -```typescript -export default createSync({ - description: 'Sync contacts from Salesforce', - frequency: 'every hour', - checkpoint: z.object({ - lastModifiedISO: z.string(), - }), - models: { Contact: ContactSchema }, - exec: async (nango) => { - // ... - }, -}); -``` - -If your sync previously declared `syncType: 'incremental'`, remove it β€” the presence of the `checkpoint` field replaces it. - -## Step 2: Replace `lastSyncDate` reads with `getCheckpoint()` - -Replace every reference to `nango.lastSyncDate` with a call to `nango.getCheckpoint()`. - -**Before:** -```typescript -exec: async (nango) => { - const lastSyncDate = nango.lastSyncDate; - - let query = 'SELECT Id, FirstName, LastName FROM Contact'; - if (lastSyncDate) { - query += ` WHERE LastModifiedDate > ${lastSyncDate.toISOString()}`; - } - query += ' ORDER BY LastModifiedDate ASC'; - - // ... fetch and save records -} -``` - -**After:** -```typescript -exec: async (nango) => { - const checkpoint = await nango.getCheckpoint(); - - let query = 'SELECT Id, FirstName, LastName FROM Contact'; - if (checkpoint) { - query += ` WHERE LastModifiedDate > ${checkpoint.lastModifiedISO}`; - } - query += ' ORDER BY LastModifiedDate ASC'; - - // ... fetch and save records -} -``` - -Note that `getCheckpoint()` is async and returns `null` on first run or after a reset, just like `lastSyncDate` was `null` on the first execution. - -## Step 3: Add `saveCheckpoint()` calls after each batch - -This is the most important change. With `lastSyncDate`, progress was saved automatically at the end of a run. With checkpoints, you save progress explicitly β€” and you should do it after every batch of records. - -**Before:** -```typescript -exec: async (nango) => { - const lastSyncDate = nango.lastSyncDate; - - while (nextPage) { - const res = await nango.get({ - endpoint: '/contacts', - params: { since: lastSyncDate?.toISOString(), cursor: nextPage }, - }); - - await nango.batchSave(mapContacts(res.data.records), 'Contact'); - nextPage = res.data.nextCursor; - } - // Progress saved automatically by Nango at run completion -} -``` - -**After:** -```typescript -exec: async (nango) => { - const checkpoint = await nango.getCheckpoint(); - - while (nextPage) { - const res = await nango.get({ - endpoint: '/contacts', - params: { since: checkpoint?.lastModifiedISO, cursor: nextPage }, - }); - - const contacts = mapContacts(res.data.records); - await nango.batchSave(contacts, 'Contact'); - - // Save progress after each page - const lastRecord = contacts[contacts.length - 1]; - await nango.saveCheckpoint({ lastModifiedISO: lastRecord.lastModified }); - - nextPage = res.data.nextCursor; - } -} -``` - -The pattern is: fetch a page, save records, save checkpoint. If the sync fails mid-way, the next run picks up from the last checkpoint instead of starting over. - -## Step 4: Test locally - -Use the CLI `dryrun` command with the `--checkpoint` flag to simulate resuming from a previous run: - -```bash -nango dryrun my-sync '' --checkpoint '{"lastModifiedISO": "2024-06-01T00:00:00Z"}' -``` - -Verify that your sync correctly filters data based on the checkpoint value. See the [testing guide](/guides/functions/testing) for how to write unit tests for checkpoint logic. - -## Step 5: Deploy - -Deploy as usual. On the first run after deployment, `getCheckpoint()` will return `null` (since no checkpoint has been saved yet), so the sync will perform a full initial fetch β€” just like it did on its first run with `lastSyncDate`. Subsequent runs will be incremental from the checkpoint. - -```bash -nango deploy -``` - - -Because the first post-migration run starts fresh, it may take longer than usual. This is expected and only happens once. - - - - **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - - -## Related guides - -- [Checkpoints](/guides/functions/syncs/checkpoints) - understand the new checkpoint model. -- [Sync functions](/guides/functions/syncs/sync-functions) - update sync implementations. -- [Testing](/guides/functions/testing) - test checkpoint filtering. + + Keep dev mode running while you write code: -## Migrate From End User + ```bash + nango dev + ``` -Source: https://nango.dev/docs/guides/platform/migrations/migrate-from-end-user.md + `nango dev` continuously type-checks and compiles your function files, surfacing errors immediately. + ---- -title: 'Migrate from end user' -sidebarTitle: 'Migrate from end user' -description: 'Guide to migrate away from using end users in connections and connect sessions' ---- - -# Who is impacted - -You are impacted if you use any of the following to identify who a connection belongs to: - -- `end_user` / `organization` in `POST /connect/sessions` -- `end_user` / `organization` in auth webhooks (`endUser` payload) -- `end_user` fields in the Connections list or connection details for reconciliation - -# What is changing - -Connections now have a first-class `tags` object. Connect sessions accept a top-level `tags` object as well. - -The legacy `end_user` and `organization` fields are deprecated. Tags exist because the end-user fields were not flexible enough for many real-world attribution and routing use cases. - -When a connection is created via a Connect session: - -- the Connect session `tags` are copied onto the newly created connection -- the auth webhook includes those tags as top-level `tags` - - - Use `tags` as your source of truth for identifying who a connection belongs to. - The legacy `end_user` and `organization` fields are deprecated and will be removed in a future version. - - -# Migration steps - -## Step 1: Start sending tags for new connect sessions - -Add a `tags` object when creating a Connect session token in your backend: - - - - ```ts - import { Nango } from '@nangohq/node'; - - const nango = new Nango({ secretKey: process.env[''] }); - - const { data } = await nango.createConnectSession({ - // Recommended - tags: { - end_user_id: '', - end_user_email: '', - organization_id: '' - }, - - allowed_integrations: [''] - }); - ``` - - - ```bash - curl --request POST \ - --url https://api.nango.dev/connect/sessions \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' \ - --data '{ - "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "" - }, - "allowed_integrations": [""] - }' - ``` - - - -For more details (including limitations and filtering), see [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata). - -## Step 2: Update webhook reconciliation to use `tags` - -Auth webhooks include connection tags as top-level `tags`. - -If you previously used `endUser.endUserId`, switch to using `tags` as your primary source of truth. For compatibility during rollout, handle both: - -```ts -function resolveOwnerFromWebhook(payload: any) { - // Preferred - if (payload.tags?.end_user_id) { - return { endUserId: payload.tags.end_user_id, endUserEmail: payload.tags.end_user_email, organizationId: payload.tags.organization_id }; - } - - // Legacy fallback - if (payload.endUser?.endUserId) { - return { endUserId: payload.endUser.endUserId, endUserEmail: payload.endUser.endUserEmail, organizationId: payload.endUser.organizationId }; - } - - return null; -} -``` - -## Step 3: Existing connections are already backfilled - -You do not need to patch anything. - -Nango has already backfilled standard tags (like `end_user_id`, `end_user_email`, `organization_id`) onto existing connections based on your legacy end-user fields. - -During the deprecation period, if you still create new connections using the deprecated `end_user` / `organization` fields, Nango will also populate connection tags automatically using the same translation logic: - -- `end_user.id` -> `tags.end_user_id` -- `end_user.email` (if present) -> `tags.end_user_email` -- `end_user.display_name` (if present) -> `tags.end_user_display_name` -- `organization.id` -> `tags.organization_id` -- `organization.display_name` (if present) -> `tags.organization_display_name` -- `end_user.tags` (if present) -> merged into `tags` (subject to the same validation and normalization rules) - -If you provide both deprecated end-user fields and a top-level `tags` object, the top-level `tags` values win. - -## Step 4: Stop using `end_user` - -Once your code relies on `tags`, stop sending or reading the deprecated `end_user` and `organization` fields. - - - **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - - -## Related guides - -- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - use tags for connection attribution. -- [Auth guide](/guides/auth/auth-guide) - create connect sessions with tags. -- [Webhooks from Nango](/guides/platform/webhooks-from-nango#auth-webhooks) - reconcile auth webhooks with tags. + + Choose the right function type for your integration use case: -## Migrate From Public Key + -Source: https://nango.dev/docs/guides/platform/migrations/migrate-from-public-key.md + | If you need to... | Use | Common trigger | Guide | + | --- | --- | --- | --- | + | Keep external API data fresh, replicate records, or reconcile changes | Sync function | Schedule, manual sync trigger, or external webhook reconciliation | [Sync functions](/guides/functions/syncs/sync-functions) | + | Run an operation when your app, backend job, or agent asks for it | Action function | HTTP API, SDK, async action queue, or MCP/tool call | [Action functions](/guides/functions/action-functions) | + | Process an external provider webhook inside Nango | Webhook function | External API webhook | [Webhook functions](/guides/functions/webhook-functions) | + | React to Nango connection lifecycle events | Event function | Connection creation, validation, or deletion | [Event functions](/guides/functions/event-functions) | ---- -title: 'Migrate from public key' -sidebarTitle: 'Migrate from public key' -description: 'Guide to migrate from using the public key (and HMAC) to a Connect session.' ---- - -# Who is impacted - -If you use the Nango public key in your frontend, you are impacted by this migration. - -To check if you are using the public key, inspect your frontend code where the `Nango` object is instantiated. If the `config` parameter includes `publicKey`, you are affected. If it uses `connectSessionToken`, you are already up-to-date. - -# Changes summary - -1. The Nango public key is replaced with a short-lived Connect session token, fetched from your backend and passed to your frontend -2. The connection ID is now randomly generated by Nango instead of being specified manually -3. The connection ID is returned via backend webhooks instead of the frontend SDK - -# Migration timeline - -Public keys and HMAC signatures will be supported until **March 31, 2025** (announced on **January 31, 2025**). - -# Why this deprecation? - -For security reasons. - -If you were using the HMAC signature (strongly recommended in the docs), your authorization flow was already secure. However, not all users implemented HMAC, and we want to enforce best-in-class security practices by default. - -For those not using HMAC, the risk of attack was minimal but theoretically possible. We have no reports of such attacks, but feel free to reach out for more details. - -# Improvements with the Connect session - -1. The new Connect session flow is **secure by default** and replaces the HMAC signature. Randomly generated connection IDs further enhance security -2. Connection IDs are now **unique across integrations**, which will allow us to simplify API endpoints by transitioning from composite keys (`connection ID` + `integration ID`) to a single **unique connection ID** -3. The Connect session will let us provide additional API capabilities that can be called directly and securely from the frontend -4. The Connect session unlocks our [pre-built authorization UI](/guides/auth/auth-guide#guide), which simplifies collecting API keys, basic credentials, and OAuth flows with custom parameters. This UI also validates end-user inputs and provides guidance on required credentials - - -The Connect session works with both the pre-built authorization UI and custom authorization UIs. Custom authorization UIs are not being deprecated; they remain a critical feature and fully supported. - -The deprecated public key, however, was only compatible with custom authorization UIs and did not support the pre-built authorization UI. - - -# Migration steps - -This migration is split into 3 steps. You can migrate at your own pace, but we recommend doing it in this order. -During the migration, both connect session and public key authentication will work so you don't have to do all 3 steps at once. - - - Existing connections will keep the custom id you have used until now but new connections will have a random id. Your code will need to support both. - - -## Step 1: Attach tags to all existing connections - -Attach tags to all existing connections. -This step will allow you to use connect sessions with existing connections. -This will also be used to attribute webhooks to the correct end user. - - - - ```ts - import { Nango } from '@nangohq/node'; - -const nango = new Nango({ secretKey: process.env[''] }); - await nango.patchConnection({ - connectionId: '', - provider_config_key: '', - }, { - tags: { - end_user_id: '', - end_user_email: '', - organization_id: '' - } - }); -``` - - -```bash -curl -X PATCH https://api.nango.dev/v1/connections/ \ --H "Authorization: Bearer " \ --H "Content-Type: application/json" \ - -d '{ - "tags": { - "end_user_id": "", - "end_user_email": "", - "organization_id": "" - } - }' -``` - - - - -Check endpoint documentation [here](/reference/backend/http-api/connections/patch). - - -## Step 2: Implement the Connect and reconnect flows - -Follow the steps in this [guide](/guides/auth/auth-guide#guide), focusing on these key changes: - -Connect session token is now required to be passed to the frontend SDK. This improves security and allows you to pass additional information to the connection. - -### Step 3: Clean up - -Finally, remove all usage of the **public key and HMAC** from your frontend. - - - **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - - -## Related guides - -- [Auth guide](/guides/auth/auth-guide) - implement Connect sessions. -- [Customize Connect UI](/guides/auth/customize-connect-ui) - migrate custom authorization UIs or customize the pre-built UI. -- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - add ownership attribution during migration. + For shared primitives, use [Storage](/guides/functions/storage) for connection metadata and [Data validation](/guides/functions/data-validation) for function input, output, and provider response validation. + -## Migrate To Zero Yaml + + Dry run a function against a real connection: -Source: https://nango.dev/docs/guides/platform/migrations/migrate-to-zero-yaml.md + ```bash + nango dryrun '' -e dev + ``` ---- -title: 'Migrating to Zero YAML' -sidebarTitle: 'Migrating to Zero YAML' -description: 'Guide on how to migrate to Zero YAML in Nango.' ---- - -
- -
- -The `nango.yaml` configuration file is deprecated and should not be used for new integrations. If you are still using it, this guide will help you migrate your existing Nango integrations from the YAML-based approach to our new Zero YAML system, which uses pure TypeScript with modern tooling. - -## What is Zero YAML? - -Zero YAML is Nango's new approach to building integrations that eliminates the need for separate `nango.yaml` configuration files. Instead, everything is defined in TypeScript using a configuration-as-code approach with full type safety. - -Key benefits: -- **Type Safety**: Full TypeScript support with Zod schema validation -- **Better Developer Experience**: Modern tooling, enhanced CLI output, and better error messages -- **Portability**: Self-contained files that can be easily shared and version controlled -- **No Custom Syntax**: Pure TypeScriptβ€”no need to learn YAML-specific conventions and our previous custom model syntax - -Here's a quick example of the new syntax: - -```typescript -import { createSync } from 'nango'; -import * as z from 'zod'; - -const issueSchema = z.object({ - id: z.string(), - title: z.string(), - state: z.string() -}); - -const sync = createSync({ - description: 'Fetches GitHub issues', - frequency: 'every hour', - models: { GithubIssue: issueSchema }, - exec: async (nango) => { - await nango.batchSave([{ id: 'foobar' }], 'GithubIssue'); - } -}); -``` - -## How Zero YAML Works - -The new system is built around simplification - -### Simplified file Structure - -Like a regular TypeScript codebase - -```sh -β”œβ”€β”€ index.ts # Declare what's deployed -β”œβ”€β”€ package.json # Dependency management and types -β”œβ”€β”€ github/ # An integration - β”œβ”€β”€ syncs/ - β”‚ └── fetchIssues.ts # A sync - └── actions/ - └── createIssue.ts # An action -``` - -### Simplified configuration - -Three core functions that replace YAML configuration. You'll benefit from IntelliSense and type safety, directly in your IDE. No need to jump between files to find the right configuration. - -- **`createSync()`**: Defines data synchronization jobs -- **`createAction()`**: Defines one-off jobs -- **`createOnEvent()`**: Defines event-based jobs - - ----- - - -## Quick Migration Guide - -### Automatic Migration - -The easiest way to migrate is using our automated migration command: - -```bash -nango migrate-to-zero-yaml -``` - -This **operation is destructive** and will overwrite your existing files. Make sure to back up your existing files before running the command. - -This command will: -1. Analyze your existing `nango.yaml` and TypeScript files -2. Generate new self-contained TypeScript files -3. Create the required `package.json` if it doesn't exist -4. Set up the `index.ts` entry point -5. Preserve your existing logic and configuration - -### Post-Migration Steps - -The migration command should automatically transform all your files. However, you should review the changes and make sure everything is correct. - -Because the new format is stricter, some type issues can arise after the migration. - -### Migration Plan - -We recommend: -1. **Back up** your current nango integrations folder -2. Use your **dev env** to migrate to test the new format -3. Deploy to **prod env** after you have assessed that everything works properly - -## What Has Changed? - -### Configuration: YAML β†’ TypeScript Objects - -**Before** (nango.yaml + separate .ts file): -```yaml -# nango.yaml -integrations: - github: - issues: - runs: every 1h - sync_type: full - endpoint: GET /issues - description: Fetches GitHub issues -models: - GithubIssue: - id: string - title: string -``` - -**After** (single self-contained file): -```typescript -const sync = createSync({ - description: 'Fetches GitHub issues', - frequency: 'every hour', - models: { GithubIssue: issueSchema } -}); -``` - -### Models: YAML Definitions β†’ Zod Schemas - -**Before**: -```yaml -models: - GithubIssue: - id: string - title: string - state: string -``` - -**After**: -```typescript -const issueSchema = z.object({ - id: z.string(), - title: z.string(), - state: z.string() -}); -``` - -## Before and After Examples - -### Sync Example - -**Before** (issues.ts + nango.yaml excerpt): -```typescript -// issues.ts -import type { NangoSync, GithubIssue } from '../../models'; - -export default async function fetchData(nango: NangoSync) { - // Sync logic here -} -``` - -```yaml -# nango.yaml excerpt -integrations: - github: - issues: - runs: every 1h - sync_type: full - endpoint: GET /issues -``` - -**After** (self-contained fetchIssues.ts): -```typescript -import { createSync } from 'nango'; -import * as z from 'zod'; - -const issueSchema = z.object({ - id: z.string(), - title: z.string(), - state: z.string() -}); - -const sync = createSync({ - description: 'Fetches GitHub issues', - frequency: 'every hour', - models: { GithubIssue: issueSchema }, - exec: async (nango) => { - // Your existing sync logic here - } -}); - -export default sync; -``` - -### Action Example - -**Before** (separate files): -```typescript -// create-issue.ts -export default async function runAction(nango: NangoAction, input: CreateIssueInput) { - // Action logic -} -``` - -**After** (self-contained): -```typescript -import { createAction } from 'nango'; -import * as z from 'zod'; - -const inputSchema = z.object({ - title: z.string(), - body: z.string() -}); - -const action = createAction({ - description: 'Create a GitHub issue', - input: inputSchema, - output: z.void(), - exec: async (nango, input) => { - // Your action logic here - } -}); - -export default action; -``` - -### Index File Structure - -The new `index.ts` file imports all your integrations: - -```typescript -// index.ts -import './github/syncs/fetchIssues.js'; -import './github/actions/createIssue.js'; -// Add more imports as needed -``` - -## Migration Gotchas & FAQ - -### Gotchas -```typescript -err - github/syncs/issues.ts:57:43 - Argument of type '{ id: number; owner: string; repo: string; issue_number: number; title: string; author: string; author_id: string; state: string; date_created: Date; date_last_modified: Date; body: string; }[]' is not assignable to parameter of type 'RawModel[]'. - Type '{ id: number; owner: string; repo: string; issue_number: number; title: string; author: string; author_id: string; state: string; date_created: Date; date_last_modified: Date; body: string; }' is not assignable to type 'RawModel'. - Types of property 'id' are incompatible. - Type 'number' is not assignable to type 'string'. -``` -Previously you were setting the ID property of a sync to a number when it should always be a string. - ------- - -```typescript -err - 1password-scim/actions/create-user.ts:26:45 - Property 'errors' does not exist on type 'ZodError<{ firstName: string; lastName: string; email: string; active?: boolean | undefined; externalId?: string | undefined; phoneNumbers?: { type: "work" | "mobile" | "other"; value: string; }[] | undefined; photos?: { ...; }[] | undefined; addresses?: { ...; }[] | undefined; title?: string | undefined; }>'. -``` -Previously you were validating an input using Zod in this way -```typescript -const parsedInput = scimCreateUserSchema.safeParse(input); - -if (!parsedInput.success) { - for (const error of parsedInput.error.errors) { - await nango.log( - `Invalid input provided to create a user: ${error.message} at path ${error.path.join(".")}`, - { level: "error" }, - ); - } - - throw new nango.ActionError({ - message: "Invalid input provided to create a user", - }); -} -``` -Instead of this, you can use a Nango helper: -```typescript -const parsedInput = await nango.zodValidateInput({ zodSchema: scimCreateUserSchema, input }); -``` - -### Nango.yaml EOL - -**Q: When will nango.yaml stop being supported?** - -**A:** nango.yaml integrations will be supported until the end of 2025. Zero YAML will be the only supported way to build integrations after that. An official roadmap will be published soon. - -### Package.json Requirement - -**Q: Why is package.json now mandatory?** - -**A:** The new system uses modern JavaScript tooling that requires proper dependency management. The `package.json` ensures: -- Consistent dependency versions across environments -- Proper module resolution -- Better integration with modern development tools - -If you don't have one, the migration command will create it automatically. - -Note: Bundling custom dependencies is not yet possible but is now on our roadmap thanks to this update. - -### Backward Compatibility - -**Q: What still works the same?** - -**A:** Your core integration logic remains unchanged. No new features or breaking changes. All CLI commands are still available. - -### Testing Migrated Integrations - -**Q: How do I test after migration?** - -**A:** Use the same testing commands: - -```bash -# Test a specific sync -nango dryrun -``` - -### Rollback Process - -**Q: Can I rollback if something goes wrong?** - -**A:** Yes, Nango's platform remains compatible with nango.yaml at all times: -1. Go to your backup folder -2. `nango deploy dev` - -Keep your original files until you've fully validated the migration. - ---- - -The Zero YAML approach represents a significant step forward in Nango's developer experience. By eliminating custom syntax and embracing pure TypeScript, we've made integrations more maintainable, shareable, and enjoyable to work with. Many more features will be possible thanks to this new syntax. - -If you encounter any issues during migration, our support team is ready to help. Happy integrating! πŸš€ - - - **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - - -## Related guides - -- [Functions guide](/guides/functions/functions-guide) - understand the current TypeScript-first project layout. -- [Functions CLI](/reference/functions/functions-cli) - deploy and dry-run migrated functions. -- [Testing](/guides/functions/testing) - verify migrated integrations before rollout. + If the function reads connection metadata, pass test metadata: -## Frontend Sdk + ```bash + nango dryrun '' -e dev --metadata '{"accountRegion":"eu"}' + ``` -Source: https://nango.dev/docs/reference/frontend/frontend-sdk.md + Deploy the function you changed: ---- -title: 'Frontend SDK' -sidebarTitle: 'Frontend SDK' -icon: 'js' ---- - -Trigger authorization flows in your frontend with this SDK. It is available on [NPM](https://www.npmjs.com/package/@nangohq/frontend) as `@nangohq/frontend`. - -# Instantiate the frontend SDK - -```ts -import Nango from '@nangohq/frontend'; - -const nango = new Nango({ connectSessionToken: '' }); -``` - -**Parameters** - - - - - - Get your public key in the environment settings of the Nango UI. This is key is not sensitive. - - - - Omitting the host points to Nango Cloud. For local development, use `http://localhost:3003`. Use your instance URL if self-hosting. - - - - For self-hosted instances only to specify a customs path for the WebSocket connection. - - - - Specify a specific width for the OAuth authorization modal. - - - - Specify a specific height for the OAuth authorization modal. - - - - Print additional console logs to debug authorization issues. - - - - - - -# Connect using Nango Connect UI - -Nango provides a UI component that guides your app's users through automatically and securely setting up an integration. This UI is hosted on Nango's servers and requires minimal setup on your end to get started quickly. -This is the recommended way to use Nango in your frontend. - -```js -const connectUI = nango.openConnectUI({ sessionToken: 'SESSION_TOKEN' }); -``` - -**Parameters** - - - The unique token to identify your user. It is required but can be set asynchronously. - - - - The base URL to load the UI - - - - The base URL to reach Nango API - - - - A callback to listen to events sent by Nango Connect - - - - Control OAuth popup close detection. If set to true, a closed popup will be detected as a failed authorization. - - - - The language to use for the UI. Defaults to browser language or english if not supported. - - - - The theme (light, dark, system) to use for the UI. Overrides your global setting in the dashboard. - - - -**Response** - - - - The class to manipulate Nango Connect - - - -# Connect using the headless client - -You store end-user credentials with the `nango.auth` method. It creates a connection in Nango. - - - - - -For OAuth, this will open a modal to let the user log in to their external account. - -```js -const result = await nango.auth('').catch((error) => { -... -}); -``` - - - - - -For API key authorization, pass the end-user's previously-collected API key directly in the parameters. - -```js -const result = await nango.auth('', { - credentials: { apiKey: '' } -}).catch((error) => { - ... -}); -``` - - - - - -For Basic Auth, pass the end-user's previously-collected username & password in the parameters. - -```js -const result = nango.auth('', { - credentials: { username: '', password: '' } -}).catch((error) => { - ... -}); -``` - - - - -**Parameters** - - - The integration ID that you can find in the integration settings on the Nango UI. - - - - The connection ID that you can find in the _Connections_ tab on the Nango UI. - - - - - - Specify additional connection configuration necessary to perform the authorization request. - - - - HMAC key to secure the authorization flow - - - - If `true`, `nango.auth()` would fail if the login window is closed before the authorization flow is completed. - - - - For OAuth, specify the query parameters of the authorization URL. - - - - For Slack OAuth, specify user-specific scopes. - - - - - - For API key authorization, pass in the user's API key. - - - - For Basic authorization, pass in the user's username. - - - - For Basic authorization, pass in the user's password. - - - - For OAuth 2, override the integration's client ID with a connection-level client ID. This is useful when your users bring their own OAuth 2 app (e.g. Netsuite). - - - - For OAuth 2, override the integration's client secret with a connection-level client secret. This is useful when your users bring their own OAuth 2 app (e.g. Netsuite). - - - - - - - -**Success response** - - - - The integration ID that you can find in the integration settings on the Nango UI. - - - - The connection ID that you can find in the _Connections_ tab on the Nango UI. - - - -**Error response** - - - - - The type of error (e.g. 'authorization_cancelled'). - - - - The detailed error message (e.g. 'Authorization fail: The user has closed the authorization modal before the process was complete.'). - - - - - -# Error Handling - -The Nango Frontend SDK may throw different types of errors during authentication and connection setup. Below is a list of all possible error types along with their meanings: - -1. `missing_auth_token` - - Occurs when neither a public key nor a connect session token is provided. - - Message: "You must specify a public key OR a connect session token (cf. documentation)." - -2. `blocked_by_browser` - - Occurs when the browser blocks the popup window for authentication. - - Message: "Modal blocked by browser" - -3. `invalid_host_url` - - Occurs when the provided host URL is invalid. - - Message: "Invalid URL provided for the Nango host." - -4. `missing_credentials` - - Occurs when required credentials are not provided. - - Message: "You must specify credentials." - -5. `window_closed` - - Occurs when the authentication window is closed before completing the flow. - - Message: "The authorization window was closed before the authorization flow was completed" - -6. `connection_test_failed` - - Occurs when credential verification fails for certain integrations before the connection is established. - - Message: "The given credentials were found to be invalid. Please check the credentials and try again." - -7. `missing_connect_session_token` - - Occurs when attempting to reconnect without a session token. - - Message: "Reconnect requires a session token" - -8. `resource_capped` - - Occurs when the resource usage limit has been reached. - - Message: "Reached maximum number of allowed connections for your plan" or "Reached maximum number of connections with functions enabled" - -9. `unknown_error` - - Occurs when an unexpected error happens that doesn't fall into other error categories. - - Message: Varies depending on the underlying error (e.g., network failures, unexpected exceptions) - -## Error Response Structure - -All errors from the Nango Frontend SDK follow this structure: - -```json -{ - "error": { - "code": "", - "message": "" - } -} -``` - -## Handling Errors - -You can handle these errors in your code using the `AuthError` class. - -```ts -import { AuthError } from '@nangohq/frontend'; - -try { - const result = await nango.auth('', { - credentials: { apiKey: '' } - }); -} catch (error) { - if (error instanceof AuthError && error.type === '') { - // Handle specific error - console.error('Your error message'); - } -} -``` - -**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - + ```bash + nango deploy --sync dev + # or + nango deploy --action dev + # or + nango deploy --integration dev + ``` -## API keys + A bare `nango deploy` reconciles every function in the environment and can overwrite teammates' work on a shared collaborative environment. See [Engineering collaboration](/guides/platform/environments#engineering-collaboration). -Source: https://nango.dev/docs/reference/backend/http-api/api-keys.md -Description: Manage API keys with scoped permissions for your Nango environments. + For function-type-specific commands, see the [Sync function guide](/guides/functions/syncs/sync-functions#test-and-deploy), [Action function guide](/guides/functions/action-functions#test-and-deploy), and [Testing](/guides/functions/testing). +
+
-# API keys + + +### Option 3: Build with the Functions API -API keys allow programmatic access to your Nango environment. Each environment can have multiple API keys with different permissions, enabling you to follow the principle of least privilege. +Use the Functions API when an agent should create or change an integration without the user working in a codebase. The agent might be Codex, Claude Code, Cursor, or a product agent running inside your app or sandbox. -## Managing API Keys +This is useful for prototypes, onboarding flows, provider operations not covered by templates, and just-in-time integrations where users describe behavior in text and an agent publishes the matching function to Nango. -API keys are managed in the Nango UI under **Environment Settings > API Keys**. +
+ +
-Each environment comes with a **Default - Full access** key that grants access to all API endpoints. You can create additional keys with restricted scopes for specific use cases. +At a high level, the flow is: -### Creating a Key +1. Give the agent the integration ID, a connection ID for validation, the intended behavior, input and output shape, and any provider API context. +2. The agent generates a self-contained TypeScript function using the right function type. +3. Compile the source with `POST /functions/compile`. Send the TypeScript source as `code` and use compiler errors to improve it. +4. Start a dry run with `POST /functions/dryruns`. Send the integration ID, function type, source `code`, connection ID, and any action input, sync metadata, or checkpoint payload needed for the run. +5. Poll `GET /functions/dryruns/{id}` until the dry run reaches `success` or `failed`, then inspect the result, logs, records, or error. +6. Deploy it with `POST /functions/deployments`. Send `type: "function"`, the integration ID, function name, function type, and final source `code`. After deployment, your app can call or trigger the function like any other Nango function. -1. Go to **Environment Settings > API Keys** -2. Click **Create API Key** -3. Enter a display name (e.g., "CI Deploy Key", "Backend service") -4. Choose **Full access** or **Custom** permissions β€” custom lets you pick individual scopes -5. The key is created immediately and can be revealed and copied from the key list +Resolve these endpoints against `NANGO_SERVER_URL`, or `https://api.nango.dev` by default. Send `Authorization: Bearer ` and `Content-Type: application/json`. Scoped API keys need `environment:functions:compile` for compile, `environment:functions:dryrun` for dry run creation and polling, and `environment:deploy` for deployment. -### Rotating a Key +The Functions API is powerful, but it intentionally skips a local Git workflow. For production integrations that need code review, tests, ownership, and CI/CD, prefer [local development with the CLI](#build-locally-with-the-cli). -To rotate a key: -1. Create a new key with the same scopes -2. Update your application to use the new key -3. Monitor the **Last used** column on the old key to confirm it's no longer in use -4. Delete the old key + +### Take ownership of a deployed function -### Using a Key +Pull the source of a function that is already deployed to an environment so you can manage it in your own repository: -Pass the API key as a Bearer token in the `Authorization` header: +```bash +nango pull github list-repos --env dev +``` - - - ```ts - import { Nango } from '@nangohq/node'; +This works for any deployed function β€” a template you enabled from the dashboard, or code deployed through [`POST /functions/deployments`](/reference/backend/http-api/functions/deployments). The CLI writes the function's TypeScript source locally; from there, `nango deploy` redeploys it as a repo-managed function, so it lives in your Git workflow with code review, tests, and CI/CD. - const nango = new Nango({ secretKey: '' }); - ``` - - - ```bash - curl --request GET \ - --url https://api.nango.dev/connections \ - --header 'Authorization: Bearer ' - ``` - - +## Related guides -## Scopes +- [Function tool calling](/guides/functions/tool-calling) β€” expose action functions to agents, LLM SDKs, and MCP clients. +- [Unified APIs](/guides/functions/unified-apis) β€” build provider-specific functions behind one stable model. +- [Logging](/guides/functions/logging) β€” control custom function logs locally and in cloud environments. +- [Storage](/guides/functions/storage) β€” store per-connection metadata and read it inside functions. +- [Data validation](/guides/functions/data-validation) β€” validate function input, output, and provider API responses. +- [Testing](/guides/functions/testing) β€” dry runs, mocks, and snapshot tests. +- [Rate limits](/guides/functions/rate-limits) β€” handle provider `429` responses and long-running retries. +- [CI/CD](/guides/functions/ci-cd) β€” deploy functions with your application pipeline. -Scopes control what an API key can access. When creating a key with **Custom** permissions, you select which scopes to grant. A key without a specific scope will receive a `403 Forbidden` response when trying to access a protected endpoint. +## Sync Functions -### Credential Scopes +Source: https://nango.dev/docs/guides/functions/syncs/sync-functions.md -Some resources (Integrations and Connections) have sensitive credential data. Access to this data is controlled by dedicated `_credentials` scopes: +--- +title: 'Sync function guide' +sidebarTitle: 'Sync function guide' +description: 'Build sync functions that keep external API data fresh and consumable by your app.' +--- -- `list` / `read` β€” returns the resource **without** sensitive credentials -- `list_credentials` / `read_credentials` β€” returns the resource **with** credentials (access tokens, client secrets, etc.) +Sync functions keep external API data fresh in your app. They run on a recurring cadence, write records to Nango's records cache, and let your app consume changes reliably. -The `_credentials` scopes are supersets β€” selecting `read_credentials` automatically includes `read` access. You don't need to select both. +Use sync functions when your app needs to replicate a dataset from an external system for sync, indexing, RAG, reporting, or change-detection workflows. -| Resource | Without credentials | With credentials | -|----------|-------------------|-----------------| -| **Connections** | Connection metadata, tags, status | + access/refresh tokens | -| **Integrations** | Provider, display name, config | + client ID and client secret | +## Create the function -## Advised Profiles +Add a file under the integration's `syncs/` folder: -Common scope combinations for typical use cases: +```typescript crm/syncs/contacts.ts +import { createSync } from 'nango'; +import * as z from 'zod'; -### Auth (Connect UI) +const Contact = z.object({ + id: z.string(), + email: z.string().email().optional(), + updatedAt: z.string() +}); -For backends that create connect sessions for the auth flow: +const Metadata = z.object({ + accountRegion: z.string().optional() +}); -| Scope | -|-------| -| `environment:connect_sessions:write` | +const Checkpoint = z.object({ + lastUpdatedAt: z.string() +}); -### CI/CD Deploy +export default createSync({ + description: 'Syncs contacts', + version: '1.0.0', + frequency: 'every hour', + autoStart: true, + models: { Contact }, + metadata: Metadata, + checkpoint: Checkpoint, + exec: async (nango) => { + const metadata = await nango.getMetadata(); + const checkpoint = await nango.getCheckpoint(); + const since = checkpoint?.lastUpdatedAt; + + for await (const page of nango.paginate({ + endpoint: '/contacts', + params: { + ...(since ? { updated_after: since } : {}), + ...(metadata?.accountRegion ? { region: metadata.accountRegion } : {}) + }, + paginate: { + type: 'cursor', + cursor_path_in_response: 'pagination.next_cursor', + cursor_name_in_request: 'cursor', + response_path: 'contacts', + limit_name_in_request: 'limit', + limit: 100 + } + })) { + const contacts = page.map((contact) => ({ + id: contact.id, + email: contact.email, + updatedAt: contact.updated_at + })); + + await nango.batchSave(contacts, 'Contact'); + + const lastContact = contacts[contacts.length - 1]; + if (lastContact) { + await nango.saveCheckpoint({ lastUpdatedAt: lastContact.updatedAt }); + } + } + } +}); +``` -For CI/CD pipelines deploying syncs and actions to production: +Import the function from `index.ts`: -| Scope | -|-------| -| `environment:deploy` | +```typescript index.ts +import './crm/syncs/contacts'; +``` -### Backend Service + + Sync implementation quality matters. Suboptimal syncs can consume far more API calls, compute, memory, and storage than needed; they can also become expensive, crash, behave unreliably, or hit provider rate limits. Before deploying a sync to production, review the [Sync efficiency guide](/guides/functions/syncs/sync-efficiency). + -For backend services that consume data, trigger actions, and proxy requests: + + Before generating a sync, collect the integration ID, connection ID for testing, target records, provider pagination style, incremental filter, deletion strategy, required metadata, and expected sync frequency. -| Scope | -|-------| -| `environment:connections:read` | -| `environment:records:read` | -| `environment:actions:execute` | -| `environment:syncs:execute` | -| `environment:proxy` | + Prefer incremental syncs when the provider supports them. Save records page by page, checkpoint after successful writes, and keep the record model limited to fields the app actually needs. + -Add `environment:connections:read_credentials` if the service needs access to connection tokens. +## Pass parameters with metadata - -For extra security, avoid when possible granting `environment:connections:list` to backend services. Without it, connection IDs act as connection-specific secrets β€” a leaked API key alone won't let an attacker enumerate and access customer data. - +Use [connection metadata](/guides/functions/storage#connection-metadata) for any value the sync needs on scheduled runs: -### Local Development +- Customer configuration, such as selected folders, projects, accounts, regions, or custom field mappings. +- Provider context discovered after authorization. +- Feature flags or filters that change what the sync fetches. -For local development, use a **Full access** key. This is the default key created for each environment. +If the sync should not run before configuration exists, set `autoStart: false`, save the required metadata from your app, then start the schedule after configuration is complete. -## CLI +From your app, call the Node SDK [`nango.startSync()` method](/reference/backend/backend-sdk/node#start-schedule-for-syncs): -The Nango CLI uses the `NANGO_SECRET_KEY_` environment variable for authentication. Set it to an API key with the required scopes: +```ts +await nango.startSync('crm', ['contacts'], ''); +``` -| CLI Command | Required Scope | -|-------------|---------------| -| `nango deploy` | `environment:deploy` | -| `nango dryrun` | `environment:connections:read` + `environment:integrations:read` + `environment:proxy` | +Or call the [Start sync API](/reference/backend/http-api/sync/start) from any backend. Starting a sync schedule also triggers an immediate first run. -For most functions, `environment:connections:read` is sufficient for `nango dryrun` β€” Nango injects credentials into the proxy automatically, so the function does not need them in its response. Upgrade to `environment:connections:read_credentials` when the function reads credential data from the connection, including: +## Test and deploy -- accessing `connection.credentials` directly (e.g. `nango.getConnection().credentials`) -- calling `nango.getToken()` β€” returns the access token from `connection.credentials` -- calling `nango.getRawTokenResponse()` β€” returns `connection.credentials.raw` +Dry run the function against a real connection: -Without `read_credentials`, these helpers return empty values because the API strips the `credentials` field from the response. +```bash +nango dryrun contacts '' -e dev +``` -The **Default - Full access** key that comes with each environment already has all required scopes for deploying and dry-running. For production CI/CD pipelines, consider creating a dedicated key with only the `environment:deploy` scope to follow the principle of least privilege. +If the sync reads connection metadata, pass test metadata to the dry run: -## All Available Scopes +```bash +nango dryrun contacts '' -e dev --metadata '{"accountRegion":"eu"}' +``` -### Integrations +Or load metadata from a file: -| Scope | Description | -|-------|-------------| -| `environment:integrations:list` | List integrations (no credentials) | -| `environment:integrations:list_credentials` | List integrations with client credentials | -| `environment:integrations:list_functions` | List deployed functions (syncs and actions) | -| `environment:integrations:read` | Read a single integration (no credentials) | -| `environment:integrations:read_credentials` | Read a single integration with client credentials | -| `environment:integrations:create` | Create integrations | -| `environment:integrations:update` | Update integrations | -| `environment:integrations:delete` | Delete integrations | +```bash +nango dryrun contacts '' -e dev --metadata @fixtures/metadata.json +``` -### Connections +Simulate resuming from a checkpoint: -| Scope | Description | -|-------|-------------| -| `environment:connections:list` | List connections (no credentials) | -| `environment:connections:list_credentials` | List connections with access/refresh tokens | -| `environment:connections:read` | Read a single connection (no credentials) | -| `environment:connections:read_credentials` | Read a single connection with access/refresh tokens | -| `environment:connections:create` | Create connections | -| `environment:connections:update` | Update connections and metadata | -| `environment:connections:delete` | Delete connections | +```bash +nango dryrun contacts '' -e dev --checkpoint '{"lastUpdatedAt":"2026-01-01T00:00:00.000Z"}' +``` -### Connect Sessions +Print local diagnostics for memory and CPU behavior: -| Scope | Description | -|-------|-------------| -| `environment:connect_sessions:write` | Create and reconnect sessions for the Connect UI auth flow | +```bash +nango dryrun contacts '' -e dev --diagnostics +``` -### Syncs +Deploy your functions: -| Scope | Description | -|-------|-------------| -| `environment:syncs:read` | Read sync status | -| `environment:syncs:execute` | Trigger, pause, start syncs | -| `environment:syncs:update` | Update sync connection frequency | -| `environment:syncs:variant:create` | Create sync variants | -| `environment:syncs:variant:delete` | Delete sync variants | +```bash +nango deploy +``` -### Deploy +To deploy only this sync function: -| Scope | Description | -|-------|-------------| -| `environment:deploy` | Deploy syncs and actions via CLI or API | +```bash +nango deploy --sync contacts dev +``` -### Functions +## Start or trigger runs -| Scope | Description | -|-------|-------------| -| `environment:functions:list` | List deployed functions | -| `environment:functions:read` | Read a single deployed function | -| `environment:functions:delete` | Delete a deployed function | -| `environment:functions:compile` | Compile function source code | -| `environment:functions:dryrun` | Dry run function source code | +If `autoStart: true`, Nango starts the schedule for new connections automatically. Otherwise, start it after the connection is ready and required metadata is saved: -### Records +```typescript +await nango.startSync('crm', ['contacts'], ''); +``` -| Scope | Description | -|-------|-------------| -| `environment:records:read` | Read synced records | -| `environment:records:write` | Prune records | +`nango.startSync()` is a [Node SDK method](/reference/backend/backend-sdk/node#start-schedule-for-syncs). Use the [Start sync API](/reference/backend/http-api/sync/start) if you are starting schedules from another backend language. -### Actions +Trigger a run immediately: -| Scope | Description | -|-------|-------------| -| `environment:actions:execute` | Trigger actions and read action results | +```typescript +await nango.triggerSync('crm', ['contacts'], ''); +``` -### Proxy +`nango.triggerSync()` is a [Node SDK method](/reference/backend/backend-sdk/node#trigger-syncs). Use the [Trigger sync API](/reference/backend/http-api/sync/trigger) for one-off sync runs from another backend language. -| Scope | Description | -|-------|-------------| -| `environment:proxy` | Send proxy requests to external APIs through Nango | +## Consume records -### Variables +Configure your app's Nango webhook URL in **Environment Settings > Webhook URLs**. After a run, Nango sends a sync webhook with the connection, integration, sync name, model, and change counts. Your app should then read records by cursor: -| Scope | Description | -|-------|-------------| -| `environment:variables:read` | Read environment variables | + + + ```typescript + import { Nango } from '@nangohq/node'; + + const nango = new Nango({ secretKey: process.env.NANGO_SECRET_KEY! }); + + const result = await nango.listRecords({ + providerConfigKey: 'crm', + connectionId: '', + model: 'Contact', + cursor: '' + }); + ``` + + + ```bash + curl -G https://api.nango.dev/records \ + --header 'Authorization: Bearer ' \ + --header 'Provider-Config-Key: crm' \ + --header 'Connection-Id: ' \ + --data-urlencode 'model=Contact' \ + --data-urlencode 'cursor=' + ``` + + -### MCP - -| Scope | Description | -|-------|-------------| -| `environment:mcp` | Access the MCP endpoint | +The consumer loop is: receive a sync webhook from Nango, look up the last cursor processed for that connection and model, fetch records with that cursor, process them, then store the cursor from the last record fetched. -## Authentication +## Two-way syncs -Source: https://nango.dev/docs/reference/backend/http-api/authentication.md +You can implement two-way syncs by combining sync functions with [action functions](/guides/functions/action-functions): ---- -title: 'Authentication' ---- - -Use an [API key](/reference/backend/http-api/api-keys) as a Bearer token in the `Authorization` header. API keys are managed in **Environment Settings > API Keys** in the Nango UI. - -``` -Authorization: Bearer -``` - -Each API key has [scopes](/reference/backend/http-api/api-keys#scopes) that control which endpoints it can access. A key without the required scope will receive a `403 Forbidden` response. +- Use a sync function to replicate external data into your app and keep your local state fresh. +- Use action functions for writes back to the external API, such as creating, updating, or deleting records. +- After a write action succeeds, update your local state optimistically or trigger the relevant sync so the records cache catches up with the external source of truth. -## Rate Limits +This keeps the read path and write path explicit. The sync owns ongoing data freshness, checkpoints, record storage, and change delivery. Actions own user-initiated writes and provider-specific validation or side effects. -Source: https://nango.dev/docs/reference/backend/http-api/rate-limits.md +For unified models, use the same schema for synced records and write action input where possible. This keeps your app from branching on each provider while still letting each provider implementation handle API-specific fields and edge cases. ---- -title: 'Rate limits' ---- - -The Nango API is rate-limited to prevent abuse and ensure fair usage across all clients. The rate limit is enforced on a per-account basis, with a fixed window of time and a maximum number of requests allowed within that window. - -Those headers are sent back with every API response: -- `X-RateLimit-Limit` indicates the maximum number of requests a client can make within the rate limit window. -- `X-RateLimit-Remaining` shows how many requests are remaining before the limit is reached. -- `X-RateLimit-Reset` provides a Unix timestamp representing the time at which the current rate limit window resets, and the remaining request count is replenished. - -If a client exceeds the rate limit, the API will respond with a 429 `Too Many Requests` status code. In this case, the `Retry-After` header is included, indicating the number of seconds the client should wait before making another request to avoid being rate-limited. +## Deep dives -## List +- [Sync efficiency](/guides/functions/syncs/sync-efficiency) +- [Checkpoints](/guides/functions/syncs/checkpoints) +- [Records cache](/guides/functions/syncs/records-cache) +- [Deletion detection](/guides/functions/syncs/deletion-detection) +- [Real-time syncs](/guides/functions/syncs/realtime-syncs) +- [Sync partitioning](/guides/functions/syncs/sync-partitioning) -Source: https://nango.dev/docs/reference/backend/http-api/integration/list.md +## Sync Efficiency ---- -title: 'List all integrations' -openapi: 'GET /integrations' ---- - - - Requires an API key with one of: `environment:integrations:list` or `environment:integrations:list_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - - - -```ts Node Client -const nango = new Nango({ secretKey }); - -const response = await nango.listIntegrations(); -``` - - - - -```json Example Response -{ - "data": [ - { - "unique_key": "slack-nango-community", - "display_name": "Slack", - "provider": "slack", - "logo": "http://localhost:3003/images/template-logos/slack.svg", - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z", - }, - { - "unique_key": "github-prod", - "display_name": "GitHub", - "provider": "github", - "logo": "http://localhost:3003/images/template-logos/github.svg", - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z", - }, - ] -} -``` - +Source: https://nango.dev/docs/guides/functions/syncs/sync-efficiency.md -## Get +--- +title: 'Sync efficiency' +sidebarTitle: 'Sync efficiency' +description: 'Build sync functions that replicate external datasets without wasting API calls, memory, or compute.' +--- -Source: https://nango.dev/docs/reference/backend/http-api/integration/get.md +Sync functions are often used to replicate external datasets into your app or to notify your app when external data changes. Efficient syncs fetch only what changed, save records in batches, and let your app consume changes promptly. ---- -title: 'Get an integration' -openapi: 'GET /integrations/{uniqueKey}' ---- - - - Requires an API key with one of: `environment:integrations:read` or `environment:integrations:read_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - - -```json Basic response -{ - "data": { - "unique_key": "slack-nango-community", - "display_name": "Slack", - "provider": "slack", - "logo": "http://localhost:3003/images/template-logos/github.svg", - "forward_webhooks": true, - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z" - } -} -``` - -```json With credentials (OAuth2/OAuth1/TBA) -{ - "data": { - "unique_key": "github-nango", - "display_name": "GitHub", - "provider": "github", - "logo": "http://localhost:3003/images/template-logos/github.svg", - "forward_webhooks": false, - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z", - "credentials": { - "type": "OAUTH2", - "client_id": "abc123", - "client_secret": "secret456", - "scopes": "repo,user", - "webhook_secret": null - } - } -} -``` - -```json With credentials (GitHub App / CUSTOM) -{ - "data": { - "unique_key": "github-app-nango", - "display_name": "GitHub App", - "provider": "github-app", - "logo": "http://localhost:3003/images/template-logos/github.svg", - "forward_webhooks": false, - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z", - "credentials": { - "type": "CUSTOM", - "client_id": "abc123", - "client_secret": "secret456", - "app_id": "123456", - "app_link": "https://github.com/apps/my-app", - "private_key": "-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----" - } - } -} -``` - +## Prefer incremental syncs -## Create +An **incremental sync** fetches only records that changed since the previous run. The function stores progress in a [checkpoint](/guides/functions/syncs/checkpoints), then passes that progress back to the external API on the next run. -Source: https://nango.dev/docs/reference/backend/http-api/integration/create.md +A **full sync** fetches the whole dataset every run, then saves or compares the complete result. ---- -title: 'Create an integration' -openapi: 'POST /integrations' ---- - - - Requires an API key with the `environment:integrations:create` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - - -```json Example Response -{ - "data": { - "unique_key": "slack-nango-community", - "display_name": "Slack", - "provider": "slack", - "logo": "http://localhost:3003/images/template-logos/github.svg", - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z", - } -} -``` - +Incremental syncs are usually an order of magnitude more efficient than full syncs. They reduce provider API calls, function runtime, memory usage, Nango compute, records churn, and downstream writes in your app. -## Update +Full syncs can be acceptable for small datasets or low-frequency jobs. For large datasets, they can become plainly unrealistic: expensive to run, slow to finish, more likely to crash, more likely to hit provider rate limits, and less reliable when a run needs to process thousands or millions of records every time. -Source: https://nango.dev/docs/reference/backend/http-api/integration/update.md +| Approach | Best for | Tradeoff | +| --- | --- | --- | +| Incremental sync | Large datasets, frequent polling, APIs with `updated_after`, cursor, or sequence filters | Requires checkpoint logic and provider support | +| Full refresh | Small datasets or APIs without incremental filters | Simpler, but uses more API calls, memory, and compute as data grows | ---- -title: 'Update an integration' -openapi: 'PATCH /integrations/{uniqueKey}' ---- - - - Requires an API key with the `environment:integrations:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - +This choice is constrained by the external API shape. To benefit from incremental syncing, the provider usually needs a parameter such as `updated_at`, `updated_since`, `modified_after`, a cursor, a sequence ID, or an event stream that lets you ask for only changed records. -## Delete +The hardest case is a large dataset where the API does not support incremental filters. Often, that happens because the provider expects you to use webhooks instead. In Nango, use [webhook functions](/guides/functions/webhook-functions), [webhook forwarding](/guides/platform/webhook-forwarding), or [real-time syncs](/guides/functions/syncs/realtime-syncs) to process provider events and avoid polling the entire dataset. -Source: https://nango.dev/docs/reference/backend/http-api/integration/delete.md +The risky combination is: **large dataset + no incremental API + high freshness requirement**. If you need to run a full sync frequently to keep data fresh, the design is usually unrealistic in terms of cost, runtime, reliability, and rate limits. Look for a webhook strategy, reduce freshness requirements, partition the dataset, or narrow the scope of synced data. ---- -title: 'Delete an integration' -openapi: 'DELETE /integrations/{uniqueKey}' ---- - - - Requires an API key with the `environment:integrations:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - +## Save page by page -## Create +Do not accumulate the full dataset in memory before calling `batchSave()`. Save each page as soon as it is mapped, then checkpoint after the save succeeds. -Source: https://nango.dev/docs/reference/backend/http-api/connect/sessions/create.md +```typescript +const checkpoint = await nango.getCheckpoint(); ---- -title: 'Create a connect session' -openapi: 'POST /connect/sessions' ---- - - - Requires an API key with the `environment:connect_sessions:write` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -Creates a short-lived connect session (30m). -The returned token can be used for instance to create connections through Connect UI. - -You can attach connection-level tags to the session via the `tags` field. These tags are copied onto the created connection and included in auth webhooks. - -Most apps start with these tags: `end_user_id`, `end_user_email`, `organization_id`. +for await (const page of nango.paginate({ + endpoint: '/contacts', + params: checkpoint ? { updated_after: checkpoint.lastModifiedISO } : {}, + paginate: { + type: 'cursor', + cursor_path_in_response: '', + cursor_name_in_request: 'cursor', + response_path: '', + limit_name_in_request: 'limit', + limit: 100 + } +})) { + const contacts = page.map(mapContact); -## Reconnect + await nango.batchSave(contacts, 'Contact'); -Source: https://nango.dev/docs/reference/backend/http-api/connect/sessions/reconnect.md + const lastContact = contacts[contacts.length - 1]; + if (lastContact) { + await nango.saveCheckpoint({ lastModifiedISO: lastContact.updatedAt }); + } +} +``` ---- -title: 'Create a reconnect session' -openapi: 'POST /connect/sessions/reconnect' ---- - - - Requires an API key with the `environment:connect_sessions:write` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - +This pattern keeps memory bounded and lets the next run resume from the last saved page if the function stops midway. -## Get +## Keep records small -Source: https://nango.dev/docs/reference/backend/http-api/connect/session/get.md +Only fetch and save fields your app needs. Smaller records reduce external API usage, Nango compute, cache size, downstream processing, and cost. ---- -title: 'Get a connect session' -openapi: 'GET /connect/session' ---- - -Retrieves a connect session information (allowed integrations, default connection configurations). +Keep records steady too. During full syncs, Nango can process unchanged records faster when the saved record payload stays identical between runs. Avoid adding fields that change on every fetch even when the underlying external record did not change, such as `lastFetchedAt`, request timestamps, random IDs, or transient API metadata. Volatile fields make the record look changed every run, which forces extra processing and downstream updates. -## Delete +## Filter unnecessary data early -Source: https://nango.dev/docs/reference/backend/http-api/connect/session/delete.md +Filter data as early as possible, either by using filters provided by the external API or by discarding records before calling `batchSave()`. This keeps the external system as the source of truth while reducing provider API usage, Nango compute, cache size, and downstream processing. ---- -title: 'Delete a connect session' -openapi: 'DELETE /connect/session' ---- - -Deletes a connect session +Prefer provider-side filters such as selected folders, projects, accounts, regions, statuses, or `updated_after` parameters. If the provider cannot filter server-side, map and filter each page before saving so Nango and your app only process records that matter. -## Post +Use [connection metadata](/guides/functions/storage#connection-metadata) for per-customer filters. For example, store selected project IDs, folder IDs, regions, pipelines, or custom field mappings on the connection, then read that metadata inside the sync and pass it to the provider API. -Source: https://nango.dev/docs/reference/backend/http-api/connections/post.md +```typescript +const metadata = await nango.getMetadata(); +const checkpoint = await nango.getCheckpoint(); ---- -title: 'Import a connection' -openapi: 'POST /connections' ---- - - - Requires an API key with the `environment:connections:create` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## When to use - -Use this API endpoint to import existing access tokens into Nango. It is mostly meant for one-off bulk imports when onboarding Nango, or for migrating existing connections when a provider introduced changes to its auth flow. - -If a connection with the same `connection_id` and `provider_config_key` already exists, the endpoint updates it with the provided credentials instead of creating a new one. - -To trigger OAuth flows with Nango, use the [Nango frontend SDK](/reference/frontend/frontend-sdk). - -## Request body - -You can use this endpoint to import OAuth 2, OAuth 1, API Keys, and Basic auth credentials. - -The required fields depend on the type of authentication of the _connections_ you are trying to import. +for await (const page of nango.paginate({ + endpoint: '/tasks', + params: { + project_id: metadata?.projectId, + updated_after: checkpoint?.lastModifiedISO + }, + paginate: { + type: 'cursor', + cursor_path_in_response: 'next_cursor', + cursor_name_in_request: 'cursor', + response_path: 'tasks' + } +})) { + const tasks = page.filter((task) => !metadata?.status || task.status === metadata.status).map(mapTask); -## List + await nango.batchSave(tasks, 'Task'); +} +``` -Source: https://nango.dev/docs/reference/backend/http-api/connections/list.md +If you need additional data later, update the sync function and trigger a run with `reset: true` to backfill historical data with the new shape or broader filter. ---- -title: 'List connections' -openapi: 'GET /connections' ---- - - - Requires an API key with one of: `environment:connections:list` or `environment:connections:list_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - - - ```json Example Response -{ - "connections": [ - { - "id": 1, - "connection_id": "test-1", - "provider": "slack", - "provider_config_key": "slack-nango-community", - "created": "2023-06-03T14:53:22.051Z", - "metadata": null, - "tags": { - "end_user_id": "your-internal-id", - "end_user_email": "user@example.com", - "organization_id": "user-organization-id" - }, - "errors": [{ "type": "auth", "log_id": "VrnbtykXJFckCm3HP93t"}] - }, - { - "id": 2, - "connection_id": "test-2", - "provider": "slack", - "provider_config_key": "slack-nango-community", - "created": "2023-06-03T15:00:14.945Z", - "metadata": { - "bot_id": "some-uuid" - }, - "tags": { - "end_user_id": "your-internal-id", - "end_user_email": "user@example.com", - "organization_id": "user-organization-id" - }, - "errors": [] - } - ] -} - ``` - +## Consume changes promptly -## Get +Nango's records cache is a delivery mechanism, not your app's long-term data store. Configure [webhooks from Nango](/guides/platform/webhooks-from-nango), fetch changed records from the [records API](/reference/backend/http-api/sync/records-list), store them in your system, and persist the last processed cursor. -Source: https://nango.dev/docs/reference/backend/http-api/connections/get.md +When reading records from Nango, keep page sizes modest. A page size around `100` records is a good default: it keeps payloads quick to transfer, reduces memory spikes in your worker, and makes retries less expensive when a downstream write fails. ---- -title: 'Get connection & credentials' -openapi: 'GET /connections/{connectionId}' ---- - - - Requires an API key with one of: `environment:connections:read` or `environment:connections:read_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - - - -The response content depends on the API authentication type (e.g: OAuth 2, OAuth 1, API key, etc.). - -If you do not want to deal with collecting & injecting credentials in requests for multiple authentication types, use the [Proxy](/guides/platform/proxy-requests). - - - - -Every time you fetch the connection with this API endpoint, Nango will check if the access token has expired. If it has, it will refresh it. - -**We recommend you always fetch the token just before you use it to make sure it is fresh!** - - +Read [Records cache](/guides/functions/syncs/records-cache) for cursor behavior, payload shape, and retention details. -## Patch +## Related guides -Source: https://nango.dev/docs/reference/backend/http-api/connections/patch.md +- [Functions guide](/guides/functions/syncs/sync-functions) +- [Checkpoints](/guides/functions/syncs/checkpoints) +- [Records cache](/guides/functions/syncs/records-cache) +- [Real-time syncs](/guides/functions/syncs/realtime-syncs) +- [Sync partitioning](/guides/functions/syncs/sync-partitioning) ---- -title: 'Patch a connection' -openapi: 'PATCH /connections/{connectionId}' ---- - - - Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - +## Checkpoints -## Set Metadata +Source: https://nango.dev/docs/guides/functions/syncs/checkpoints.md -Source: https://nango.dev/docs/reference/backend/http-api/connections/set-metadata.md +--- +title: 'Checkpoints' +sidebarTitle: 'Checkpoints' +description: 'Save progress mid-run, resume after failures, and turn full syncs into incremental ones.' +--- ---- -title: 'Set connection metadata' -openapi: 'POST /connections/metadata' ---- - - - Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Set _connection metadata_ - -Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides any existing metadata. The connection_id must be passed in the body as well. Note that the connection_id can be a single string or an array of strings. - -## Fetching _connection metadata_ - -To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. +Checkpoints let sync functions save their progress and resume from where they left off. This enables a function to fetch only new or changed data instead of re-fetching everything on each run. Checkpoints are what make sync functions **resilient to failures** and enable **incremental syncing**, the recommended approach for any non-trivial dataset. -## Update Metadata +Define a `checkpoint` schema in your sync function to enable checkpoint support. If you are migrating from `nango.lastSyncDate`, see the [migration guide](/guides/platform/migrations/migrate-to-checkpoints). -Source: https://nango.dev/docs/reference/backend/http-api/connections/update-metadata.md +## Why checkpointing matters ---- -title: 'Edit connection metadata' -openapi: 'PATCH /connections/metadata' ---- - - - Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Update _connection metadata_ - -Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides specified properties, not the entire metadata. The connection_id must be passed in the body as well. Note that the connection_id can be a single string or an array of strings. - -## Fetching _connection metadata_ - -To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. +Without checkpoints, every sync run fetches the entire dataset from the external API. This works for small datasets, but quickly becomes unsustainable as data grows. Consider a Salesforce account with 500,000 contacts syncing every 15 minutes: without checkpoints, each run re-fetches all 500,000 records even if only a handful changed β€” consuming orders of magnitude more API calls, compute time, and memory than necessary. -## Delete +Checkpoints solve this by tracking how far your sync has progressed. The benefits compound: -Source: https://nango.dev/docs/reference/backend/http-api/connections/delete.md +- **Performance** β€” Only fetch what changed. A 15-minute incremental sync processes minutes of changes, not years of history. +- **Resilience** β€” If a sync fails mid-execution, the next run resumes from the last checkpoint instead of restarting from scratch. +- **Lower costs** β€” Less compute time on Nango, fewer API calls against the external API's rate limits, and lower bandwidth consumption. +- **Higher freshness** β€” Faster syncs mean you can run them more frequently, keeping your data closer to real-time. ---- -title: 'Delete a connection' -openapi: 'DELETE /connections/{connectionId}' ---- - - - Requires an API key with the `environment:connections:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - +## Function interruption and resumption -## List functions +Nango reserves the right to cap the duration of a function execution. When an execution reaches the limit, Nango interrupts it gracefully and schedules the next execution to start immediately. -Source: https://nango.dev/docs/reference/backend/http-api/functions/list.md +Checkpoints are what make this seamless: the next execution should call `getCheckpoint()` and resumes from where the previous one stopped. **Without checkpoints, each execution starts from scratch**, meaning any function that takes longer than the execution cap will loop indefinitely without ever completing. - - Requires an API key with the `environment:functions:list` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - + +If your sync processes a large dataset, you must call `saveCheckpoint()` after every `batchSave`. A sync without checkpoints that exceeds the execution duration will restart from the beginning on every run and never finish. + -Returns the functions deployed to an integration. +The interrupt-and-resume flow: -## Get a function +1. Sync runs, processes records, saves a checkpoint after each page. +2. Nango interrupts the sync gracefully when the execution cap is reached (ie: after the current `saveCheckpoint()` call completes). +3. The next execution starts immediately, calls `getCheckpoint()`, and continues from that point. +4. This repeats until the sync finishes naturally. -Source: https://nango.dev/docs/reference/backend/http-api/functions/get.md +## How checkpoints work - - Requires an API key with the `environment:functions:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - +A checkpoint is a small payload, defined by a schema you control, that your sync saves after processing each batch of data. On the next execution, the sync reads the checkpoint to know where it left off. -Returns a single deployed function. +The typical flow is: -## Get a function's source code +1. Read the current checkpoint with `nango.getCheckpoint()` (returns `null` on first run). +2. Fetch a page of data from the external API, starting from the checkpoint. +3. Save the records to Nango's cache with `nango.batchSave()`. +4. Save a new checkpoint with `nango.saveCheckpoint()`. +5. Repeat until there is no more data. -Source: https://nango.dev/docs/reference/backend/http-api/functions/code.md +## Defining a checkpoint schema - - Requires an API key with the `environment:functions:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - +You define your checkpoint schema in the `createSync()` declaration using [Zod](https://zod.dev), just like your data models. The schema describes the shape of the progress marker your sync will save. -Returns the TypeScript source code of a function for a given integration. +Most commonly, the checkpoint is a timestamp indicating how far you've synced: -## Delete a function +```ts +import { createSync } from 'nango'; +import * as z from 'zod'; + +export default createSync({ + description: 'Sync contacts from Salesforce', + frequency: 'every hour', + checkpoint: z.object({ + lastModifiedISO: z.string(), + }), + models: { Contact: ContactSchema }, + exec: async (nango) => { + // Implementation below + }, +}); +``` -Source: https://nango.dev/docs/reference/backend/http-api/functions/delete.md +The checkpoint payload can be anything the external API gives you to track progress: a timestamp, a cursor, a page token, or any combination. You control the schema. - - Requires an API key with the `environment:functions:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - +```ts +// Timestamp-based checkpoint +checkpoint: z.object({ lastModifiedISO: z.string() }) -Deletes a deployed function and enqueues its async teardown. Functions managed by `nango deploy` (repo source) cannot be deleted through this endpoint. +// Cursor-based checkpoint +checkpoint: z.object({ nextCursor: z.string() }) -## Compile +// Composite checkpoint +checkpoint: z.object({ lastModifiedISO: z.string(), pageToken: z.string().optional() }) +``` -Source: https://nango.dev/docs/reference/backend/http-api/functions/compile.md +## Implementing an incremental sync with checkpoints ---- -title: 'Compile a function' -openapi: 'POST /functions/compile' ---- - - - Requires an API key with the `environment:functions:compile` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -Compiles TypeScript function source code and returns the bundled JavaScript. +Here is a complete example syncing Salesforce contacts incrementally: -## Dryruns Create +```ts +import { createSync } from 'nango'; +import * as z from 'zod'; + +const ContactSchema = z.object({ + id: z.string(), + first_name: z.string(), + last_name: z.string(), + email: z.string(), + last_modified_date: z.string(), +}); -Source: https://nango.dev/docs/reference/backend/http-api/functions/dryruns-create.md +export default createSync({ + description: 'Sync contacts from Salesforce', + frequency: 'every hour', + checkpoint: z.object({ + lastModifiedISO: z.string(), + }), + models: { Contact: ContactSchema }, + + exec: async (nango) => { + // 1. Read the checkpoint (null on first run) + const checkpoint = await nango.getCheckpoint(); + + let query = 'SELECT Id, FirstName, LastName, Email, LastModifiedDate FROM Contact'; + if (checkpoint) { + // Only fetch records modified since the last checkpoint + query += ` WHERE LastModifiedDate > ${checkpoint.lastModifiedISO}`; + } + query += ' ORDER BY LastModifiedDate ASC'; + + for await (const records of nango.paginate({ + endpoint: '/services/data/v53.0/query', + params: { q: query }, + paginate: { + type: 'link', + response_path: 'records', + link_path_in_response_body: 'nextRecordsUrl', + }, + })) { + const contacts = mapContacts(records); ---- -title: 'Dry run a function' -openapi: 'POST /functions/dryruns' ---- - - - Requires an API key with the `environment:functions:dryrun` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -Starts an asynchronous dry run for TypeScript function source code against a connection without deploying it. + // 2. Save records to the cache + await nango.batchSave(contacts, 'Contact'); -## Dryruns Get + // 3. Save checkpoint after each page + const lastContact = contacts[contacts.length - 1]; + await nango.saveCheckpoint({ + lastModifiedISO: lastContact.last_modified_date, + }); + } + }, +}); +``` -Source: https://nango.dev/docs/reference/backend/http-api/functions/dryruns-get.md +The key pattern: **save records and checkpoint after every page**. This ensures that if the sync fails on page 50 of 100, the next run resumes from page 50 β€” not page 1. ---- -title: 'Get dry run results' -openapi: 'GET /functions/dryruns/{id}' ---- - - - Requires an API key with the `environment:functions:dryrun` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -Returns the status and result of an asynchronous function dry run. +## The first sync run -## Deployments +Even with checkpoints, the very first execution has no previous progress to resume from β€” `getCheckpoint()` returns `null`. This initial run fetches the entire historical dataset and is inherently more resource-intensive than subsequent runs. -Source: https://nango.dev/docs/reference/backend/http-api/functions/deployments.md +One strategy to manage this is to limit the backfill window. For example, if you are syncing a Notion workspace, you might only fetch pages modified in the last three months, assuming older pages are less relevant: ---- -title: 'Create a function deployment' -openapi: 'POST /functions/deployments' ---- - - - Requires an API key with the `environment:deploy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -Deploys a function to an existing integration: either submitted TypeScript source code (`type: function`) or a template from the provider catalog (`type: template`). +```ts +const checkpoint = await nango.getCheckpoint(); +const since = checkpoint?.lastModifiedISO ?? threeMonthsAgo(); +``` -## Config +After the initial run completes, subsequent runs are fast and incremental β€” only processing changes since the last checkpoint. -Source: https://nango.dev/docs/reference/backend/http-api/scripts/config.md +## Implementing a full sync with checkpoints ---- -title: 'Get integration functions config' -openapi: 'GET /scripts/config' ---- - - - Requires an API key with the `environment:integrations:list_functions` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -The `/scripts/config` endpoint returns the configuration for all integration functions. There are two variants of this endpoint: - -1. `/scripts/config?format=nango` - Returns the standard configuration format -2. `/scripts/config?format=openai` - Returns the configuration in OpenAI's function calling format - -## OpenAI Function Format - -The `/scripts/config?format=openai` endpoint transforms the script configurations into OpenAI's function calling format. This format is particularly useful when working with OpenAI's API to enable function calling capabilities. - -### Parameter Descriptions - -The endpoint automatically parses parameter descriptions from the script's description field. If a script's description contains a markdown list of parameters, these descriptions will be used for the corresponding parameters in the OpenAI function format. - -For example, in your script file, you can define a script like this: - -```typescript google-calendar/actions/move-event.ts -export default createAction({ - description: `Move an event to a different time or calendar with the following parameters: - - eventId: The ID of the event to move - - start: New start time in ISO format (e.g., "2024-03-28T14:00:00") - - end: New end time in ISO format (e.g., "2024-03-28T15:00:00") - - calendar: Optional new calendar ID to move the event to`, - version: '1.0.0', - endpoints: [{ method: 'GET', path: '/example/github/issues', group: 'Issues' }], - frequency: 'every hour', - autoStart: false, - scopes: ['https://www.googleapis.com/auth/calendar'], - input: z.object({ - eventId: z.string(), - start: z.string(), - end: z.string(), - calendar: z.string().optional() - }) -}); -``` - -The endpoint will generate a function definition like this: - -```json -{ - "data": [ - { - "name": "move-event", - "description": "Move an event to a different time or calendar with the following parameters:\n- eventId: The ID of the event to move\n- start: New start time in ISO format (e.g., \"2024-03-28T14:00:00\")\n- end: New end time in ISO format (e.g., \"2024-03-28T15:00:00\")\n- calendar: Optional new calendar ID to move the event to", - "parameters": { - "type": "object", - "properties": { - "eventId": { - "type": "string", - "description": "The ID of the event to move" - }, - "start": { - "type": "string", - "description": "New start time in ISO format (e.g., \"2024-03-28T14:00:00\")" - }, - "end": { - "type": "string", - "description": "New end time in ISO format (e.g., \"2024-03-28T15:00:00\")" - }, - "calendar": { - "type": "string", - "description": "Optional new calendar ID to move the event to" - } - }, - "required": ["eventId", "start", "end"] - } - } - ] -} -``` - -### Array Fields - -The endpoint properly handles array fields in the configuration. For example, if a field is defined as: - -```typescript google-calendar/actions/create-event.ts -export default createAction({ - description: `Create a new calendar event with the following parameters: - - summary: The title of the event - - attendees: List of email addresses of event attendees`, - version: '1.0.0', - endpoints: [{ method: 'POST', path: '/example/google-calendar/events', group: 'Events' }], - input: z.object({ - summary: z.string(), - attendees: z.array(z.string()).optional() - }) -}); -``` - -It will be transformed into: - -```json -{ - "data": [ - { - "name": "create-event", - "description": "Create a new calendar event with the following parameters:\n- summary: The title of the event\n- attendees: List of email addresses of event attendees", - "parameters": { - "type": "object", - "properties": { - "summary": { - "type": "string", - "description": "The title of the event" - }, - "attendees": { - "type": "array", - "description": "List of email addresses of event attendees", - "items": { - "type": "string" - } - } - }, - "required": ["summary"] - } - } - ] -} -``` +Not every sync can be incremental. Some APIs don't support filtering by modification date, so you must fetch all records on every run. Such syncs can still benefit from checkpoints for resilience: if a run is interrupted mid-dataset, the next run resumes from the last page instead of starting over. -## Records List +Call `clearCheckpoint()` at the end of a successful run so the next scheduled run starts from the first page. -Source: https://nango.dev/docs/reference/backend/http-api/sync/records-list.md +```ts +export default createSync({ + description: 'Sync all contacts', + frequency: 'every hour', + checkpoint: z.object({ + nextCursor: z.string(), + }), + models: { Contact: ContactSchema }, + + exec: async (nango) => { + // Resume from the last page if this run was interrupted + const checkpoint = await nango.getCheckpoint(); + let nextCursor: string | undefined = checkpoint?.nextCursor; + + do { + const res = await nango.get({ + endpoint: '/contacts', + params: { cursor: nextCursor }, + }); + + const contacts = mapContacts(res.data.records); + await nango.batchSave(contacts, 'Contact'); + + nextCursor = res.data.nextCursor; + + if (nextCursor) { + await nango.saveCheckpoint({ nextCursor }); + } + } while (nextCursor); ---- -title: 'Get records' -sidebarTitle: 'Get records' -openapi: 'GET /records' ---- - - - Requires an API key with the `environment:records:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Receive webhooks on data updates - -Receive webhooks from Nango when new records are available. Follow the [sync functions section](/guides/functions/syncs/sync-functions). - - -**Data availability**: Records are subject to Nango's [data retention policies](/guides/platform/security#synced-records-retention). Records not updated for 30 days will have their payload pruned (only metadata remains). Records from syncs not executed for 60 days are permanently deleted. Fetch and store records promptly in your own system. - - -## Response - - -This endpoint returns a list of records, ordered by modification date ascending. If some records are updated while you paginate through this endpoint, you might see these records multiple times. - - - -A response may contain fewer records than `limit` when records have a large size. Always check `next_cursor` and continue paginating until it is `null`. - - -### Default behavior -By default this returns an array of objects in the data model that you queried with some metadata about each record. - -```json -{ - records: - [ - { - id: 123, - ..., // Fields as specified in the model you queried - _nango_metadata: { - deleted_at: null, - last_action: 'ADDED', - first_seen_at: '2023-09-18T15:20:35.941305+00:00', - last_modified_at: '2023-09-18T15:20:35.941305+00:00', - cursor: 'MjAyNC0wMy0wNFQwNjo1OTo1MS40NzE0NDEtMDU6MDB8fDE1Y2NjODA1LTY0ZDUtNDk0MC1hN2UwLTQ1ZmM3MDQ5OTdhMQ==' - } - }, - ... - ], - next_cursor: "MjAyMy0xMS0xN1QxMTo0NzoxNC40NDcrMDI6MDB8fDAzZTA1NzIxLWNiZmQtNGYxNS1iYTNhLWFlNjM2Y2MwNmEw==" -} + // All pages fetched, clear checkpoint so the next run starts from the first page + await nango.clearCheckpoint(); + }, +}); ``` -## Prune Records +## When to sync without checkpoints -Source: https://nango.dev/docs/reference/backend/http-api/sync/prune-records.md +For small datasets (e.g., a list of Slack users for an organization with fewer than 100 employees), a sync without checkpoint can be perfectly fine. ---- -title: 'Prune records' -sidebarTitle: 'Prune records' -openapi: 'PATCH /records/prune' ---- - - - Requires an API key with the `environment:records:write` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -Prunes synced records for a given connection and model using cursor-based pagination. - -## What is pruning? - -Pruning empties the record payload while preserving the record metadata. -This is useful for compliance requirements, ensuring Nango doesn't hold onto your records data while maintaining the ability to track record state. The payload can be restored by re-syncing the data. - - -Pruning is not the same as marking a record as deleted from the external API. -This endpoint prunes data from Nango’s cache only. It does not delete anything on the external API, and it is not the same as [detecting a deletion from the source](/guides/functions/syncs/deletion-detection). - -If you need to tell your customers that a record was deleted on the external API while keeping its last-known payload in cache, use `batchDelete` or `trackDeletesStart`/`trackDeletesEnd` in your sync functions instead. - - -## Cursor behavior - -Records are pruned up to and including the specified `until_cursor` value. Use the `_nango_metadata.cursor` value from the record you want to prune up to. - -## Response - - -The `has_more` field indicates whether there are potentially more records to prune. When `true`, make another request with the same `until_cursor` to continue pruning. When `false`, all records up to the cursor have been pruned. - - -```json -{ - "count": 150, - "has_more": true -} -``` +As datasets grow, full syncs become unscalable β€” taking longer to run, triggering rate limits, and consuming more compute and memory. If your dataset has more than a few thousand records and the API supports pagination and/or filtering by date or cursor, use checkpoints. -## Trigger + +`deleteRecordsFromPreviousExecutions()` is incompatible with checkpoints because it requires comparing the full dataset between consecutive runs. Use `trackDeletesStart`/`trackDeletesEnd` instead β€” see [Deletion detection](/guides/functions/syncs/deletion-detection). + -Source: https://nango.dev/docs/reference/backend/http-api/sync/trigger.md +## Checkpoints vs. cursors ---- -title: 'Trigger sync(s)' -openapi: 'POST /sync/trigger' ---- - - - Requires an API key with the `environment:syncs:execute` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Triggering one-off syncs - -This is especially useful if you e.g. changed the metadata for the connection and now want to re-import data. - -Use `reset` to clear the checkpoint and re-fetch all data, or `reset` with `emptyCache` to start completely fresh. See the [checkpoints guide](/guides/functions/syncs/checkpoints#re-syncing-resetting-checkpoints-and-the-cache) for details. +Both checkpoints and [cursors](/guides/functions/syncs/records-cache#cursors-and-sync-progress) are markers of sync progress, but they track different relationships: -## Start +| | Checkpoint | Cursor | +| --- | --- | --- | +| **Direction** | Nango β†’ external API | Your app β†’ Nango | +| **What it tracks** | How far Nango has synced from the external API | How far your app has fetched from Nango's records cache | +| **Who manages it** | Your sync function, via `saveCheckpoint()` | Your application, via the `cursor` parameter on [GET /records](/reference/backend/http-api/sync/records-list) | +| **Typical payload** | A timestamp or API cursor from the external system | An opaque string returned by Nango | -Source: https://nango.dev/docs/reference/backend/http-api/sync/start.md +Both are important: checkpoints keep your sync efficient, and cursors keep your application's data consumption efficient. ---- -title: 'Start sync(s)' -openapi: 'POST /sync/start' ---- - - - Requires an API key with the `environment:syncs:execute` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - +## Re-syncing: resetting checkpoints and the cache -## Pause +When you [trigger a sync](/reference/backend/http-api/sync/trigger) manually (from the UI or API), you can control whether to preserve or reset progress: -Source: https://nango.dev/docs/reference/backend/http-api/sync/pause.md +| Option | Default | What it does | +| --- | --- | --- | +| `reset` | `false` | When `true`, clears the checkpoint and re-fetches the full dataset from the external API. The cache is preserved, so Nango can still distinguish new records from updated ones. | +| `emptyCache` | `false` | When `true`, deletes all cached records before the sync runs. Must be used with `reset: true`. The sync starts completely fresh. | ---- -title: 'Pause sync(s)' -openapi: 'POST /sync/pause' ---- - - - Requires an API key with the `environment:syncs:execute` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - +**Leave both off** for a standard incremental sync. -## Status +**Use `reset: true`** when you want to re-fetch everything from the external API but preserve the cache for accurate change detection. This is useful when you suspect data may have been missed. -Source: https://nango.dev/docs/reference/backend/http-api/sync/status.md +**Use `reset: true` with `emptyCache: true`** when you need to start from scratch β€” for example, after a breaking change to your data model. ---- -title: 'Sync status' -openapi: 'GET /sync/status' ---- - - - Requires an API key with the `environment:syncs:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -The response includes the current `checkpoint` for each sync, which tracks how far the sync has progressed. Learn more about [checkpoints](/guides/functions/syncs/checkpoints). + +Resetting the checkpoint triggers a full re-sync from the external API, which takes longer and may incur higher compute costs. Clearing the cache additionally means every record will be reported as `ADDED`, your previously persisted [cursors](/guides/functions/syncs/records-cache#cursors-and-sync-progress) become invalid, and you will need to reprocess the entire dataset on your side. + -## Update Connection Frequency +```ts +// Preserve checkpoint (standard incremental sync) +await nango.triggerSync('', ['contacts'], ''); -Source: https://nango.dev/docs/reference/backend/http-api/sync/update-connection-frequency.md +// Reset checkpoint, re-fetch everything, preserve cache for change detection +await nango.triggerSync('', ['contacts'], '', { reset: true }); ---- -title: 'Override sync connection frequency' -openapi: 'PUT /sync/update-connection-frequency' ---- - - - Requires an API key with the `environment:syncs:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - +// Full reset β€” re-fetch everything and clear the cache +await nango.triggerSync('', ['contacts'], '', { reset: true, emptyCache: true }); +``` -## Environment Variables +## Observability -Source: https://nango.dev/docs/reference/backend/http-api/sync/environment-variables.md +Checkpoints are exposed in several places to help you monitor sync progress: ---- -title: 'Get environment variables' -openapi: 'GET /environment-variables' ---- - - - Requires an API key with the `environment:variables:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - +- **Sync webhooks** β€” The [sync completion webhook](/guides/platform/webhooks-from-nango) includes checkpoint information, so your application knows how far the sync has progressed. +- **Sync status API** β€” The [GET /sync/status](/reference/backend/http-api/sync/status) endpoint returns the current checkpoint for each sync, letting you check progress programmatically. +- **Logs** β€” Checkpoint-related details are visible in the Nango dashboard logs. *(We are actively improving checkpoint visibility in the dashboard.)* -## Create Variant +## Testing checkpoints locally -Source: https://nango.dev/docs/reference/backend/http-api/sync/create-variant.md +When developing locally with the Nango CLI, you can pass a checkpoint value to `dryrun` to simulate resuming from a previous run: ---- -title: 'Create sync variant' -sidebarTitle: 'Create variant' -openapi: 'POST /sync/{name}/variant/{variant}' ---- - - - Requires an API key with the `environment:syncs:variant:create` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Creating a sync variant - -Sync variants allow you to create different configurations of the same sync for a specific connection. This is useful when you need to sync the same data with different settings or filters. - -### Key features -- Each variant operates independently with its own sync schedule -- Variants can be queried separately through the records endpoint using the `variant` query parameter -- Cannot use "base" as a variant name (protected) - -After creating a variant, you can use the `/records` endpoint to access its data by specifying the variant query parameter: - -``` -GET /records?model=MyModel&variant=MyVariant +```bash +nango dryrun salesforce-contacts '' --checkpoint '{"lastModifiedISO": "2024-01-15T00:00:00Z"}' ``` -## Delete Variant +This lets you test that your sync correctly resumes from a checkpoint without needing to run a full initial sync first. See the [testing guide](/guides/functions/testing) for more details, including how to write unit tests for checkpoint logic. -Source: https://nango.dev/docs/reference/backend/http-api/sync/delete-variant.md + +**Migrating from `nango.lastSyncDate`?** Checkpoints replace it with a schema you control, mid-run granularity, and failure-resumption. Follow the [migration guide](/guides/platform/migrations/migrate-to-checkpoints) for step-by-step instructions. + ---- -title: 'Delete sync variant' -sidebarTitle: 'Delete variant' -openapi: 'DELETE /sync/{name}/variant/{variant}' ---- - - - Requires an API key with the `environment:syncs:variant:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - +## Reference -## Trigger +| Function | Description | +| --- | --- | +| [`nango.getCheckpoint()`](/reference/functions/functions-sdk#getcheckpoint) | Retrieves the current checkpoint. Returns `null` on first run or after a reset. | +| [`nango.saveCheckpoint()`](/reference/functions/functions-sdk#savecheckpoint) | Saves progress. Call after each batch of data. | +| [`nango.clearCheckpoint()`](/reference/functions/functions-sdk#clearcheckpoint) | Clears the checkpoint. Use at the end of a full sync so the next run starts from the first page. Checkpoints are also automatically cleared when triggering a sync with `reset: true`. | -Source: https://nango.dev/docs/reference/backend/http-api/action/trigger.md +## Records Cache ---- -title: 'Trigger an action' -openapi: 'POST /action/trigger' ---- - - - Requires an API key with the `environment:actions:execute` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - +Source: https://nango.dev/docs/guides/functions/syncs/records-cache.md -## Get +--- +title: 'Records cache' +sidebarTitle: 'Records cache' +description: 'How Nango stores synced records, detects changes, and lets your app fetch deltas via cursors.' +--- -Source: https://nango.dev/docs/reference/backend/http-api/proxy/get.md +Sync functions replicate records from an external API to your system continuously. To do this reliably, Nango uses a **records cache** β€” an intermediate store that sits between the external API and your application. ---- -title: 'Proxy - GET requests' -sidebarTitle: 'Proxy - GET requests' -openapi: 'GET /proxy/{anyPath}' ---- - - - Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -### API request - -The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: -* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. -* Provider-Config-Key -* Connection-Id -* Retries -* Base-Url-Override: provide an API base URL when the base API is not listed in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) or it needs to be overridden - -### API response - -The response from the external API is passed back to you exactly as Nango gets it: -* Response code -* Response headers -* Response body +Every time you call [`nango.batchSave()`](/reference/functions/functions-sdk#save-records) or [`nango.batchDelete()`](/reference/functions/functions-sdk#delete-records) inside a sync function, you are writing to this cache. Your application then reads from the cache using the [GET /records](/reference/backend/http-api/sync/records-list) endpoint or the [Node SDK](/reference/backend/backend-sdk/node#get-records). -## Post +## What the cache does -Source: https://nango.dev/docs/reference/backend/http-api/proxy/post.md +The records cache fulfils three roles: ---- -title: 'Proxy - POST requests' -sidebarTitle: 'Proxy - POST requests' -openapi: 'POST /proxy/{anyPath}' ---- - - - Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -### API request - -The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: -* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. -* Provider-Config-Key -* Connection-Id -* Retries - -### API response - -The response from the external API is passed back to you exactly as Nango gets it: -* Response code -* Response headers -* Response body +**Change detection** β€” By tracking every record that has been synced, Nango can tell you which records are new, which have been updated, and which have been deleted. Your application only needs to fetch the delta, reducing bandwidth and processing on your side. -## Put +**Reliable data availability** β€” Fetching from external APIs is inherently unreliable: rate limits, timeouts, and transient errors are common. The cache decouples this unreliable step from your application. Once data lands in the cache, you can fetch it quickly and reliably. -Source: https://nango.dev/docs/reference/backend/http-api/proxy/put.md +**Observability** β€” The cache gives you visibility into the state of synced data directly from the Nango dashboard and API, including record counts, last sync times, and change history. ---- -title: 'Proxy - PUT requests' -sidebarTitle: 'Proxy - PUT requests' -openapi: 'PUT /proxy/{anyPath}' ---- - - - Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -### API request - -The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: -* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. -* Provider-Config-Key -* Connection-Id -* Retries -* Base-Url-Override: provide an API base URL when the base API is not listed in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) or it needs to be overridden - -### API response - -The response from the external API is passed back to you exactly as Nango gets it: -* Response code -* Response headers -* Response body +## How records are identified and compared -## Patch +Each record in the cache is uniquely identified by two things: -Source: https://nango.dev/docs/reference/backend/http-api/proxy/patch.md +- **Record ID** β€” The `id` field you set on each record in your sync function. This should match the unique identifier of the record in the external system (e.g. the external API's primary key). +- **Payload hash** β€” Nango computes a hash of the full record payload. When a record with the same ID is saved again, Nango compares hashes to determine whether the record has actually changed. ---- -title: 'Proxy - PATCH requests' -sidebarTitle: 'Proxy - PATCH requests' -openapi: 'PATCH /proxy/{anyPath}' ---- - - - Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -### API request - -The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: -* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. -* Provider-Config-Key -* Connection-Id -* Retries - -### API response - -The response from the external API is passed back to you exactly as Nango gets it: -* Response code -* Response headers -* Response body +If the ID already exists and the hash is identical, the record is considered unchanged and no update is emitted. If the hash differs, Nango marks it as updated. -## Delete + +Be careful with fields that change on every fetch but don't represent a meaningful change to the record, such as a `fetched_at` timestamp. Including such fields in the payload will cause Nango to report spurious updates on every sync run. If possible, exclude or normalize these fields before calling `batchSave()`. + -Source: https://nango.dev/docs/reference/backend/http-api/proxy/delete.md +## How records are stored ---- -title: 'Proxy - DELETE requests' -sidebarTitle: 'Proxy - DELETE requests' -openapi: 'DELETE /proxy/{anyPath}' ---- - - - Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -### API request - -The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: -* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. -* Provider-Config-Key -* Connection-Id -* Retries -* Base-Url-Override: provide an API base URL when the base API is not listed in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) or it needs to be overridden - -### API response - -The response from the external API is passed back to you exactly as Nango gets it: -* Response code -* Response headers -* Response body +The cache only keeps the **latest version** of each record β€” there is no versioning or history of payloads. When you call `batchSave()` with an existing ID, the previous payload is overwritten. -## List +When you call `batchDelete()`, you only need to pass the record's `id`. This does **not** remove the record from the cache. Instead, it marks the record as deleted (a soft delete), so your application can react to the deletion event. The last-known payload is preserved. -Source: https://nango.dev/docs/reference/backend/http-api/providers/list.md +```ts +// Saving records to the cache +await nango.batchSave(contacts, 'Contact'); ---- -title: 'List all providers' -openapi: 'GET /providers' ---- - - -```json Example Response -{ - "data": [ - { - "name": "hubspot", - "logo_url": "https://app.nango.dev/images/template-logos/hubspot.svg", - "display_name": "HubSpot", - "categories": ["marketing","support","crm"], - "auth_mode": "OAUTH2", - "authorization_url": "https://app.hubspot.com/oauth/authorize", - "token_url": "https://api.hubapi.com/oauth/v1/token", - "connection_configuration": ["portalId"], - "post_connection_script": "hubspotPostConnection", - "webhook_routing_script": "hubspotWebhookRouting", - "proxy": { - "base_url": "https://api.hubapi.com", - "decompress": true, - "paginate": { - "type": "cursor", - "cursor_path_in_response": "paging.next.after", - "limit_name_in_request": "limit", - "cursor_name_in_request": "after", - "response_path": "results" - } - }, - "docs": "https://nango.dev/docs/api-integrations/hubspot" - }, - { - "name": "posthog", - "logo_url": "https://app.nango.dev/images/template-logos/posthog.svg", - "display_name": "PostHog", - "categories": ["dev-tools"], - "auth_mode": "API_KEY", - "proxy": { - "base_url": "https://api.posthog.com", - }, - "docs": "https://nango.dev/docs/api-integrations/posthog" - } - ] -} -``` - +// Marking records as deleted (soft delete) +const toDelete = [{ id: 'record-123' }, { id: 'record-456' }]; +await nango.batchDelete(toDelete, 'Contact'); +``` -## Get +## Fetching records: the change stream -Source: https://nango.dev/docs/reference/backend/http-api/providers/get.md +The [GET /records](/reference/backend/http-api/sync/records-list) endpoint returns a **chronologically ordered stream of record changes**. Each entry in the stream includes: ---- -title: 'Get a provider' -openapi: 'GET /providers/{provider}' ---- - - -```json Example Response -{ - "data": { - "name": "hubspot", - "logo_url": "https://app.nango.dev/images/template-logos/hubspot.svg", - "display_name": "HubSpot", - "categories": ["marketing","support","crm"], - "auth_mode": "OAUTH2", - "authorization_url": "https://app.hubspot.com/oauth/authorize", - "token_url": "https://api.hubapi.com/oauth/v1/token", - "connection_configuration": ["portalId"], - "post_connection_script": "hubspotPostConnection", - "webhook_routing_script": "hubspotWebhookRouting", - "proxy": { - "base_url": "https://api.hubapi.com", - "decompress": true, - "paginate": { - "type": "cursor", - "cursor_path_in_response": "paging.next.after", - "limit_name_in_request": "limit", - "cursor_name_in_request": "after", - "response_path": "results" - } - }, - "docs": "https://nango.dev/docs/api-integrations/hubspot" - } -} -``` - +- The full record payload +- Metadata indicating whether the record was `ADDED`, `UPDATED`, or `DELETED` +- A cursor for tracking your sync progress -## List provider templates +```json +{ + "records": [ + { + "id": "contact-1", + "name": "Alice", + "_nango_metadata": { + "first_seen_at": "2024-01-15T10:00:00.000Z", + "last_modified_at": "2024-01-15T10:00:00.000Z", + "last_action": "ADDED", + "deleted_at": null, + "cursor": "MjAyNC0wMS0xNVQxMDowMDowMC..." + } + }, + { + "id": "contact-2", + "name": "Bob (updated)", + "_nango_metadata": { + "first_seen_at": "2024-01-10T08:00:00.000Z", + "last_modified_at": "2024-01-15T10:05:00.000Z", + "last_action": "UPDATED", + "deleted_at": null, + "cursor": "MjAyNC0wMS0xNVQxMDowNTowMC..." + } + } + ], + "next_cursor": "MjAyNC0wMS0xNVQxMDowNTowMC..." +} +``` -Source: https://nango.dev/docs/reference/backend/http-api/providers/templates.md +You can filter the stream to only return records with a specific `last_action` (`added`, `updated`, or `deleted`) using the `filter` query parameter. -Returns the template functions available in the catalog for a provider. +## Cursors and sync progress -## List +Every record change in the cache has a **cursor** attached to it. Cursors are opaque, ordered strings that let you: -Source: https://nango.dev/docs/reference/backend/http-api/connection/list.md +1. **Track how far you've synced** β€” After fetching records, persist the cursor of the last record you processed. On the next fetch, pass it back to only receive changes that happened after that point. +2. **Paginate through large result sets** β€” The same cursor is used for pagination when there are more records than the page `limit`. ---- -title: 'List connections (deprecated)' -openapi: 'GET /connection' ---- - - - Requires an API key with one of: `environment:connections:list` or `environment:connections:list_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - - - ```json Example Response -{ - "connections": [ - { - "id": 1, - "connection_id": "test-1", - "provider": "slack", - "provider_config_key": "slack-nango-community", - "created": "2023-06-03T14:53:22.051Z", - "metadata": null, - "tags": { - "end_user_id": "your-internal-id", - "end_user_email": "user@example.com", - "organization_id": "user-organization-id" - }, - "errors": [{ "type": "auth", "log_id": "VrnbtykXJFckCm3HP93t"}] - }, - { - "id": 2, - "connection_id": "test-2", - "provider": "slack", - "provider_config_key": "slack-nango-community", - "created": "2023-06-03T15:00:14.945Z", - "metadata": { - "bot_id": "some-uuid" - }, - "tags": { - "end_user_id": "your-internal-id", - "end_user_email": "user@example.com", - "organization_id": "user-organization-id" - }, - "errors": [] - } - ] -} - ``` - + +You must persist the cursor on your side for each combination of **connection** and **sync function**. This is how you keep track of your sync progress and avoid reprocessing records. + -## Get + + +```ts +import { Nango } from '@nangohq/node'; -Source: https://nango.dev/docs/reference/backend/http-api/connection/get.md +const nango = new Nango({ secretKey: '' }); ---- -title: 'Get connection & credentials (deprecated)' -openapi: 'GET /connection/{connectionId}' ---- - - - Requires an API key with one of: `environment:connections:read` or `environment:connections:read_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - - - -The response content depends on the API authentication type (e.g: OAuth 2, OAuth 1, API key, etc.). - -If you do not want to deal with collecting & injecting credentials in requests for multiple authentication types, use the [Proxy](/guides/platform/proxy-requests). - - - - -Every time you fetch the connection with this API endpoint, Nango will check if the access token has expired. If it has, it will refresh it. - -**We recommend you always fetch the token just before you use it to make sure it is fresh!** - - +// Fetch only records that changed since your last cursor +const result = await nango.listRecords({ + providerConfigKey: '', + connectionId: '', + model: 'Contact', + cursor: '' +}); -## Post +// Process records... -Source: https://nango.dev/docs/reference/backend/http-api/connection/post.md +// Persist the cursor of the last record for next time +if (result.records.length > 0) { + const lastCursor = result.records[result.records.length - 1]._nango_metadata.cursor; + await saveToDatabase(connectionId, syncName, lastCursor); +} +``` + + +```bash +curl -G https://api.nango.dev/records \ + --header 'Authorization: Bearer ' \ + --header 'Provider-Config-Key: ' \ + --header 'Connection-Id: ' \ + --data-urlencode 'model=Contact' \ + --data-urlencode 'cursor=' +``` + + ---- -title: 'Import a connection (deprecated)' -openapi: 'POST /connection' ---- - - - Requires an API key with the `environment:connections:create` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## When to use - -Use this API endpoint to import existing access tokens into Nango. It is mostly meant for one-off bulk imports when onboarding Nango, or for migrating existing connections when a provider introduced changes to its auth flow. - -If a connection with the same `connection_id` and `provider_config_key` already exists, the endpoint updates it with the provided credentials instead of creating a new one. - -To trigger OAuth flows with Nango, use the [Nango frontend SDK](/reference/frontend/frontend-sdk). - -## Request body - -You can use this endpoint to import OAuth 2, OAuth 1, API Keys, and Basic auth credentials. - -The required fields depend on the type of authentication of the _connections_ you are trying to import. +## Re-syncing: preserve vs. clear the cache -## Set Metadata +See [Re-syncing: resetting checkpoints and the cache](/guides/functions/syncs/checkpoints#re-syncing-resetting-checkpoints-and-the-cache) in the Checkpoints guide for the `reset` / `emptyCache` options and their implications. -Source: https://nango.dev/docs/reference/backend/http-api/connection/set-metadata.md +## Cache summary ---- -title: 'Set connection metadata (deprecated)' -openapi: 'POST /connection/metadata' ---- - - - Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Set _connection metadata_ - -Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides any existing metadata. The connection_id must be passed in the body as well. Note that the connection_id can be a single string or an array of strings. - -## Fetching _connection metadata_ - -To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. +| Concept | Details | +| --- | --- | +| **Writing to the cache** | `nango.batchSave()` and `nango.batchDelete()` in sync functions | +| **Reading from the cache** | `GET /records` endpoint or `nango.listRecords()` SDK method | +| **Record identity** | Determined by the `id` field you set on each record | +| **Change detection** | Based on comparing payload hashes for the same `id` | +| **Versioning** | None β€” only the latest payload is kept | +| **Deletions** | Soft delete β€” record is marked as deleted, payload is preserved | +| **Cursor** | Opaque ordered string for tracking sync progress and pagination | +| **Payload TTL** | 30 days without update β†’ payload pruned | +| **Full record TTL** | 60 days without sync execution β†’ all records hard-deleted | -## Set Metadata Legacy +## Related guides -Source: https://nango.dev/docs/reference/backend/http-api/connection/set-metadata-legacy.md +- [Sync functions](/guides/functions/syncs/sync-functions) - write records into the cache. +- [Sync efficiency](/guides/functions/syncs/sync-efficiency) - keep records small and consume changes promptly. +- [Deletion detection](/guides/functions/syncs/deletion-detection) - mark records deleted in the cache. +- [Get records API](/reference/backend/http-api/sync/records-list) - fetch changed records from your app. ---- -title: 'Set connection metadata (deprecated)' -openapi: 'POST /connection/{connectionId}/metadata' ---- - - - Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Set _connection metadata_ - -Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides any existing metadata. - -## Fetching _connection metadata_ - -To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. +## Deletion Detection -## Update Metadata - -Source: https://nango.dev/docs/reference/backend/http-api/connection/update-metadata.md - ---- -title: 'Edit connection metadata (deprecated)' -openapi: 'PATCH /connection/metadata' ---- - - - Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Update _connection metadata_ - -Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides specified properties, not the entire metadata. The connection_id must be passed in the body as well. Note that the connection_id can be a single string or an array of strings. - -## Fetching _connection metadata_ - -To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. +Source: https://nango.dev/docs/guides/functions/syncs/deletion-detection.md -## Update Metadata Legacy +--- +title: 'Deletion detection' +sidebarTitle: 'Deletion detection' +description: 'Surface deletes from the external API β€” even when the API itself doesn''t expose them cleanly.' +--- -Source: https://nango.dev/docs/reference/backend/http-api/connection/update-metadata-legacy.md +Sometimes you need to know when a record you are syncing has been deleted in the external system. Deletion detection works differently depending on whether your sync function is incremental or full β€” pick the strategy that matches your sync approach. ---- -title: 'Edit connection metadata (deprecated)' -openapi: 'PATCH /connection/{connectionId}/metadata' ---- - - - Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - - -## Update _connection metadata_ - -Nango uses the request body as the new metadata (it must be a JSON object). - -## Fetching _connection metadata_ - -To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. +For incremental syncs, you must actively tell Nango which IDs have been removed. For full syncs (which fetch all records on every run), Nango can compute deletes for you automatically. -## Delete +## Detecting deletes in incremental syncs -Source: https://nango.dev/docs/reference/backend/http-api/connection/delete.md +When your sync only fetches changed data since the previous run, Nango has no built-in way to know which records disappeared on the provider side. ---- -title: 'Delete a connection (deprecated)' -openapi: 'DELETE /connection/{connectionId}' ---- - - - Requires an API key with the `environment:connections:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). - +You must actively tell Nango which IDs have been removed by calling `nango.batchDelete()` ([full reference](/reference/functions/functions-sdk#delete-records)) inside the sync function. -## Node +### When can you use this? -Source: https://nango.dev/docs/reference/backend/backend-sdk/node.md +You can use `nango.batchDelete()` if the external API supports one of the following: -The backend SDK lets you interact with the Nango API. It is available on [NPM](https://www.npmjs.com/package/@nangohq/node) as `@nangohq/node`. +- A dedicated "recently deleted" endpoint (e.g. `GET /entities/deleted?since=...`) +- The ability to filter or sort by a deletion timestamp +- The ability to filter or sort by last-modified timestamp and records include a flag like `is_deleted`, `archived`, etc. -## Instantiate the backend SDK +If none of these are available, you cannot detect deletes in an incremental sync. You'll either need to switch to a full sync or skip deletion detection. -Install it with your favorite package manager, e.g.: +### Example -```bash -npm i -S @nangohq/node -``` +```ts +import { createSync } from 'nango'; +import * as z from 'zod'; -Instantiate the `Nango` class: +const AccountSchema = z.object({ + id: z.string(), + name: z.string() +}); -```js -import { Nango } from '@nangohq/node'; +export default createSync({ + description: 'Sync Accounts incrementally and handle deletions', + frequency: 'every 2 hours', + endpoints: [{ method: 'GET', path: '/accounts', group: 'Accounts' }], + models: { Account: AccountSchema }, + checkpoint: z.object({ + lastSyncedISO: z.string(), + }), + + exec: async (nango) => { + const checkpoint = await nango.getCheckpoint(); + const now = new Date().toISOString(); + + // (1) Fetch newly created / updated accounts + const res = await nango.get({ + endpoint: '/accounts', + params: { ...(checkpoint && { since: checkpoint.lastSyncedISO }) } + }); + await nango.batchSave(res.data, 'Account'); + + // (2) Fetch deletions since the last run (if this is not the first run) + if (checkpoint) { + const deletedRes = await nango.get({ + endpoint: '/accounts/deleted', + params: { since: checkpoint.lastSyncedISO } + }); + + // (3) Tell Nango which IDs have been deleted in the external system + const toDelete = deletedRes.data.map((row: any) => ({ id: row.id })); + if (toDelete.length) { + await nango.batchDelete(toDelete, 'Account'); + } + } -const nango = new Nango({ apiKey: '' }); + // (4) Save checkpoint for next run + await nango.saveCheckpoint({ lastSyncedISO: now }); + } +}); ``` -**Parameters** +## Detecting deletes in full syncs - - - - - Your environment API key, found in **Environment Settings > API Keys** in the Nango UI. Sent as the bearer token for API calls. This key should never be shared. - +Sync functions that fetch all records on every run can automatically detect deletions. - - Deprecated alias for `apiKey`, kept for backward compatibility. Provide either `apiKey` or `secretKey`. - +Nango detects removals by computing the diff between what existed before `trackDeletesStart` and what was saved between `trackDeletesStart` and `trackDeletesEnd` ([full reference](/reference/functions/functions-sdk#detect-deletions-automatically)). - - The environment's webhook signing key, found in **Environment Settings > Webhooks > Signing key**. Used by `verifyIncomingWebhookRequest` to validate incoming webhook signatures. Falls back to `secretKey` when omitted. On environments created after 2026-04-20 (or any environment that later rotated its API key), the signing key differs from the API key, so set this explicitly to verify webhooks. - +This works whether your full sync uses checkpoints for resilience or not. If it does, `trackDeletesStart` should be called before fetching any data and `trackDeletesEnd` after all records are saved and the checkpoint is cleared. - - Omitting the host points to Nango Cloud. For local development, use `http://localhost:3003`. Use your instance URL if self-hosting. - - - - +### Example -## Rate limits +```ts +import { createSync } from 'nango'; +import * as z from 'zod'; -The Nango SDK is rate-limited to prevent abuse and ensure fair usage across all clients. The rate limit is enforced on a per-account basis, with a fixed window of time and a maximum number of requests allowed within that window. +const TicketSchema = z.object({ + id: z.string(), + subject: z.string(), + status: z.string() +}); -If a client exceeds the rate limit, the API will respond with a 429 `Too Many Requests` status code. In this case, the `Retry-After` header is included, indicating the number of seconds the client should wait before making another request to avoid being rate-limited. +export default createSync({ + description: 'Fetch all help-desk tickets', + frequency: 'every day', + endpoints: [{ method: 'GET', path: '/tickets', group: 'Tickets' }], + models: { Ticket: TicketSchema }, -To handle rate limiting gracefully, clients should monitor for the 429 status code and honor the `Retry-After` header value provided in the response. + exec: async (nango) => { + // Mark the start of deletion tracking + await nango.trackDeletesStart('Ticket'); -```js -// Example: -try { - const res = await nango.listIntegrations(); - ... -} catch(err) { - if (err.response.status === 429) { - const retryAfter = err.response.headers['retry-after']; - // wait and retry - ... - } - ... -} -``` + const tickets = nango.paginate<{ id: string; subject: string; status: string }>({ + endpoint: '/tickets', + paginate: { type: 'cursor', cursor_path_in_response: 'next', cursor_name_in_request: 'cursor', response_path: 'tickets' } + }); -## Integrations + for await (const page of tickets) { + await nango.batchSave(page, 'Ticket'); + } -### List all integrations + // Detect and mark deleted records + await nango.trackDeletesEnd('Ticket'); + } +}); +``` -Returns a list of integrations. +### How the algorithm works -```js -await nango.listIntegrations() -``` +1. When `trackDeletesStart` is called, Nango marks the beginning of the deletion tracking window for the model. +2. Records saved with `batchSave` between `trackDeletesStart` and `trackDeletesEnd` are tracked. +3. When `trackDeletesEnd` is called, Nango compares what existed before `trackDeletesStart` with what was saved in the window. +4. Any records missing from the new dataset are marked as deleted (soft delete). They remain accessible from the Nango cache, but with `record._metadata.deleted === true`. -**Example Response** + +**Be careful with exception handling when using** `trackDeletesStart`/`trackDeletesEnd` - -```json -{ - "configs": [ - { - "unique_key": "slack-nango-community", - "provider": "slack", - "logo": "http://localhost:3003/images/template-logos/slack.svg", - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z", - }, - { - "unique_key": "github-prod", - "provider": "github", - "logo": "http://localhost:3003/images/template-logos/github.svg", - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z", - }, - ] -} -``` - +Nango only performs deletion detection (the "diff") if a sync run completes successfully without any uncaught exceptions. -### Get an integration +Exception handling is critical: +- If your sync doesn't fetch the full dataset between the two calls (e.g. you catch and swallow an exception), Nango will attempt the diff on an incomplete dataset. +- This leads to false positives, where valid records are mistakenly considered deleted. -Returns a specific integration. +**What You Should Do** -```js -await nango.getIntegration({ uniqueKey: }); +If a failure prevents full data retrieval, make sure the sync run fails and `trackDeletesEnd` is not being called: +- Let exceptions bubble up and interrupt the run. +- If you're using `try/catch`, re-throw exceptions that indicate incomplete data. + -// Deprecated -await nango.getIntegration(); -``` + +**How to use** `trackDeletesStart`/`trackDeletesEnd` **safely** -**Parameters** +If some records are incorrectly marked as deleted, you can trigger a full resync (via the UI or API) to restore the correct data state. - - - The integration ID - - - Include sensitive data. Allowed values: `webhook`, `credentials` - - +We strongly recommend not performing irreversible destructive actions (like hard-deleting records in your system) based solely on deletions reported by Nango. A full resync should always be able to recover from issues. + -**Example Response** +## Troubleshooting deletion detection issues - -```json -{ - "data": { - "unique_key": "slack-nango-community", - "display_name": "Slack", - "provider": "slack", - "logo": "http://localhost:3003/images/template-logos/slack.svg", - "forward_webhooks": true, - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z" - } -} -``` - +| Symptom | Likely cause | +| --- | --- | +| Records that still exist in the source API are shown as `deleted` in Nango | Sync didn't save all records (silent failures) between `trackDeletesStart` and `trackDeletesEnd` | +| You never see deleted records | Check if deletion detection is implemented for the sync. | -### Create an integration +## Related guides -Create a new integration. +- [Sync functions](/guides/functions/syncs/sync-functions) - implement full and incremental syncs. +- [Records cache](/guides/functions/syncs/records-cache) - understand how deleted records are exposed to your app. +- [Sync efficiency](/guides/functions/syncs/sync-efficiency) - reduce API work during delete detection. +- [Functions SDK reference](/reference/functions/functions-sdk#delete-records) - deletion helper methods. -```js -await nango.createIntegration({ provider: '', unique_key: '' }); -``` +## Realtime Syncs -**Parameters** +Source: https://nango.dev/docs/guides/functions/syncs/realtime-syncs.md - - - The ID of the API provider in Nango (cf. [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) for a list of API provider IDs.) - +--- +title: 'Real-time syncs with webhooks' +sidebarTitle: 'Real-time syncs' +description: 'Combine webhooks from external APIs with periodic polling for a reliable, real-time stream of changes.' +--- - - The integration ID. - +Nango supports real-time syncs using [webhook functions](/guides/functions/webhook-functions). You can rely entirely on webhooks or combine them with polling to ensure you never miss data. - - The display name of this integration - +## What is a real-time sync - - The credentials to include depend on the specific integration that you want to create. - +Real-time sync involves receiving webhooks from external APIs and processing them inside a sync function. By default, sync functions poll data at a set frequency, but they can also be configured to handle webhooks for real-time updates. - - Provider-specific configuration for providers with an `integration_config` schema (e.g. `private-api-generic`, `aws-sigv4`). See the provider's integration page for fields. - +When processed in a sync: +- The webhook triggers the execution of a Nango sync script +- The script extracts data from the webhook and optionally fetches additional data from the external API +- The modified data is stored in the Nango cache - - Whether to forward webhooks received for this integration. Defaults to `true`. - - +Whenever the cache is updated, Nango sends a [sync completion webhook](/guides/platform/webhooks-from-nango#sync-webhooks) to notify your application of new data. This entire process happens in real-time. -**Example Response** +### Webhooks & periodic polling - -```json -{ - "data": { - "unique_key": "slack-nango-community", - "provider": "slack", - "logo": "http://localhost:3003/images/template-logos/slack.svg", - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z", - } -} -``` - +Webhooks can fail due to external API outages or unordered events. Periodic polling ensures data consistency by reconciling any missed updates. -### Update an integration +If you use webhooks for real-time syncs, we recommend always combining them with a polling sync function. -Patch an integration. The first argument identifies the integration; all body fields are optional and only the fields you pass are updated. +### Near real-time syncing -```js -await nango.updateIntegration({ uniqueKey: '' }, { display_name: 'New name' }); -``` +As an alternative to real-time syncing, consider **near**-real-time syncing by polling at a higher frequency, which is simpler. Sync functions can run as frequently as every 30 seconds. -**Parameters** +This is more resource intensive, but can be a good compromise if you are only syncing data for a handful of [Connections](/guides/auth/auth-guide#overview). - - - The integration ID to update. Passed in the first argument. - +## Implement a real-time sync - - A new integration ID, to rename the integration. Not allowed when the integration has active connections. - +### Step 1 β€” Setup prerequisites - - The display name of this integration - +To create a real-time sync, you need: +- Webhooks from the external API enabled. Follow [Webhook functions](/guides/functions/webhook-functions). +- A sync function for the object you want to sync. See [Sync functions](/guides/functions/syncs/sync-functions). - - Whether to forward webhooks received for this integration. - +### Step 2 β€” Enable webhooks processing - - The credentials to include depend on the specific integration that you want to update. - +To enable the real-time sync, define `webhookSubscriptions` and `onWebhook` in your sync function: - - Provider-specific configuration for providers with an `integration_config` schema. Only the fields you pass are updated. - +```typescript +export default createSync({ + exec: async (nango) => { + // Use for periodic polling. + }, - - Free-form custom values for providers without an `integration_config` schema. - - + webhookSubscriptions: ['contact.propertyChange'], // Webhook event type to listen to -**Example Response** + // Webhook handler + onWebhook: async (nango, payload) => { + if (payload.subscriptionType === 'contact.propertyChange') { + const updatedObject = { + id: payload.objectId, + [payload.propertyName]: payload.propertyValue + }; - -```json -{ - "data": { - "unique_key": "slack-nango-community", - "provider": "slack", - "logo": "http://localhost:3003/images/template-logos/slack.svg", - "created_at": "2023-10-16T08:45:26.241Z", - "updated_at": "2023-10-16T08:45:26.241Z", + // Use nango.batchSave() or nango.batchUpdate() to save/update records. } -} + } +}); ``` - -### Delete an integration +To check if a sync supports webhooks, navigate to the _Integrations_ tab > select an integration > _Endpoints_ sub-tab > check the function settings for webhook subscriptions. -Deletes a specific integration. +## Sync concurrency considerations -```js -await nango.deleteIntegration(); -``` +When a polling run and a webhook race to update the same record, the later write wins by default β€” which can clobber a fresher webhook update with stale polled data. To prevent that, set a merging strategy at the start of your function: -**Parameters** +```typescript +export default createSync({ + exec: async (nango) => { + // Don't overwrite records that were modified after this batch was fetched + await nango.setMergingStrategy({ strategy: 'ignore_if_modified_after' }, 'Contact'); - - - The integration ID. - - + const contacts: Contact[] = []; + await nango.batchSave(contacts, 'Contact'); + } +}); +``` -**Example Response** +Two strategies are available: - -```json -{ - "success": true -} -``` - +- **`override`** (default) β€” applies updates regardless of last modification time. May overwrite real-time webhook updates with older polled data. +- **`ignore_if_modified_after`** β€” preserves records that were modified after the current batch was fetched. **Recommended** when you combine polling with webhooks. -## Connect +Run `batchSave` / `batchUpdate` / `batchDelete` calls sequentially (not in parallel), and persist data promptly after fetching β€” concurrent batch operations can race against each other. -### Create a connect session +## Related guides -Create a connect session. The token is short-lived and lasts for 30 minutes. +- [Webhook functions](/guides/functions/webhook-functions) - process external API webhooks in Nango. +- [Webhook forwarding](/guides/platform/webhook-forwarding) - forward provider webhooks to your app. +- [Sync functions](/guides/functions/syncs/sync-functions) - keep a polling sync as reconciliation. +- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - consume sync completion notifications. -```js -const { data } = await nango.createConnectSession({ - // Recommended: copied onto the connection and included in auth webhooks. - tags: { - end_user_id: '', - end_user_email: '', - organization_id: '' - }, +## Sync Partitioning - allowed_integrations: ['', ''], - integrations_config_defaults: { - : { - connection_config: { - : '' - } - } - } -}); -``` +Source: https://nango.dev/docs/guides/functions/syncs/sync-partitioning.md -**Parameters** +--- +title: 'Sync partitioning' +sidebarTitle: 'Sync partitioning' +description: 'Spawn multiple independent sync processes inside a single connection β€” one per mailbox, drive folder, Slack channel, repo, or any other partition.' +--- - +Sync variants let you spawn multiple independent sync processes **inside a single connection** β€” one per mailbox, file folder, Slack channel, repo, or any other sub-resource the end-user has access to. Each variant runs on its own schedule, with its own checkpoint and records cache, so a slow partition doesn't block a fast one. - - Deprecated. Use `tags` instead. - +Nango is already multi-tenant by default β€” every sync function executes in the context of an end-user [Connection](/guides/auth/auth-guide#overview), and runs independently for each connection. Variants are for the next level down: fan-out *within* one connection. - - Deprecated. Use `tags` instead. - - - The unique identifier for the organization. - - - The display name of the organization. - - - +## Overview - - An array of integration IDs that are allowed for this session. - +Traditionally, a sync function is defined once and executed once per connection. With variants, you can create multiple instances of the same function that share the base configuration but run independently. Each variant has its own execution schedule, checkpoint, and data storage. - - Optional. Tags that will be copied onto the created connection and included in auth webhooks. - +Key benefits: +- **Parallel execution** β€” variants run independently, so a slow mailbox or folder doesn't block the others. +- **Custom filtering** β€” each variant can target a different sub-resource (e.g., a specific Gmail label, a specific Drive folder). +- **Per-partition state** β€” each variant has its own checkpoint and cache, so failures and re-syncs are isolated. +- **Dynamic scale** β€” create or delete variants programmatically as the end-user adds/removes sub-resources. - - Default configuration for specific integrations. For OAuth2 integrations, you can allow end-users to provide their own OAuth client credentials by setting empty `oauth_client_id_override` and `oauth_client_secret_override` values: - ```js - integrations_config_defaults: { - google: { - connection_config: { - oauth_client_id_override: '', - oauth_client_secret_override: '' - } - } - } - ``` - When set to empty strings, Connect UI will display optional input fields for users to enter their own OAuth app credentials. +## How sync variants work - `connection_config` also accepts `webhook_url` to override the environment's webhook URLs for the connection created with this session. When set, that connection's webhooks are sent only to this URL. See [Override webhook URLs per connection](/guides/platform/webhooks-from-nango#override-webhook-urls-per-connection). - ```js - integrations_config_defaults: { - '': { - connection_config: { - webhook_url: 'https://.ngrok.app/webhooks-from-nango' - } - } - } - ``` - +- By default, a sync is associated with a base variant. +- You can create additional sync variants programmatically using the API or SDK. +- Each variant is treated as a separate sync in the Nango UI. +- Sync webhooks include a variant field to identify which variant was executed. +- External webhooks (e.g., from Airtable) are always processed by the base variant. +- If a sync variant needs additional context (e.g., filtering parameters), store/retrieve it using the connection metadata, namespaced with the variant ID. - - Override Connect UI settings per integration. The key is your integration's unique ID (e.g. `jira`, `slack`, `github`) and the value is an object with the settings to override. Currently supports overriding the documentation URL shown in info icons during the connect flow: - ```js - overrides: { - '': { - docs_connect: 'https://your-docs.com/how-to-connect' - } - } +## Creating a sync variant + + +Each sync can have a maximum of **100 variants** per connection. For heavier workloads, reach out to increase this limit. + + +To create a sync variant, use the Nango API or SDK. The variant must have a unique name and cannot be "base" (reserved). + + + + ```ts + // Create a sync variant + await nango.createSyncVariant({ + provider_config_key: 'my-integration', + connection_id: 'customer-123', + name: 'sync-orders', + variant: 'high-value-orders' + }); ``` - Available on the [Growth plan](https://www.nango.dev/pricing). - - + + + ```bash + curl --request POST \ + --url https://api.nango.dev/sync/sync-orders/variant/high-value-orders \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "provider_config_key": "my-integration", + "connection_id": "customer-123" + }' + ``` + + -**Returns** +This creates a new variant named `high-value-orders` for the `sync-orders` sync. It will run separately from the base variant. - -```json -{ - "data": { - "token": "nango_connect_session_4603dbca8a588315ba69b5bfddde52e72d312dc2d2870bd5e45da6357333601c", - "connect_link": "https://connect.nango.dev/?session_token=nango_connect_session_4603dbca8a588315ba69b5bfddde52e72d312dc2d2870bd5e45da6357333601c", - "expires_at": "2024-09-27T19:49:51.449Z" - } -} -``` - +## Running & managing sync variants -### Create a reconnect session +Once created, a variant can be managed just like a regular sync. All sync operations (triggering, pausing, resuming, etc.) support the variant parameter. -Create a reconnect session for a given `connection_id`. -You can pass `tags` to update connection attribution during reconnection. -Use this method when a user needs to input new credentials or to manually refresh token. +Check out the [HTTP API reference](/reference/backend/http-api/sync/trigger) or [Node SDK reference](/reference/backend/backend-sdk/node#trigger-syncs) for details. -This method is only compatible with `connection_id` created with a session token. +## Accessing the variant in a sync script -```js -const { data } = await nango.createReconnectSession({ - // Required - connection_id: '', - integration_id: '', +When a sync script runs, the variant name is available via `nango.variant`. You can use this to customize the behavior of your sync. - // Optional - tags: { - end_user_id: '', - end_user_email: '', - organization_id: '' +```ts example-partitioned-sync-script.ts +export default createSync({ + exec: async (nango) => { + await nango.log(`Running sync with variant: ${nango.variant}`); + + // Use the variant name to namespace the metadata and/or customize API calls. + const res = await nango.get({ + endpoint: `/orders?filter=${nango.variant}` + }); + + // Records are saved in the context of this specific variant. + await nango.batchSave(res.data.orders, 'Order'); }, - integrations_config_defaults: { - : { - connection_config: { - : '' - } - } - } }); ``` -**Parameters** +## Fetching data for a variant - - - The unique identifier for the connection. - +Use the `variant` query parameter when retrieving records from the Nango API. - - The unique identifier for the integration. - + + + ```ts + const records = await nango.listRecords({ + providerConfigKey: 'my-integration', + connectionId: 'customer-123', + model: 'Order', + variant: 'high-value-orders' + }); + ``` + + + ```bash + curl --request GET \ + --url "https://api.nango.dev/records?model=Order&variant=high-value-orders" \ + --header 'Authorization: Bearer ' + ``` + + - - Optional. Tags to apply to the connection during reconnection. - +This fetches only the records for the `high-value-orders` variant. - - Deprecated. Use `tags` instead. - +## Storing variant-specific context - - Deprecated. Use `tags` instead. - - - The unique identifier for the organization. - - - The display name of the organization. - - - +If a sync variant requires custom parameters (e.g., a filtering threshold), store them in the connection metadata, namespaced by the variant ID. - - Default configuration for specific integrations. - - +Storing metadata: -**Returns** + + + ```ts + await nango.setMetadata('my-integration', 'customer-123', { + 'high-value-orders.threshold': 500 + }); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/metadata \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "connection_id": "customer-123", + "metadata": { + "high-value-orders.threshold": 500 + } + }' + ``` + + - -```json -{ - "data": { - "token": "nango_connect_session_4603dbca8a588315ba69b5bfddde52e72d312dc2d2870bd5e45da6357333601c", - "connect_link": "https://connect.nango.dev/?session_token=nango_connect_session_4603dbca8a588315ba69b5bfddde52e72d312dc2d2870bd5e45da6357333601c", - "expires_at": "2024-09-27T19:49:51.449Z" - } -} +Retrieving metadata in a sync script: + +```ts example-partitioned-sync-script.ts +const metadata = await nango.getMetadata(); +const threshold = metadata[`${nango.variant}.threshold`] || 100; + +await nango.log(`Filtering orders above ${threshold}`); ``` - -## Connections +Keep variants non-overlapping in data scope (unless intentional), store variant-specific settings in connection metadata rather than hardcoding them, and avoid creating one variant per row of data β€” variants are best for partitioning, not row-level fan-out. -### List connections +## Related guides -Returns a list of connections without credentials. +- [Sync functions](/guides/functions/syncs/sync-functions) - build the base sync before adding variants. +- [Checkpoints](/guides/functions/syncs/checkpoints) - track progress per variant. +- [Records cache](/guides/functions/syncs/records-cache) - fetch data for each variant. +- [Create sync variant API](/reference/backend/http-api/sync/create-variant) - manage variants programmatically. -```js -await nango.listConnections({ - connectionId: 'connection-id', - integrationId: 'integration-456', - limit: 100, - tags: { "end_user_id": 'user-123' } +## Action Functions + +Source: https://nango.dev/docs/guides/functions/action-functions.md + +--- +title: 'Action functions' +sidebarTitle: 'Action functions' +description: 'Build Action functions that your app, backend jobs, or agents can call on demand.' +--- + +Action functions run when your app, backend job, or agent explicitly calls them. In SDK and API names, this function type is often called an **action** because it receives an input and returns an output. + +Use action functions for reads, writes, multi-step provider workflows, unified API operations, and AI tools. + +## Create the function + +Add a file under the integration's `actions/` folder: + +```typescript github/actions/create-issue.ts +import { createAction } from 'nango'; +import * as z from 'zod'; + +export default createAction({ + description: 'Creates a GitHub issue', + version: '1.0.0', + input: z.object({ + owner: z.string(), + repo: z.string(), + title: z.string(), + body: z.string().optional() + }), + output: z.object({ + id: z.number(), + url: z.string().url() + }), + exec: async (nango, input) => { + const response = await nango.post({ + endpoint: `/repos/${input.owner}/${input.repo}/issues`, + data: { + title: input.title, + body: input.body + } + }); + + return { + id: response.data.id, + url: response.data.html_url + }; + } }); ``` -**Parameters** +Import it from `index.ts`: - - - - - Optional. Will exactly match a given connectionId. Can return multiple connections with the same ID across integrations. - - - Deprecated. Prefer filtering connections using `tags` instead (e.g. `end_user_id`). - - - Optional. Filter by integration ID. - - - Optional. Filter by tags associated with connections. - - - - +```typescript index.ts +import './github/actions/create-issue'; +``` -**Example Response** + + The output of an action function cannot exceed 2 MB. Return only the fields your app needs. For larger payloads, use the [requests proxy](/guides/platform/proxy-requests) to fetch data directly from your app. + - -```json -{ - "connections": [ - { - "id": 1, - "connection_id": "test-1", - "provider": "slack", - "provider_config_key": "slack-nango-community", - "created": "2023-06-03T14:53:22.051Z", - "metadata": null, - "tags": { - "end_user_id": "your-internal-id", - "end_user_email": "user@example.com", - "organization_id": "user-organization-id" - }, - "errors": [] - }, - { - "id": 2, - "connection_id": "test-2", - "provider": "slack", - "provider_config_key": "slack-nango-community", - "created": "2023-06-03T15:00:14.945Z", - "metadata": { - "bot_id": "some-uuid" - }, - "tags": { - "end_user_id": "your-internal-id", - "end_user_email": "user@example.com", - "organization_id": "user-organization-id" - }, - "errors": [{ "type": "auth", "log_id": "VrnbtykXJFckCm3HP93t"}] - } - ] -} -``` - + + Before generating an action function, collect the integration ID, connection ID for testing, provider endpoint, required input fields, expected output shape, and whether the operation is safe to retry. -### Get a connection (with credentials) + Prefer explicit Zod schemas and short provider response mapping. If the action performs writes, make the logic idempotent before using async execution or retries. + -Returns a specific connection with credentials. +## Test and deploy -```js -await nango.getConnection(, ); +Dry run the function with realistic input: + +```bash +nango dryrun create-issue '' -e dev --input '{"owner":"NangoHQ","repo":"interactive-demo","title":"Bug report","body":"Created from a Nango action"}' ``` - -The response content depends on the API authentication type (OAuth 2, OAuth 1, API key, Basic auth, etc.). +Deploy your functions: -If you do not want to deal with collecting & injecting credentials in requests for multiple authentication types, use the Proxy ([step-by-step guide](/guides/platform/proxy-requests)). - +```bash +nango deploy +``` - -When you fetch the connection with this API endpoint, Nango will check if the access token has expired. If it has, it will refresh it. +To deploy only this action function: -We recommend not caching tokens for longer than 5 minutes to ensure they are fresh. - +```bash +nango deploy --action create-issue dev +``` -**Parameters** +For broader test coverage, see the [testing guide](/guides/functions/testing). To deploy from CI, see [CI/CD](/guides/functions/ci-cd). - - - The integration ID. - - - The connection ID. - - - Defaults to `false`. If `false`, the token will only be refreshed if it expires within 15 minutes. If `true`, a token refresh attempt will happen on each request. This is only useful for testing and should not be done at high traffic. - - - Defaults to `false`. If `false`, the refresh token is not included in the response, otherwise it is. In production, it is not advised to return the refresh token, for security reasons, since only the access token is needed to sign requests. - - - Defaults to `false`. If true, this will refresh the JWT token for GitHub App / Github App OAuth connections - - +## Trigger synchronously -**Example Response** +Synchronous execution is the default. The API or SDK call returns the function output. - -```json -{ - "id": 18393, - "created_at": "2023-03-08T09:43:03.725Z", - "updated_at": "2023-03-08T09:43:03.725Z", - "provider_config_key": "github", - "connection_id": "1", - "credentials": { - "type": "OAUTH2", - "access_token": "gho_tsXLG73f....", - "refresh_token": "gho_fjofu84u9....", - "expires_at": "2024-03-08T09:43:03.725Z", - "raw": { // Raw token response from the OAuth provider: Contents vary! - "access_token": "gho_tsXLG73f....", - "refresh_token": "gho_fjofu84u9....", - "token_type": "bearer", - "scope": "public_repo,user" - } - }, - "connection_config": { - "subdomain": "myshop", - "realmId": "XXXXX", - "instance_id": "YYYYYYY" - }, - "metadata": { - "myProperty": "yes", - "filter": "closed=true" - } -} -``` - + + + ```typescript + import { Nango } from '@nangohq/node'; -### Patch a connection + const nango = new Nango({ secretKey: process.env.NANGO_SECRET_KEY! }); -Patch a connection. + const result = await nango.triggerAction( + 'github', + '', + 'create-issue', + { + owner: 'NangoHQ', + repo: 'interactive-demo', + title: 'Bug report', + body: 'Created from a Nango action' + } + ); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/action/trigger \ + --header 'Authorization: Bearer ' \ + --header 'Connection-Id: ' \ + --header 'Provider-Config-Key: github' \ + --header 'Content-Type: application/json' \ + --data '{ + "action_name": "create-issue", + "input": { + "owner": "NangoHQ", + "repo": "interactive-demo", + "title": "Bug report", + "body": "Created from a Nango action" + } + }' + ``` + + -```js -await nango.patchConnection({ - connectionId: '', - provider_config_key: '' - }, - { ...body }); -``` +## Trigger asynchronously -**Parameters** +Use async execution for bulk writes, bursty work, or provider endpoints with tight rate limits. Nango queues the execution, applies retries, and lets you poll or receive a webhook when it completes. - - - The body of the connection (see [API Reference](/reference/backend/http-api/connections/patch)). - - - Connection tags (key/value strings). Keys are normalized to lowercase. - - - Maximum string length: 255 - - - - - Deprecated. Use tags instead - - - Deprecated. Uniquely identifies the end user. - - - Deprecated. The email address of the end user. - - - Deprecated. The display name of the end user. - - - Deprecated. Tags associated with the end user. Only accepts string values, up to 64 keys. - - - - - - + + Execution timing for asynchronous actions is not guaranteed. Async actions are currently processed sequentially per environment, so completion time depends on how many actions are queued and how long each one runs. Design callers to handle delays by polling the result endpoint or listening for the completion webhook. + -**Example Response** + + + ```typescript + const { id, statusUrl } = await nango.triggerActionAsync( + 'github', + '', + 'create-issue', + { + owner: 'NangoHQ', + repo: 'interactive-demo', + title: 'Bug report', + body: 'Created from an async Nango action' + } + ); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/action/trigger \ + --header 'Authorization: Bearer ' \ + --header 'Connection-Id: ' \ + --header 'Provider-Config-Key: github' \ + --header 'X-Async: true' \ + --header 'X-Max-Retries: 3' \ + --header 'Content-Type: application/json' \ + --data '{ + "action_name": "create-issue", + "input": { + "owner": "NangoHQ", + "repo": "interactive-demo", + "title": "Bug report", + "body": "Created from an async Nango action" + } + }' + ``` + + - -```json -{ - "success": true -} +Poll the result: + +```typescript +const result = await nango.getAsyncActionResult({ id }); ``` - -### Get connection metadata +The async trigger response includes a `statusUrl` and `id`. Poll `GET /action/` for the result: `404` means the execution is still running, `200` returns the function output, and `500` returns the execution error. -Returns a connection's metadata. +To receive completion events instead of polling, configure [webhooks from Nango to your app](/guides/platform/webhooks-from-nango) and enable the `Async action completed` webhook. -```js -await nango.getMetadata('', 'CONNECTION-ID'); -``` + + Use retries only for idempotent function logic. Retried writes can otherwise create duplicate side effects in the external API. + -If you know the structure of the metadata, you can specify a type; +## Related guides -```ts -interface CustomMetadata { - anyKey: Record; -} -const myTypedMetadata = await nango.getMetadata('', ''); -``` +- [Function tool calling](/guides/functions/tool-calling) +- [Data validation](/guides/functions/data-validation) +- [Rate limits](/guides/functions/rate-limits) +- [Trigger action API](/reference/backend/http-api/action/trigger) +- [Functions SDK reference](/reference/functions/functions-sdk) -**Parameters** +## Webhook Functions - - - The integration ID of the connection. - +Source: https://nango.dev/docs/guides/functions/webhook-functions.md - - The connection ID. - - +--- +title: 'Webhook functions' +sidebarTitle: 'Webhook functions' +description: 'Process external API webhooks inside Nango functions.' +--- -**Example Response** +Webhook functions run when an external API sends a webhook to Nango. Use them when the webhook should execute Nango-hosted logic, update records, normalize events, or mark data for later reconciliation. - -```json -{ - "custom_key1": "custom_value1" -} -``` - +If your app should handle the webhook directly, use [webhook forwarding](/guides/platform/webhook-forwarding) instead. -### Set connection metadata +## Processing or forwarding -Set custom metadata for the connection or connections (overrides existing metadata). +Webhook functions and webhook forwarding both start with the same external event: a provider sends a webhook to Nango. -```js -await nango.setMetadata('', 'CONNECTION-ID', { 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); +Use a webhook function when: -# set an array of connection ids -await nango.setMetadata('', ['CONNECTION-ID', 'CONNECTION-ID-TWO'], { 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); -``` +- Nango should run function code as soon as the provider webhook arrives. +- The webhook should update the records cache. +- The webhook payload needs normalization before your app sees it. +- The event should trigger reconciliation logic inside a sync function. -**Parameters** +Use [webhook forwarding](/guides/platform/webhook-forwarding) when: - - - The integration ID of the connection. - +- Your app already has webhook handling logic. +- You want Nango to attribute the event to a connection and forward it. +- The event should not run Nango function code. - - The connection ID or connection IDs. - +## How routing works - - The custom metadata to store in the connection. - - +External APIs send webhooks to the integration's Nango webhook URL. Find it in **Integrations > [Integration] > Webhooks**. -**Response** +When the provider has a webhook routing script, Nango reads the incoming payload, headers, or allowed query parameters and tries to map the event to one or more Nango connections. Provider-specific guides explain the exact routing fields when extra setup is required. - -```json -{ - "connection_id": "", - "provider_config_key": "", - "metadata": { - "CUSTOM_KEY1": "CUSTOM_VALUE1" - } -} -``` - +If Nango can map the webhook to a connection, the webhook function runs in that connection context. If Nango cannot map the event, the event cannot safely run connection-scoped function logic; use provider-specific setup or webhook forwarding for that case. -### Edit connection metadata +Some providers require one global webhook registration. Others require one webhook subscription per connected account, which you can automate with an [event function](/guides/functions/event-functions). -Edit custom metadata for the connection or connections. Only overrides specified properties, not the entire metadata. + + Before implementing a webhook function, inspect the provider-specific Nango docs for webhook routing requirements. Some providers need the Nango connection ID embedded in the provider webhook payload, while others route automatically from account, team, tenant, or installation identifiers. -```js -await nango.updateMetadata('', 'CONNECTION-ID', { 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); + Do not assume an external webhook payload is already trusted or complete. Keep `onWebhook` short, idempotent, and resilient to duplicates or out-of-order delivery. + -# update an array of connection ids -await nango.updateMetadata('', ['CONNECTION-ID', 'CONNECTION-ID-TWO'], { 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); -``` +## Create the function -**Parameters** +Webhook function logic usually lives on a sync function with `webhookSubscriptions` and `onWebhook`: - - - The integration ID of the connection. - +```typescript crm/syncs/contacts.ts +import { createSync } from 'nango'; +import * as z from 'zod'; - - The connection ID or connection IDs. - +const Contact = z.object({ + id: z.string(), + email: z.string().email().optional(), + updatedAt: z.string().optional() +}); - - The custom metadata to store in the connection. - - +export default createSync({ + description: 'Sync contacts and process contact webhooks', + version: '1.0.0', + frequency: 'every hour', + webhookSubscriptions: ['contact.updated', 'contact.deleted'], + models: { Contact }, + exec: async (nango) => { + // Periodic reconciliation logic. Keep this as the source of truth + // when provider webhooks can be missed, delayed, or partial. + }, + onWebhook: async (nango, payload) => { + if (payload.body.event === 'contact.deleted') { + await nango.batchDelete([{ id: payload.body.contactId }], 'Contact'); + return; + } -**Response** - - -```json -{ - "connection_id": "", - "provider_config_key": "", - "metadata": { - "CUSTOM_KEY1": "CUSTOM_VALUE1" + if (payload.body.event === 'contact.updated' && payload.body.contact) { + await nango.batchSave( + [ + { + id: payload.body.contact.id, + email: payload.body.contact.email, + updatedAt: payload.body.contact.updated_at + } + ], + 'Contact' + ); + } } -} +}); ``` - - -### Delete a connection -Deletes a specific connection. +Import it from `index.ts`: -```js -await nango.deleteConnection('', 'CONNECTION-ID'); +```typescript index.ts +import './crm/syncs/contacts'; ``` -**Parameters** +## Register the provider webhook URL - - - The integration ID of the connection. - +Register the integration's Nango webhook URL in the external API's developer portal. If the provider requires per-connection registration, use an event function after connection creation. - - The connection ID. - - +For example, an event function can call the provider's webhook subscription API with the connection's credentials and store the provider webhook subscription ID in connection metadata for cleanup later. -**Response** +## Test and deploy -Empty response. +Dry run the sync function's `exec` logic: -### Wait for connection +```bash +nango dryrun contacts '' -e dev +``` -Waits for a connection to be created for a given end user and integration. This is useful in agentic flows where you need to wait for a user to complete the OAuth flow before proceeding. +Deploy your functions: -```js -const connection = await nango.waitForConnection('', ''); +```bash +nango deploy ``` - -This method polls for a connection every 2 seconds for up to 60 seconds (30 attempts). If no connection is found within this time, it will throw a timeout error. - +To deploy only this webhook-backed sync function: -**Parameters** +```bash +nango deploy --sync contacts dev +``` - - - The integration ID (provider config key). - +Then send a test webhook from the provider dashboard, CLI, or webhook testing tool to the Nango webhook URL. Check Nango logs for the incoming webhook, routing result, and function execution. - - The end user ID to wait for a connection for. - - +## Keep webhook processing lightweight -**Example Response** +Avoid making slow provider API calls directly from `onWebhook` unless the provider's webhook is explicitly designed for that flow. Webhooks can arrive in bursts, be retried, or arrive out of order. - -```json -{ - "id": 1, - "connection_id": "", - "provider": "slack", - "provider_config_key": "slack-integration", - "created": "2023-06-03T14:53:22.051Z", - "metadata": null, - "errors": [], - "tags": { - "end_user_id": "user-123", - "end_user_email": "user@example.com", - "organization_id": "org-456" - } -} -``` - +Prefer lightweight, idempotent handling in `onWebhook`, and let the sync function's `exec` reconcile full state. -## Integration functions +## Related guides -### List functions +- [Webhook forwarding](/guides/platform/webhook-forwarding) +- [Process external webhooks](/getting-started/use-cases/webhooks-from-external-apis) +- [Real-time syncs](/guides/functions/syncs/realtime-syncs) +- [Event functions](/guides/functions/event-functions) +- [Records cache](/guides/functions/syncs/records-cache) -Returns the functions deployed to an integration, with pagination. +## Event Functions -```ts -await nango.listFunctions({ uniqueKey: 'github' }); -``` +Source: https://nango.dev/docs/guides/functions/event-functions.md -Filter by function type, name, or page: +--- +title: 'Event functions' +sidebarTitle: 'Event functions' +description: 'Run function logic automatically when Nango connection lifecycle events happen.' +--- -```ts -await nango.listFunctions({ uniqueKey: 'github' }, { type: 'action', search: 'issue', page: 0, limit: 20 }); -``` +Event functions run automatically when Nango reaches a connection lifecycle event. They are defined with `createOnEvent()`. -**Parameters** +Use them to validate credentials, register provider webhooks, seed connection-specific metadata, or clean up external resources before a connection is deleted. - - - The integration ID. - - - Filter by function type: `sync`, `action`, or `on-event`. - - - Case-insensitive filter on the function name. - - - Page to return (starts at `0`, default `0`). - - - Results per page (1-100, default `20`). - - +## Choose the lifecycle event -**Example Response** +Supported events: - -```json -{ - "data": [ - { - "type": "action", - "name": "create-issue", - "description": "Create a GitHub issue", - "returns": ["GithubIssue"], - "json_schema": null, - "id": 42, - "enabled": true, - "last_deployed": "2024-03-28T14:00:00.000Z", - "source": "repo" - }, - { - "type": "sync", - "name": "issues", - "returns": ["GithubIssue"], - "json_schema": null, - "runs": "every hour", - "auto_start": true, - "track_deletes": false, - "id": 43, - "enabled": true, - "last_deployed": "2024-03-28T14:00:00.000Z", - "source": "repo" - } - ], - "pagination": { - "total": 2, - "page": 0, - "limit": 20 - } -} -``` - +| Event | When it runs | Common use | +| --- | --- | --- | +| `post-connection-creation` | Immediately after a connection is created | Register provider webhooks, seed metadata, run setup checks | +| `validate-connection` | During connection creation and reconnect | Reject invalid credentials, missing provider permissions, or policy violations (e.g. same-account enforcement) | +| `pre-connection-deletion` | Before a connection is deleted | Delete provider webhook subscriptions or external resources | -### Get a function + + Before generating an event function, identify the lifecycle event, provider endpoint, required metadata, and desired failure behavior. -Retrieves a deployed function of an integration. + For `validate-connection`, throwing rejects the auth attempt. On first connect, the connection is deleted. On reconnect, the connection is marked as an auth error (`refresh_exhausted`) and the user must reconnect explicitly. For cleanup functions, make the provider call idempotent because the external resource may already be gone. -```ts -await nango.getFunction({ uniqueKey: 'github', name: 'create-issue' }); -``` + For same-account enforcement on reconnect, store the provider account identifier in **connection metadata** during `post-connection-creation`, then compare it to a live identity API call in `validate-connection`. Do not compare `connection_config` fields: reconnect upserts new credentials before validation runs, so config values already reflect the newly authenticated account. + -Pass `type` to disambiguate when a sync and an action share the same name: +## Create a setup function -```ts -await nango.getFunction({ uniqueKey: 'github', name: 'issues' }, { type: 'sync' }); -``` +Add a file under the integration's `on-events/` folder: -**Parameters** +```typescript salesforce/on-events/post-connection-setup.ts +import { createOnEvent } from 'nango'; +import * as z from 'zod'; - - - The integration ID. - - - The function name. - - - Disambiguates when functions share a name: `sync`, `action`, or `on-event`. - - +const Metadata = z.object({ + organization_id: z.string().optional(), + webhookId: z.string().optional() +}); -**Example Response** +export default createOnEvent({ + description: 'Register a Salesforce webhook after a successful connection', + event: 'post-connection-creation', + metadata: Metadata, + exec: async (nango) => { + const response = await nango.post({ + endpoint: '/webhooks', + data: { + url: 'https://api.myapp.com/webhooks/salesforce', + events: ['contact.updated'] + } + }); - -```json -{ - "data": { - "type": "action", - "name": "create-issue", - "description": "Create a GitHub issue", - "returns": ["GithubIssue"], - "json_schema": null, - "id": 42, - "enabled": true, - "last_deployed": "2024-03-28T14:00:00.000Z", - "source": "repo" + await nango.setMetadata({ + webhookId: response.data.id + }); } -} +}); ``` - - -### Get function code -Retrieves the source code of a deployed function. +Import it from `index.ts`: -```ts -await nango.getFunctionCode({ uniqueKey: 'github', name: 'create-issue' }, { type: 'action' }); +```typescript index.ts +import './salesforce/on-events/post-connection-setup'; ``` -**Parameters** +## Create a connection validation function - - - The integration ID. - - - The function name. - - - Disambiguates when functions share a name: `sync`, `action`, or `on-event`. - - +Add a file under the integration's `on-events/` folder: -**Example Response** +```typescript salesforce/on-events/validate-connection.ts +import { createOnEvent } from 'nango'; +import * as z from 'zod'; - -```json -{ - "type": "action", - "code": "export default createAction({ /* ... */ });" -} -``` - +const Metadata = z.object({ + organizationId: z.string().optional(), + webhookId: z.string().optional() +}); -### Delete a function +export default createOnEvent({ + description: 'Validate connection against saved organization id to prevent changing account on reconnect', + event: 'validate-connection', + metadata: Metadata, + exec: async (nango) => { + const metadata = await nango.getMetadata(); + const lockedOrganizationId = metadata?.organizationId; + + const response = await nango.get<{organization_id: string}>({ + endpoint: '/services/oauth2/userinfo' + }); + const organizationId = response.data?.organization_id; + if (!organizationId) { + throw new nango.ActionError('Salesforce connection missing organization_id from /services/oauth2/userinfo'); + } -Deletes a deployed function of an integration. The `type` is required. + // On initial connection, save organization id to connection metadata + if (!lockedOrganizationId) { + await nango.setMetadata({organizationId}); + return; + } -```ts -await nango.deleteFunction({ uniqueKey: 'github', name: 'create-issue' }, { type: 'action' }); + // On subsequent connections, check if new organization id matches stored value + if (lockedOrganizationId !== organizationId) { + throw new nango.ActionError( + `Salesforce org mismatch: expected ${lockedOrganizationId}, got ${organizationId}` + ); + } + } +}); ``` -**Parameters** +Import it from `index.ts`: - - - The integration ID. - - - The function name. - - - The function type: `sync` or `action`. - - +```typescript index.ts +import './salesforce/on-events/validate-connection'; +``` -**Example Response** +On first connect, validation passes when metadata has no locked org yet; the setup function records `organization_id` after auth succeeds. On reconnect, validation compares the new credentials against the saved org ID and rejects the attempt if they differ. - -```json -{ - "data": { - "success": true + +Compare the locked value in **metadata** to a live value from the provider API. Do not compare `connection_config` fields: on reconnect, Nango upserts the new credentials and overwrites `connection_config` **before** `validate-connection` runs, so config already reflects the account the user just authenticated with. + + +## Create a cleanup function + +If the provider webhook is registered per connection, clean it up before the Nango connection is deleted: + +```typescript salesforce/on-events/pre-connection-cleanup.ts +import { createOnEvent } from 'nango'; +import * as z from 'zod'; + +const Metadata = z.object({ + organization_id: z.string().optional(), + webhookId: z.string().optional() +}); + +export default createOnEvent({ + description: 'Delete the Salesforce webhook before connection deletion', + event: 'pre-connection-deletion', + metadata: Metadata, + exec: async (nango) => { + const metadata = await nango.getMetadata(); + if (!metadata?.webhookId) { + return; + } + + await nango.delete({ + endpoint: `/webhooks/${metadata.webhookId}` + }); } -} +}); ``` - - -### Get integration functions config -Return the configuration for all integration functions +Import it from `index.ts`: -```ts -const scriptsConfig = await nango.getScriptsConfig(); +```typescript index.ts +import './salesforce/on-events/pre-connection-cleanup'; ``` -**Example Response** +## Test and deploy - -```json -[ - { - "providerConfigKey": "demo-github-integration", - "syncs": [ - { - "name": "github-issue-example", - "type": "sync", - "models": [ - { - "name": "GithubIssue", - "fields": [ - { - "name": "id", - "type": "integer" - }, - { - "name": "owner", - "type": "string" - }, - { - "name": "repo", - "type": "string" - }, - { - "name": "issue_number", - "type": "number" - }, - { - "name": "title", - "type": "string" - }, - { - "name": "author", - "type": "string" - }, - { - "name": "author_id", - "type": "string" - }, - { - "name": "state", - "type": "string" - }, - { - "name": "date_created", - "type": "date" - }, - { - "name": "date_last_modified", - "type": "date" - }, - { - "name": "body", - "type": "string" - } - ] - } - ], - "sync_type": "FULL", // DEPRECATED - "runs": "every half hour", - "track_deletes": false, - "auto_start": false, - "last_deployed": "2024-02-28T20:16:38.052Z", - "is_public": false, - "pre_built": false, - "version": "4", - "attributes": {}, - "input": {}, - "returns": [ - "GithubIssue" - ], - "description": "Fetches the Github issues from all a user's repositories.\nDetails: doesn't track deletes, metadata is not required.\n", - "scopes": [ - "public_repo" - ], - "endpoints": [ - { - "GET": "/github/issue-example" - } - ], - "nango_yaml_version": "v2", - "webhookSubscriptions": [] - } - ], - "actions": [ - { - "name": "fetch-issues", - "type": "action", - "models": [ - { - "name": "GithubIssue", - "fields": [ - { - "name": "id", - "type": "integer" - }, - { - "name": "owner", - "type": "string" - }, - { - "name": "repo", - "type": "string" - }, - { - "name": "issue_number", - "type": "number" - }, - { - "name": "title", - "type": "string" - }, - { - "name": "author", - "type": "string" - }, - { - "name": "author_id", - "type": "string" - }, - { - "name": "state", - "type": "string" - }, - { - "name": "date_created", - "type": "date" - }, - { - "name": "date_last_modified", - "type": "date" - }, - { - "name": "body", - "type": "string" - } - ] - } - ], - "runs": "", - "is_public": false, - "pre_built": false, - "version": "4", - "last_deployed": "2024-02-28T20:16:38.052Z", - "attributes": {}, - "returns": [ - "GithubIssue" - ], - "description": "", - "scopes": [], - "input": {}, - "endpoints": [ - { - "GET": "/github/issues" - } - ], - "nango_yaml_version": "v2" - } - ], - "postConnectionScripts": [], - "provider": "github" - } -] +Dry run an event function against an existing connection: + +```bash +nango dryrun post-connection-setup '' -e dev ``` - -You can also pass in an optional argument with the value of `nango` or `openai`. The default is `nango` +Deploy your functions: + +```bash +nango deploy +``` + +Event functions run automatically when their configured event occurs. Your app does not trigger them directly. + +## Related guides + +- [Webhook functions](/guides/functions/webhook-functions) +- [Webhook forwarding](/guides/platform/webhook-forwarding) +- [Storage](/guides/functions/storage) +- [Functions SDK reference](/reference/functions/functions-sdk) + +## Tool Calling + +Source: https://nango.dev/docs/guides/functions/tool-calling.md + +--- +title: 'Tool calling & MCP' +sidebarTitle: 'Tool calling & MCP' +description: 'Expose Nango action functions to agents, LLM SDKs, and MCP clients.' +--- + +Tool calling in Nango happens through [action functions](/guides/functions/action-functions). Each tool is an action function that an agent, LLM SDK, or MCP client can call on demand for a specific connection. + +The agent chooses a tool, your application asks Nango to execute the action function for that connection, and Nango handles the external API credentials, retries, rate limits, and logs. + +## Prerequisites + +- A Nango integration configured for the external API. +- A connection for the user whose credentials should be used. +- One or more enabled action functions for the operations the agent may call. + +Build custom tools with [action functions](/guides/functions/action-functions), or enable template action functions from the [template catalog](/guides/functions/functions-guide#template-catalog). + +## Common auth and execution + +Keep provider credentials out of the agent runtime. Your app should resolve the Nango connection for the current user, then pass only the connection ID and selected tool to Nango. ```ts -const scriptsConfig = await nango.getScriptsConfig('openai'); +import { Nango } from '@nangohq/node'; + +const nango = new Nango({ secretKey: process.env.NANGO_SECRET_KEY! }); + +const integrationId = 'hubspot'; + +async function getConnectionIdForUser(userId: string) { + const connections = await nango.listConnections({ + integrationId, + tags: { end_user_id: userId } + }); + + let connectionId = connections.connections[0]?.connection_id; + + if (!connectionId) { + const session = await nango.createConnectSession({ + allowed_integrations: [integrationId], + tags: { end_user_id: userId } + }); + + // Send this URL to the user in your app, then wait for authorization. + console.log(session.data.connect_link); + + const connection = await nango.waitForConnection(integrationId, userId); + connectionId = connection!.connection_id; + } + + return connectionId; +} + +async function executeNangoTool(actionName: string, input?: unknown) { + const connectionId = await getConnectionIdForUser('user_123'); + + return await nango.triggerAction(integrationId, connectionId, actionName, input); +} ``` - -```json -{ - "data": [ - { - "name": "calendars", - "description": "Sync the user's calendar list.\nIncludes all calendars the user has access to.", - "parameters": { - "type": "object", - "properties": {}, - "required": [] + +The examples below focus on framework-specific tool syntax and call the shared `executeNangoTool()` helper. + +## Framework examples + +These examples expose a HubSpot `whoami` action function as a `who_am_i` tool. + + + + ```ts + import OpenAI from 'openai'; + + const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY! }); + + const tools = [ + { + type: 'function' as const, + name: 'who_am_i', + description: 'Get the current HubSpot user information.', + strict: true, + parameters: { + type: 'object', + properties: {}, + required: [], + additionalProperties: false + } } - }, - { - "name": "events", - "description": "Sync calendar events from the primary calendar.\nIncludes events from the past month.", - "parameters": { - "type": "object", - "properties": {}, - "required": [] + ]; + + const input: any[] = [ + { + role: 'user', + content: 'Use who_am_i and summarize the current HubSpot user.' } - }, - { - "name": "cancel-event", - "description": "Cancel/delete an event by searching for it.\n\nInput parameters:\n- title: The title of the event to cancel\n- date: The date of the event in ISO format\n- time: The time of the event in 24-hour format (HH:mm)\n- calendar: Calendar ID where to search for the event\n- id: Calendar identifier\n- summary: Calendar name/title\n- description: Calendar description\n- location: Calendar location\n- timeZone: Time zone of the calendar\n- backgroundColor: Calendar color in UI\n- foregroundColor: Text color in UI\n- selected: Whether the calendar is selected in UI\n- accessRole: User's access role for the calendar\n- primary: Whether this is the primary calendar", - "parameters": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Calendar identifier" - }, - "summary": { - "type": "string", - "description": "Calendar name/title" - }, - "description": { - "type": "string", - "description": "Calendar description" - }, - "location": { - "type": "string", - "description": "Calendar location" - }, - "timeZone": { - "type": "string", - "description": "Time zone of the calendar" - }, - "backgroundColor": { - "type": "string", - "description": "Calendar color in UI" - }, - "foregroundColor": { - "type": "string", - "description": "Text color in UI" - }, - "selected": { - "type": "boolean", - "description": "Whether the calendar is selected in UI" - }, - "accessRole": { - "type": "string", - "description": "User's access role for the calendar" - }, - "primary": { - "type": "boolean", - "description": "Whether this is the primary calendar" - }, - "title": { - "type": "string", - "description": "The title of the event to cancel" - }, - "date": { - "type": "string", - "description": "The date of the event in ISO format" - }, - "time": { - "type": "string", - "description": "The time of the event in 24-hour format (HH:mm)" - }, - "calendar": { - "type": "string", - "description": "Calendar ID where to search for the event" - } - }, - "required": [ - "id", - "summary" - ] + ]; + + const response = await client.responses.create({ + model: 'gpt-5', + input, + tools + }); + + for (const item of response.output) { + if (item.type !== 'function_call' || item.name !== 'who_am_i') { + continue; } - }, - { - "name": "create-event", - "description": "Create a new calendar event.\n\nInput parameters:\n- summary: The title/summary of the event\n- description: A detailed description of the event\n- location: The location of the event\n- start: The start time of the event in ISO format\n- end: The end time of the event in ISO format\n- attendees: List of email addresses to invite\n- recurrence: List of recurrence rules in RRULE format\n- calendar: Calendar ID to create the event in\n- id: Calendar identifier\n- timeZone: Time zone of the calendar\n- backgroundColor: Calendar color in UI\n- foregroundColor: Text color in UI\n- selected: Whether the calendar is selected in UI\n- accessRole: User's access role for the calendar\n- primary: Whether this is the primary calendar", - "parameters": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Calendar identifier" - }, - "summary": { - "type": "string", - "description": "The title/summary of the event" - }, - "description": { - "type": "string", - "description": "A detailed description of the event" - }, - "location": { - "type": "string", - "description": "The location of the event" - }, - "timeZone": { - "type": "string", - "description": "Time zone of the calendar" - }, - "backgroundColor": { - "type": "string", - "description": "Calendar color in UI" - }, - "foregroundColor": { - "type": "string", - "description": "Text color in UI" - }, - "selected": { - "type": "boolean", - "description": "Whether the calendar is selected in UI" - }, - "accessRole": { - "type": "string", - "description": "User's access role for the calendar" - }, - "primary": { - "type": "boolean", - "description": "Whether this is the primary calendar" - }, - "start": { - "type": "string", - "description": "The start time of the event in ISO format" - }, - "end": { - "type": "string", - "description": "The end time of the event in ISO format" - }, - "attendees": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of email addresses to invite" - }, - "recurrence": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of recurrence rules in RRULE format" - }, - "calendar": { - "type": "string", - "description": "Calendar ID to create the event in" + + const result = await executeNangoTool('whoami', JSON.parse(item.arguments || '{}')); + + input.push(item); + input.push({ + type: 'function_call_output', + call_id: item.call_id, + output: JSON.stringify(result) + }); + } + + const finalResponse = await client.responses.create({ + model: 'gpt-5', + input, + tools + }); + + console.log(finalResponse.output_text); + ``` + + + ```ts + import Anthropic from '@anthropic-ai/sdk'; + + const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY! }); + + const tools = [ + { + name: 'who_am_i', + description: 'Get the current HubSpot user information.', + input_schema: { + type: 'object', + properties: {}, + required: [] } - }, - "required": [ - "id", - "summary", - "start", - "end" - ] } - }, - { - "name": "move-event", - "description": "Move an event to a different time or calendar.\n\nInput parameters:\n- eventId: The ID of the event to move\n- title: The title of the event to move\n- sourceStart: The current start time of the event\n- start: The new start time for the event in ISO format\n- end: The new end time for the event in ISO format\n- calendar: Calendar ID to move the event to\n- id: Calendar identifier\n- summary: Calendar name/title\n- description: Calendar description\n- location: Calendar location\n- timeZone: Time zone of the calendar\n- backgroundColor: Calendar color in UI\n- foregroundColor: Text color in UI\n- selected: Whether the calendar is selected in UI\n- accessRole: User's access role for the calendar\n- primary: Whether this is the primary calendar", - "parameters": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Calendar identifier" - }, - "summary": { - "type": "string", - "description": "Calendar name/title" - }, - "description": { - "type": "string", - "description": "Calendar description" - }, - "location": { - "type": "string", - "description": "Calendar location" - }, - "timeZone": { - "type": "string", - "description": "Time zone of the calendar" - }, - "backgroundColor": { - "type": "string", - "description": "Calendar color in UI" - }, - "foregroundColor": { - "type": "string", - "description": "Text color in UI" - }, - "selected": { - "type": "boolean", - "description": "Whether the calendar is selected in UI" - }, - "accessRole": { - "type": "string", - "description": "User's access role for the calendar" - }, - "primary": { - "type": "boolean", - "description": "Whether this is the primary calendar" - }, - "eventId": { - "type": "string", - "description": "The ID of the event to move" - }, - "title": { - "type": "string", - "description": "The title of the event to move" - }, - "sourceStart": { - "type": "string", - "description": "The current start time of the event" - }, - "start": { - "type": "string", - "description": "The new start time for the event in ISO format" - }, - "end": { - "type": "string", - "description": "The new end time for the event in ISO format" - }, - "calendar": { - "type": "string", - "description": "Calendar ID to move the event to" + ]; + + const messages: Anthropic.MessageParam[] = [ + { + role: 'user', + content: 'Use who_am_i and summarize the current HubSpot user.' + } + ]; + + const message = await client.messages.create({ + model: 'claude-sonnet-4-5', + max_tokens: 1024, + messages, + tools + }); + + const toolUse = message.content.find((block) => block.type === 'tool_use'); + + if (toolUse?.type === 'tool_use' && toolUse.name === 'who_am_i') { + const result = await executeNangoTool('whoami', toolUse.input); + + messages.push({ role: 'assistant', content: message.content }); + messages.push({ + role: 'user', + content: [ + { + type: 'tool_result', + tool_use_id: toolUse.id, + content: JSON.stringify(result) + } + ] + }); + + const finalMessage = await client.messages.create({ + model: 'claude-sonnet-4-5', + max_tokens: 1024, + messages, + tools + }); + + console.log(finalMessage.content); + } + ``` + + + ```ts + import { generateText, stepCountIs, tool } from 'ai'; + import { openai } from '@ai-sdk/openai'; + import { z } from 'zod'; + + const { text, toolResults } = await generateText({ + model: openai('gpt-4o'), + prompt: 'Use who_am_i and summarize the current HubSpot user.', + tools: { + who_am_i: tool({ + description: 'Get the current HubSpot user information.', + inputSchema: z.object({}), + execute: async () => { + return await executeNangoTool('whoami'); + } + }) + }, + stopWhen: stepCountIs(5) + }); + + console.log(text); + console.log(toolResults); + ``` + + + ```ts + import { createAgent, tool } from 'langchain'; + import { z } from 'zod'; + + const whoAmI = tool( + async () => { + const result = await executeNangoTool('whoami'); + return JSON.stringify(result); + }, + { + name: 'who_am_i', + description: 'Get the current HubSpot user information.', + schema: z.object({}) + } + ); + + const agent = createAgent({ + model: 'openai:gpt-5.4', + tools: [whoAmI] + }); + + const result = await agent.invoke({ + messages: [ + { + role: 'user', + content: 'Use who_am_i and summarize the current HubSpot user.' } - }, - "required": [ - "id", - "summary", - "start", - "end" - ] + ] + }); + + console.log(result.messages.at(-1)?.content); + ``` + + + ```ts + import { openai } from '@ai-sdk/openai'; + import { Agent } from '@mastra/core/agent'; + import { createTool } from '@mastra/core/tools'; + import { z } from 'zod'; + + const whoAmI = createTool({ + id: 'who_am_i', + description: 'Get the current HubSpot user information.', + inputSchema: z.object({}), + execute: async () => { + return await executeNangoTool('whoami'); } - }, - { - "name": "whoami", - "description": "Get information about the authenticated user.\n\nNo input parameters.", - "parameters": { - "type": "object", - "properties": {}, - "required": [] + }); + + const agent = new Agent({ + name: 'HubSpot Agent', + instructions: 'Use available tools to answer HubSpot account questions.', + model: openai('gpt-4o'), + tools: { + who_am_i: whoAmI } - }, - { - "name": "invite-user-to-repository", - "description": "Invite a user to a GitHub repository.\n\nInput parameters:\n- owner: The owner (user or organization) of the repository\n- repo: The name of the repository to invite the user to\n- username: The GitHub username of the user to invite\n- permission: The permission level to grant (\"pull\", \"push\", \"admin\", \"maintain\", \"triage\")", - "parameters": { - "type": "object", - "properties": { - "owner": { - "type": "string", - "description": "The owner (user or organization) of the repository" - }, - "repo": { - "type": "string", - "description": "The name of the repository to invite the user to" - }, - "username": { - "type": "string", - "description": "The GitHub username of the user to invite" - }, - "permission": { - "type": "string", - "description": "The permission level to grant (\"pull\", \"push\", \"admin\", \"maintain\", \"triage\")" + }); + + const response = await agent.generate('Use who_am_i and summarize the current HubSpot user.'); + + console.log(response.text); + ``` + + + +## Programmatic tool discovery + +The [Get integration functions config API](/reference/backend/http-api/scripts/config) returns enabled action function definitions. Use it when an agent or orchestration layer should discover available tools at runtime. + +```bash +curl --request GET \ + --url 'https://api.nango.dev/scripts/config?provider_config_key=&format=openai' \ + --header 'Authorization: Bearer ' +``` + +Use `format=nango` for Nango's native configuration shape, or `format=openai` when you want OpenAI-compatible function definitions. + +## Direct tool execution + +For SDKs that let you provide your own tool executor, define the tool schema in your app and call Nango from the executor. + +```ts +import { Nango } from '@nangohq/node'; + +const nango = new Nango({ secretKey: process.env.NANGO_SECRET_KEY! }); + +async function executeTool(connectionId: string, input: { owner: string; repo: string; title: string }) { + return await nango.triggerAction('github', connectionId, 'create-issue', input); +} +``` + +Keep these values explicit: + +- `providerConfigKey` / integration ID - which integration owns the action function. +- `connectionId` - which user's credentials the call uses. +- Action function name - the enabled action function to execute. +- Input payload - validated by the action function schema when configured. + +## MCP server + +Nango exposes enabled action functions through a hosted MCP server: + +```text +https://api.nango.dev/mcp +``` + +The server supports Streamable HTTP transport. Requests must include: + +| Header | Value | +| --- | --- | +| `Authorization` | `Bearer ` | +| `connection-id` | The connection whose credentials should be used | +| `provider-config-key` | The integration ID | + +Example client setup with the MCP TypeScript SDK: + +```ts +import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'; + +const transport = new StreamableHTTPClientTransport(new URL('https://api.nango.dev/mcp'), { + requestInit: { + headers: { + Authorization: `Bearer ${process.env.NANGO_SECRET_KEY}`, + 'connection-id': '', + 'provider-config-key': '' + } + } +}); +``` + +For desktop clients that only support stdio, use a bridge such as `mcp-remote` and pass the same headers. Keep the header spacing exactly as required by the bridge you choose. + +## Auth flow for agents + +Agents should not receive provider credentials. Your app should: + +1. Check whether the user already has a Nango connection. +2. Create a Connect session if they need to authorize. +3. Store the resulting `connectionId` in your app. +4. Use that `connectionId` for future tool calls. + +See the [Auth guide](/guides/auth/auth-guide) and [Create Connect Session API](/reference/backend/http-api/connect/sessions/create) for the end-to-end auth flow. + + + If you are implementing this flow programmatically, first list or create the user's connection, then call `GET /scripts/config` to discover enabled action functions, and finally execute tools with `POST /action/trigger` or the MCP server. + + Required values for every execution are the Nango secret key, integration ID, connection ID, action function name, and input payload. + + +## Observability and safety + +Every action function execution appears in Nango logs. Use logs to debug failed tool calls, inspect provider requests, and review agent behavior. + +Keep tool names and descriptions specific. Expose only action functions the agent is allowed to call for the current user and workflow. For write operations, make action function logic idempotent before using async execution or retries. + +## Related references + +- [Action functions](/guides/functions/action-functions) +- [Template catalog](/guides/functions/functions-guide#template-catalog) +- [Get integration functions config API](/reference/backend/http-api/scripts/config) +- [Trigger action API](/reference/backend/http-api/action/trigger) +- [Functions SDK reference](/reference/functions/functions-sdk) +- [Observability](/guides/platform/observability) + +## Storage + +Source: https://nango.dev/docs/guides/functions/storage.md + +--- +title: 'Storage' +sidebarTitle: 'Storage' +description: 'Use connection metadata as the default storage for function parameters and per-customer configuration.' +--- + +Functions have access to storage that is scoped to the connection they run for. Use it to keep integration behavior tied to the customer, account, workspace, or tenant that authorized the connection. + +For the product-level workflow, see [Customize per customer](/getting-started/use-cases/customer-configuration). + +## Connection metadata + +Connection metadata is the default blob storage for Nango Functions. It is a JSON object stored on a Nango connection and available to action functions, sync functions, webhook functions, and event functions. + +Use metadata for: + +- Customer-specific settings, such as field mappings, filters, folders, projects, account IDs, or feature flags. +- Function configuration values that should persist across executions. +- Values discovered during setup, such as provider webhook subscription IDs or tenant-specific identifiers. +- Configuration shared across multiple functions for the same connection. + +Do not use metadata for synced datasets or large lists of records. For data replicated by sync functions, use the [records cache](/guides/functions/syncs/records-cache). + +## Set and update metadata from your app + +Set metadata after the customer chooses integration settings during onboarding or in your app's settings UI. + + + + ```ts + await nango.setMetadata( + '', + '', + { + accountRegion: 'eu', + syncArchived: false, + fieldMapping: { + companyName: 'Account_Name__c' + } + } + ); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/connection//metadata \ + --header 'Authorization: Bearer ' \ + --header 'Provider-Config-Key: ' \ + --header 'Content-Type: application/json' \ + --data '{ + "accountRegion": "eu", + "syncArchived": false, + "fieldMapping": { + "companyName": "Account_Name__c" + } + }' + ``` + + + ```ts + await nango.updateMetadata( + '', + '', + { syncArchived: true } + ); + ``` + + + ```bash + curl --request PATCH \ + --url https://api.nango.dev/connection//metadata \ + --header 'Authorization: Bearer ' \ + --header 'Provider-Config-Key: ' \ + --header 'Content-Type: application/json' \ + --data '{ "syncArchived": true }' + ``` + + + +`setMetadata` replaces the metadata object. `updateMetadata` merges the provided fields into the existing object. + +For exact parameters and response shapes, see the [set metadata API](/reference/backend/http-api/connections/set-metadata), [update metadata API](/reference/backend/http-api/connections/update-metadata), [Node SDK set metadata method](/reference/backend/backend-sdk/node#set-connection-metadata), and [Node SDK edit metadata method](/reference/backend/backend-sdk/node#edit-connection-metadata). + +## Read metadata from your app + +Read metadata from your app when you need to render saved settings, pre-fill a configuration UI, or decide whether a connection is ready for syncs: + +```ts +const metadata = await nango.getMetadata('', ''); +``` + +You can also fetch the connection with the REST API: + +```bash +curl --request GET \ + --url 'https://api.nango.dev/connection/?provider_config_key=' \ + --header 'Authorization: Bearer ' +``` + +## Read metadata inside a function + +Define a metadata schema on the function, then call `nango.getMetadata()`: + +```ts crm/syncs/contacts.ts +import { createSync } from 'nango'; +import * as z from 'zod'; + +const Metadata = z.object({ + accountRegion: z.string().optional(), + syncArchived: z.boolean().default(false) +}); + +export default createSync({ + description: 'Sync contacts', + frequency: 'every hour', + metadata: Metadata, + exec: async (nango) => { + const metadata = await nango.getMetadata(); + + await nango.get({ + endpoint: '/contacts', + params: { + region: metadata.accountRegion, + archived: metadata.syncArchived + } + }); + } +}); +``` + +Inside a function, `nango.getMetadata()` automatically reads metadata for the connection being executed. + + + When a sync function reads metadata with `nango.getMetadata()`, metadata can be cached for up to 60 seconds during that execution. The next execution always reads the latest metadata. + + +## Customer configuration pattern + +A common customer configuration pattern is to ask the customer how their external custom fields map to your product model, then store that mapping as connection metadata. + +```json +{ + "fieldMapping": { + "internal_customer_id": "External_Customer_ID__c", + "plan": "Plan__c" + } +} +``` + +Use an action function to fetch available custom fields from the provider, save the customer's choices as metadata, then read the mapping inside the sync function that fetches records. + +If a sync function should start only after the required configuration exists, start it after saving metadata: + +```ts +await nango.startSync('', ['contacts'], ''); +``` + +## Records cache + +The records cache is the storage layer for sync output. Sync functions write records with `nango.batchSave()`, `nango.batchUpdate()`, and `nango.batchDelete()`. Your app reads changed records through the records API or SDK. + +Use the records cache for synced external data, not for function configuration. See [Records cache](/guides/functions/syncs/records-cache). + +## Related guides + +- [Customize per customer](/getting-started/use-cases/customer-configuration) - design the product workflow for customer-specific integration settings. +- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - distinguish tags, connection configuration, and runtime metadata. +- [Set connection metadata API](/reference/backend/http-api/connections/set-metadata) - replace metadata from your app. +- [Update connection metadata API](/reference/backend/http-api/connections/update-metadata) - patch metadata from your app. + +## Logging + +Source: https://nango.dev/docs/guides/functions/logging.md + +--- +title: 'Function logging' +sidebarTitle: 'Logging' +description: 'Use function logs for local debugging, cloud observability, and production troubleshooting.' +--- + +Nango records function executions in the Logs tab. You can also add custom logs from action, sync, webhook, and event functions with `nango.log()`. + +Use custom logs for information that helps you understand function behavior: selected filters, page counts, checkpoint values, provider identifiers, branch decisions, and recoverable errors. + +## Add custom logs + +```ts +await nango.log('Starting contacts sync'); +await nango.log('Applying region filter', { level: 'debug' }); +await nango.log('Provider returned a partial response', { level: 'warn' }); +await nango.log('Failed to map contact', { level: 'error' }); +``` + +If you do not pass a level, `nango.log()` uses `info`. + +## Log levels + +Nango supports these levels, from most to least verbose: + +| Level | Use for | +| --- | --- | +| `debug` | Local diagnostics, pagination details, temporary investigation logs | +| `info` | Normal execution milestones you may want during development | +| `warn` | Unexpected but recoverable behavior | +| `error` | Failed operations, invalid provider responses, or errors you catch and continue from | +| `off` | Disable custom logs | + +Only logs at or above the configured logger level are ingested into the Nango UI Logs tab. + +For example, when the logger level is `warn`, only `warn` and `error` custom logs are visible in the cloud logs. + +## Cloud vs local behavior + +| Runtime | Default custom log level | Where custom logs appear | +| --- | --- | --- | +| Cloud environments | `warn` | Nango UI Logs tab for logs at `warn` or `error` | +| `nango dryrun` | `debug` | Local console for all custom log levels | + +This means `await nango.log('message')` is visible during local dry runs, because local dry runs default to `debug`. The same call defaults to `info`, so it is not visible in cloud logs unless you lower the configured logger level to `info` or `debug`. + + + Cloud custom logs can affect log volume and billing. Prefer `debug` and `info` for local investigation, and use `warn` or `error` for production signals you want retained by default. + + +## Configure the logger + +Set the default logger level for an environment with `NANGO_LOGGER_LEVEL` in **Environment Settings > Environment Variables**: + +```bash +NANGO_LOGGER_LEVEL=info +``` + +Valid values are `debug`, `info`, `warn`, `error`, and `off`. + +You can also change the logger level inside a function. This applies to `nango.log()` calls after the setting is changed: + +```ts +nango.setLogger({ level: 'debug' }); + +await nango.log('Detailed investigation log'); + +nango.setLogger({ level: 'warn' }); +``` + +Use function-level configuration when one run or one branch needs additional visibility. Use the environment variable when all functions in that environment should share the same threshold. + +## What to log + +Good function logs are specific and bounded: + +- Log the connection-specific configuration that changes behavior, such as selected folder IDs, regions, or pipeline IDs. +- Log provider pagination progress with counts, cursors, or checkpoints, but avoid logging every record. +- Log warnings when the provider omits optional data or returns a shape you can recover from. +- Log errors when you catch an exception and continue, so the run is still inspectable. + +Avoid logging secrets, access tokens, refresh tokens, full request headers, or raw payloads that may contain sensitive customer data. + +## Related guides + +- [Observability](/guides/platform/observability) +- [Functions SDK reference](/reference/functions/functions-sdk#logging) +- [Testing](/guides/functions/testing) +- [Sync efficiency](/guides/functions/syncs/sync-efficiency) + +## Rate Limits + +Source: https://nango.dev/docs/guides/functions/rate-limits.md + +--- +title: 'Rate limits' +sidebarTitle: 'Rate limits' +description: 'Guide on how to handle API rate limits from external APIs.' +--- + +External APIs often enforce rate limits to prevent excessive use. When these limits are reached, you'll start receiving HTTP `429 Too Many Requests` errors, blocking further requests until the limit resets. + +To maintain data freshness and avoid disruptions in your integration functions, it's crucial to manage your API call volume and handle rate limits effectively. Nango simplifies this process significantly. + +## Strategy 1: Retry with exponential backoff + +The simplest strategy involves retrying failed requests after waiting: + +When you configure HTTP requests using Nango's helper ([reference](/reference/functions/functions-sdk#http-requests)), you can specify the number of retries: + +```ts +await nango.get({ endpoint: '/some-endpoint', retries: 10 }); +``` + +This configuration enables automatic retries on receiving a `429` status code, with the retries spaced out using exponential backoff. This method is efficient because: + +- It uses exponential backoff to wait out the rate-limit period +- Nango [sync functions](/guides/functions/syncs/sync-functions) can run for up to 24 hours, allowing retries to occur within this window (note that action functions and webhook functions have shorter lifespans; see [Resource limits](/guides/platform/limits)) +- It works for APIs without requiring any API-specific configurations + +Find details about HTTP request retries in the [reference](/reference/functions/functions-sdk#http-request-retries). + +## Strategy 2: Leverage rate-limit headers + +Most of the time, the first strategy is sufficient to handle rate limits. + +For APIs with stringent limits, Nango provides a more refined and customized approach by automatically parsing API-specific rate-limit headers from responses and scheduling retries only after the rate limit period has reset: + +This is set up in the same way as the first strategy: + +```ts +await nango.get({ endpoint: '/some-endpoint', retryHeader: { at: "x-ratelimit-reset" } }); +``` + + +If rate-limit headers are not already configured for an API you are using, you can request their inclusion by reaching out to the Nango team via the [community](https://nango.dev/slack)β€”typically within 24 hours. + +## Related guides + +- [Sync efficiency](/guides/functions/syncs/sync-efficiency) - avoid unnecessary provider requests. +- [Action functions](/guides/functions/action-functions) - design retries for idempotent actions. +- [Resource limits](/guides/platform/limits) - understand runtime constraints. +- [Functions SDK reference](/reference/functions/functions-sdk#http-request-retries) - configure request retries. + + +**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + + +## Data Validation + +Source: https://nango.dev/docs/guides/functions/data-validation.md + +--- +title: 'Data validation' +sidebarTitle: 'Data validation' +description: 'How to validate data in your functions and in your app' +--- + +Nango offers data validation at two levels: inside your [Nango functions](/guides/functions/functions-guide) (when calling external APIs) and in your application code (when consuming function responses). + +## Validate API responses in Nango functions + +Use Zod to validate data you receive from and send to external APIs. The CLI will also surface *type* errors during dry runs when using the `--validation` option. + +```typescript +import * as z from 'zod'; + +const dataFromAPI = z.object({ + ticketId: z.string(), +}); + +export default createSync({ + exec: async (nango) => { + const response = await nango.get({ endpoint: '/tickets' }); + const isValid = dataFromAPI.parse(response.json); + if (isValid) { + [...] + } + }, +}); +``` + +## Validate Nango function responses in your app + +### TypeScript types (compile-time) + +Use `z.infer` to derive TypeScript types from your Zod schemas and export them from your sync/action files: + +```ts +// In: github/syncs/fetchIssues.ts (Nango function) +export type GithubIssue = z.infer; +``` + +Then import the types in your application code: + +```ts +import type { GithubIssue } from './nango-integrations/github/syncs/fetchIssues'; + +const issues = await nango.listRecords({ ... }); +``` + +### JSON Schema (runtime, language-agnostic) + +When you run `nango compile` or `nango deploy`, Nango generates a `nango.json` file in the `.nango` folder. Each sync/action entry includes a `json_schema` property with the JSON Schema for its models: + +```json +// .nango/nango.json (simplified) +[ + { + "providerConfigKey": "github", + "syncs": [ + { + "name": "fetchIssues", + "output": ["GithubIssue"], + "json_schema": { + "definitions": { + "GithubIssue": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "title": { "type": "string" }, + "state": { "type": "string" } + }, + "required": ["id", "title", "state"], + "additionalProperties": false + } } + } + } + ] + } +] +``` + +You can extract the `json_schema` object for a given sync or action and use it with any JSON Schema validator in your language of choice (e.g., `ajv` in TypeScript, `jsonschema` in Python, `jsonschema` in Rust, `santhosh-tekuri/jsonschema` in Go). + +Alternatively, Zod v4 supports JSON Schema conversion natively with [`z.toJSONSchema()`](https://zod.dev/json-schema?id=ztojsonschema): + +```ts +import { z } from 'zod'; +import { issueSchema } from './nango-integrations/github/syncs/fetchIssues'; + +const jsonSchema = z.toJSONSchema(issueSchema); +``` + +## Related guides + +- [Action functions](/guides/functions/action-functions) - validate action inputs and outputs. +- [Sync functions](/guides/functions/syncs/sync-functions) - validate synced record models. +- [Unified APIs](/guides/functions/unified-apis) - normalize provider data behind stable schemas. +- [Testing](/guides/functions/testing) - cover validation behavior in tests. + +## Testing + +Source: https://nango.dev/docs/guides/functions/testing.md + +--- +title: 'Testing integrations' +sidebarTitle: 'Testing' +description: 'How to test your Nango integrations using dry runs, mocks, and snapshots' +--- + +Nango provides a comprehensive testing framework that combines dry runs with mock-based snapshot testing. This guide will walk you through testing your integrations effectively. + +## Testing approach + +Nango's testing framework is built on three core concepts: + +1. **Dry runs**: Test your integrations against live API connections without affecting production data +2. **Mocks**: Save API responses during dry runs to create reproducible test fixtures +3. **Snapshot testing**: Automatically compare integration outputs against saved snapshots using Vitest + +This approach ensures your integrations work correctly while providing fast, reliable tests that don't depend on external APIs. + +## Dry run testing + +Dry runs allow you to execute your sync functions and action functions against real API connections without saving data to your database. This is essential for: + +- Testing integration logic before deployment +- Debugging issues with live data +- Generating test fixtures (mocks) +- Validating data transformations + +### Basic dry run + +Execute a sync or action against an existing connection: + +```bash +nango dryrun +``` + +**Example:** +```bash +nango dryrun fetch-tickets abc-123-connection +``` + +### Dry run options + +Common options for testing: + +```bash +# Specify environment (dev or prod) +nango dryrun fetch-tickets abc-123 -e prod + +# For action functions: pass input data +nango dryrun create-ticket abc-123 --input '{"title": "Test ticket"}' + +# For sync functions: specify an initial checkpoint +nango dryrun fetch-tickets abc-123 --checkpoint '{ "lastModifiedAt": "2026-02-01T01:00:00.000Z" }' + +# Use a specific integration when sync names overlap +nango dryrun fetch-tickets abc-123 --integration-id github + +# Execute a specific variant +nango dryrun fetch-tickets abc-123 --variant premium +``` + +## Data validation + +Validation ensures your integration inputs and outputs match your defined schemas. This catches data transformation errors early. + +### Enable validation during dry runs + +Use the `--validate` flag to enforce validation: + +```bash +nango dryrun fetch-tickets abc-123 --validate +``` + +When validation is enabled: +- **Action inputs** are validated before execution +- **Action outputs** are validated after execution +- **Sync records** are validated before they would be saved +- **Validation failures** halt execution and display detailed error messages + +### Validation with Zod + +You can also validate data directly in your integration code using Zod: + +```typescript +import { z } from 'zod'; + +const TicketSchema = z.object({ + id: z.string(), + title: z.string(), + status: z.enum(['open', 'closed']), + createdAt: z.string().datetime(), +}); + +export default createSync({ + exec: async (nango) => { + const response = await nango.get({ endpoint: '/tickets' }); + + // Validate the API response + const tickets = response.data.map(ticket => { + return TicketSchema.parse(ticket); // Throws if validation fails + }); + + await nango.batchSave(tickets, 'Ticket'); + }, +}); +``` + +### Validation error output + +When validation fails, you'll see detailed error information: + +``` +Invalid sync record. Use `--validate` option to see the details (invalid_sync_record) +{ + "validation": [ + { + "path": "createdAt", + "message": "Invalid datetime string! Must be UTC.", + "code": "invalid_string" + } + ], + "model": "Ticket" +} +``` + +## Saving mocks for tests + +Mocks are saved API responses that allow you to run tests without hitting external APIs. This makes tests faster and more reliable. + +### Generate mocks with dry run + +Use the `--save` flag to save all API responses: + +```bash +nango dryrun fetch-tickets abc-123 --save +``` + +**Important**: When using `--save`, validation is automatically enabled. Mocks are only saved if validation passes, ensuring your test fixtures contain valid data. + +### Mock file structure + +Mocks are saved in a single `.test.json` file that can be used alongside your test file: + +``` +github/ +β”œβ”€β”€ tests/ +β”‚ β”œβ”€β”€ fetch-tickets.test.ts +β”‚ └── fetch-tickets.test.json +``` + +The `test.json` file contains all the necessary mock data for a given test: + +```json +{ + "input": { "title": "Test ticket" }, + "output": { "id": "TKT-123", "status": "created" }, + "nango": { + "getConnection": { "connectionId": "abc-123", "provider": "github" }, + "getMetadata": { "accountId": "test-123" }, + "batchSave": { + "Ticket": [{ "id": "TKT-123", "title": "Test ticket" }] + }, + "batchDelete": { + "Ticket": [{ "_nango_id": "del-456" }] + } + }, + "api": { + "GET": { + "/tickets": { + "response": [{ "id": "TKT-123", "title": "Test ticket" }] + } + }, + "POST": { + "/issues": { + "response": { "id": "ISS-789" } + } + } + } +} +``` + +### Using stubbed metadata + +For sync functions that rely on connection metadata, you can provide test metadata: + +```bash +nango dryrun fetch-tickets abc-123 --save --metadata '{"accountId": "test-123"}' +``` + +Or load from a file: + +```bash +nango dryrun fetch-tickets abc-123 --save --metadata @fixtures/metadata.json +``` + +## Testing with Vitest + +Nango uses [Vitest](https://vitest.dev/) as its testing framework. Vitest is fast, has a great developer experience, and provides snapshot testing out of the box. + +### Setup + +Install Vitest as a dev dependency: + +```bash +npm install -D vitest +``` + +Generate tests for your integrations: + +```bash +nango generate:tests +``` + +You can also generate tests for specific integrations, sync functions, or action functions: + +```bash +# Generate tests for a specific integration +nango generate:tests -i github + +# Generate tests for a specific sync function +nango generate:tests -s fetch-tickets + +# Generate tests for a specific action function +nango generate:tests -a create-ticket + +# Combine flags for more specific targeting +nango generate:tests -i github -s fetch-tickets +``` + +Run your tests: + +```bash +npm test +``` + +### Auto-generated tests + +When you run `nango generate:tests`, Nango creates test files for all your integrations: + +**Sync test example:** +```typescript +import { vi, expect, it, describe, beforeAll } from 'vitest'; +import createSync from '../syncs/fetch-tickets.js'; + +describe('github fetch-tickets tests', () => { + let nangoMock; + + beforeAll(async () => { + nangoMock = new global.vitest.NangoSyncMock({ + dirname: __dirname, + name: "fetch-tickets", + Model: "Ticket" + }); + }); + + const models = 'Ticket'.split(','); + const batchSaveSpy = vi.spyOn(nangoMock, 'batchSave'); + + it('should get, map correctly the data and batchSave the result', async () => { + await createSync.exec(nangoMock); + + for (const model of models) { + const expectedBatchSaveData = await nangoMock.getBatchSaveData(model); + const spiedData = batchSaveSpy.mock.calls.flatMap(call => { + if (call[1] === model) { + return call[0]; + } + return []; + }); + + const spied = JSON.parse(JSON.stringify(spiedData)); + expect(spied).toStrictEqual(expectedBatchSaveData); + } + }); + + it('should get, map correctly the data and batchDelete the result', async () => { + await createSync.exec(nangoMock); + + for (const model of models) { + const batchDeleteData = await nangoMock.getBatchDeleteData(model); + if (batchDeleteData && batchDeleteData.length > 0) { + expect(nangoMock.batchDelete).toHaveBeenCalledWith(batchDeleteData, model); + } + } + }); +}); +``` + +**Action test example:** +```typescript +import { vi, expect, it, describe, beforeAll } from 'vitest'; +import createAction from '../actions/create-ticket.js'; + +describe('github create-ticket tests', () => { + let nangoMock; + + beforeAll(async () => { + nangoMock = new global.vitest.NangoActionMock({ + dirname: __dirname, + name: "create-ticket", + Model: "Ticket" + }); + }); + + it('should output the action output that is expected', async () => { + const input = await nangoMock.getInput(); + const response = await createAction.exec(nangoMock, input); + const output = await nangoMock.getOutput(); + + expect(response).toEqual(output); + }); +}); +``` + +### How mocks work in tests + +The `NangoSyncMock` and `NangoActionMock` classes automatically load your saved mocks from the `.test.json` file: + +1. **API requests** are intercepted and return saved mock responses from the `api` section. +2. **Input data** is loaded from the `input` property for action functions. +3. **Expected outputs** are loaded from the `output` property. +4. **Tests compare** actual outputs against expected outputs. + +This means: +- Tests run **instantly** (no API calls) +- Tests are **deterministic** (same input = same output) +- Tests work **offline** + +### Migrating from the old format + +If you have tests using the old multi-file mock format, you can automatically migrate them to the new unified format. + +Set the `MIGRATE_MOCKS` environment variable to `2026-01` and run your tests: + +```bash +MIGRATE_MOCKS=2026-01 npm test +``` + +This will: +1. Run your tests using the old mock files. +2. Intercept all mock data accessed during the test run. +3. Save the data into a new `.test.json` file. +4. The old mock directory (`mocks` and `fixtures`) can then be safely deleted once a clean green test run is achieved. + +> **Note:** This migration tool works by intercepting the mock data loaded by your existing tests. It requires that your tests are using the standard Nango mock utilities (`NangoSyncMock` or `NangoActionMock`) imported from `nango/test`. + + +**Pagination Bug in Legacy Test Utilities** + +The legacy test utilities had a bug where pagination would sometimes stop after the first page. This means: + +1. **Tests appeared to pass** but were only testing the first page of results +2. **Mock files may exist** for subsequent pages, but might be incorrect (hashes or params were never checked) +3. **Some mock files may be missing entirely** if they were never recorded + +**How the migration handles this:** + +The migration tool performs a **best-effort recovery**: +- It first tries to match mock files by their exact request hash +- If that fails, it scans all available mock files and matches by comparing the actual request parameters (endpoint, query params, headers) +- This handles cases where the hash in the filename is wrong but the request data inside the file is correct + +**What to do if tests fail after migration:** + +If your tests fail after running the migration, it means one of: +- The mock file for a paginated request doesn't exist at all (it was never recorded due to the bug) +- The request parameters stored in the mock file don't match what Nango's pagination now sends + +**To fix failing tests, re-record your mocks:** + +```bash +nango dryrun --save +``` + +This will generate a complete `.test.json` file with all paginated responses using Nango's actual pagination implementation. + + +### Running tests + +```bash +# Run all tests +npm test + +# Run tests in watch mode +npm test -- --watch + +# Run tests for a specific integration +npm test github + +# Run a specific test file +npm test github-fetch-tickets.test.ts + +# Run with coverage +npm test -- --coverage +``` + +### Test configuration + +Vitest is configured via `vite.config.ts` in your project root: + +```typescript +import { defineConfig } from 'vite'; + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + setupFiles: ['./vitest.setup.ts'], + }, +}); +``` + +The `vitest.setup.ts` file makes Nango mocks available globally: + +```typescript +import { NangoActionMock, NangoSyncMock } from "nango/test"; + +globalThis.vitest = { + NangoActionMock, + NangoSyncMock, +}; +``` + +## Customizing tests with business logic + +While auto-generated tests validate basic data flow, you often need custom tests for business logic. + +### Adding custom assertions + +Extend the generated tests with additional assertions: + +```typescript +import { vi, expect, it, describe, beforeAll } from 'vitest'; +import createSync from '../syncs/fetch-tickets.js'; + +describe('github fetch-tickets tests', () => { + let nangoMock; + + beforeAll(async () => { + nangoMock = new global.vitest.NangoSyncMock({ + dirname: __dirname, + name: "fetch-tickets", + Model: "Ticket" + }); + }); + + it('should correctly transform ticket priorities', async () => { + await createSync.exec(nangoMock); + + const savedTickets = await nangoMock.getBatchSaveData('Ticket'); + + // Custom business logic validation + savedTickets.forEach(ticket => { + // Ensure priority is normalized + expect(['low', 'medium', 'high', 'critical']).toContain(ticket.priority); + + // Ensure dates are ISO 8601 + expect(ticket.createdAt).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/); + + // Ensure ticket numbers are prefixed correctly + if (ticket.source === 'github') { + expect(ticket.id).toMatch(/^GH-\d+$/); + } + }); + }); + + it('should filter out spam tickets', async () => { + await createSync.exec(nangoMock); + + const savedTickets = await nangoMock.getBatchSaveData('Ticket'); + + // Verify spam filtering logic + const spamTickets = savedTickets.filter(t => + t.title.toLowerCase().includes('spam') + ); + expect(spamTickets).toHaveLength(0); + }); +}); +``` + +### Testing error handling + +Test how your integration handles errors: + +```typescript +it('should handle API errors gracefully', async () => { + // Create a mock that will throw an error + const errorMock = new global.vitest.NangoSyncMock({ + dirname: __dirname, + name: "fetch-tickets-error", + Model: "Ticket" + }); + + // Mock the get method to throw + vi.spyOn(errorMock, 'get').mockRejectedValue( + new Error('API rate limit exceeded') + ); + + // Verify error is logged + const logSpy = vi.spyOn(errorMock, 'log'); + + await expect(async () => { + await createSync.exec(errorMock); + }).rejects.toThrow('API rate limit exceeded'); + + expect(logSpy).toHaveBeenCalledWith( + expect.stringContaining('rate limit'), + { level: 'error' } + ); +}); +``` + +### Testing pagination + +Verify pagination logic works correctly: + +```typescript +it('should fetch all pages of results', async () => { + await createSync.exec(nangoMock); + + const savedTickets = await nangoMock.getBatchSaveData('Ticket'); + + // Verify we got results from multiple pages + // (based on your pagination implementation) + expect(savedTickets.length).toBeGreaterThan(100); // Assuming page size is 100 +}); +``` + +### Testing sync functions with checkpoints + +Test that checkpoint logic works: + +```typescript +it('should only fetch tickets after checkpoint date', async () => { + const getSpy = vi.spyOn(nangoMock, 'get'); + const saveCheckpointSpy = vi.spyOn(nangoMock, 'saveCheckpoint'); + + // Mock getCheckpoint to return a previous checkpoint + vi.spyOn(nangoMock, 'getCheckpoint').mockResolvedValue({ + lastModifiedISO: '2024-01-01T00:00:00Z' + }); + + await createSync.exec(nangoMock); + + // Verify the API request used the checkpoint value + expect(getSpy).toHaveBeenCalledWith( + expect.objectContaining({ + params: expect.objectContaining({ + since: '2024-01-01T00:00:00Z' + }) + }) + ); + + // Verify checkpoint was saved + expect(saveCheckpointSpy).toHaveBeenCalled(); +}); +``` + +### Parameterized tests + +Test multiple scenarios with different inputs: + +```typescript +import { it, describe, expect, beforeAll } from 'vitest'; + +describe.each([ + { priority: 'P0', expected: 'critical' }, + { priority: 'P1', expected: 'high' }, + { priority: 'P2', expected: 'medium' }, + { priority: 'P3', expected: 'low' }, +])('priority mapping for $priority', ({ priority, expected }) => { + let nangoMock; + + beforeAll(async () => { + nangoMock = new global.vitest.NangoSyncMock({ + dirname: __dirname, + name: `fetch-tickets-${priority}`, + Model: "Ticket" + }); + }); + + it(`should map ${priority} to ${expected}`, async () => { + await createSync.exec(nangoMock); + + const savedTickets = await nangoMock.getBatchSaveData('Ticket'); + const ticket = savedTickets.find(t => t.rawPriority === priority); + + expect(ticket?.priority).toBe(expected); + }); +}); +``` + +## Related resources + +- [Data Validation](/guides/functions/data-validation) - Learn more about schema validation +- [Vitest Documentation](https://vitest.dev/) - Official Vitest docs +- [Action functions](/guides/functions/action-functions) - Building and testing on-demand functions +- [Sync functions](/guides/functions/syncs/sync-functions) - Building and testing sync functions + +## Ci Cd + +Source: https://nango.dev/docs/guides/functions/ci-cd.md + +--- +title: 'CI/CD for Nango Functions' +sidebarTitle: 'CI/CD' +description: 'How to integrate Nango Function deployments into your CI/CD pipeline.' +--- + +CI/CD for Nango is about keeping your [Functions](/guides/functions/functions-guide) β€” sync functions, action functions, webhook functions, and event functions β€” in sync with your application across environments. + +The core principle: **deploy to Nango as part of the same pipeline step as your application**. Deploying them separately risks your app and your Functions going out of sync, which can cause subtle bugs that are hard to trace. + +## Authentication + +To deploy from CI, you need a scoped API key for each Nango environment. + +1. **Create API keys**: In the Nango UI, go to **Environment Settings > API Keys** and create a key for each environment (e.g., `dev` and `prod`). For CI/CD pipelines, use a key scoped to `environment:deploy` only β€” see the [CI/CD Deploy profile](/reference/backend/http-api/api-keys#cicd-deploy). +2. **Store the keys**: Add them as secrets in your CI/CD provider. The Nango CLI reads them from these environment variables: + - `NANGO_SECRET_KEY_DEV` + - `NANGO_SECRET_KEY_PROD` + +## Recommended pipeline + +Treat Nango Functions like application code: validate on every PR, deploy to each environment in the same step as your application. + +| Pipeline stage | What to do | +|---|---| +| **Pull request** | Run `nango compile` and `npm test` as required checks. Block merge on failure. | +| **Merge to main** | Deploy to your dev/staging Nango environment alongside your app. | +| **Release to production** | Deploy to your prod Nango environment in the same step as your app release. | + +The Nango CLI `deploy` command targets a specific environment: + +```bash +nango deploy +``` + +If you don't specify an environment, it defaults to `dev`. + +**If you don't have a staging environment**, wire the prod Nango deploy directly to your production release step β€” use a `workflow_dispatch` trigger or equivalent manual approval. This keeps production deploys intentional, and ensures they always happen through CI using the prod API key rather than from a local machine. + + +Add the `dist/` folder inside your `nango-integrations` directory to `.gitignore`. The CLI writes compiled JS artifacts there, and committing them creates noisy diffs and risks deploying stale bundles. + + +## Example: GitHub Actions + +Two workflow files implement the pipeline above. + + + +```yaml +name: Validate Nango Functions + +on: + pull_request: + branches: + - main + +jobs: + validate: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: npm ci + + - name: Compile + run: npx nango@latest compile --no-dependency-update + + - name: Test + run: npm test +``` + + + +```yaml +name: Deploy Nango Functions + +on: + # Manual trigger to deploy to a specific environment + workflow_dispatch: + inputs: + stage: + type: choice + description: 'Environment to deploy to' + required: true + default: 'dev' + options: + - dev + - prod + allowDestructive: + type: boolean + description: 'Allow destructive changes' + required: true + default: false + + # Automatic deploy to dev on merge to main + push: + branches: + - main + +jobs: + deploy: + runs-on: ubuntu-latest + env: + NANGO_SECRET_KEY_DEV: ${{ secrets.NANGO_SECRET_KEY_DEV }} + NANGO_SECRET_KEY_PROD: ${{ secrets.NANGO_SECRET_KEY_PROD }} + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: npm ci + + - name: Deploy to Nango + run: | + if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then + stage="${{ inputs.stage }}" + else + stage="dev" + fi + + secret_key_var="NANGO_SECRET_KEY_$(echo "$stage" | tr '[:lower:]' '[:upper:]')" + secret_key="${!secret_key_var}" + + if [ -z "$secret_key" ]; then + echo "Error: ${secret_key_var} is not set" + exit 1 + fi + + destructive_flag="" + if [ "${{ github.event_name }}" == "workflow_dispatch" ] && [ "${{ inputs.allowDestructive }}" == "true" ]; then + destructive_flag="--allow-destructive" + fi + + npx nango@latest deploy "$stage" --secret-key "$secret_key" --no-dependency-update $destructive_flag +``` + + + + + **Destructive Changes** + + A destructive change removes an integration, sync function, or action function. To prevent accidental deletions, `nango deploy` will prompt for confirmation when it detects one. + + In CI, use `--auto-confirm` or `--allow-destructive` to bypass the prompt. We recommend only doing this on a manual trigger, as shown above. + + +## Testing in CI + +Run your test suite in CI before every deployment. Nango's testing framework uses dry runs and snapshot testing to validate your Functions without affecting live data: + +```bash +npm test +``` + +See the [Testing integrations guide](/guides/functions/testing) for details. + +## Ephemeral preview environments (e.g. Vercel) + +If you use ephemeral preview environments β€” such as Vercel preview deployments β€” as your staging layer, you'll run into a challenge: each preview has a unique URL, but Nango webhook URLs must be registered in advance and point to a stable destination. + + +Nango doesn't currently support creating environments programmatically. This is on the roadmap and will make ephemeral environment setups much cleaner when available. + + +For now, the simplest approach is to designate a fixed, long-lived Nango environment (e.g., `dev`) specifically for Nango-related changes, and use that consistently across preview deployments rather than trying to create a new Nango environment per preview. + +If you need previews to receive live webhook events, a proxy server is the current workaround: register a stable URL in Nango, and have the proxy forward incoming webhooks to the correct preview URL. + +## Dependency-safe CI and monorepos + +When running Nango in CI or monorepos, you often want to avoid modifying `package.json` or running extra installs from within Nango commands. Use `--no-dependency-update` on CLI commands, or set `NANGO_CLI_DEPENDENCY_UPDATE=false` as an environment variable: + +```bash +npx nango@latest deploy dev --no-dependency-update +``` + + +With `--no-dependency-update`, Nango will not install dependencies. Make sure your pipeline does so first (e.g. `npm ci`, `pnpm install --frozen-lockfile`, `yarn install --immutable`, or `bun install --frozen-lockfile`). + + + +In CI environments, Nango automatically disables dependency updates to prevent modifying `package.json`. Passing `--no-dependency-update` explicitly silences the related warning. + + +## Related resources + +- [Testing integrations](/guides/functions/testing) - A comprehensive guide to testing your Nango Functions. +- [API Keys reference](/reference/backend/http-api/api-keys) - Available scopes and advised profiles for CI/CD and other use cases. + +## Unified Apis + +Source: https://nango.dev/docs/guides/functions/unified-apis.md + +--- +title: 'Unified APIs with functions' +sidebarTitle: 'Unified APIs' +description: 'Build provider-specific functions behind one stable model and operation surface.' +--- + +API unification is the process of standardizing multiple provider APIs behind one interface that your product can use consistently. + +In Nango, unification is optional and code-first. You define the models and operations that fit your product, then implement provider-specific functions that translate to and from each external API. + +## When to unify + +Unification is useful when your customers use different systems for the same business object: + +- CRMs with contacts, companies, deals, and custom fields. +- ATS platforms with candidates, jobs, stages, and applications. +- Accounting systems with invoices, customers, transactions, and accounts. +- Support tools with tickets, comments, users, and organizations. + +It is less useful when the provider exposes concepts that are deeply unique. For example, Notion's block model can be partially normalized for simple document export, but advanced block behavior usually needs provider-specific logic. + +Unification does not need to be perfect to be valuable. A stable common model with explicit provider extensions is often better than trying to force every API into a lowest-common-denominator shape. + +## Design principles + +Design the unified model around your product, not around the external APIs. + +If your app already has a `Contact`, `Invoice`, or `Candidate` model, use that as the starting point. Keep the fields your workflows actually need, and resist carrying every provider field into the common model. + +Expect optional fields. Providers rarely expose the same data with the same semantics, and some customers may rely on custom fields or custom statuses. Model those gaps intentionally with nullable fields, fallbacks, metadata, or provider-specific extensions. + +Use the same model for reads and writes when possible. If a sync writes `UnifiedContact` records into your app, the corresponding create or update action should accept the same shape unless the write operation truly needs a different contract. + +Validate close to the external API. Use [data validation](/guides/functions/data-validation) in your functions so mapping drift, malformed provider responses, and invalid write inputs fail at the integration boundary. + +## Define the model + +Put shared schemas in a common file and import them from each provider implementation: + +```ts models.ts +import * as z from 'zod'; + +export const UnifiedUser = z.object({ + id: z.string().optional(), + name: z.string().optional(), + email: z.string().email().optional(), + externalUrl: z.string().url().optional(), + raw: z.unknown().optional() +}); + +export const CreateUnifiedUser = z.object({ + name: z.string(), + email: z.string().email() +}); + +export type UnifiedUser = z.infer; +``` + +Keep provider-specific fields explicit: + +```ts models.ts +export const JiraUser = UnifiedUser.extend({ + accountType: z.string().optional() +}); +``` + +## Implement unified actions + +Each provider gets an action with the same input and output contract: + + + + ```ts jira/actions/create-user.ts + import { createAction } from 'nango'; + import { CreateUnifiedUser, UnifiedUser } from '../../models'; + + export default createAction({ + description: 'Creates a user in Jira', + input: CreateUnifiedUser, + output: UnifiedUser, + exec: async (nango, input) => { + const response = await nango.post({ + endpoint: '/rest/api/3/user', + data: { + emailAddress: input.email, + displayName: input.name + } + }); + + return { + id: response.data.accountId, + name: response.data.displayName ?? input.name, + email: input.email, + raw: response.data + }; + } + }); + ``` + + + ```ts zendesk/actions/create-user.ts + import { createAction } from 'nango'; + import { CreateUnifiedUser, UnifiedUser } from '../../models'; + + export default createAction({ + description: 'Creates a user in Zendesk', + input: CreateUnifiedUser, + output: UnifiedUser, + exec: async (nango, input) => { + const response = await nango.post({ + endpoint: '/api/v2/users.json', + data: { + user: { + name: input.name, + email: input.email + } + } + }); + + return { + id: String(response.data.user.id), + name: response.data.user.name, + email: response.data.user.email, + externalUrl: response.data.user.url, + raw: response.data.user + }; + } + }); + ``` + + + +Your app can choose the integration ID at runtime and call the same action name for each provider: + +```ts +await nango.triggerAction(integrationId, connectionId, 'create-user', { + name: 'Ada Lovelace', + email: 'ada@example.com' +}); +``` + +## Implement unified syncs + +Sync functions are where read-side unification usually lives. Fetch provider records, map each page into your unified model, then save those records to Nango's records cache: + +```ts hubspot/syncs/users.ts +import { createSync } from 'nango'; +import { UnifiedUser } from '../../models'; + +export default createSync({ + description: 'Syncs users into the unified user model', + frequency: 'every hour', + models: { UnifiedUser }, + exec: async (nango) => { + for await (const page of nango.paginate({ + endpoint: '/crm/v3/objects/contacts', + params: { properties: 'email,firstname,lastname' }, + paginate: { + type: 'cursor', + cursor_path_in_response: 'paging.next.after', + cursor_name_in_request: 'after', + response_path: 'results', + limit_name_in_request: 'limit', + limit: 100 + } + })) { + const users = page.map((contact) => ({ + id: contact.id, + name: [contact.properties.firstname, contact.properties.lastname].filter(Boolean).join(' '), + email: contact.properties.email, + raw: contact + })); + + await nango.batchSave(users, 'UnifiedUser'); + } + } +}); +``` + +## Handle provider-specific behavior + +Use one of these patterns when the common model is not enough: + +- Extend the common model with provider-specific fields for integrations that need them. +- Store raw provider data under a `raw` field for debugging or advanced workflows. +- Use connection metadata for customer-specific mappings, such as custom fields, custom statuses, or selected pipelines. +- Create provider-specific actions for operations that do not map cleanly to the unified interface. + +## Related guides + +- [Action functions](/guides/functions/action-functions) +- [Sync functions](/guides/functions/syncs/sync-functions) +- [Data validation](/guides/functions/data-validation) +- [Storage](/guides/functions/storage) + +## Observability + +Source: https://nango.dev/docs/guides/platform/observability.md + +--- +title: 'Observability' +sidebarTitle: 'Observability' +description: 'How Nango helps you with observability for your integrations' +--- + +Nango's logs are comprehensive and give you a detailed picture of what happens in your integrations. + +## Our approach + +Since integrations rely on third-party APIs, production issues are bound to happen. + +When you encounter a problem, great observability is the difference between a week-long needle-in-a-haystack hunt and a timely resolution. + +We built Nango's logs based on three principles: + +- **Comprehensive**: Everything that happens in Nango for your integrations produces an "operation" in the logs +- **Detailed**: Every operation and every log message contains detailed information about the integration, [connection](/guides/auth/auth-guide#overview), and [function](/guides/functions/functions-guide). Error messages are as detailed as the external APIs allow. +- **Customizable**: You can easily log your own messages from functions you write ([learn more](/reference/functions/functions-sdk#logging)). To consume logs, you can either use our built-in interface or export them with our [OpenTelemetry exporter](#opentelemetry-export) + +## Overview of Nango logs + + + ![](/images/screenshots/nango-logs-overview.png) + + +Logs are structured into: +- Operations: High-level actions happening in your Nango account (e.g., sync executed, connection created, webhook processed) +- Log messages: Nested in operations, these provide details on what happened (e.g., HTTP request executed, data validation warning, custom log message) + +Nango provides detailed filtering and searching of log messages by integration, connection, operation type, status, etc. + +We recommend exploring the logs in your own Nango account under **Logs**. + +## OpenTelemetry export + +Nango supports exporting OpenTelemetry traces so you can monitor and analyze integration activity in your own observability stack. + +Use this for: +- Advanced custom metrics +- Advanced alerting and escalation paths (e.g., segment sync errors by customer account for customized escalation paths) + +### Supported operations + +The following operations are exported as traces: +- Sync executions +- Action executions +- Third-party API webhook executions +- Proxied requests + + + If you need support for other operations please reach out. We can enable support for them. + + +### Configuration + + + + Log into the Nango dashboard and navigate to the Environment settings page. + + + In the Environment Settings, provide the following information: + - OpenTelemetry endpoint: The endpoint URL of your OpenTelemetry collector. Ex: https://my.otlp.collector:4318 + - Headers (Optional): Any authorization headers or additional headers required to access your collector. + + + +## Related guides + +- [Function logging](/guides/functions/logging) - add custom logs from function code. +- [Webhooks from Nango](/guides/platform/webhooks-from-nango#webhook-retries-debugging) - debug webhook delivery. +- [Common issues](/guides/platform/common-issues) - troubleshoot failed auth, sync, and proxy operations. + +## Environments + +Source: https://nango.dev/docs/guides/platform/environments.md +Description: Organize your integrations & data with environments + +Environments help you segment your integration configuration and customer data across different stages of your development lifecycle. + +## Overview + +Each environment in your Nango account is completely isolated with its own: + +- Integration configurations +- [Functions](/guides/functions/functions-guide) +- [Connections](/guides/auth/auth-guide) +- Environment-specific settings + + +Each Nango account comes with **dev** and **prod** environments by default. Additional environments are available depending on your [pricing plan](https://www.nango.dev/pricing). + + +## Production environments + +Any environment can be designated as a production environment. This affects how team members interact with it based on their [role](/guides/platform/security#team-and-roles). + +**To mark an environment as production:** + +1. Open the environment settings (gear icon in the top navigation) +2. Toggle the **Production environment** switch + + +Only **Full Access** team members can toggle the production flag. Once an environment is marked as production, **Support** members get read-only access to it, and **Contributor** members lose access entirely. + + +By default, the `prod` environment created with your account is already marked as production. + +## Engineering collaboration + +Use a **shared non-production environment** (usually `dev`) for day-to-day engineering work. The team shares integrations and the baseline function set. For local webhook testing, each engineer creates their own connections with a webhook URL override (see below). + +### Local webhooks on a shared environment + +Keep the environment webhook URL pointed at your shared app (or staging backend). To receive webhooks from Nango locally, create connections with a [per-connection `webhook_url` override](/guides/platform/webhooks-from-nango#override-webhook-urls-per-connection) pointing at your local webhook endpoint (for example via [ngrok](https://ngrok.com/)). + +One convenient pattern is to read the override from an optional env var, so the same connect-session code works locally and when the var is unset. For example, set `NANGO_CONNECTION_WEBHOOK_URL` in your local `.env` to that URL and leave it unset elsewhere: + +```ts +const webhookUrl = process.env.NANGO_CONNECTION_WEBHOOK_URL; // e.g. https://.ngrok.app/webhooks-from-nango + +const session = await nango.createConnectSession({ + tags: { + end_user_id: '' + }, + allowed_integrations: [''], + ...(webhookUrl && { + integrations_config_defaults: { + '': { + connection_config: { webhook_url: webhookUrl } + } + } + }) +}); +``` + +When the var is set, new connections from that session route webhooks to your machine without changing the environment webhook URLs. + +### Local function deploys on a shared environment + +A full `nango deploy` reconciles every function in the environment. On a shared collaborative environment, that can overwrite teammates' deploys. Deploy only what you changed: + +```bash +nango deploy --sync +nango deploy --action +nango deploy --integration # all functions for one integration, including event functions +``` + +Reserve full deploys for environments where the repo is the sole source of truth (for example staging or prod). See the [CI/CD guide](/guides/functions/ci-cd). + +### One environment per engineer + +You can give each engineer their own environment for full isolation. You then need to recreate integrations, connections, and settings in each environment yourself; that also means more API keys to manage and config that tends to drift over time. A shared `dev` environment avoids that overhead for most teams. + +## Best practices + +**Mirror your application environments** + +We recommend creating Nango environments that match your application's deployment stages. For example: +- Development / local β†’ dev environment +- Staging β†’ staging environment +- Production β†’ prod environment +- Demo β†’ demo environment + +**Deploy to specific environments** + +When you deploy [Functions](/guides/functions/functions-guide), you always target a specific environment. This ensures changes are tested before reaching production. + +## Related guides + +- [API keys](/reference/backend/http-api/api-keys) - scope keys per environment. +- [CI/CD](/guides/functions/ci-cd) - deploy functions safely across environments. +- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - environment and per-connection webhook URLs. +- [Self-host Nango](/guides/platform/self-hosting) - plan environments for self-hosted deployments. + +## Limits + +Source: https://nango.dev/docs/guides/platform/limits.md + +--- +title: 'Limits' +sidebarTitle: 'Limits' +description: 'Overview of resource limits on Nango Cloud.' +--- + +Nango Cloud has several resource limits to ensure platform stability and fair usage across all customers. + + +For plan-specific limits, refer to the [pricing page](https://www.nango.dev/pricing) and the Usage & Billing page in your account. + + +## API rate limits + +Rate limits apply to API requests from your application to Nango: + +| Plan | Requests per Minute | +| - | - | +| Free tier | 200 | +| Starter | 1,000 | +| Growth | 2,000 | +| Enterprise | Custom | + + +If you exceed the rate limit, use the standard rate-limit headers to determine when to resume requests. + + +## Function execution limits + +Different function types have varying execution and enqueuing time limits: + +| Function Type | Max Execution Time | +| - | - | +| [Sync functions](/guides/functions/syncs/sync-functions) | 24 hours | +| [Action functions](/guides/functions/action-functions) | 15 minutes | +| [Webhook functions](/guides/functions/webhook-functions) | 1 hour | + +### Minimum sync frequency + +For polling syncs, the minimum frequency is **30 seconds**, available on all plans. You can set the frequency in the sync definition or override it per connection using the [SDK](/reference/backend/backend-sdk/node#override-sync-connection-frequency) or [API](/reference/backend/http-api/sync/update-connection-frequency). + +For real-time updates, use [real-time syncs](/guides/functions/syncs/realtime-syncs) which trigger from external API webhooks instead of polling. + +### Sync variant limits + +Each sync can have a maximum of **100 variants** per connection. For heavier workloads, reach out to increase this limit. See the [sync partitioning guide](/guides/functions/syncs/sync-partitioning) for more details. + +### Action function output limits + +Action functions have a maximum output payload size of **2MB**. For large payloads, use the [Proxy](/guides/platform/proxy-requests) instead. + +## Data retention policies + +Nango automatically manages data retention for records in the sync cache: + +### Payload pruning (30 days) + +If a record hasn't been updated for **30 days**, Nango automatically prunes its payload while preserving: +- Record ID +- Sync state +- Payload hash (for change detection) + +The record still exists and Nango can detect future changes, but the data fields are no longer retrievable from the cache. + +### Hard deletion (60 days) + +If a sync hasn't executed for **60 days**, all associated records (payload + metadata) are permanently deleted. + + +These policies ensure sensitive data isn't stored indefinitely. If you need to access record payloads long after updates (30+ days), please reach out in the [Slack community](https://nango.dev/slack). + + +## Webhook limits + +Webhooks sent from Nango to your application have the following limits: + +- **Timeout**: 20 seconds +- **Retries**: 2 attempts + +These limits apply to all webhook types: auth, sync function completion, async action function completion, and webhook forwards. + +## Related guides + +- [Rate limits](/guides/functions/rate-limits) - handle provider throttling in functions. +- [Sync efficiency](/guides/functions/syncs/sync-efficiency) - stay within payload and runtime limits. +- [Security](/guides/platform/security) - review retention and access constraints. + + +**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + + +## Security + +Source: https://nango.dev/docs/guides/platform/security.md + +--- +title: 'Security' +sidebarTitle: 'Security' +description: 'How Nango secures your API credentials and customer data.' +--- + +Nango is designed with security as a core principle. This page provides technical details about how Nango stores, encrypts, and manages API credentials. + +## Compliance + +Nango is **SOC 2 Type II** certified, **GDPR** compliant, and **HIPAA** compliant. + +| Certification | Details | +| - | - | +| SOC 2 Type II | Annual audit covering security, availability, and confidentiality. [View report β†’](https://trust.nango.dev) | +| GDPR | Data Processing Agreement (DPA) automatically applies to all cloud accounts. [View DPA β†’](https://nango.dev/terms#dpa) | +| HIPAA | Business Associate Agreement (BAA) available on request. [Contact us β†’](https://nango.dev/demo) | + +Our security practices include: + +- Regular security assessments and penetration testing +- Secure development lifecycle +- Incident response procedures +- Continuous monitoring and alerting + +Visit our [Trust Center](https://trust.nango.dev) for the latest compliance documentation, security policies, and audit reports. + +## Credential storage + +### What credentials are stored + +Nango stores the following credential types depending on your API integrations: + +- **OAuth tokens**: Access tokens, refresh tokens, and associated metadata +- **API keys**: For APIs using key-based authentication +- **Client credentials**: OAuth client IDs and secrets for your integrations +- **Connection configuration**: OAuth scopes, authorization parameters, and provider-specific settings + +### Storage infrastructure + +Nango Cloud stores all data in **AWS Aurora PostgreSQL** databases hosted in AWS. The database infrastructure includes: + +- Encryption at rest using AWS-managed keys +- Automated backups with point-in-time recovery +- Multi-AZ deployment for high availability +- Network isolation within a private VPC + +For self-hosted deployments, you control the database infrastructure and can apply your own security policies. + +## Encryption + +### Encryption at rest + +All sensitive credentials are encrypted before being stored in the database using **AES-256-GCM** (Advanced Encryption Standard with Galois/Counter Mode). + +| Property | Value | +| - | - | +| Algorithm | AES-256-GCM | +| Key size | 256 bits (32 bytes) | +| IV size | 12 bytes (generated per encryption) | +| Auth tag size | 16 bytes | + +### What is encrypted + +The following data types are encrypted at rest: + +- Connection credentials (OAuth tokens, API keys, etc.) +- OAuth client secrets (your integration credentials) +- Environment secret keys +- Environment variables + +### Key management + +- **Nango Cloud**: Encryption keys are securely managed by Nango. All credentials are encrypted at rest. +- **Self-hosted**: You must provide your own encryption key to enable encryption at rest. + +### Encryption in transit + +All data transmitted to and from Nango is encrypted using TLS 1.2+. This includes: + +- API requests between your application and Nango +- Requests from Nango to external APIs (using each provider's TLS configuration) +- Dashboard access + +## Data retention + +### Active connections + +Credentials are stored for as long as the connection exists. You have full control over connection lifecycle: + +- Create connections when users authorize integrations +- Delete connections at any time via the API or dashboard +- Connections can be programmatically managed through your application + +#### Retention after deletion + +When a connection is deleted: + +1. **Immediate soft delete**: Connection is marked as deleted and becomes inaccessible +2. **Associated data cleanup**: Sync functions are stopped, and scheduled tasks are cancelled +3. **Hard delete after retention period**: Credentials and associated data are permanently removed from the database + +The default retention period is **31 days**. For self-hosted deployments, this is configurable. + +This retention period allows for: +- Recovery from accidental deletions +- Compliance with audit requirements +- Graceful handling of in-flight operations + +#### What is deleted + +When a connection is permanently deleted, the following data is removed: + +- All stored credentials (tokens, keys, secrets) +- Connection metadata and configuration +- Sync records associated with the connection +- Related job history and logs + +### Synced records retention + + +This section only applies if you are using Functions of type Sync, e.g. for replicating data or receiving trigger notifications from an external API. + + +Nango automatically manages data retention for records stored in the Nango records cache to ensure that sensitive user data is not stored indefinitely when it's no longer needed. + +#### Automated payload pruning (30 days) + +If a record has not been updated for **30 days**, Nango will automatically empty its payload. + +**Impact:** +After pruning, the record's data fields are no longer retrievable from the Nango cache via the API or SDK. However, Nango retains the metadata needed for change detection (record ID and payload hash). Your sync functions will continue to work normally. This pruning does not impact sync execution or delta-detection capabilities. + +#### Automated hard deletion (60 days) + +If a sync has not executed for **60 days**, all records belonging to that sync will be permanently deleted. + +**Impact:** +Complete removal of all records from the inactive sync, including metadata and payload hashes used for delta-detection. The sync itself remains configured but starts fresh on the next execution. Nango will no longer be able to detect changes against previously synced records. + +#### When do retention policies apply? + +- **30-day pruning countdown**: Starts from the last time a specific record was updated. +- **60-day deletion countdown**: Starts from the last time a sync successfully executed. + +#### Best practices + +To work optimally with Nango's retention policies: + +**1. Fetch records promptly** + +Set up [webhooks from Nango](/guides/platform/webhooks-from-nango) to be notified when new data is available. Fetch the updated records immediately after receiving a sync webhook. + +**2. Use cursor-based synchronization** + +Track your sync progress using cursors to ensure you never miss records, even if webhooks are occasionally missed. Store the cursor of the last-fetched record and use it on subsequent fetches. + +**3. Store data in your own system** + +Don't use Nango's cache as your primary data store. Instead: +- Store synced records in your own database +- Use Nango as a synchronization pipeline +- Keep your own copy of all critical data + +#### Longer retention requirements + +If your use case requires accessing record payloads from Nango's cache beyond the 30-day window, please reach out to the Nango team. We can work with you to ensure you don't experience breaking changes. + +## Deletion procedures + +### User-initiated deletion + +You can delete connections through: + +- **Dashboard**: Navigate to the connection and click "Delete" +- **API**: Call the [delete connection endpoint](/reference/backend/http-api/connections/delete) +- **SDK**: Use the `deleteConnection` method in any of our backend SDKs + +### Automatic cleanup + +Nango automatically cleans up: + +- Expired OAuth sessions +- Expired connect session tokens +- Orphaned data from deleted integrations + +### Data purge requests + +For compliance requirements (e.g., GDPR), contact Nango support to request immediate data purges. We can expedite the deletion process when required by regulation. + +## Access controls + +### API authentication + +Nango supports multiple authentication methods: + +| Method | Use case | Token lifetime | +| - | - | - | +| Secret key | Server-to-server API access | Long-lived (until rotated) | +| Connect session token | Frontend auth flows | 30 minutes | +| Session cookie | Dashboard access | Session-based | + +### Secret key security + +- Secret keys are environment-specific (dev, prod, etc.) +- Keys can be rotated via the dashboard +- All API requests require a valid secret key in the `Authorization` header + +### Environment isolation + +Each [environment](/guides/platform/environments) in your Nango account is completely isolated: + +- Separate credentials and connections +- Separate integration configurations +- Separate secret keys + +This ensures your production data is never accessible from development environments. + +### Audit logging + +All credential access and modifications are logged: + +- Connection creation and deletion +- Credential refresh operations +- API requests using credentials + +Logs are available in the Nango dashboard and can be exported via [OpenTelemetry](/guides/platform/observability#opentelemetry-export). + + +## Team & roles + +Nango supports multiple team members per account with role-based access control (RBAC). Roles determine what each member can view and modify, particularly in production environments. + +### Role overview + +There are three roles: + +| | **Full Access** | **Support** | **Contributor** | +| - | - | - | - | +| **Summary** | Unrestricted access across all environments. The only role that can manage account settings, billing, and the team. | Designed for monitoring production without being able to change it. Full access in non-production environments. | Designed for developers who work exclusively in non-production environments. No production access at all. | + +**Full Access is the default role** for just-in-time (JIT) provisioning when using SSO. When inviting members manually, you choose their role during the invitation flow. + + +At least one Full Access member is required per account. + + +### Permissions + +| | **Full Access** | **Support** | **Contributor** | +| - | - | - | - | +| Non-production: read (integrations, connections, syncs, logs) | βœ“ | βœ“ | βœ“ | +| Non-production: write / delete | βœ“ | βœ“ | βœ“ | +| Production: read (integrations, connections, syncs, logs) | βœ“ | βœ“ | β€” | +| Production: trigger syncs | βœ“ | βœ“ | β€” | +| Production: write / delete | βœ“ | β€” | β€” | +| Production: view secret key | βœ“ | β€” | β€” | +| Production: view integration credentials | βœ“ | β€” | β€” | +| Production: view connection credentials | βœ“ | β€” | β€” | +| Invite / update / remove team members | βœ“ | β€” | β€” | +| Manage billing & plan | βœ“ | β€” | β€” | +| Configure Connect UI | βœ“ | β€” | β€” | +| Create environments / toggle production flag | βœ“ | β€” | β€” | + + +All environments appear in the dashboard switcher regardless of role, but access is enforced server-side β€” users are blocked from entering environments their role does not permit. Permissions cannot be bypassed by manipulating URLs or API parameters. + + +### Production environment flag + +Whether an environment is considered production is configured in **Environment Settings β†’ General**. The production status of the current environment is also visible in the environment dropdown at the top left of the dashboard. + +The flag can be set on any environment regardless of its name β€” not just `prod`. This lets you protect environments like `prod-eu`, `production`, or `live` the same way. + +Only **Full Access** members can toggle this flag. Once set, Support members get read-only access (without sensitive credentials) and Contributor members lose access entirely. + + +The production flag currently governs role-based access. In the future it may also control additional environment traits to differentiate production-grade environments from development or staging ones. + + + +These roles apply to dashboard access only. They do not affect API authentication β€” any caller with a valid secret key retains full API access regardless of their dashboard role. + + + +## Single sign-on (SSO) + +Nango Cloud uses [WorkOS](https://workos.com) to power SSO. + +### Availability + +| Plan | SSO support | +| - | - | +| Free / Starter | Google SSO only | +| Growth | SSO with 20+ identity providers (add-on) | +| Enterprise (Cloud) | SSO with 20+ identity providers (included) | +| Enterprise (Self-hosted) | Not yet available (planned) | + +### Supported providers + +Through WorkOS, Nango supports the main SSO providers, including **Okta**, **Entra ID**, **OneLogin** and 20+ other identity providers. + +### How to enable SSO + +1. To enable SSO for your account, contact the Nango team (on our shared Slack channel or the [community](https://nango.dev/slack)). +2. If you are on the Growth plan, we will subscribe your workspace to the SSO add-on. +3. We will invite an admin from your company to complete the SSO setup flow. + +### Setup flow + +During setup, your company admin can configure the **domains allowed to sign in**. User accounts are created automatically through just-in-time (JIT) provisioning. + +### How users log in + +Once SSO is configured, users sign in through your company's identity provider (IdP). Nango currently does not provide a dedicated SSO button on the login page β€” login must be initiated from the IdP side. + +## IP Allowlist + +Some integrations require network-level access controls that only allow inbound traffic from known IP addresses. +This page lists the **public IP addresses used by Nango services** when making outbound requests. + + +### When is IP allowlisting required? + +IP allowlisting is only required if **your customers' systems** restrict inbound network traffic. + +Common examples include: +- Private or self-hosted APIs behind a firewall +- Enterprise systems that only accept traffic from approved IPs +- Third-party services with IP-based access controls + +If a system is publicly accessible without IP restrictions, **no allowlist configuration is needed**. + + +### Nango public IP addresses + +Allowlist the following IP addresses to permit inbound traffic from Nango: + +- `52.34.139.153` +- `54.69.127.183` +- `44.247.133.183` +- `52.26.211.56` + + +### IP address changes + +While we aim to keep IP addresses stable, they **may change over time** as we scale or improve reliability. + +To minimize disruption: +- Ensure all listed IPs are allowlisted +- Periodically review this page for updates + +We will make reasonable efforts to communicate breaking changes in advance. + +## API Key Scoping + +Nango supports scoped API keys, allowing you to follow the principle of least privilege when granting programmatic access to your environments. Each API key can be restricted to specific operations β€” for example, a CI/CD pipeline key that can only deploy, or a backend service key that can read connections but not manage integrations. + +For details on available scopes, advised profiles, and key management, see the [API Keys reference](/reference/backend/http-api/api-keys). + + +**Questions about security?** Please reach out in the [Slack community](https://nango.dev/slack) or contact security@nango.dev. + + +## Related guides + +- [API keys](/reference/backend/http-api/api-keys) - create scoped keys for production access. +- [Auth guide](/guides/auth/auth-guide) - keep provider credentials out of your app. +- [Token refreshing and validity](/guides/auth/token-refreshing) - handle revoked OAuth credentials. +- [Self-host Nango](/guides/platform/self-hosting) - review deployment and data ownership options. + +## Self Hosting + +Source: https://nango.dev/docs/guides/platform/self-hosting.md + +--- +title: 'Self-host Nango' +sidebarTitle: 'Self-hosting' +description: 'Overview of self-hosted deployments.' +--- + +Nango offers a self-hosted deployment option for Enterprise customers. This guide covers deployment, scaling, updates, and other key operational details. + +## Architecture overview + + + + + +## Architecture components + +Nango consists of several core services, each handling specific responsibilities: + +- **Server (Node service)**: Powers the dashboard, API, proxy requests, and incoming/outgoing webhooks. +- **Orchestrator (Node service)**: Manages task scheduling and state tracking. +- **Jobs (Node service)**: Processes tasks and dispatches them to the Runner. +- **Runner (Node service)**: Executes integration code and interacts with external APIs. +- **Persist (Node service)**: Stores synced records and logs. +- **Postgres**: Stores data for the control plane, API credentials, scheduled tasks, and synced records. +- **Object Storage (e.g. S3)**: Stores compiled integration code for execution by the Runner. +- **ElasticSearch**: Stores execution data. +- **Redis**: Caches system data, including socket information, token refresh locks, and rate limits. + +## Cloud vs. self-hosted architecture + +The Nango architecture is largely the same for both Cloud and Enterprise self-hosting. This ensures self-hosted instances benefit from continuous dogfooding and load testing. + +The primary differences are: +- In the Cloud version, the Runner service runs as isolated instances per customer. +- The Postgres database is segmented by use case (control plane, task scheduling, synced records). + +## Features + +All paid features available on Nango Cloud are also included in the Enterprise self-hosted edition. + +## Plan requirement + +An [Enterprise plan](https://www.nango.dev/pricing) subscription is required. + +Enterprise Self-Hosted pricing contain a fixed annual license and maintenance fee, plus a fraction of the cloud usage-based fees since infrastructure is on the customer side. + +## Intended users + +Inteded for large and/or regulated enterprises. + +## Deployment + +By default, Nango is deployed using [Helm charts](https://github.com/NangoHQ/nango-helm-charts). Custom deployments (e.g., ECS) are possible with our guidance. + +## Updates + +Managed image updates are published on a **two-month cadence**, with occasional **hotfixes** as needed. Notifications about new releases will be posted to your dedicated Nango Slack channel. + +You can also subscribe to release notifications on the [`NangoHQ/managed-image-releases`](https://github.com/NangoHQ/managed-image-releases) repository: + +- **GitHub:** watch the repository, select **Custom**, and enable **Releases**. +- **RSS/Atom:** subscribe to `https://github.com/NangoHQ/managed-image-releases/releases.atom`, which can be wired into Slack, Microsoft Teams, RSS readers, or internal automation. + +Each release includes the managed image tag, application version, source commit hash, release date, Docker pull reference, a GitHub compare link to the previous managed release, and a generated changelog of changes since the previous managed release. + +### Image tags + +Managed image tags follow this format: + +``` +nangohq/nango:managed-{managed-release-version}-{application-version}-{commit-sha} +``` + +* `managed-release-version`: Semantic version for the managed image lifecycle (major = breaking, minor/patch = features/fixes) +* `application-version`: Semantic version of the Nango application baked into the image +* `commit-sha`: Full Git commit hash of the released source + +For example, pull a release from Docker Hub with: + +```bash +docker pull nangohq/nango:managed-1.5.4-0.70.4-0fe07a6d83aea0becc4cea382c5cead2f555718d +``` + +Customers should **pin their CLI version to the `application-version`** specified in the tag for compatibility. + +### Versions and policy + +You can find the latest version in [`managed-manifest.json`](https://github.com/NangoHQ/managed-image-releases/blob/main/managed-manifest.json) on `managed-image-releases` (mirrored from [`NangoHQ/nango`](https://github.com/NangoHQ/nango/blob/master/managed-manifest.json) on each release). The in-repo [`CHANGELOG.md`](https://github.com/NangoHQ/managed-image-releases/blob/main/CHANGELOG.md) tracks release history. + +Each managed release maps to a specific source commit, and published image tags are never changed after release. Customers are encouraged to stay reasonably current with managed image releases. + +See the full [changelog](/updates/changelog) for details on each release. + +## Cloud provider support + +Supports all major cloud providers (AWS, GCP, Azure). + +## Recommended configuration + +- **5 Node services** (Server, Persist, Runner, Jobs, Orchestrator): 1 CPU, 2GB RAM per service +- **Postgres database**: 2 CPU, 8GB RAM, 128GB storage +- **Redis data store**: 128MB +- **ElasticSearch data store**: 2 vCPU, 1GB RAM, 30GB storage +- **Object storage (e.g. S3)**: less than 500MB of storage + +## Scaling + +The default configuration supports 1M+ sync/action executions per day (assuming ~2s execution time per action/sync). + +Auto-scaling is not provided out-of-the-box yet, but the default configuration scales far. We can guide you on configuring auto-scaling when needed. + +Bottlenecks mostly depend on: +- **Action/sync execution time**: solved by scaling the Runner service vertically, then horizontally. +- **Cached records & size (for sync functions only)**: solved by scaling Postgres vertically. + +## Data storage + +- **Postgres**: Stores data for the control plane, API credentials, scheduled tasks, and synced records. +- **Object Storage (e.g. S3)**: Stores compiled integration code for execution by the Runner. +- **ElasticSearch**: Stores execution data. +- **Redis**: Caches system data, including socket information, token refresh locks, and rate limits. + +## Using existing data stores + +Yes, Nango is flexible with data store setups. However, we recommend a separate instance for independent scaling. + +## Internet access requirements + +- **Server:** Required for proxy requests, credential management, and incoming/outgoing webhooks (inbound & outbound traffic). +- **Runner:** Required for reading/writing data from external APIs during sync and action executions (outbound traffic only). + +## Exporting metrics & logs + +Yes, metrics and logs can be exported to any monitoring tool using our OpenTelemetry Export add-on. Additional metrics and logs can be added upon request. + +## Email service + +Nango uses emails for account verification, password reset, and sending invitations, etc... + +Any SMTP server can be configured to be used by Nango for these email communications. + +## Encryption key + +You must provide your own encryption key via the `NANGO_ENCRYPTION_KEY` environment variable to enable encryption at rest. It encrypts credentials in the control-plane database as well as data in the records cache. Without this key, credentials are stored unencrypted. + +The records cache always requires this key. If you run sync functions that persist records, the persist and records services fail to store or retrieve records when `NANGO_ENCRYPTION_KEY` is not setβ€”they do not fall back to plaintext. + + +The encryption key must be a base64-encoded 256-bit (32-byte) key. Key rotation is not supported yetβ€”changing the key after initial setup will cause decryption failures. Plan your key management accordingly. + + +## Data retention configuration + +The default retention period for deleted connections is 31 days. You can configure this via the `CRON_DELETE_OLD_CONNECTIONS_MAX_DAYS` environment variable. + +## Free self-hosting + +A limited free self-hosting option is available for hobby projects. It is intended for lightweight deployments that need Auth and Proxy, without the managed features and support included with Enterprise self-hosting or Nango Cloud. + +For more details, see the [pricing page](https://nango.dev/pricing) or [schedule a call](https://nango.dev/demo) to discuss the Enterprise self-hosted version. + +### Feature availability + +| Feature | Free self-hosted | Enterprise self-hosted / Nango Cloud | +| --- | --- | --- | +| Auth | Yes | Yes | +| Proxy | Yes | Yes | +| Observability | Auth + proxy only | Full | +| OpenTelemetry export | No | Yes | +| Functions | No | Yes | +| Webhooks | No | Yes | +| MCP server | No | Yes | +| Customize auth branding | No | Yes | +| Role-based permissions | No | Yes | +| SAML SSO | No | On the roadmap | +| Support SLA | No | Yes | + +### Server URL, callback URL, and custom domains + +Add server environment variables for the instance URL and port in the `.env` file or directly in your hosting provider: + +```sh +NANGO_SERVER_URL= +SERVER_PORT= +``` + +The resulting OAuth callback URL is `/oauth/callback`. + +You can customize the callback URL by updating the "Callback URL" field in the "Environment Settings" tab in the Nango admin. + + +If you are using a custom domain, update `NANGO_SERVER_URL` to match it. + + +### Connect UI + +Nango Connect is available for self-hosted deployments in the main Docker image. + +```sh +FLAG_SERVE_CONNECT_UI=true +NANGO_CONNECT_UI_PORT=3009 +NANGO_PUBLIC_CONNECT_URL= +``` + +Nango Connect is available by default at `http://localhost:3009`. + + +If you are using a custom domain, update `NANGO_PUBLIC_CONNECT_URL` to match it. + + +See [Auth](/guides/auth/auth-guide) for the end-user connection flow. + +### Persistent storage + +If you deploy with Docker Compose, the bundled database uses local container storage. This is not appropriate for production. + +Connect Nango to an external Postgres database by setting the database environment variables: + +```sh +NANGO_DB_USER= +NANGO_DB_PASSWORD= +NANGO_DB_HOST= +NANGO_DB_PORT= +NANGO_DB_NAME= +NANGO_DB_SSL=true +``` + +You can also use a database URL: + +```sh +NANGO_DATABASE_URL=postgresql://user:password@host:port/dbname +``` + +Special characters in `NANGO_DATABASE_URL` must be URL encoded. + + +Nango is incompatible with connection poolers using `pool_mode=transaction`. Use a direct database connection or configure the pooler to use a different mode. + + +Records saved by sync functions can be persisted in a dedicated database. To use a dedicated records database, set `RECORDS_DATABASE_URL`: + +```sh +RECORDS_DATABASE_URL=postgresql://user:password@host:port/dbname +``` + +Special characters in `RECORDS_DATABASE_URL` must be URL encoded. If it is not specified, records are stored in the main database. + + +Deploying with Render or Heroku automatically generates a persistent database connected to your Nango instance. + + +### External Redis + +The bundled Redis is fine for local use but not for production. Connect Nango to an external Redis (or Valkey) with either a full URL or discrete variables: + +```sh +NANGO_REDIS_URL=rediss://:@: +# or +NANGO_REDIS_HOST= +NANGO_REDIS_PORT= +NANGO_REDIS_AUTH= +``` + +Use the `rediss://` scheme (or discrete variables, which default to TLS) to enable in-transit encryption. + +#### IAM / short-lived token authentication + +Managed Redis with IAM authentication (for example GCP Memorystore for Valkey) uses a short-lived token as the password and requires the token to be refreshed before it expires. Instead of a static `NANGO_REDIS_AUTH`, point Nango at a file that an external process (such as a sidecar) keeps up to date: + +```sh +NANGO_REDIS_HOST= +NANGO_REDIS_PORT= +NANGO_REDIS_AUTH_TOKEN_FILE=/path/to/token # re-read on every (re)connect +NANGO_REDIS_USERNAME= # optional; defaults to "default" +``` + +Nango reads the token file on every connection and reconnection, so a rotated token is always picked up without a restart. This is cloud-agnostic: anything that writes the current token to the file works. The writer must update the file atomically β€” write a temporary file and `rename()` it into place β€” so a reconnect never reads a half-written token and fails authentication. When `NANGO_REDIS_AUTH_TOKEN_FILE` is set, do not embed credentials in `NANGO_REDIS_URL`. + +The runner boundary has the same set of variables prefixed with `NANGO_CUSTOMER_REDIS_` (for example `NANGO_CUSTOMER_REDIS_AUTH_TOKEN_FILE`); it falls back to the system Redis when unset. + +### Securing your instance + +#### Proxy base URL override hardening + +The [proxy](/guides/platform/proxy-requests) can send authenticated requests to external APIs. Some proxy calls accept a **base URL override** (HTTP header `Base-Url-Override`, SDK `baseUrlOverride`, or an integration `custom.baseUrl`) to target a host that differs from the provider's default API base URL. + +Because the proxy makes outbound HTTP requests from your Nango server (and from the runner for sync and action scripts), a caller with permission to use the proxy could use an override to reach hosts that were not meant to be exposedβ€”such as cloud metadata services or `localhost` on the host making the request. This is a classic **SSRF** risk. + +By default, Nango keeps base URL override **enabled** and blocks override targets and redirect hops whose hostnames match a built-in denylist (cloud metadata and loopback addresses). Configure these environment variables and restart the **server** and **runners** after changes: + +```sh +NANGO_PROXY_BASE_URL_OVERRIDE_ENABLED=true +NANGO_PROXY_BASE_URL_OVERRIDE_DENYLIST='["169.254.169.254","metadata.google.internal","localhost","127.0.0.1","[::1]"]' +``` + +| Variable | Default | Purpose | +| - | - | - | +| `NANGO_PROXY_BASE_URL_OVERRIDE_ENABLED` | `true` | Set to `false` to reject all base URL overrides | +| `NANGO_PROXY_BASE_URL_OVERRIDE_DENYLIST` | Secure defaults when unset | JSON array of hostnames or URLs to block; custom entries are merged with defaults | +| `NANGO_OUTBOUND_URL_POLICY` | Secure defaults when unset | JSON object controlling SSRF protection for proxy, customer webhooks, and `uncontrolledFetch` | + +**Operator guidance:** + +- **Production:** keep the default denylist. Add environment-specific hosts if your deployment exposes additional internal endpoints. +- **Legitimate localhost overrides (dev only):** set `NANGO_PROXY_BASE_URL_OVERRIDE_DENYLIST='[]'` to restore fail-open behavior. +- **No overrides at all:** set `NANGO_PROXY_BASE_URL_OVERRIDE_ENABLED=false`. + +Denylist matching is hostname-based and applies to redirect hops as well as the initial override target. + +#### Outbound URL policy (DNS rebinding, private IPs, redirects) + +Beyond the hostname denylist, Nango routes every outbound connection on the **proxy**, **customer webhook delivery**, and **`uncontrolledFetch`** paths through DNS-pinning agents that re-validate the *resolved* IP address β€” closing DNS-rebinding and redirect-to-internal-address SSRF holes. The behavior is controlled by `NANGO_OUTBOUND_URL_POLICY`, a JSON object (applied on top of the denylist). It propagates automatically to runners. + +The `mode` field selects how hostnames are filtered: + +- **`denylist`** (default): every destination is reachable except hostnames on the denylist (plus the IP-based protections below). This is the out-of-the-box mode, since the denylist always carries the secure defaults. +- **`allowlist`**: only hostnames in `allowlist` are reachable (a leading `.` matches subdomains); everything else is rejected. The denylist and the IP-based protections still apply on top, so allowlist is strictly *more* restrictive β€” a listed hostname that resolves to a blocked IP is still rejected. +- **`permissive`**: no hostname-based filtering (the IP-based protections below still apply). You only reach this mode deliberately β€” either by emptying the server denylist with no explicit mode (see below), or by setting `mode: "permissive"`. + + +The IP-based protections apply in **every** mode, including `permissive`. Loopback (`127.0.0.0/8`, `::1`) and unspecified addresses are **always** blocked; private/RFC1918/CGNAT addresses (`blockPrivateIps`) and link-local addresses β€” including the cloud-metadata IP `169.254.169.254` (`blockLinkLocal`) β€” are blocked by default. + +The denylist is **never empty by default** β€” it is always seeded with the secure defaults (`localhost`, `metadata.google.internal`, `169.254.169.254`, …). It only becomes empty if you explicitly opt out: either `NANGO_PROXY_BASE_URL_OVERRIDE_DENYLIST='[]'` (server only, which then selects `permissive`) or `mode: "permissive"`. Even then, only hostname string matches such as `localhost` are dropped β€” literal or resolved internal IPs stay blocked unless you also set `blockPrivateIps`/`blockLinkLocal` to `false`. Runners re-apply the secure denylist defaults even when the server has emptied its denylist; note an explicit `mode: "permissive"` empties the denylist everywhere, runners included. + + +```sh +# Block private/link-local IPs (default) and cap redirects at 3 +NANGO_OUTBOUND_URL_POLICY='{"blockPrivateIps":true,"blockLinkLocal":true,"maxRedirects":3}' + +# Allowlist mode: only the listed hostnames (and their subdomains) are reachable +NANGO_OUTBOUND_URL_POLICY='{"mode":"allowlist","allowlist":[".hubspot.com","api.github.com"]}' +``` + +| Field | Default | Purpose | +| - | - | - | +| `mode` | `denylist` (auto-`permissive` only if you empty the denylist) | `denylist`, `allowlist`, or `permissive` (see above) | +| `allowlist` | `[]` | In `allowlist` mode, hostnames (a leading `.` matches subdomains) that may be reached | +| `blockPrivateIps` | `true` | Block RFC1918 / CGNAT addresses (all modes) | +| `blockLinkLocal` | `true` | Block link-local addresses incl. `169.254.169.254` (all modes) | +| `maxRedirects` | `5` | Maximum redirect hops followed | + +Each resolved address (including on every redirect hop) is validated; in `allowlist` mode, only listed hostnames are reachable regardless of IP. + +#### Securing the dashboard + +By default, the dashboard of your Nango instance is open to anyone who can access your instance URL. + +You can secure it with Basic Auth by setting the following environment variables and restarting the server: + +```bash +FLAG_AUTH_ENABLED=false +NANGO_DASHBOARD_USERNAME= +NANGO_DASHBOARD_PASSWORD= +``` + +#### Encrypting sensitive data + +You can enforce encryption of sensitive data, including tokens, secret keys, and app secrets, by setting a 256-bit base64-encoded key: + +```sh +openssl rand -base64 32 +``` + +Set the generated value as `NANGO_ENCRYPTION_KEY`: + +```sh +NANGO_ENCRYPTION_KEY= +``` + +After you restart the Nango server, database encryption happens automatically. The encryption key cannot currently be modified after it is set. + + +`NANGO_ENCRYPTION_KEY` is also required for Connect UI. It is used to generate sessions for [Connect UI](/reference/frontend/frontend-sdk#connect-using-nango-connect-ui). Without this key, Connect UI will not work. + + +#### Custom websockets path + +The Nango server serves websockets from `/` by default for use by `@nangohq/frontend` during the login flow. + +To isolate websockets from the dashboard, set `NANGO_SERVER_WEBSOCKETS_PATH`: + +```sh +NANGO_SERVER_WEBSOCKETS_PATH= +``` + +If you set a custom path, configure `websocketsPath` when initializing the `Nango` object in the `@nangohq/frontend` SDK: + +```js +import Nango from '@nangohq/frontend'; + +let nango = new Nango({ host: 'https://', websocketsPath: '' }); +``` + +### Telemetry + +Self-hosted instances do not automatically send telemetry back to Nango. Operational metrics and logs stay within your own infrastructure and are only exported if you configure the OpenTelemetry Export add-on described above. + +### Logs + +Nango stores execution logs and powers the logs UI with either Elasticsearch or OpenSearch. To keep free self-hosted deployments lighter, this stack is optional. + +To enable logs: + +- Host an Elasticsearch or OpenSearch cluster. +- Set `NANGO_LOGS_ENABLED=true`. +- Configure the relevant `NANGO_LOGS_ES_*` environment variables (these apply to both providers). + +Nango uses Elasticsearch by default. To use OpenSearch instead, set: + +```sh +NANGO_LOGS_PROVIDER=opensearch +``` + +Elasticsearch hosting options include: + +- Local: uncomment the service in [`docker-compose.yaml`](https://github.com/NangoHQ/nango/blob/master/docker-compose.yaml#L63) and run `docker-compose up`. +- Elastic Cloud: use [elastic.co](https://www.elastic.co/). +- Render: deploy an Elasticsearch instance with [Render](https://docs.render.com/deploy-elasticsearch). + +If `NANGO_LOGS_ENABLED` is `false`, logs are sent to stdout and can be viewed in your host logs. + +### Run and update Nango + +To install Nango on a VM: + +```bash +mkdir nango && cd nango +wget https://raw.githubusercontent.com/NangoHQ/nango/master/docker-compose.yaml +docker-compose up -d +``` + +To update Nango: + +```bash +docker-compose stop +docker-compose rm -f +docker-compose pull +docker-compose up -d +``` + + +If you are interested in the Enterprise self-hosting version, please get in touch with us in the [community](https://nango.dev/slack) or [book a demo](https://nango.dev/demo). + + +## Related guides + +- [Security](/guides/platform/security) - review data, encryption, and access controls. +- [Environments](/guides/platform/environments) - organize dev, staging, and production setups. +- [Changelog](/updates/changelog) - track changes that affect self-hosted upgrades. + +## Proxy Requests + +Source: https://nango.dev/docs/guides/platform/proxy-requests.md + +--- +title: 'Proxy requests' +sidebarTitle: 'Proxy requests' +description: 'How to use the requests proxy from Nango' +--- + +Use the requests proxy to make authenticated API requests to the external API. + +## How to use the proxy + +Make sure you have an [integration configured](/guides/auth/auth-guide#guide) in your environment, and at least one [connection](/guides/auth/auth-guide#overview) available for it. + +You can use the proxy with the [Node SDK](/reference/backend/backend-sdk/node#proxy) or [REST API](/reference/backend/http-api/proxy/get): + + + + ```typescript + try { + const res = await nango.proxy({ + method: 'POST', + baseUrlOverride: 'https://api.example.com', + endpoint: '/external-endpoint', + providerConfigKey: '', + connectionId: '', + retries: 5, // Retries with exponential backoff (optional, default 0) + data: { + id: 1, + colorId: 'blue', + selected: true + } + }); + + // Response was 200! + // See https://axios-http.com/docs/res_schema + console.log(res.data); + } catch (error) { + // Status of response != 200 + // See https://axios-http.com/docs/handling_errors + console.log(error.response.data); + console.log(error.response.status); + console.log(error.response.headers); + } + ``` + + + + ```bash + curl -X POST -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer ' \ + -H 'Provider-Config-Key: ' \ + -H 'Connection-Id: ' \ + -d '{"colorId: "blue"}' \ + 'https://api.nango.dev/proxy/' + ``` + + + +## Related guides + +- [Auth guide](/guides/auth/auth-guide) - create the connection used by proxy requests. +- [Node SDK reference](/reference/backend/backend-sdk/node#proxy) - proxy helper methods. +- [Proxy API reference](/reference/backend/http-api/proxy/get) - REST endpoints for proxied requests. +- [Rate limits](/guides/functions/rate-limits) - handle provider throttling. + +## Receive webhooks from Nango + +Source: https://nango.dev/docs/guides/platform/webhooks-from-nango.md +Description: Reference for the webhooks Nango sends to your app β€” setup, types, payloads, signature verification, and retries. + +Nango POSTs webhooks to your app to notify it of important events: a new connection was created, a sync run finished, an async action completed, or an external webhook was forwarded. This page covers how to receive and verify webhooks from Nango, plus the payloads for auth, sync, and async action webhooks. + + +To process webhooks coming **from external APIs** (not from Nango), see [Process external webhooks](/getting-started/use-cases/webhooks-from-external-apis). To forward external API webhooks through Nango to your app, see [Webhook forwarding](/guides/platform/webhook-forwarding). + + +## Set up webhooks from Nango + + + Webhook settings in Nango are specific to each [environment](/guides/platform/environments). + + +To subscribe to Nango webhooks: + +1. Set up a `POST` endpoint in your app to receive the Nango webhooks +2. Input the endpoint's URL in your _Environment Settings_, under _Webhook URLs_ ([direct link for your dev environment](https://app.nango.dev/dev/environment-settings#notification)) +3. Implement [verify incoming webhooks](#verifying-webhooks-from-nango) to ensure sure only authentic Nango webhooks are processed +4. Implement processing logic for each [webhook type](#types-of-nango-webhooks) from Nango you want to handle + - Make sure your processing logic handles the webhooks you have enabled in the environment settings + +You can configure up to two webhook URLs per environment. Nango webhooks will be sent to both. A single connection can [override these with its own URL](#override-webhook-urls-per-connection). + +To test webhooks locally, use a webhook forwarding service like [ngrok](https://dev.to/mmascioni/testing-and-debugging-webhooks-with-ngrok-4alp), or [webhook.site](https://webhook.site/). + +## Override webhook URLs per connection + +A single connection can override the environment's webhook URLs with its own `webhook_url`. The connection still receives all the same [webhook types](#types-of-nango-webhooks), with the same signing, retries, and logs. + +When a connection sets `webhook_url`, its webhooks are sent **only** to that URL β€” the environment's primary and secondary webhook URLs are both bypassed for that connection. It does not add a third destination. + +Set `webhook_url` when creating a [connect session](/reference/backend/http-api/connect/sessions/create), under `integrations_config_defaults..connection_config`: + + + + ```ts + const session = await nango.createConnectSession({ + allowed_integrations: [''], + integrations_config_defaults: { + '': { + connection_config: { + webhook_url: 'https://.ngrok.app/webhooks-from-nango' + } + } + } + }); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/connect/sessions \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "allowed_integrations": [""], + "integrations_config_defaults": { + "": { + "connection_config": { + "webhook_url": "https://.ngrok.app/webhooks-from-nango" + } + } + } + }' + ``` + + + +You can also set `webhook_url` from the **Create connection** flow in the Nango dashboard, under the connection's advanced configuration. + + + `webhook_url` can only be set at connect-session creation time β€” the trusted actor that creates the session. The same key passed to `nango.auth()` `params` from the client is ignored. + + + + **Local development:** create a connection with `webhook_url` pointing at your local webhook endpoint (for example via [ngrok](https://ngrok.com/) or [webhook.site](https://webhook.site/)) to receive that connection's webhooks on your machine β€” without changing the shared environment webhook URLs. See [Engineering collaboration](/guides/platform/environments#engineering-collaboration) for the shared-environment workflow. + + +## Verifying webhooks from Nango + +Validate webhooks from Nango by looking at the `X-Nango-Hmac-Sha256` header. + +It's an HMAC-SHA256 hash of the webhook payload, using the webhook signing key found in **Environment Settings > Webhooks > Signing key** in the Nango UI. + + +Nango webhook requests include an `X-Nango-Hmac-Sha256` header for secure verification. A legacy `X-Nango-Signature` header (using plain SHA-256) is also sent for backwards compatibility but should not be used. If you're currently using `X-Nango-Signature`, migrate to `X-Nango-Hmac-Sha256` for improved security. + + +The webhook signature can be verified with the following code: + + +Verify the signature with the **webhook signing key** from **Environment Settings > Webhooks > Signing key** β€” not your API secret key. These are two distinct keys. With the Node SDK, pass it as `webhookSigningKey`; for raw HMAC verification, use it as the HMAC secret. Using the API secret key will cause verification to fail on any environment where the keys differ. + + + + + Pass the webhook signing key as `webhookSigningKey` so a single client can make API calls with the API key and verify webhooks with the signing key. `webhookSigningKey` falls back to `secretKey` when omitted. + + ```typescript + const nango = new Nango({ + apiKey: process.env.NANGO_API_KEY, // used for API calls + webhookSigningKey: process.env.NANGO_WEBHOOK_SIGNING_KEY // used to verify webhooks + }); + + async (req, res) => { + const isValid = nango.verifyIncomingWebhookRequest(req.body, req.headers); + } + ``` + + + ```typescript + import crypto from 'crypto'; + + // From Environment Settings > Webhooks > Signing key + const webhookSigningKey = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'; + const body = // raw request body as string + const hash = crypto.createHmac('sha256', webhookSigningKey).update(body).digest('hex'); + ``` + + + ```python + import hmac + import hashlib + + # From Environment Settings > Webhooks > Signing key + webhook_signing_key = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' + body = # raw request body as bytes + hash = hmac.new(webhook_signing_key.encode('utf-8'), body, hashlib.sha256).hexdigest() + ``` + + + ```java + import javax.crypto.Mac; + import javax.crypto.spec.SecretKeySpec; + import java.nio.charset.StandardCharsets; + + public class Main { + public static void main(String[] args) throws Exception { + // From Environment Settings > Webhooks > Signing key + String webhookSigningKey = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; + String body = // raw request body as string + + Mac mac = Mac.getInstance("HmacSHA256"); + SecretKeySpec secretKey = new SecretKeySpec(webhookSigningKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); + mac.init(secretKey); + byte[] hashBytes = mac.doFinal(body.getBytes(StandardCharsets.UTF_8)); + + StringBuilder hexString = new StringBuilder(); + for (byte b : hashBytes) { + hexString.append(String.format("%02x", b)); + } + String hash = hexString.toString(); + } + } + ``` + + + ```ruby + require 'openssl' + + # From Environment Settings > Webhooks > Signing key + webhook_signing_key = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' + body = # raw request body + hash = OpenSSL::HMAC.hexdigest('SHA256', webhook_signing_key, body) + ``` + + + ```go + package main + + import ( + "crypto/hmac" + "crypto/sha256" + "encoding/hex" + "io" + "net/http" + ) + + func main() { + // From Environment Settings > Webhooks > Signing key + webhookSigningKey := "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" + var body []byte // raw request body + + h := hmac.New(sha256.New, []byte(webhookSigningKey)) + h.Write(body) + hash := hex.EncodeToString(h.Sum(nil)) + } + ``` + + + ```rust + use hmac::{Hmac, Mac}; + use sha2::Sha256; + + type HmacSha256 = Hmac; + + // From Environment Settings > Webhooks > Signing key + let webhook_signing_key = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; + let body = // raw request body as string or bytes + let mut mac = HmacSha256::new_from_slice(webhook_signing_key.as_bytes()).unwrap(); + mac.update(body.as_bytes()); + let hash = format!("{:x}", mac.finalize().into_bytes()); + ``` + + + ```php + Webhooks > Signing key + $webhookSigningKey = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'; + $body = // raw request body as string + $hash = hash_hmac('sha256', $body, $webhookSigningKey); + ?> + ``` + + + +Only accept a webhook if the `X-Nango-Hmac-Sha256` header value matches the webhook signature. + +## Types of Nango webhooks + + + New Nango webhook types are added regularly, without considering this a breaking change. Your webhook handling logic should gracefully support receiving new types of webhooks by simply ignoring them. + + +All webhooks from Nango are POST requests. + +The exact webhook type definitions can be found [here](https://github.com/NangoHQ/nango/blob/master/packages/types/lib/webhooks/api.ts). + +### Auth webhooks + +New connection webhooks have `"type": "auth"` and `"operation": "creation"`. They are sent after a connection has been successfully created. + +Payload received following a connection creation: + +```json +{ + "type": "auth", + "operation": "creation", + "connectionId": "", + "authMode": "OAUTH2 | BASIC | API_KEY | ...", + "providerConfigKey": "", + "provider": "", + "environment": "DEV | PROD | ...", + "success": true, + "tags": { + "end_user_id": "", + "end_user_email": "", + "organization_id": "" + } +} +``` + + + Processing webhooks with `"type": "auth"` and `"operation": "creation"` is **necessary**. After a connection is created, these webhooks give you the generated connection ID which lets you access the connection later on. + + Use `tags` to reconcile and save the connection ID with the user/org/workspace that initiated the connection. + + +All `authMode` values can be found [here](https://github.com/NangoHQ/nango/blob/master/packages/types/lib/auth/api.ts). The `authMode` value depends on the `provider` value. + +All `operation` values are: + +- `creation`: a new connection has been created +- `override`: a connection has been re-authorized +- `refresh`: an OAuth connection's access token has failed to refresh + +Payload received following a refresh token error: + +```json +{ + "type": "auth", + "operation": "refresh", + "connectionId": "", + "authMode": "OAUTH2 | BASIC | API_KEY | ...", + "providerConfigKey": "", + "provider": "", + "environment": "DEV | PROD | ...", + "success": false, + "tags": { + "end_user_id": "", + "end_user_email": "", + "organization_id": "" + }, + "error": { + "type": "", + "description": "" + } +} +``` + + + Webhooks are only sent for certain connection creation errors. For example, during the OAuth flow, some errors are reported locally in the OAuth modal by the external API. Since Nango does not receive these errors, it cannot trigger a webhook for them. + + +### Sync webhooks + +Sync webhooks are sent when a [sync function](/guides/functions/syncs/sync-functions) execution finishes, whether successful or not. + +Payload received following a successful sync execution: + +```json +{ + "type": "sync", + "connectionId": "", + "providerConfigKey": "", + "syncName": "", + "model": "", + "syncType": "INCREMENTAL | INITIAL | WEBHOOK", // DEPRECATED β€” use checkpoints instead + "success": true, + "modifiedAfter": "", + "responseResults": { + "added": number, + "updated": number, + "deleted": number + }, + // checkpoints itself may be missing or null if the sync doesn't use checkpoints β€” + // always guard against that before reading `from`/`to`. + "checkpoints": { + "from": { "": "" }, // or null if no prior checkpoint + "to": { "": "" } // or null if the sync didn't save one + } +} +``` + +`modifiedAfter` is an ISO-8601 timestamp marking the start of the last run. To read the changed records, use cursor-based fetching as described in [Records cache β†’ Cursors and sync progress](/guides/functions/syncs/records-cache#cursors-and-sync-progress). + +**Distinguishing full vs incremental syncs:** use `checkpoints` instead of the deprecated `syncType` field. `checkpoints.from`/`checkpoints.to` are checkpoint objects (`Record`) as saved by the sync function via `saveCheckpoint()` β€” not strings β€” and either can be `null`. The `checkpoints` field itself can also be missing or `null`, so guard against that before reading nested fields: + +```javascript +const { checkpoints } = payload; +const isFullSync = !checkpoints || checkpoints.from === null; +``` + +- `checkpoints` is missing/`null`, or `checkpoints.from === null` β€” the run started with no prior state. This happens on the first run, after a manual reset, or when the sync explicitly cleared its checkpoint. Treat this as a full sync and overwrite your data. +- `checkpoints.from` is a non-null checkpoint object β€” the run continued from a previously saved checkpoint. This is an incremental sync; merge the new records into your existing data. +- **Webhook-triggered runs** (deprecated `syncType: "WEBHOOK"`): always treat these as incremental merges, regardless of `checkpoints.from`. A webhook-triggered run processes a single incoming external event on top of already-synced data β€” it never represents a full resync. + + +**Fetch records promptly**: Due to Nango's [data retention policies](/guides/platform/security#synced-records-retention), you should fetch and store synced records in your own system promptly after receiving webhook notifications. Records not updated for 30 days will have their payload pruned, and sync functions not executed for 60 days will have all records deleted. + + +By default, Nango sends a webhook even if no modified data was detected in the last sync execution (referred as an "empty" sync), but this is configurable in your _Environment Settings_. In case of an empty sync, the `responseResults` would be: +```json +{ + "added": 0, + "updated": 0, + "deleted": 0 +} +``` + +Payload received following a failed sync execution: + +```json +{ + "type": "sync", + "connectionId": "", + "providerConfigKey": "", + "syncName": "", + "model": "", + "syncType": "INCREMENTAL | INITIAL | WEBHOOK", // DEPRECATED β€” use checkpoints instead + "success": false, + "error": { + "type": "", + "description": "" + }, + "startedAt": "", + "failedAt": "", + // checkpoints itself may be missing or null β€” see the note above. + "checkpoints": { + "from": { "": "" }, // or null + "to": { "": "" } // or null + } +} +``` + +### External webhook forwarding + +Forwarded external webhooks use the same webhook URLs, signing, retries, and logs as other Nango webhooks. See [Webhook forwarding](/guides/platform/webhook-forwarding) for setup, routing behavior, and payload shapes. + +## Webhook retries & debugging + +Nango retries each webhook with non-2xx responses 2 times with exponential backoff (starting delay: 100ms, time multiple: 2, view details in the [code](https://github.com/NangoHQ/nango/blob/master/packages/webhooks/lib/utils.ts)). + +Webhooks time out after 20 seconds. + +Each webhook attempt is logged in Nango's [logs](/guides/platform/observability). + +You can also use the [OpenTelemetry exporter](/guides/platform/observability#opentelemetry-export) to monitor Nango webhooks in your own observability stack. + + + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + + +## Related guides + +- [Webhook forwarding](/guides/platform/webhook-forwarding) - forward external provider webhooks through Nango. +- [Webhook functions](/guides/functions/webhook-functions) - process provider webhooks inside Nango. +- [Event functions](/guides/functions/event-functions) - react to connection lifecycle events. +- [Observability](/guides/platform/observability) - monitor webhook operations and retries. + +## Webhook Forwarding + +Source: https://nango.dev/docs/guides/platform/webhook-forwarding.md + +--- +title: 'External webhook forwarding' +sidebarTitle: 'External webhook forwarding' +description: 'Forward external API webhooks through Nango to your app, with connection attribution.' +--- + +Webhook forwarding lets Nango receive webhooks from external APIs and forward them to your app's webhook URL. Use it when your app should own the webhook handling logic, but you still want Nango to provide the provider-specific webhook URL, routing, signing, retries, and logs. + +For processing the webhook inside Nango function code, use [webhook functions](/guides/functions/webhook-functions). + +## How forwarding works + +1. You configure your app's webhook URL in **Environment Settings > Webhook URLs**. +2. You register the integration's Nango webhook URL in the provider's developer portal. Find it in **Integrations > [Integration] > Webhooks**. +3. The provider sends a webhook to Nango. +4. Nango runs the provider-specific routing logic and tries to map the event to one or more Nango connections. +5. Nango forwards the payload to your app's webhook URL and signs the request like other Nango webhooks. + +Nango forwards webhooks asynchronously after accepting the provider webhook, so slow app endpoints do not block the provider response. + +## Forwarded payloads + +When Nango can attribute the webhook to a connection, your app receives a Nango wrapper: + +```json +{ + "from": "hubspot", + "providerConfigKey": "", + "type": "forward", + "connectionId": "", + "payload": { + "...": "raw provider payload" + } +} +``` + +If a provider webhook maps to multiple connections, Nango sends one forwarded webhook per connection. + +If Nango cannot map the webhook to a connection, Nango forwards the raw provider payload without the wrapper. Your consumer should handle both shapes when the provider can emit unattributed events. + +## Headers and signatures + +Nango forwards safe provider headers when possible, excluding headers that should not be replayed such as `authorization`, `cookie`, `host`, `content-length`, `content-type`, `user-agent`, and similar transport-sensitive headers. + +Every forwarded webhook is signed with the same headers used by other Nango webhooks: + +- `X-Nango-Hmac-Sha256` +- `X-Nango-Signature` for backwards compatibility + +Verify forwarded webhooks the same way you verify other webhooks from Nango. See [Verifying webhooks from Nango](/guides/platform/webhooks-from-nango#verifying-webhooks-from-nango). + +## When to use forwarding + +Use forwarding when: + +- Your app already has webhook handling logic. +- You want app code to decide what to do with the provider event. +- You need Nango to attribute the event to a connection when possible. +- You want webhook delivery logs and retries without running Nango function code. + +Use [webhook functions](/guides/functions/webhook-functions) when Nango should update records, normalize the payload, or run connection-scoped integration logic immediately. + +## Configure forwarding + + + + In Nango, open **Environment Settings > Webhook URLs** and add your app's endpoint. + + Nango sends forwarded webhooks to the same URLs used for auth, sync, and async action webhooks. + + + + In the integration page, copy the Nango webhook URL from **Integrations > [Integration] > Webhooks** and register it in the provider's developer portal. + + Some providers use one global webhook registration. Others require one webhook registration per connected account. Provider-specific docs explain the required setup. + + + + If the payload has `"type": "forward"`, read `connectionId`, `providerConfigKey`, and `payload`. + + If the payload does not have `"type": "forward"`, handle it as the raw provider payload. This can happen when the provider event cannot be attributed to a Nango connection. + + + + + When implementing webhook forwarding, first find the provider-specific Nango webhook guide. Confirm whether the provider routes automatically or requires embedding the Nango connection ID, tenant ID, team ID, installation ID, or another identifier in the provider webhook subscription. + + Implement signature verification with `X-Nango-Hmac-Sha256`, then branch on whether the incoming body has `type: "forward"`. Store and use `connectionId` only when it is present. + + +## Retries and debugging + +Nango retries forwarded webhooks when your app returns a non-2xx response or has a network failure. Forwarded attempts appear in Nango logs as webhook forwarding operations. + +For retry behavior, timeout limits, and local testing tips, see [Webhook retries & debugging](/guides/platform/webhooks-from-nango#webhook-retries-debugging) and [Webhook limits](/guides/platform/limits#webhook-limits). + +## Related guides + +- [Webhook functions](/guides/functions/webhook-functions) +- [Process external webhooks](/getting-started/use-cases/webhooks-from-external-apis) +- [Receive webhooks from Nango](/guides/platform/webhooks-from-nango) +- [Observability](/guides/platform/observability) + +## Common Issues + +Source: https://nango.dev/docs/guides/platform/common-issues.md + +--- +title: 'Common issues' +sidebarTitle: 'Common issues' +description: 'Troubleshooting guide for frequent errors and how to fix them.' +--- + +If you encounter an issue not documented here, reach out on the [Slack community](https://nango.dev/slack). + +## I just run `nango migrate-to-zero-yaml`, can I change the folder structure? + +Yes, you can change the folder structure. You can move files, zod definitions, types, rename files, folders, etc. +The results of the migration is just an example of how you can structure your project. + +## I'm getting `ZodXX is missing the following properties` errors + +If you are getting Zod errors, it's most likely because you are using a different version of Zod than the one we use in our CLI. We currently require zod `4.0.5`. + +If you have an overrides in your package.json or something that is changing the version of Zod, you will need to remove that. + +NB: `nango compile` will automatically update your dependencies to the version we use in our CLI. + +## Token refresh error from the external API + +Indications of the error: + +- Nango logs may show: + +```json +{ + "error": { + "message": "An error occurred during an HTTP call", + "payload": { + "error": { + "code": "invalid_credentials", + "payload": { [...] }, + "message": "The refresh limit has been reached for this connection." + } + } + } +} +``` + +- Or in `Token refresh` log operations: + +```json +{ + "payload": { + "dataMessage": { + "error_description": "Token has been expired or revoked.", + "error": "invalid_grant" + } + }, + "type": "refresh_token_external_error", + "status": 400 +} +``` + + +The `error` and `error_description` fields may differ by API, but typically include `invalid_grant` and mention the token being expired or revoked. + + +### How to debug + +- This error means the external API (e.g., Google, Salesforce) rejected the refresh token as expired or revoked. Nango retries several times, but if the error persists, the credentials are considered permanently broken. +- The only solution is to ask the user to re-authenticate. See: [How to trigger a re-authorization flow in Nango](/guides/auth/auth-guide#re-authorize-an-existing-connection) +- We recommend enabling [Nango's revoked token webhooks](/guides/platform/webhooks-from-nango#auth-webhooks) for real-time notifications. + +Revoked refresh tokens are a normal part of integrations. Ensure your app provides a good re-authorization experience for users. + +APIs may revoke tokens for unpredictable reasons. Only investigate if you observe an unusual increase of connection revocations for an API. Achieving a 0% revocation rate is not realistic. + +Known API-specific behaviors: +- Google: All tokens are revoked after 7 days if your OAuth app is in test mode ([detailed guide](https://www.nango.dev/blog/google-oauth-invalid-grant-token-has-been-expired-or-revoked)). To go to production, read our [guide for Google's OAuth app review](/api-integrations/google-shared/google-security-review). +- Salesforce: See [Salesforce refresh token issues](https://nango.dev/blog/salesforce-oauth-refresh-token-invalid-grant/). + + +## Connection not found (unknown_connection / 404) + +Indications of the error: + +- Request failed with status code `404` +- code `unknown_connection` +- error message: "No connection matching the provided params of 'connection_id' and 'provider_config_key'" + +```json +{ + "error": { + "message": "Request failed with status code 404", + "data": { + "error": { + "message": "No connection matching the provided params of 'connection_id' and 'provider_config_key'.Please make sure these values exist in the Nango dashboard [...]", + "code": "unknown_connection" + } + } + } +} +``` + +### How to debug + +1. Confirm the environment and secret key + - The `secretKey` in the API or SDK is specific to the environment. Make sure you pass the key that corresponds to the environment you are using (e.g., dev vs prod). + - Open [Environment Settings > API Keys](https://app.nango.dev/dev/environment-settings#api-keys) and verify the key matches. + +2. Verify the Integration ID (aka `providerConfigKey`) + - Go to [Integrations](https://app.nango.dev/dev/integrations), open the integration, and copy the `Integration ID` exactly. + - Ensure the value you send as `providerConfigKey` matches this ID. + +3. Verify the Connection ID + - Go to [Connections](https://app.nango.dev/dev/connections), find the connection, and copy its `Connection ID`. + - Ensure the value you send as `connectionId` (header `Connection-Id` when using HTTP, or `connectionId` in the SDK) matches exactly. + +## Related guides + +- [Observability](/guides/platform/observability) - inspect logs and exported traces. +- [Auth guide](/guides/auth/auth-guide#re-authorize-an-existing-connection) - repair broken connections with re-authorization. +- [Token refreshing and validity](/guides/auth/token-refreshing) - understand refresh failures. +- [Webhooks from Nango](/guides/platform/webhooks-from-nango) - receive failure notifications. + +## Migrate To Checkpoints + +Source: https://nango.dev/docs/guides/platform/migrations/migrate-to-checkpoints.md + +--- +title: 'Migrate to checkpoints' +sidebarTitle: 'Migrate to checkpoints' +description: 'Guide to migrate your sync functions from nango.lastSyncDate to the new checkpointing system.' +--- + +
+ +
+ +# Who is impacted + +If any of your sync functions read `nango.lastSyncDate` to determine where to resume syncing, you are impacted by this migration. + +To check, search your sync files for `lastSyncDate`. If you find references like `nango.lastSyncDate` or destructured equivalents, those syncs should be migrated to use checkpoints. + +If you want your syncs to be resilient to failures, ensuring that a failed run resumes from where it left off instead of starting over, you should also migrate any sync that paginates through large datasets, even if it doesn't currently use `lastSyncDate`. + +# What is changing + +`nango.lastSyncDate` is deprecated and replaced by checkpoints β€” a more flexible and resilient way to track sync progress. + +With `lastSyncDate`, Nango automatically tracked the timestamp of the last completed sync run. Your function could read it but not set it, and it was always a timestamp. With checkpoints, you define the schema, you control when it's saved, and you can store any type of progress marker β€” not just a date. + +| | `lastSyncDate` (deprecated) | Checkpoints | +| --- | --- | --- | +| **Type** | Always a `Date` | Any schema you define with Zod | +| **Control** | Managed by Nango, read-only | You set it explicitly with `saveCheckpoint()` | +| **Granularity** | Updated once per completed run | Updated mid-execution, after each batch | +| **Resilience** | If a run fails, no progress is saved | Progress is saved incrementally β€” the next run resumes from the last checkpoint | + + +Checkpoints also replace the `syncType: 'incremental'` field in your sync declaration. Whether the dataset is fetched from scratch or incrementally depends on how you use the checkpoint in your function code, not just whether you declared a checkpoint schema. + + +# Why this deprecation + +`lastSyncDate` had two significant limitations: + +1. **No mid-run resilience.** If a sync fetched 90% of its data and then failed, all progress was lost. The next run started over from the previous `lastSyncDate`, re-fetching everything. + +2. **Rigid type.** The value was always a timestamp managed by Nango. Some APIs use cursors, page tokens, or composite markers to track progress β€” `lastSyncDate` couldn't accommodate these. + +Checkpoints solve both problems. For a full overview, see the [checkpoints guide](/guides/functions/syncs/checkpoints). + +# Migration steps + + +## Migrate with the migrating-to-checkpoints skill + +You can migrate syncs to checkpoints with the **`migrating-to-checkpoints`** skill from [NangoHQ/skills](https://github.com/NangoHQ/skills). The skill guides a coding agent through converting `createSync()` implementations from `nango.lastSyncDate`, legacy `syncType: 'incremental'`, and non-resumable full refreshes to checkpoint-based syncs. + +Install it in your functions repo: + +```bash +npx skills add NangoHQ/skills -s migrating-to-checkpoints +``` + +Then ask your agent to migrate a specific sync using the `migrating-to-checkpoints` skill. The skill covers checkpoint schema selection, replacing `lastSyncDate` with `getCheckpoint()` and `saveCheckpoint()`, full-refresh recovery with `clearCheckpoint()`, and validating with `nango dryrun --checkpoint`. + +The manual steps below walk through the same migration if you prefer to do it by hand or want to review what the skill changes. + +## Step 1: Add a checkpoint schema to your sync declaration + +Add a `checkpoint` field to your `createSync()` call. In most cases, this is a single string field holding a timestamp: + +**Before:** +```typescript +export default createSync({ + description: 'Sync contacts from Salesforce', + frequency: 'every hour', + models: { Contact: ContactSchema }, + exec: async (nango) => { + // ... + }, +}); +``` + +**After:** +```typescript +export default createSync({ + description: 'Sync contacts from Salesforce', + frequency: 'every hour', + checkpoint: z.object({ + lastModifiedISO: z.string(), + }), + models: { Contact: ContactSchema }, + exec: async (nango) => { + // ... + }, +}); +``` + +If your sync previously declared `syncType: 'incremental'`, remove it β€” the presence of the `checkpoint` field replaces it. + +## Step 2: Replace `lastSyncDate` reads with `getCheckpoint()` + +Replace every reference to `nango.lastSyncDate` with a call to `nango.getCheckpoint()`. + +**Before:** +```typescript +exec: async (nango) => { + const lastSyncDate = nango.lastSyncDate; + + let query = 'SELECT Id, FirstName, LastName FROM Contact'; + if (lastSyncDate) { + query += ` WHERE LastModifiedDate > ${lastSyncDate.toISOString()}`; + } + query += ' ORDER BY LastModifiedDate ASC'; + + // ... fetch and save records +} +``` + +**After:** +```typescript +exec: async (nango) => { + const checkpoint = await nango.getCheckpoint(); + + let query = 'SELECT Id, FirstName, LastName FROM Contact'; + if (checkpoint) { + query += ` WHERE LastModifiedDate > ${checkpoint.lastModifiedISO}`; + } + query += ' ORDER BY LastModifiedDate ASC'; + + // ... fetch and save records +} +``` + +Note that `getCheckpoint()` is async and returns `null` on first run or after a reset, just like `lastSyncDate` was `null` on the first execution. + +## Step 3: Add `saveCheckpoint()` calls after each batch + +This is the most important change. With `lastSyncDate`, progress was saved automatically at the end of a run. With checkpoints, you save progress explicitly β€” and you should do it after every batch of records. + +**Before:** +```typescript +exec: async (nango) => { + const lastSyncDate = nango.lastSyncDate; + + while (nextPage) { + const res = await nango.get({ + endpoint: '/contacts', + params: { since: lastSyncDate?.toISOString(), cursor: nextPage }, + }); + + await nango.batchSave(mapContacts(res.data.records), 'Contact'); + nextPage = res.data.nextCursor; + } + // Progress saved automatically by Nango at run completion +} +``` + +**After:** +```typescript +exec: async (nango) => { + const checkpoint = await nango.getCheckpoint(); + + while (nextPage) { + const res = await nango.get({ + endpoint: '/contacts', + params: { since: checkpoint?.lastModifiedISO, cursor: nextPage }, + }); + + const contacts = mapContacts(res.data.records); + await nango.batchSave(contacts, 'Contact'); + + // Save progress after each page + const lastRecord = contacts[contacts.length - 1]; + await nango.saveCheckpoint({ lastModifiedISO: lastRecord.lastModified }); + + nextPage = res.data.nextCursor; + } +} +``` + +The pattern is: fetch a page, save records, save checkpoint. If the sync fails mid-way, the next run picks up from the last checkpoint instead of starting over. + +## Step 4: Test locally + +Use the CLI `dryrun` command with the `--checkpoint` flag to simulate resuming from a previous run: + +```bash +nango dryrun my-sync '' --checkpoint '{"lastModifiedISO": "2024-06-01T00:00:00Z"}' +``` + +Verify that your sync correctly filters data based on the checkpoint value. See the [testing guide](/guides/functions/testing) for how to write unit tests for checkpoint logic. + +## Step 5: Deploy + +Deploy as usual. On the first run after deployment, `getCheckpoint()` will return `null` (since no checkpoint has been saved yet), so the sync will perform a full initial fetch β€” just like it did on its first run with `lastSyncDate`. Subsequent runs will be incremental from the checkpoint. + +```bash +nango deploy +``` + + +Because the first post-migration run starts fresh, it may take longer than usual. This is expected and only happens once. + + + + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + + +## Related guides + +- [Checkpoints](/guides/functions/syncs/checkpoints) - understand the new checkpoint model. +- [Sync functions](/guides/functions/syncs/sync-functions) - update sync implementations. +- [Testing](/guides/functions/testing) - test checkpoint filtering. + +## Migrate From End User + +Source: https://nango.dev/docs/guides/platform/migrations/migrate-from-end-user.md + +--- +title: 'Migrate from end user' +sidebarTitle: 'Migrate from end user' +description: 'Guide to migrate away from using end users in connections and connect sessions' +--- + +# Who is impacted + +You are impacted if you use any of the following to identify who a connection belongs to: + +- `end_user` / `organization` in `POST /connect/sessions` +- `end_user` / `organization` in auth webhooks (`endUser` payload) +- `end_user` fields in the Connections list or connection details for reconciliation + +# What is changing + +Connections now have a first-class `tags` object. Connect sessions accept a top-level `tags` object as well. + +The legacy `end_user` and `organization` fields are deprecated. Tags exist because the end-user fields were not flexible enough for many real-world attribution and routing use cases. + +When a connection is created via a Connect session: + +- the Connect session `tags` are copied onto the newly created connection +- the auth webhook includes those tags as top-level `tags` + + + Use `tags` as your source of truth for identifying who a connection belongs to. + The legacy `end_user` and `organization` fields are deprecated and will be removed in a future version. + + +# Migration steps + +## Step 1: Start sending tags for new connect sessions + +Add a `tags` object when creating a Connect session token in your backend: + + + + ```ts + import { Nango } from '@nangohq/node'; + + const nango = new Nango({ secretKey: process.env[''] }); + + const { data } = await nango.createConnectSession({ + // Recommended + tags: { + end_user_id: '', + end_user_email: '', + organization_id: '' + }, + + allowed_integrations: [''] + }); + ``` + + + ```bash + curl --request POST \ + --url https://api.nango.dev/connect/sessions \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{ + "tags": { + "end_user_id": "", + "end_user_email": "", + "organization_id": "" + }, + "allowed_integrations": [""] + }' + ``` + + + +For more details (including limitations and filtering), see [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata). + +## Step 2: Update webhook reconciliation to use `tags` + +Auth webhooks include connection tags as top-level `tags`. + +If you previously used `endUser.endUserId`, switch to using `tags` as your primary source of truth. For compatibility during rollout, handle both: + +```ts +function resolveOwnerFromWebhook(payload: any) { + // Preferred + if (payload.tags?.end_user_id) { + return { endUserId: payload.tags.end_user_id, endUserEmail: payload.tags.end_user_email, organizationId: payload.tags.organization_id }; + } + + // Legacy fallback + if (payload.endUser?.endUserId) { + return { endUserId: payload.endUser.endUserId, endUserEmail: payload.endUser.endUserEmail, organizationId: payload.endUser.organizationId }; + } + + return null; +} +``` + +## Step 3: Existing connections are already backfilled + +You do not need to patch anything. + +Nango has already backfilled standard tags (like `end_user_id`, `end_user_email`, `organization_id`) onto existing connections based on your legacy end-user fields. + +During the deprecation period, if you still create new connections using the deprecated `end_user` / `organization` fields, Nango will also populate connection tags automatically using the same translation logic: + +- `end_user.id` -> `tags.end_user_id` +- `end_user.email` (if present) -> `tags.end_user_email` +- `end_user.display_name` (if present) -> `tags.end_user_display_name` +- `organization.id` -> `tags.organization_id` +- `organization.display_name` (if present) -> `tags.organization_display_name` +- `end_user.tags` (if present) -> merged into `tags` (subject to the same validation and normalization rules) + +If you provide both deprecated end-user fields and a top-level `tags` object, the top-level `tags` values win. + +## Step 4: Stop using `end_user` + +Once your code relies on `tags`, stop sending or reading the deprecated `end_user` and `organization` fields. + + + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + + +## Related guides + +- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - use tags for connection attribution. +- [Auth guide](/guides/auth/auth-guide) - create connect sessions with tags. +- [Webhooks from Nango](/guides/platform/webhooks-from-nango#auth-webhooks) - reconcile auth webhooks with tags. + +## Migrate From Public Key + +Source: https://nango.dev/docs/guides/platform/migrations/migrate-from-public-key.md + +--- +title: 'Migrate from public key' +sidebarTitle: 'Migrate from public key' +description: 'Guide to migrate from using the public key (and HMAC) to a Connect session.' +--- + +# Who is impacted + +If you use the Nango public key in your frontend, you are impacted by this migration. + +To check if you are using the public key, inspect your frontend code where the `Nango` object is instantiated. If the `config` parameter includes `publicKey`, you are affected. If it uses `connectSessionToken`, you are already up-to-date. + +# Changes summary + +1. The Nango public key is replaced with a short-lived Connect session token, fetched from your backend and passed to your frontend +2. The connection ID is now randomly generated by Nango instead of being specified manually +3. The connection ID is returned via backend webhooks instead of the frontend SDK + +# Migration timeline + +Public keys and HMAC signatures will be supported until **March 31, 2025** (announced on **January 31, 2025**). + +# Why this deprecation? + +For security reasons. + +If you were using the HMAC signature (strongly recommended in the docs), your authorization flow was already secure. However, not all users implemented HMAC, and we want to enforce best-in-class security practices by default. + +For those not using HMAC, the risk of attack was minimal but theoretically possible. We have no reports of such attacks, but feel free to reach out for more details. + +# Improvements with the Connect session + +1. The new Connect session flow is **secure by default** and replaces the HMAC signature. Randomly generated connection IDs further enhance security +2. Connection IDs are now **unique across integrations**, which will allow us to simplify API endpoints by transitioning from composite keys (`connection ID` + `integration ID`) to a single **unique connection ID** +3. The Connect session will let us provide additional API capabilities that can be called directly and securely from the frontend +4. The Connect session unlocks our [pre-built authorization UI](/guides/auth/auth-guide#guide), which simplifies collecting API keys, basic credentials, and OAuth flows with custom parameters. This UI also validates end-user inputs and provides guidance on required credentials + + +The Connect session works with both the pre-built authorization UI and custom authorization UIs. Custom authorization UIs are not being deprecated; they remain a critical feature and fully supported. + +The deprecated public key, however, was only compatible with custom authorization UIs and did not support the pre-built authorization UI. + + +# Migration steps + +This migration is split into 3 steps. You can migrate at your own pace, but we recommend doing it in this order. +During the migration, both connect session and public key authentication will work so you don't have to do all 3 steps at once. + + + Existing connections will keep the custom id you have used until now but new connections will have a random id. Your code will need to support both. + + +## Step 1: Attach tags to all existing connections + +Attach tags to all existing connections. +This step will allow you to use connect sessions with existing connections. +This will also be used to attribute webhooks to the correct end user. + + + + ```ts + import { Nango } from '@nangohq/node'; + +const nango = new Nango({ secretKey: process.env[''] }); + await nango.patchConnection({ + connectionId: '', + provider_config_key: '', + }, { + tags: { + end_user_id: '', + end_user_email: '', + organization_id: '' + } + }); +``` + + +```bash +curl -X PATCH https://api.nango.dev/v1/connections/ \ +-H "Authorization: Bearer " \ +-H "Content-Type: application/json" \ + -d '{ + "tags": { + "end_user_id": "", + "end_user_email": "", + "organization_id": "" + } + }' +``` + + + + +Check endpoint documentation [here](/reference/backend/http-api/connections/patch). + + +## Step 2: Implement the Connect and reconnect flows + +Follow the steps in this [guide](/guides/auth/auth-guide#guide), focusing on these key changes: + +Connect session token is now required to be passed to the frontend SDK. This improves security and allows you to pass additional information to the connection. + +### Step 3: Clean up + +Finally, remove all usage of the **public key and HMAC** from your frontend. + + + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + + +## Related guides + +- [Auth guide](/guides/auth/auth-guide) - implement Connect sessions. +- [Customize Connect UI](/guides/auth/customize-connect-ui) - migrate custom authorization UIs or customize the pre-built UI. +- [Connection tags, configuration, and metadata](/guides/auth/connection-tags-configuration-metadata) - add ownership attribution during migration. + +## Migrate To Zero Yaml + +Source: https://nango.dev/docs/guides/platform/migrations/migrate-to-zero-yaml.md + +--- +title: 'Migrating to Zero YAML' +sidebarTitle: 'Migrating to Zero YAML' +description: 'Guide on how to migrate to Zero YAML in Nango.' +--- + +
+ +
+ +The `nango.yaml` configuration file is deprecated and should not be used for new integrations. If you are still using it, this guide will help you migrate your existing Nango integrations from the YAML-based approach to our new Zero YAML system, which uses pure TypeScript with modern tooling. + +## What is Zero YAML? + +Zero YAML is Nango's new approach to building integrations that eliminates the need for separate `nango.yaml` configuration files. Instead, everything is defined in TypeScript using a configuration-as-code approach with full type safety. + +Key benefits: +- **Type Safety**: Full TypeScript support with Zod schema validation +- **Better Developer Experience**: Modern tooling, enhanced CLI output, and better error messages +- **Portability**: Self-contained files that can be easily shared and version controlled +- **No Custom Syntax**: Pure TypeScriptβ€”no need to learn YAML-specific conventions and our previous custom model syntax + +Here's a quick example of the new syntax: + +```typescript +import { createSync } from 'nango'; +import * as z from 'zod'; + +const issueSchema = z.object({ + id: z.string(), + title: z.string(), + state: z.string() +}); + +const sync = createSync({ + description: 'Fetches GitHub issues', + frequency: 'every hour', + models: { GithubIssue: issueSchema }, + exec: async (nango) => { + await nango.batchSave([{ id: 'foobar' }], 'GithubIssue'); + } +}); +``` + +## How Zero YAML Works + +The new system is built around simplification + +### Simplified file Structure + +Like a regular TypeScript codebase + +```sh +β”œβ”€β”€ index.ts # Declare what's deployed +β”œβ”€β”€ package.json # Dependency management and types +β”œβ”€β”€ github/ # An integration + β”œβ”€β”€ syncs/ + β”‚ └── fetchIssues.ts # A sync + └── actions/ + └── createIssue.ts # An action +``` + +### Simplified configuration + +Three core functions that replace YAML configuration. You'll benefit from IntelliSense and type safety, directly in your IDE. No need to jump between files to find the right configuration. + +- **`createSync()`**: Defines data synchronization jobs +- **`createAction()`**: Defines one-off jobs +- **`createOnEvent()`**: Defines event-based jobs + + +---- + + +## Quick Migration Guide + +### Automatic Migration + +The easiest way to migrate is using our automated migration command: + +```bash +nango migrate-to-zero-yaml +``` + +This **operation is destructive** and will overwrite your existing files. Make sure to back up your existing files before running the command. + +This command will: +1. Analyze your existing `nango.yaml` and TypeScript files +2. Generate new self-contained TypeScript files +3. Create the required `package.json` if it doesn't exist +4. Set up the `index.ts` entry point +5. Preserve your existing logic and configuration + +### Post-Migration Steps + +The migration command should automatically transform all your files. However, you should review the changes and make sure everything is correct. + +Because the new format is stricter, some type issues can arise after the migration. + +### Migration Plan + +We recommend: +1. **Back up** your current nango integrations folder +2. Use your **dev env** to migrate to test the new format +3. Deploy to **prod env** after you have assessed that everything works properly + +## What Has Changed? + +### Configuration: YAML β†’ TypeScript Objects + +**Before** (nango.yaml + separate .ts file): +```yaml +# nango.yaml +integrations: + github: + issues: + runs: every 1h + sync_type: full + endpoint: GET /issues + description: Fetches GitHub issues +models: + GithubIssue: + id: string + title: string +``` + +**After** (single self-contained file): +```typescript +const sync = createSync({ + description: 'Fetches GitHub issues', + frequency: 'every hour', + models: { GithubIssue: issueSchema } +}); +``` + +### Models: YAML Definitions β†’ Zod Schemas + +**Before**: +```yaml +models: + GithubIssue: + id: string + title: string + state: string +``` + +**After**: +```typescript +const issueSchema = z.object({ + id: z.string(), + title: z.string(), + state: z.string() +}); +``` + +## Before and After Examples + +### Sync Example + +**Before** (issues.ts + nango.yaml excerpt): +```typescript +// issues.ts +import type { NangoSync, GithubIssue } from '../../models'; + +export default async function fetchData(nango: NangoSync) { + // Sync logic here +} +``` + +```yaml +# nango.yaml excerpt +integrations: + github: + issues: + runs: every 1h + sync_type: full + endpoint: GET /issues +``` + +**After** (self-contained fetchIssues.ts): +```typescript +import { createSync } from 'nango'; +import * as z from 'zod'; + +const issueSchema = z.object({ + id: z.string(), + title: z.string(), + state: z.string() +}); + +const sync = createSync({ + description: 'Fetches GitHub issues', + frequency: 'every hour', + models: { GithubIssue: issueSchema }, + exec: async (nango) => { + // Your existing sync logic here + } +}); + +export default sync; +``` + +### Action Example + +**Before** (separate files): +```typescript +// create-issue.ts +export default async function runAction(nango: NangoAction, input: CreateIssueInput) { + // Action logic +} +``` + +**After** (self-contained): +```typescript +import { createAction } from 'nango'; +import * as z from 'zod'; + +const inputSchema = z.object({ + title: z.string(), + body: z.string() +}); + +const action = createAction({ + description: 'Create a GitHub issue', + input: inputSchema, + output: z.void(), + exec: async (nango, input) => { + // Your action logic here + } +}); + +export default action; +``` + +### Index File Structure + +The new `index.ts` file imports all your integrations: + +```typescript +// index.ts +import './github/syncs/fetchIssues.js'; +import './github/actions/createIssue.js'; +// Add more imports as needed +``` + +## Migration Gotchas & FAQ + +### Gotchas +```typescript +err - github/syncs/issues.ts:57:43 + Argument of type '{ id: number; owner: string; repo: string; issue_number: number; title: string; author: string; author_id: string; state: string; date_created: Date; date_last_modified: Date; body: string; }[]' is not assignable to parameter of type 'RawModel[]'. + Type '{ id: number; owner: string; repo: string; issue_number: number; title: string; author: string; author_id: string; state: string; date_created: Date; date_last_modified: Date; body: string; }' is not assignable to type 'RawModel'. + Types of property 'id' are incompatible. + Type 'number' is not assignable to type 'string'. +``` +Previously you were setting the ID property of a sync to a number when it should always be a string. + +------ + +```typescript +err - 1password-scim/actions/create-user.ts:26:45 + Property 'errors' does not exist on type 'ZodError<{ firstName: string; lastName: string; email: string; active?: boolean | undefined; externalId?: string | undefined; phoneNumbers?: { type: "work" | "mobile" | "other"; value: string; }[] | undefined; photos?: { ...; }[] | undefined; addresses?: { ...; }[] | undefined; title?: string | undefined; }>'. +``` +Previously you were validating an input using Zod in this way +```typescript +const parsedInput = scimCreateUserSchema.safeParse(input); + +if (!parsedInput.success) { + for (const error of parsedInput.error.errors) { + await nango.log( + `Invalid input provided to create a user: ${error.message} at path ${error.path.join(".")}`, + { level: "error" }, + ); + } + + throw new nango.ActionError({ + message: "Invalid input provided to create a user", + }); +} +``` +Instead of this, you can use a Nango helper: +```typescript +const parsedInput = await nango.zodValidateInput({ zodSchema: scimCreateUserSchema, input }); +``` + +### Nango.yaml EOL + +**Q: When will nango.yaml stop being supported?** + +**A:** nango.yaml integrations will be supported until the end of 2025. Zero YAML will be the only supported way to build integrations after that. An official roadmap will be published soon. + +### Package.json Requirement + +**Q: Why is package.json now mandatory?** + +**A:** The new system uses modern JavaScript tooling that requires proper dependency management. The `package.json` ensures: +- Consistent dependency versions across environments +- Proper module resolution +- Better integration with modern development tools + +If you don't have one, the migration command will create it automatically. + +Note: Bundling custom dependencies is not yet possible but is now on our roadmap thanks to this update. + +### Backward Compatibility + +**Q: What still works the same?** + +**A:** Your core integration logic remains unchanged. No new features or breaking changes. All CLI commands are still available. + +### Testing Migrated Integrations + +**Q: How do I test after migration?** + +**A:** Use the same testing commands: + +```bash +# Test a specific sync +nango dryrun +``` + +### Rollback Process + +**Q: Can I rollback if something goes wrong?** + +**A:** Yes, Nango's platform remains compatible with nango.yaml at all times: +1. Go to your backup folder +2. `nango deploy dev` + +Keep your original files until you've fully validated the migration. + +--- + +The Zero YAML approach represents a significant step forward in Nango's developer experience. By eliminating custom syntax and embracing pure TypeScript, we've made integrations more maintainable, shareable, and enjoyable to work with. Many more features will be possible thanks to this new syntax. + +If you encounter any issues during migration, our support team is ready to help. Happy integrating! πŸš€ + + + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + + +## Related guides + +- [Functions guide](/guides/functions/functions-guide) - understand the current TypeScript-first project layout. +- [Functions CLI](/reference/functions/functions-cli) - deploy and dry-run migrated functions. +- [Testing](/guides/functions/testing) - verify migrated integrations before rollout. + +## Frontend Sdk + +Source: https://nango.dev/docs/reference/frontend/frontend-sdk.md + +--- +title: 'Frontend SDK' +sidebarTitle: 'Frontend SDK' +icon: 'js' +--- + +Trigger authorization flows in your frontend with this SDK. It is available on [NPM](https://www.npmjs.com/package/@nangohq/frontend) as `@nangohq/frontend`. + +# Instantiate the frontend SDK + +```ts +import Nango from '@nangohq/frontend'; + +const nango = new Nango({ connectSessionToken: '' }); +``` + +**Parameters** + + + + + + Get your public key in the environment settings of the Nango UI. This is key is not sensitive. + + + + Omitting the host points to Nango Cloud. For local development, use `http://localhost:3003`. Use your instance URL if self-hosting. + + + + For self-hosted instances only to specify a customs path for the WebSocket connection. + + + + Specify a specific width for the OAuth authorization modal. + + + + Specify a specific height for the OAuth authorization modal. + + + + Print additional console logs to debug authorization issues. + + + + + + +# Connect using Nango Connect UI + +Nango provides a UI component that guides your app's users through automatically and securely setting up an integration. This UI is hosted on Nango's servers and requires minimal setup on your end to get started quickly. +This is the recommended way to use Nango in your frontend. + +```js +const connectUI = nango.openConnectUI({ sessionToken: 'SESSION_TOKEN' }); +``` + +**Parameters** + + + The unique token to identify your user. It is required but can be set asynchronously. + + + + The base URL to load the UI + + + + The base URL to reach Nango API + + + + A callback to listen to events sent by Nango Connect + + + + Control OAuth popup close detection. If set to true, a closed popup will be detected as a failed authorization. + + + + The language to use for the UI. Defaults to browser language or english if not supported. + + + + The theme (light, dark, system) to use for the UI. Overrides your global setting in the dashboard. + + + +**Response** + + + + The class to manipulate Nango Connect + + + +# Connect using the headless client + +You store end-user credentials with the `nango.auth` method. It creates a connection in Nango. + + + + + +For OAuth, this will open a modal to let the user log in to their external account. + +```js +const result = await nango.auth('').catch((error) => { +... +}); +``` + + + + + +For API key authorization, pass the end-user's previously-collected API key directly in the parameters. + +```js +const result = await nango.auth('', { + credentials: { apiKey: '' } +}).catch((error) => { + ... +}); +``` + + + + + +For Basic Auth, pass the end-user's previously-collected username & password in the parameters. + +```js +const result = nango.auth('', { + credentials: { username: '', password: '' } +}).catch((error) => { + ... +}); +``` + + + + +**Parameters** + + + The integration ID that you can find in the integration settings on the Nango UI. + + + + The connection ID that you can find in the _Connections_ tab on the Nango UI. + + + + + + Specify additional connection configuration necessary to perform the authorization request. + + + + HMAC key to secure the authorization flow + + + + If `true`, `nango.auth()` would fail if the login window is closed before the authorization flow is completed. + + + + For OAuth, specify the query parameters of the authorization URL. + + + + For Slack OAuth, specify user-specific scopes. + + + + + + For API key authorization, pass in the user's API key. + + + + For Basic authorization, pass in the user's username. + + + + For Basic authorization, pass in the user's password. + + + + For OAuth 2, override the integration's client ID with a connection-level client ID. This is useful when your users bring their own OAuth 2 app (e.g. Netsuite). + + + + For OAuth 2, override the integration's client secret with a connection-level client secret. This is useful when your users bring their own OAuth 2 app (e.g. Netsuite). + + + + + + + +**Success response** + + + + The integration ID that you can find in the integration settings on the Nango UI. + + + + The connection ID that you can find in the _Connections_ tab on the Nango UI. + + + +**Error response** + + + + + The type of error (e.g. 'authorization_cancelled'). + + + + The detailed error message (e.g. 'Authorization fail: The user has closed the authorization modal before the process was complete.'). + + + + + +# Error Handling + +The Nango Frontend SDK may throw different types of errors during authentication and connection setup. Below is a list of all possible error types along with their meanings: + +1. `missing_auth_token` + - Occurs when neither a public key nor a connect session token is provided. + - Message: "You must specify a public key OR a connect session token (cf. documentation)." + +2. `blocked_by_browser` + - Occurs when the browser blocks the popup window for authentication. + - Message: "Modal blocked by browser" + +3. `invalid_host_url` + - Occurs when the provided host URL is invalid. + - Message: "Invalid URL provided for the Nango host." + +4. `missing_credentials` + - Occurs when required credentials are not provided. + - Message: "You must specify credentials." + +5. `window_closed` + - Occurs when the authentication window is closed before completing the flow. + - Message: "The authorization window was closed before the authorization flow was completed" + +6. `connection_test_failed` + - Occurs when credential verification fails for certain integrations before the connection is established. + - Message: "The given credentials were found to be invalid. Please check the credentials and try again." + +7. `missing_connect_session_token` + - Occurs when attempting to reconnect without a session token. + - Message: "Reconnect requires a session token" + +8. `resource_capped` + - Occurs when the resource usage limit has been reached. + - Message: "Reached maximum number of allowed connections for your plan" or "Reached maximum number of connections with functions enabled" + +9. `unknown_error` + - Occurs when an unexpected error happens that doesn't fall into other error categories. + - Message: Varies depending on the underlying error (e.g., network failures, unexpected exceptions) + +## Error Response Structure + +All errors from the Nango Frontend SDK follow this structure: + +```json +{ + "error": { + "code": "", + "message": "" + } +} +``` + +## Handling Errors + +You can handle these errors in your code using the `AuthError` class. + +```ts +import { AuthError } from '@nangohq/frontend'; + +try { + const result = await nango.auth('', { + credentials: { apiKey: '' } + }); +} catch (error) { + if (error instanceof AuthError && error.type === '') { + // Handle specific error + console.error('Your error message'); + } +} +``` + +**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + + +## API keys + +Source: https://nango.dev/docs/reference/backend/http-api/api-keys.md +Description: Manage API keys with scoped permissions for your Nango environments. + +# API keys + +API keys allow programmatic access to your Nango environment. Each environment can have multiple API keys with different permissions, enabling you to follow the principle of least privilege. + +## Managing API Keys + +API keys are managed in the Nango UI under **Environment Settings > API Keys**. + +Each environment comes with a **Default - Full access** key that grants access to all API endpoints. You can create additional keys with restricted scopes for specific use cases. + +### Creating a Key + +1. Go to **Environment Settings > API Keys** +2. Click **Create API Key** +3. Enter a display name (e.g., "CI Deploy Key", "Backend service") +4. Choose **Full access** or **Custom** permissions β€” custom lets you pick individual scopes +5. The key is created immediately and can be revealed and copied from the key list + +### Rotating a Key + +To rotate a key: +1. Create a new key with the same scopes +2. Update your application to use the new key +3. Monitor the **Last used** column on the old key to confirm it's no longer in use +4. Delete the old key + +### Using a Key + +Pass the API key as a Bearer token in the `Authorization` header: + + + + ```ts + import { Nango } from '@nangohq/node'; + + const nango = new Nango({ secretKey: '' }); + ``` + + + ```bash + curl --request GET \ + --url https://api.nango.dev/connections \ + --header 'Authorization: Bearer ' + ``` + + + +## Scopes + +Scopes control what an API key can access. When creating a key with **Custom** permissions, you select which scopes to grant. A key without a specific scope will receive a `403 Forbidden` response when trying to access a protected endpoint. + +### Credential Scopes + +Some resources (Integrations and Connections) have sensitive credential data. Access to this data is controlled by dedicated `_credentials` scopes: + +- `list` / `read` β€” returns the resource **without** sensitive credentials +- `list_credentials` / `read_credentials` β€” returns the resource **with** credentials (access tokens, client secrets, etc.) + +The `_credentials` scopes are supersets β€” selecting `read_credentials` automatically includes `read` access. You don't need to select both. + +| Resource | Without credentials | With credentials | +|----------|-------------------|-----------------| +| **Connections** | Connection metadata, tags, status | + access/refresh tokens | +| **Integrations** | Provider, display name, config | + client ID and client secret | + +## Advised Profiles + +Common scope combinations for typical use cases: + +### Auth (Connect UI) + +For backends that create connect sessions for the auth flow: + +| Scope | +|-------| +| `environment:connect_sessions:write` | + +### CI/CD Deploy + +For CI/CD pipelines deploying syncs and actions to production: + +| Scope | +|-------| +| `environment:deploy` | + +### Backend Service + +For backend services that consume data, trigger actions, and proxy requests: + +| Scope | +|-------| +| `environment:connections:read` | +| `environment:records:read` | +| `environment:actions:execute` | +| `environment:syncs:execute` | +| `environment:proxy` | + +Add `environment:connections:read_credentials` if the service needs access to connection tokens. + + +For extra security, avoid when possible granting `environment:connections:list` to backend services. Without it, connection IDs act as connection-specific secrets β€” a leaked API key alone won't let an attacker enumerate and access customer data. + + +### Local Development + +For local development, use a **Full access** key. This is the default key created for each environment. + +## CLI + +The Nango CLI uses the `NANGO_SECRET_KEY_` environment variable for authentication. Set it to an API key with the required scopes: + +| CLI Command | Required Scope | +|-------------|---------------| +| `nango deploy` | `environment:deploy` | +| `nango dryrun` | `environment:connections:read` + `environment:integrations:read` + `environment:proxy` | + +For most functions, `environment:connections:read` is sufficient for `nango dryrun` β€” Nango injects credentials into the proxy automatically, so the function does not need them in its response. Upgrade to `environment:connections:read_credentials` when the function reads credential data from the connection, including: + +- accessing `connection.credentials` directly (e.g. `nango.getConnection().credentials`) +- calling `nango.getToken()` β€” returns the access token from `connection.credentials` +- calling `nango.getRawTokenResponse()` β€” returns `connection.credentials.raw` + +Without `read_credentials`, these helpers return empty values because the API strips the `credentials` field from the response. + +The **Default - Full access** key that comes with each environment already has all required scopes for deploying and dry-running. For production CI/CD pipelines, consider creating a dedicated key with only the `environment:deploy` scope to follow the principle of least privilege. + +## All Available Scopes + +### Integrations + +| Scope | Description | +|-------|-------------| +| `environment:integrations:list` | List integrations (no credentials) | +| `environment:integrations:list_credentials` | List integrations with client credentials | +| `environment:integrations:list_functions` | List deployed functions (syncs and actions) | +| `environment:integrations:read` | Read a single integration (no credentials) | +| `environment:integrations:read_credentials` | Read a single integration with client credentials | +| `environment:integrations:create` | Create integrations | +| `environment:integrations:update` | Update integrations | +| `environment:integrations:delete` | Delete integrations | + +### Connections + +| Scope | Description | +|-------|-------------| +| `environment:connections:list` | List connections (no credentials) | +| `environment:connections:list_credentials` | List connections with access/refresh tokens | +| `environment:connections:read` | Read a single connection (no credentials) | +| `environment:connections:read_credentials` | Read a single connection with access/refresh tokens | +| `environment:connections:create` | Create connections | +| `environment:connections:update` | Update connections and metadata | +| `environment:connections:delete` | Delete connections | + +### Connect Sessions + +| Scope | Description | +|-------|-------------| +| `environment:connect_sessions:write` | Create and reconnect sessions for the Connect UI auth flow | + +### Syncs + +| Scope | Description | +|-------|-------------| +| `environment:syncs:read` | Read sync status | +| `environment:syncs:execute` | Trigger, pause, start syncs | +| `environment:syncs:update` | Update sync connection frequency | +| `environment:syncs:variant:create` | Create sync variants | +| `environment:syncs:variant:delete` | Delete sync variants | + +### Deploy + +| Scope | Description | +|-------|-------------| +| `environment:deploy` | Deploy syncs and actions via CLI or API | + +### Functions + +| Scope | Description | +|-------|-------------| +| `environment:functions:list` | List deployed functions | +| `environment:functions:read` | Read a single deployed function | +| `environment:functions:delete` | Delete a deployed function | +| `environment:functions:compile` | Compile function source code | +| `environment:functions:dryrun` | Dry run function source code | + +### Records + +| Scope | Description | +|-------|-------------| +| `environment:records:read` | Read synced records | +| `environment:records:write` | Prune records | + +### Actions + +| Scope | Description | +|-------|-------------| +| `environment:actions:execute` | Trigger actions and read action results | + +### Proxy + +| Scope | Description | +|-------|-------------| +| `environment:proxy` | Send proxy requests to external APIs through Nango | + +### Variables + +| Scope | Description | +|-------|-------------| +| `environment:variables:read` | Read environment variables | + +### MCP + +| Scope | Description | +|-------|-------------| +| `environment:mcp` | Access the MCP endpoint | + +## Authentication + +Source: https://nango.dev/docs/reference/backend/http-api/authentication.md + +--- +title: 'Authentication' +--- + +Use an [API key](/reference/backend/http-api/api-keys) as a Bearer token in the `Authorization` header. API keys are managed in **Environment Settings > API Keys** in the Nango UI. + +``` +Authorization: Bearer +``` + +Each API key has [scopes](/reference/backend/http-api/api-keys#scopes) that control which endpoints it can access. A key without the required scope will receive a `403 Forbidden` response. + +## Rate Limits + +Source: https://nango.dev/docs/reference/backend/http-api/rate-limits.md + +--- +title: 'Rate limits' +--- + +The Nango API is rate-limited to prevent abuse and ensure fair usage across all clients. The rate limit is enforced on a per-account basis, with a fixed window of time and a maximum number of requests allowed within that window. + +Those headers are sent back with every API response: +- `X-RateLimit-Limit` indicates the maximum number of requests a client can make within the rate limit window. +- `X-RateLimit-Remaining` shows how many requests are remaining before the limit is reached. +- `X-RateLimit-Reset` provides a Unix timestamp representing the time at which the current rate limit window resets, and the remaining request count is replenished. + +If a client exceeds the rate limit, the API will respond with a 429 `Too Many Requests` status code. In this case, the `Retry-After` header is included, indicating the number of seconds the client should wait before making another request to avoid being rate-limited. + +## List + +Source: https://nango.dev/docs/reference/backend/http-api/integration/list.md + +--- +title: 'List all integrations' +openapi: 'GET /integrations' +--- + + + Requires an API key with one of: `environment:integrations:list` or `environment:integrations:list_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + + + +```ts Node Client +const nango = new Nango({ secretKey }); + +const response = await nango.listIntegrations(); +``` + + + + +```json Example Response +{ + "data": [ + { + "unique_key": "slack-nango-community", + "display_name": "Slack", + "provider": "slack", + "logo": "http://localhost:3003/images/template-logos/slack.svg", + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z", + }, + { + "unique_key": "github-prod", + "display_name": "GitHub", + "provider": "github", + "logo": "http://localhost:3003/images/template-logos/github.svg", + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z", + }, + ] +} +``` + + +## Get + +Source: https://nango.dev/docs/reference/backend/http-api/integration/get.md + +--- +title: 'Get an integration' +openapi: 'GET /integrations/{uniqueKey}' +--- + + + Requires an API key with one of: `environment:integrations:read` or `environment:integrations:read_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + + +```json Basic response +{ + "data": { + "unique_key": "slack-nango-community", + "display_name": "Slack", + "provider": "slack", + "logo": "http://localhost:3003/images/template-logos/github.svg", + "forward_webhooks": true, + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z" + } +} +``` + +```json With credentials (OAuth2/OAuth1/TBA) +{ + "data": { + "unique_key": "github-nango", + "display_name": "GitHub", + "provider": "github", + "logo": "http://localhost:3003/images/template-logos/github.svg", + "forward_webhooks": false, + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z", + "credentials": { + "type": "OAUTH2", + "client_id": "abc123", + "client_secret": "secret456", + "scopes": "repo,user", + "webhook_secret": null + } + } +} +``` + +```json With credentials (GitHub App / CUSTOM) +{ + "data": { + "unique_key": "github-app-nango", + "display_name": "GitHub App", + "provider": "github-app", + "logo": "http://localhost:3003/images/template-logos/github.svg", + "forward_webhooks": false, + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z", + "credentials": { + "type": "CUSTOM", + "client_id": "abc123", + "client_secret": "secret456", + "app_id": "123456", + "app_link": "https://github.com/apps/my-app", + "private_key": "-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----" + } + } +} +``` + + +## Create + +Source: https://nango.dev/docs/reference/backend/http-api/integration/create.md + +--- +title: 'Create an integration' +openapi: 'POST /integrations' +--- + + + Requires an API key with the `environment:integrations:create` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + + +```json Example Response +{ + "data": { + "unique_key": "slack-nango-community", + "display_name": "Slack", + "provider": "slack", + "logo": "http://localhost:3003/images/template-logos/github.svg", + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z", + } +} +``` + + +## Update + +Source: https://nango.dev/docs/reference/backend/http-api/integration/update.md + +--- +title: 'Update an integration' +openapi: 'PATCH /integrations/{uniqueKey}' +--- + + + Requires an API key with the `environment:integrations:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Delete + +Source: https://nango.dev/docs/reference/backend/http-api/integration/delete.md + +--- +title: 'Delete an integration' +openapi: 'DELETE /integrations/{uniqueKey}' +--- + + + Requires an API key with the `environment:integrations:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Create + +Source: https://nango.dev/docs/reference/backend/http-api/connect/sessions/create.md + +--- +title: 'Create a connect session' +openapi: 'POST /connect/sessions' +--- + + + Requires an API key with the `environment:connect_sessions:write` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +Creates a short-lived connect session (30m). +The returned token can be used for instance to create connections through Connect UI. + +You can attach connection-level tags to the session via the `tags` field. These tags are copied onto the created connection and included in auth webhooks. + +Most apps start with these tags: `end_user_id`, `end_user_email`, `organization_id`. + +## Reconnect + +Source: https://nango.dev/docs/reference/backend/http-api/connect/sessions/reconnect.md + +--- +title: 'Create a reconnect session' +openapi: 'POST /connect/sessions/reconnect' +--- + + + Requires an API key with the `environment:connect_sessions:write` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Get + +Source: https://nango.dev/docs/reference/backend/http-api/connect/session/get.md + +--- +title: 'Get a connect session' +openapi: 'GET /connect/session' +--- + +Retrieves a connect session information (allowed integrations, default connection configurations). + +## Delete + +Source: https://nango.dev/docs/reference/backend/http-api/connect/session/delete.md + +--- +title: 'Delete a connect session' +openapi: 'DELETE /connect/session' +--- + +Deletes a connect session + +## Post + +Source: https://nango.dev/docs/reference/backend/http-api/connections/post.md + +--- +title: 'Import a connection' +openapi: 'POST /connections' +--- + + + Requires an API key with the `environment:connections:create` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## When to use + +Use this API endpoint to import existing access tokens into Nango. It is mostly meant for one-off bulk imports when onboarding Nango, or for migrating existing connections when a provider introduced changes to its auth flow. + +If a connection with the same `connection_id` and `provider_config_key` already exists, the endpoint updates it with the provided credentials instead of creating a new one. + +To trigger OAuth flows with Nango, use the [Nango frontend SDK](/reference/frontend/frontend-sdk). + +## Request body + +You can use this endpoint to import OAuth 2, OAuth 1, API Keys, and Basic auth credentials. + +The required fields depend on the type of authentication of the _connections_ you are trying to import. + +## List + +Source: https://nango.dev/docs/reference/backend/http-api/connections/list.md + +--- +title: 'List connections' +openapi: 'GET /connections' +--- + + + Requires an API key with one of: `environment:connections:list` or `environment:connections:list_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + + + ```json Example Response +{ + "connections": [ + { + "id": 1, + "connection_id": "test-1", + "provider": "slack", + "provider_config_key": "slack-nango-community", + "created": "2023-06-03T14:53:22.051Z", + "metadata": null, + "tags": { + "end_user_id": "your-internal-id", + "end_user_email": "user@example.com", + "organization_id": "user-organization-id" + }, + "errors": [{ "type": "auth", "log_id": "VrnbtykXJFckCm3HP93t"}] + }, + { + "id": 2, + "connection_id": "test-2", + "provider": "slack", + "provider_config_key": "slack-nango-community", + "created": "2023-06-03T15:00:14.945Z", + "metadata": { + "bot_id": "some-uuid" + }, + "tags": { + "end_user_id": "your-internal-id", + "end_user_email": "user@example.com", + "organization_id": "user-organization-id" + }, + "errors": [] + } + ] +} + ``` + + +## Get + +Source: https://nango.dev/docs/reference/backend/http-api/connections/get.md + +--- +title: 'Get connection & credentials' +openapi: 'GET /connections/{connectionId}' +--- + + + Requires an API key with one of: `environment:connections:read` or `environment:connections:read_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + + + +The response content depends on the API authentication type (e.g: OAuth 2, OAuth 1, API key, etc.). + +If you do not want to deal with collecting & injecting credentials in requests for multiple authentication types, use the [Proxy](/guides/platform/proxy-requests). + + + + +Every time you fetch the connection with this API endpoint, Nango will check if the access token has expired. If it has, it will refresh it. + +**We recommend you always fetch the token just before you use it to make sure it is fresh!** + + + +## Patch + +Source: https://nango.dev/docs/reference/backend/http-api/connections/patch.md + +--- +title: 'Patch a connection' +openapi: 'PATCH /connections/{connectionId}' +--- + + + Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Set Metadata + +Source: https://nango.dev/docs/reference/backend/http-api/connections/set-metadata.md + +--- +title: 'Set connection metadata' +openapi: 'POST /connections/metadata' +--- + + + Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Set _connection metadata_ + +Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides any existing metadata. The connection_id must be passed in the body as well. Note that the connection_id can be a single string or an array of strings. + +## Fetching _connection metadata_ + +To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. + +## Update Metadata + +Source: https://nango.dev/docs/reference/backend/http-api/connections/update-metadata.md + +--- +title: 'Edit connection metadata' +openapi: 'PATCH /connections/metadata' +--- + + + Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Update _connection metadata_ + +Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides specified properties, not the entire metadata. The connection_id must be passed in the body as well. Note that the connection_id can be a single string or an array of strings. + +## Fetching _connection metadata_ + +To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. + +## Delete + +Source: https://nango.dev/docs/reference/backend/http-api/connections/delete.md + +--- +title: 'Delete a connection' +openapi: 'DELETE /connections/{connectionId}' +--- + + + Requires an API key with the `environment:connections:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## List functions + +Source: https://nango.dev/docs/reference/backend/http-api/functions/list.md + + + Requires an API key with the `environment:functions:list` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +Returns the functions deployed to an integration. + +## Get a function + +Source: https://nango.dev/docs/reference/backend/http-api/functions/get.md + + + Requires an API key with the `environment:functions:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +Returns a single deployed function. + +## Get a function's source code + +Source: https://nango.dev/docs/reference/backend/http-api/functions/code.md + + + Requires an API key with the `environment:functions:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +Returns the TypeScript source code of a function for a given integration. + +## Delete a function + +Source: https://nango.dev/docs/reference/backend/http-api/functions/delete.md + + + Requires an API key with the `environment:functions:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +Deletes a deployed function and enqueues its async teardown. Functions managed by `nango deploy` (repo source) cannot be deleted through this endpoint. + +## Compile + +Source: https://nango.dev/docs/reference/backend/http-api/functions/compile.md + +--- +title: 'Compile a function' +openapi: 'POST /functions/compile' +--- + + + Requires an API key with the `environment:functions:compile` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +Compiles TypeScript function source code and returns the bundled JavaScript. + +## Dryruns Create + +Source: https://nango.dev/docs/reference/backend/http-api/functions/dryruns-create.md + +--- +title: 'Dry run a function' +openapi: 'POST /functions/dryruns' +--- + + + Requires an API key with the `environment:functions:dryrun` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +Starts an asynchronous dry run for TypeScript function source code against a connection without deploying it. + +## Dryruns Get + +Source: https://nango.dev/docs/reference/backend/http-api/functions/dryruns-get.md + +--- +title: 'Get dry run results' +openapi: 'GET /functions/dryruns/{id}' +--- + + + Requires an API key with the `environment:functions:dryrun` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +Returns the status and result of an asynchronous function dry run. + +## Deployments + +Source: https://nango.dev/docs/reference/backend/http-api/functions/deployments.md + +--- +title: 'Create a function deployment' +openapi: 'POST /functions/deployments' +--- + + + Requires an API key with the `environment:deploy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +Deploys a function to an existing integration: either submitted TypeScript source code (`type: function`) or a template from the provider catalog (`type: template`). + +## Config + +Source: https://nango.dev/docs/reference/backend/http-api/scripts/config.md + +--- +title: 'Get integration functions config' +openapi: 'GET /scripts/config' +--- + + + Requires an API key with the `environment:integrations:list_functions` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +The `/scripts/config` endpoint returns the configuration for all integration functions. There are two variants of this endpoint: + +1. `/scripts/config?format=nango` - Returns the standard configuration format +2. `/scripts/config?format=openai` - Returns the configuration in OpenAI's function calling format + +## OpenAI Function Format + +The `/scripts/config?format=openai` endpoint transforms the script configurations into OpenAI's function calling format. This format is particularly useful when working with OpenAI's API to enable function calling capabilities. + +### Parameter Descriptions + +The endpoint automatically parses parameter descriptions from the script's description field. If a script's description contains a markdown list of parameters, these descriptions will be used for the corresponding parameters in the OpenAI function format. + +For example, in your script file, you can define a script like this: + +```typescript google-calendar/actions/move-event.ts +export default createAction({ + description: `Move an event to a different time or calendar with the following parameters: + - eventId: The ID of the event to move + - start: New start time in ISO format (e.g., "2024-03-28T14:00:00") + - end: New end time in ISO format (e.g., "2024-03-28T15:00:00") + - calendar: Optional new calendar ID to move the event to`, + version: '1.0.0', + endpoints: [{ method: 'GET', path: '/example/github/issues', group: 'Issues' }], + frequency: 'every hour', + autoStart: false, + scopes: ['https://www.googleapis.com/auth/calendar'], + input: z.object({ + eventId: z.string(), + start: z.string(), + end: z.string(), + calendar: z.string().optional() + }) +}); +``` + +The endpoint will generate a function definition like this: + +```json +{ + "data": [ + { + "name": "move-event", + "description": "Move an event to a different time or calendar with the following parameters:\n- eventId: The ID of the event to move\n- start: New start time in ISO format (e.g., \"2024-03-28T14:00:00\")\n- end: New end time in ISO format (e.g., \"2024-03-28T15:00:00\")\n- calendar: Optional new calendar ID to move the event to", + "parameters": { + "type": "object", + "properties": { + "eventId": { + "type": "string", + "description": "The ID of the event to move" + }, + "start": { + "type": "string", + "description": "New start time in ISO format (e.g., \"2024-03-28T14:00:00\")" + }, + "end": { + "type": "string", + "description": "New end time in ISO format (e.g., \"2024-03-28T15:00:00\")" + }, + "calendar": { + "type": "string", + "description": "Optional new calendar ID to move the event to" + } + }, + "required": ["eventId", "start", "end"] + } + } + ] +} +``` + +### Array Fields + +The endpoint properly handles array fields in the configuration. For example, if a field is defined as: + +```typescript google-calendar/actions/create-event.ts +export default createAction({ + description: `Create a new calendar event with the following parameters: + - summary: The title of the event + - attendees: List of email addresses of event attendees`, + version: '1.0.0', + endpoints: [{ method: 'POST', path: '/example/google-calendar/events', group: 'Events' }], + input: z.object({ + summary: z.string(), + attendees: z.array(z.string()).optional() + }) +}); +``` + +It will be transformed into: + +```json +{ + "data": [ + { + "name": "create-event", + "description": "Create a new calendar event with the following parameters:\n- summary: The title of the event\n- attendees: List of email addresses of event attendees", + "parameters": { + "type": "object", + "properties": { + "summary": { + "type": "string", + "description": "The title of the event" + }, + "attendees": { + "type": "array", + "description": "List of email addresses of event attendees", + "items": { + "type": "string" + } + } + }, + "required": ["summary"] + } + } + ] +} +``` + +## Records List + +Source: https://nango.dev/docs/reference/backend/http-api/sync/records-list.md + +--- +title: 'Get records' +sidebarTitle: 'Get records' +openapi: 'GET /records' +--- + + + Requires an API key with the `environment:records:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Receive webhooks on data updates + +Receive webhooks from Nango when new records are available. Follow the [sync functions section](/guides/functions/syncs/sync-functions). + + +**Data availability**: Records are subject to Nango's [data retention policies](/guides/platform/security#synced-records-retention). Records not updated for 30 days will have their payload pruned (only metadata remains). Records from syncs not executed for 60 days are permanently deleted. Fetch and store records promptly in your own system. + + +## Response + + +This endpoint returns a list of records, ordered by modification date ascending. If some records are updated while you paginate through this endpoint, you might see these records multiple times. + + + +A response may contain fewer records than `limit` when records have a large size. Always check `next_cursor` and continue paginating until it is `null`. + + +### Default behavior +By default this returns an array of objects in the data model that you queried with some metadata about each record. + +```json +{ + records: + [ + { + id: 123, + ..., // Fields as specified in the model you queried + _nango_metadata: { + deleted_at: null, + last_action: 'ADDED', + first_seen_at: '2023-09-18T15:20:35.941305+00:00', + last_modified_at: '2023-09-18T15:20:35.941305+00:00', + cursor: 'MjAyNC0wMy0wNFQwNjo1OTo1MS40NzE0NDEtMDU6MDB8fDE1Y2NjODA1LTY0ZDUtNDk0MC1hN2UwLTQ1ZmM3MDQ5OTdhMQ==' + } + }, + ... + ], + next_cursor: "MjAyMy0xMS0xN1QxMTo0NzoxNC40NDcrMDI6MDB8fDAzZTA1NzIxLWNiZmQtNGYxNS1iYTNhLWFlNjM2Y2MwNmEw==" +} +``` + +## Prune Records + +Source: https://nango.dev/docs/reference/backend/http-api/sync/prune-records.md + +--- +title: 'Prune records' +sidebarTitle: 'Prune records' +openapi: 'PATCH /records/prune' +--- + + + Requires an API key with the `environment:records:write` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +Prunes synced records for a given connection and model using cursor-based pagination. + +## What is pruning? + +Pruning empties the record payload while preserving the record metadata. +This is useful for compliance requirements, ensuring Nango doesn't hold onto your records data while maintaining the ability to track record state. The payload can be restored by re-syncing the data. + + +Pruning is not the same as marking a record as deleted from the external API. +This endpoint prunes data from Nango’s cache only. It does not delete anything on the external API, and it is not the same as [detecting a deletion from the source](/guides/functions/syncs/deletion-detection). + +If you need to tell your customers that a record was deleted on the external API while keeping its last-known payload in cache, use `batchDelete` or `trackDeletesStart`/`trackDeletesEnd` in your sync functions instead. + + +## Cursor behavior + +Records are pruned up to and including the specified `until_cursor` value. Use the `_nango_metadata.cursor` value from the record you want to prune up to. + +## Response + + +The `has_more` field indicates whether there are potentially more records to prune. When `true`, make another request with the same `until_cursor` to continue pruning. When `false`, all records up to the cursor have been pruned. + + +```json +{ + "count": 150, + "has_more": true +} +``` + +## Trigger + +Source: https://nango.dev/docs/reference/backend/http-api/sync/trigger.md + +--- +title: 'Trigger sync(s)' +openapi: 'POST /sync/trigger' +--- + + + Requires an API key with the `environment:syncs:execute` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Triggering one-off syncs + +This is especially useful if you e.g. changed the metadata for the connection and now want to re-import data. + +Use `reset` to clear the checkpoint and re-fetch all data, or `reset` with `emptyCache` to start completely fresh. See the [checkpoints guide](/guides/functions/syncs/checkpoints#re-syncing-resetting-checkpoints-and-the-cache) for details. + +## Start + +Source: https://nango.dev/docs/reference/backend/http-api/sync/start.md + +--- +title: 'Start sync(s)' +openapi: 'POST /sync/start' +--- + + + Requires an API key with the `environment:syncs:execute` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Pause + +Source: https://nango.dev/docs/reference/backend/http-api/sync/pause.md + +--- +title: 'Pause sync(s)' +openapi: 'POST /sync/pause' +--- + + + Requires an API key with the `environment:syncs:execute` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Status + +Source: https://nango.dev/docs/reference/backend/http-api/sync/status.md + +--- +title: 'Sync status' +openapi: 'GET /sync/status' +--- + + + Requires an API key with the `environment:syncs:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +The response includes the current `checkpoint` for each sync, which tracks how far the sync has progressed. Learn more about [checkpoints](/guides/functions/syncs/checkpoints). + +## Update Connection Frequency + +Source: https://nango.dev/docs/reference/backend/http-api/sync/update-connection-frequency.md + +--- +title: 'Override sync connection frequency' +openapi: 'PUT /sync/update-connection-frequency' +--- + + + Requires an API key with the `environment:syncs:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Environment Variables + +Source: https://nango.dev/docs/reference/backend/http-api/sync/environment-variables.md + +--- +title: 'Get environment variables' +openapi: 'GET /environment-variables' +--- + + + Requires an API key with the `environment:variables:read` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Create Variant + +Source: https://nango.dev/docs/reference/backend/http-api/sync/create-variant.md + +--- +title: 'Create sync variant' +sidebarTitle: 'Create variant' +openapi: 'POST /sync/{name}/variant/{variant}' +--- + + + Requires an API key with the `environment:syncs:variant:create` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Creating a sync variant + +Sync variants allow you to create different configurations of the same sync for a specific connection. This is useful when you need to sync the same data with different settings or filters. + +### Key features +- Each variant operates independently with its own sync schedule +- Variants can be queried separately through the records endpoint using the `variant` query parameter +- Cannot use "base" as a variant name (protected) + +After creating a variant, you can use the `/records` endpoint to access its data by specifying the variant query parameter: + +``` +GET /records?model=MyModel&variant=MyVariant +``` + +## Delete Variant + +Source: https://nango.dev/docs/reference/backend/http-api/sync/delete-variant.md + +--- +title: 'Delete sync variant' +sidebarTitle: 'Delete variant' +openapi: 'DELETE /sync/{name}/variant/{variant}' +--- + + + Requires an API key with the `environment:syncs:variant:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Trigger + +Source: https://nango.dev/docs/reference/backend/http-api/action/trigger.md + +--- +title: 'Trigger an action' +openapi: 'POST /action/trigger' +--- + + + Requires an API key with the `environment:actions:execute` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Get + +Source: https://nango.dev/docs/reference/backend/http-api/proxy/get.md + +--- +title: 'Proxy - GET requests' +sidebarTitle: 'Proxy - GET requests' +openapi: 'GET /proxy/{anyPath}' +--- + + + Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +### API request + +The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: +* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. +* Provider-Config-Key +* Connection-Id +* Retries +* Base-Url-Override: provide an API base URL when the base API is not listed in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) or it needs to be overridden + +### API response + +The response from the external API is passed back to you exactly as Nango gets it: +* Response code +* Response headers +* Response body + +## Post + +Source: https://nango.dev/docs/reference/backend/http-api/proxy/post.md + +--- +title: 'Proxy - POST requests' +sidebarTitle: 'Proxy - POST requests' +openapi: 'POST /proxy/{anyPath}' +--- + + + Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +### API request + +The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: +* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. +* Provider-Config-Key +* Connection-Id +* Retries + +### API response + +The response from the external API is passed back to you exactly as Nango gets it: +* Response code +* Response headers +* Response body + +## Put + +Source: https://nango.dev/docs/reference/backend/http-api/proxy/put.md + +--- +title: 'Proxy - PUT requests' +sidebarTitle: 'Proxy - PUT requests' +openapi: 'PUT /proxy/{anyPath}' +--- + + + Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +### API request + +The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: +* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. +* Provider-Config-Key +* Connection-Id +* Retries +* Base-Url-Override: provide an API base URL when the base API is not listed in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) or it needs to be overridden + +### API response + +The response from the external API is passed back to you exactly as Nango gets it: +* Response code +* Response headers +* Response body + +## Patch + +Source: https://nango.dev/docs/reference/backend/http-api/proxy/patch.md + +--- +title: 'Proxy - PATCH requests' +sidebarTitle: 'Proxy - PATCH requests' +openapi: 'PATCH /proxy/{anyPath}' +--- + + + Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +### API request + +The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: +* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. +* Provider-Config-Key +* Connection-Id +* Retries + +### API response + +The response from the external API is passed back to you exactly as Nango gets it: +* Response code +* Response headers +* Response body + +## Delete + +Source: https://nango.dev/docs/reference/backend/http-api/proxy/delete.md + +--- +title: 'Proxy - DELETE requests' +sidebarTitle: 'Proxy - DELETE requests' +openapi: 'DELETE /proxy/{anyPath}' +--- + + + Requires an API key with the `environment:proxy` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +### API request + +The path, query params, and headers you send to the Proxy are all passed on to the external API, except for the configuration headers mentioned here: +* Authorization: See [Nango API Authentication](/reference/backend/http-api/authentication). Nango will add a new Authorization header for the external API as needed. +* Provider-Config-Key +* Connection-Id +* Retries +* Base-Url-Override: provide an API base URL when the base API is not listed in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) or it needs to be overridden + +### API response + +The response from the external API is passed back to you exactly as Nango gets it: +* Response code +* Response headers +* Response body + +## List + +Source: https://nango.dev/docs/reference/backend/http-api/providers/list.md + +--- +title: 'List all providers' +openapi: 'GET /providers' +--- + + +```json Example Response +{ + "data": [ + { + "name": "hubspot", + "logo_url": "https://app.nango.dev/images/template-logos/hubspot.svg", + "display_name": "HubSpot", + "categories": ["marketing","support","crm"], + "auth_mode": "OAUTH2", + "authorization_url": "https://app.hubspot.com/oauth/authorize", + "token_url": "https://api.hubapi.com/oauth/v1/token", + "connection_configuration": ["portalId"], + "post_connection_script": "hubspotPostConnection", + "webhook_routing_script": "hubspotWebhookRouting", + "proxy": { + "base_url": "https://api.hubapi.com", + "decompress": true, + "paginate": { + "type": "cursor", + "cursor_path_in_response": "paging.next.after", + "limit_name_in_request": "limit", + "cursor_name_in_request": "after", + "response_path": "results" + } + }, + "docs": "https://nango.dev/docs/api-integrations/hubspot" + }, + { + "name": "posthog", + "logo_url": "https://app.nango.dev/images/template-logos/posthog.svg", + "display_name": "PostHog", + "categories": ["dev-tools"], + "auth_mode": "API_KEY", + "proxy": { + "base_url": "https://api.posthog.com", + }, + "docs": "https://nango.dev/docs/api-integrations/posthog" + } + ] +} +``` + + +## Get + +Source: https://nango.dev/docs/reference/backend/http-api/providers/get.md + +--- +title: 'Get a provider' +openapi: 'GET /providers/{provider}' +--- + + +```json Example Response +{ + "data": { + "name": "hubspot", + "logo_url": "https://app.nango.dev/images/template-logos/hubspot.svg", + "display_name": "HubSpot", + "categories": ["marketing","support","crm"], + "auth_mode": "OAUTH2", + "authorization_url": "https://app.hubspot.com/oauth/authorize", + "token_url": "https://api.hubapi.com/oauth/v1/token", + "connection_configuration": ["portalId"], + "post_connection_script": "hubspotPostConnection", + "webhook_routing_script": "hubspotWebhookRouting", + "proxy": { + "base_url": "https://api.hubapi.com", + "decompress": true, + "paginate": { + "type": "cursor", + "cursor_path_in_response": "paging.next.after", + "limit_name_in_request": "limit", + "cursor_name_in_request": "after", + "response_path": "results" + } + }, + "docs": "https://nango.dev/docs/api-integrations/hubspot" + } +} +``` + + +## List provider templates + +Source: https://nango.dev/docs/reference/backend/http-api/providers/templates.md + +Returns the template functions available in the catalog for a provider. + +## List + +Source: https://nango.dev/docs/reference/backend/http-api/connection/list.md + +--- +title: 'List connections (deprecated)' +openapi: 'GET /connection' +--- + + + Requires an API key with one of: `environment:connections:list` or `environment:connections:list_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + + + ```json Example Response +{ + "connections": [ + { + "id": 1, + "connection_id": "test-1", + "provider": "slack", + "provider_config_key": "slack-nango-community", + "created": "2023-06-03T14:53:22.051Z", + "metadata": null, + "tags": { + "end_user_id": "your-internal-id", + "end_user_email": "user@example.com", + "organization_id": "user-organization-id" + }, + "errors": [{ "type": "auth", "log_id": "VrnbtykXJFckCm3HP93t"}] + }, + { + "id": 2, + "connection_id": "test-2", + "provider": "slack", + "provider_config_key": "slack-nango-community", + "created": "2023-06-03T15:00:14.945Z", + "metadata": { + "bot_id": "some-uuid" + }, + "tags": { + "end_user_id": "your-internal-id", + "end_user_email": "user@example.com", + "organization_id": "user-organization-id" + }, + "errors": [] + } + ] +} + ``` + + +## Get + +Source: https://nango.dev/docs/reference/backend/http-api/connection/get.md + +--- +title: 'Get connection & credentials (deprecated)' +openapi: 'GET /connection/{connectionId}' +--- + + + Requires an API key with one of: `environment:connections:read` or `environment:connections:read_credentials`. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + + + +The response content depends on the API authentication type (e.g: OAuth 2, OAuth 1, API key, etc.). + +If you do not want to deal with collecting & injecting credentials in requests for multiple authentication types, use the [Proxy](/guides/platform/proxy-requests). + + + + +Every time you fetch the connection with this API endpoint, Nango will check if the access token has expired. If it has, it will refresh it. + +**We recommend you always fetch the token just before you use it to make sure it is fresh!** + + + +## Post + +Source: https://nango.dev/docs/reference/backend/http-api/connection/post.md + +--- +title: 'Import a connection (deprecated)' +openapi: 'POST /connection' +--- + + + Requires an API key with the `environment:connections:create` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## When to use + +Use this API endpoint to import existing access tokens into Nango. It is mostly meant for one-off bulk imports when onboarding Nango, or for migrating existing connections when a provider introduced changes to its auth flow. + +If a connection with the same `connection_id` and `provider_config_key` already exists, the endpoint updates it with the provided credentials instead of creating a new one. + +To trigger OAuth flows with Nango, use the [Nango frontend SDK](/reference/frontend/frontend-sdk). + +## Request body + +You can use this endpoint to import OAuth 2, OAuth 1, API Keys, and Basic auth credentials. + +The required fields depend on the type of authentication of the _connections_ you are trying to import. + +## Set Metadata + +Source: https://nango.dev/docs/reference/backend/http-api/connection/set-metadata.md + +--- +title: 'Set connection metadata (deprecated)' +openapi: 'POST /connection/metadata' +--- + + + Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Set _connection metadata_ + +Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides any existing metadata. The connection_id must be passed in the body as well. Note that the connection_id can be a single string or an array of strings. + +## Fetching _connection metadata_ + +To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. + +## Set Metadata Legacy + +Source: https://nango.dev/docs/reference/backend/http-api/connection/set-metadata-legacy.md + +--- +title: 'Set connection metadata (deprecated)' +openapi: 'POST /connection/{connectionId}/metadata' +--- + + + Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Set _connection metadata_ + +Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides any existing metadata. + +## Fetching _connection metadata_ + +To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. + +## Update Metadata + +Source: https://nango.dev/docs/reference/backend/http-api/connection/update-metadata.md + +--- +title: 'Edit connection metadata (deprecated)' +openapi: 'PATCH /connection/metadata' +--- + + + Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Update _connection metadata_ + +Nango uses the request body as the new metadata (it must be a JSON object). Note that this overrides specified properties, not the entire metadata. The connection_id must be passed in the body as well. Note that the connection_id can be a single string or an array of strings. + +## Fetching _connection metadata_ + +To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. + +## Update Metadata Legacy + +Source: https://nango.dev/docs/reference/backend/http-api/connection/update-metadata-legacy.md + +--- +title: 'Edit connection metadata (deprecated)' +openapi: 'PATCH /connection/{connectionId}/metadata' +--- + + + Requires an API key with the `environment:connections:update` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Update _connection metadata_ + +Nango uses the request body as the new metadata (it must be a JSON object). + +## Fetching _connection metadata_ + +To read the existing metadata of a _connection_, simply fetch the connection. Your custom metadata is included as part of the returned connection object. + +## Delete + +Source: https://nango.dev/docs/reference/backend/http-api/connection/delete.md + +--- +title: 'Delete a connection (deprecated)' +openapi: 'DELETE /connection/{connectionId}' +--- + + + Requires an API key with the `environment:connections:delete` scope. [Learn more about API key scopes](/reference/backend/http-api/api-keys#scopes). + + +## Node + +Source: https://nango.dev/docs/reference/backend/backend-sdk/node.md + +The backend SDK lets you interact with the Nango API. It is available on [NPM](https://www.npmjs.com/package/@nangohq/node) as `@nangohq/node`. + +## Instantiate the backend SDK + +Install it with your favorite package manager, e.g.: + +```bash +npm i -S @nangohq/node +``` + +Instantiate the `Nango` class: + +```js +import { Nango } from '@nangohq/node'; + +const nango = new Nango({ apiKey: '' }); +``` + +**Parameters** + + + + + + Your environment API key, found in **Environment Settings > API Keys** in the Nango UI. Sent as the bearer token for API calls. This key should never be shared. + + + + Deprecated alias for `apiKey`, kept for backward compatibility. Provide either `apiKey` or `secretKey`. + + + + The environment's webhook signing key, found in **Environment Settings > Webhooks > Signing key**. Used by `verifyIncomingWebhookRequest` to validate incoming webhook signatures. Falls back to `secretKey` when omitted. On environments created after 2026-04-20 (or any environment that later rotated its API key), the signing key differs from the API key, so set this explicitly to verify webhooks. + + + + Omitting the host points to Nango Cloud. For local development, use `http://localhost:3003`. Use your instance URL if self-hosting. + + + + + +## Rate limits + +The Nango SDK is rate-limited to prevent abuse and ensure fair usage across all clients. The rate limit is enforced on a per-account basis, with a fixed window of time and a maximum number of requests allowed within that window. + +If a client exceeds the rate limit, the API will respond with a 429 `Too Many Requests` status code. In this case, the `Retry-After` header is included, indicating the number of seconds the client should wait before making another request to avoid being rate-limited. + +To handle rate limiting gracefully, clients should monitor for the 429 status code and honor the `Retry-After` header value provided in the response. + +```js +// Example: +try { + const res = await nango.listIntegrations(); + ... +} catch(err) { + if (err.response.status === 429) { + const retryAfter = err.response.headers['retry-after']; + // wait and retry + ... + } + ... +} +``` + +## Integrations + +### List all integrations + +Returns a list of integrations. + +```js +await nango.listIntegrations() +``` + +**Example Response** + + +```json +{ + "configs": [ + { + "unique_key": "slack-nango-community", + "provider": "slack", + "logo": "http://localhost:3003/images/template-logos/slack.svg", + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z", + }, + { + "unique_key": "github-prod", + "provider": "github", + "logo": "http://localhost:3003/images/template-logos/github.svg", + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z", + }, + ] +} +``` + + +### Get an integration + +Returns a specific integration. + +```js +await nango.getIntegration({ uniqueKey: }); + +// Deprecated +await nango.getIntegration(); +``` + +**Parameters** + + + + The integration ID + + + Include sensitive data. Allowed values: `webhook`, `credentials` + + + +**Example Response** + + +```json +{ + "data": { + "unique_key": "slack-nango-community", + "display_name": "Slack", + "provider": "slack", + "logo": "http://localhost:3003/images/template-logos/slack.svg", + "forward_webhooks": true, + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z" + } +} +``` + + +### Create an integration + +Create a new integration. + +```js +await nango.createIntegration({ provider: '', unique_key: '' }); +``` + +**Parameters** + + + + The ID of the API provider in Nango (cf. [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) for a list of API provider IDs.) + + + + The integration ID. + + + + The display name of this integration + + + + The credentials to include depend on the specific integration that you want to create. + + + + Provider-specific configuration for providers with an `integration_config` schema (e.g. `private-api-generic`, `aws-sigv4`). See the provider's integration page for fields. + + + + Whether to forward webhooks received for this integration. Defaults to `true`. + + + +**Example Response** + + +```json +{ + "data": { + "unique_key": "slack-nango-community", + "provider": "slack", + "logo": "http://localhost:3003/images/template-logos/slack.svg", + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z", + } +} +``` + + +### Update an integration + +Patch an integration. The first argument identifies the integration; all body fields are optional and only the fields you pass are updated. + +```js +await nango.updateIntegration({ uniqueKey: '' }, { display_name: 'New name' }); +``` + +**Parameters** + + + + The integration ID to update. Passed in the first argument. + + + + A new integration ID, to rename the integration. Not allowed when the integration has active connections. + + + + The display name of this integration + + + + Whether to forward webhooks received for this integration. + + + + The credentials to include depend on the specific integration that you want to update. + + + + Provider-specific configuration for providers with an `integration_config` schema. Only the fields you pass are updated. + + + + Free-form custom values for providers without an `integration_config` schema. + + + +**Example Response** + + +```json +{ + "data": { + "unique_key": "slack-nango-community", + "provider": "slack", + "logo": "http://localhost:3003/images/template-logos/slack.svg", + "created_at": "2023-10-16T08:45:26.241Z", + "updated_at": "2023-10-16T08:45:26.241Z", + } +} +``` + + +### Delete an integration + +Deletes a specific integration. + +```js +await nango.deleteIntegration(); +``` + +**Parameters** + + + + The integration ID. + + + +**Example Response** + + +```json +{ + "success": true +} +``` + + +## Connect + +### Create a connect session + +Create a connect session. The token is short-lived and lasts for 30 minutes. + +```js +const { data } = await nango.createConnectSession({ + // Recommended: copied onto the connection and included in auth webhooks. + tags: { + end_user_id: '', + end_user_email: '', + organization_id: '' + }, + + allowed_integrations: ['', ''], + integrations_config_defaults: { + : { + connection_config: { + : '' + } + } + } +}); +``` + +**Parameters** + + + + + Deprecated. Use `tags` instead. + + + + Deprecated. Use `tags` instead. + + + The unique identifier for the organization. + + + The display name of the organization. + + + + + + An array of integration IDs that are allowed for this session. + + + + Optional. Tags that will be copied onto the created connection and included in auth webhooks. + + + + Default configuration for specific integrations. For OAuth2 integrations, you can allow end-users to provide their own OAuth client credentials by setting empty `oauth_client_id_override` and `oauth_client_secret_override` values: + ```js + integrations_config_defaults: { + google: { + connection_config: { + oauth_client_id_override: '', + oauth_client_secret_override: '' + } + } + } + ``` + When set to empty strings, Connect UI will display optional input fields for users to enter their own OAuth app credentials. + + `connection_config` also accepts `webhook_url` to override the environment's webhook URLs for the connection created with this session. When set, that connection's webhooks are sent only to this URL. See [Override webhook URLs per connection](/guides/platform/webhooks-from-nango#override-webhook-urls-per-connection). + ```js + integrations_config_defaults: { + '': { + connection_config: { + webhook_url: 'https://.ngrok.app/webhooks-from-nango' + } + } + } + ``` + + + + Override Connect UI settings per integration. The key is your integration's unique ID (e.g. `jira`, `slack`, `github`) and the value is an object with the settings to override. Currently supports overriding the documentation URL shown in info icons during the connect flow: + ```js + overrides: { + '': { + docs_connect: 'https://your-docs.com/how-to-connect' + } + } + ``` + Available on the [Growth plan](https://www.nango.dev/pricing). + + + +**Returns** + + +```json +{ + "data": { + "token": "nango_connect_session_4603dbca8a588315ba69b5bfddde52e72d312dc2d2870bd5e45da6357333601c", + "connect_link": "https://connect.nango.dev/?session_token=nango_connect_session_4603dbca8a588315ba69b5bfddde52e72d312dc2d2870bd5e45da6357333601c", + "expires_at": "2024-09-27T19:49:51.449Z" + } +} +``` + + +### Create a reconnect session + +Create a reconnect session for a given `connection_id`. +You can pass `tags` to update connection attribution during reconnection. +Use this method when a user needs to input new credentials or to manually refresh token. + +This method is only compatible with `connection_id` created with a session token. + +```js +const { data } = await nango.createReconnectSession({ + // Required + connection_id: '', + integration_id: '', + + // Optional + tags: { + end_user_id: '', + end_user_email: '', + organization_id: '' + }, + integrations_config_defaults: { + : { + connection_config: { + : '' + } + } + } +}); +``` + +**Parameters** + + + + The unique identifier for the connection. + + + + The unique identifier for the integration. + + + + Optional. Tags to apply to the connection during reconnection. + + + + Deprecated. Use `tags` instead. + + + + Deprecated. Use `tags` instead. + + + The unique identifier for the organization. + + + The display name of the organization. + + + + + + Default configuration for specific integrations. + + + +**Returns** + + +```json +{ + "data": { + "token": "nango_connect_session_4603dbca8a588315ba69b5bfddde52e72d312dc2d2870bd5e45da6357333601c", + "connect_link": "https://connect.nango.dev/?session_token=nango_connect_session_4603dbca8a588315ba69b5bfddde52e72d312dc2d2870bd5e45da6357333601c", + "expires_at": "2024-09-27T19:49:51.449Z" + } +} +``` + + +## Connections + +### List connections + +Returns a list of connections without credentials. + +```js +await nango.listConnections({ + connectionId: 'connection-id', + integrationId: 'integration-456', + limit: 100, + tags: { "end_user_id": 'user-123' } +}); +``` + +**Parameters** + + + + + + Optional. Will exactly match a given connectionId. Can return multiple connections with the same ID across integrations. + + + Deprecated. Prefer filtering connections using `tags` instead (e.g. `end_user_id`). + + + Optional. Filter by integration ID. + + + Optional. Filter by tags associated with connections. + + + + + +**Example Response** + + +```json +{ + "connections": [ + { + "id": 1, + "connection_id": "test-1", + "provider": "slack", + "provider_config_key": "slack-nango-community", + "created": "2023-06-03T14:53:22.051Z", + "metadata": null, + "tags": { + "end_user_id": "your-internal-id", + "end_user_email": "user@example.com", + "organization_id": "user-organization-id" + }, + "errors": [] + }, + { + "id": 2, + "connection_id": "test-2", + "provider": "slack", + "provider_config_key": "slack-nango-community", + "created": "2023-06-03T15:00:14.945Z", + "metadata": { + "bot_id": "some-uuid" + }, + "tags": { + "end_user_id": "your-internal-id", + "end_user_email": "user@example.com", + "organization_id": "user-organization-id" + }, + "errors": [{ "type": "auth", "log_id": "VrnbtykXJFckCm3HP93t"}] + } + ] +} +``` + + +### Get a connection (with credentials) + +Returns a specific connection with credentials. + +```js +await nango.getConnection(, ); +``` + + +The response content depends on the API authentication type (OAuth 2, OAuth 1, API key, Basic auth, etc.). + +If you do not want to deal with collecting & injecting credentials in requests for multiple authentication types, use the Proxy ([step-by-step guide](/guides/platform/proxy-requests)). + + + +When you fetch the connection with this API endpoint, Nango will check if the access token has expired. If it has, it will refresh it. + +We recommend not caching tokens for longer than 5 minutes to ensure they are fresh. + + +**Parameters** + + + + The integration ID. + + + The connection ID. + + + Defaults to `false`. If `false`, the token will only be refreshed if it expires within 15 minutes. If `true`, a token refresh attempt will happen on each request. This is only useful for testing and should not be done at high traffic. + + + Defaults to `false`. If `false`, the refresh token is not included in the response, otherwise it is. In production, it is not advised to return the refresh token, for security reasons, since only the access token is needed to sign requests. + + + Defaults to `false`. If true, this will refresh the JWT token for GitHub App / Github App OAuth connections + + + +**Example Response** + + +```json +{ + "id": 18393, + "created_at": "2023-03-08T09:43:03.725Z", + "updated_at": "2023-03-08T09:43:03.725Z", + "provider_config_key": "github", + "connection_id": "1", + "credentials": { + "type": "OAUTH2", + "access_token": "gho_tsXLG73f....", + "refresh_token": "gho_fjofu84u9....", + "expires_at": "2024-03-08T09:43:03.725Z", + "raw": { // Raw token response from the OAuth provider: Contents vary! + "access_token": "gho_tsXLG73f....", + "refresh_token": "gho_fjofu84u9....", + "token_type": "bearer", + "scope": "public_repo,user" + } + }, + "connection_config": { + "subdomain": "myshop", + "realmId": "XXXXX", + "instance_id": "YYYYYYY" + }, + "metadata": { + "myProperty": "yes", + "filter": "closed=true" + } +} +``` + + +### Patch a connection + +Patch a connection. + +```js +await nango.patchConnection({ + connectionId: '', + provider_config_key: '' + }, + { ...body }); +``` + +**Parameters** + + + + The body of the connection (see [API Reference](/reference/backend/http-api/connections/patch)). + + + Connection tags (key/value strings). Keys are normalized to lowercase. + + + Maximum string length: 255 + + + + + Deprecated. Use tags instead + + + Deprecated. Uniquely identifies the end user. + + + Deprecated. The email address of the end user. + + + Deprecated. The display name of the end user. + + + Deprecated. Tags associated with the end user. Only accepts string values, up to 64 keys. + + + + + + + +**Example Response** + + +```json +{ + "success": true +} +``` + + +### Get connection metadata + +Returns a connection's metadata. + +```js +await nango.getMetadata('', 'CONNECTION-ID'); +``` + +If you know the structure of the metadata, you can specify a type; + +```ts +interface CustomMetadata { + anyKey: Record; +} +const myTypedMetadata = await nango.getMetadata('', ''); +``` + +**Parameters** + + + + The integration ID of the connection. + + + + The connection ID. + + + +**Example Response** + + +```json +{ + "custom_key1": "custom_value1" +} +``` + + +### Set connection metadata + +Set custom metadata for the connection or connections (overrides existing metadata). + +```js +await nango.setMetadata('', 'CONNECTION-ID', { 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); + +# set an array of connection ids +await nango.setMetadata('', ['CONNECTION-ID', 'CONNECTION-ID-TWO'], { 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); +``` + +**Parameters** + + + + The integration ID of the connection. + + + + The connection ID or connection IDs. + + + + The custom metadata to store in the connection. + + + +**Response** + + +```json +{ + "connection_id": "", + "provider_config_key": "", + "metadata": { + "CUSTOM_KEY1": "CUSTOM_VALUE1" + } +} +``` + + +### Edit connection metadata + +Edit custom metadata for the connection or connections. Only overrides specified properties, not the entire metadata. + +```js +await nango.updateMetadata('', 'CONNECTION-ID', { 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); + +# update an array of connection ids +await nango.updateMetadata('', ['CONNECTION-ID', 'CONNECTION-ID-TWO'], { 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); +``` + +**Parameters** + + + + The integration ID of the connection. + + + + The connection ID or connection IDs. + + + + The custom metadata to store in the connection. + + + +**Response** + + +```json +{ + "connection_id": "", + "provider_config_key": "", + "metadata": { + "CUSTOM_KEY1": "CUSTOM_VALUE1" + } +} +``` + + +### Delete a connection + +Deletes a specific connection. + +```js +await nango.deleteConnection('', 'CONNECTION-ID'); +``` + +**Parameters** + + + + The integration ID of the connection. + + + + The connection ID. + + + +**Response** + +Empty response. + +### Wait for connection + +Waits for a connection to be created for a given end user and integration. This is useful in agentic flows where you need to wait for a user to complete the OAuth flow before proceeding. + +```js +const connection = await nango.waitForConnection('', ''); +``` + + +This method polls for a connection every 2 seconds for up to 60 seconds (30 attempts). If no connection is found within this time, it will throw a timeout error. + + +**Parameters** + + + + The integration ID (provider config key). + + + + The end user ID to wait for a connection for. + + + +**Example Response** + + +```json +{ + "id": 1, + "connection_id": "", + "provider": "slack", + "provider_config_key": "slack-integration", + "created": "2023-06-03T14:53:22.051Z", + "metadata": null, + "errors": [], + "tags": { + "end_user_id": "user-123", + "end_user_email": "user@example.com", + "organization_id": "org-456" + } +} +``` + + +## Integration functions + +### List functions + +Returns the functions deployed to an integration, with pagination. + +```ts +await nango.listFunctions({ uniqueKey: 'github' }); +``` + +Filter by function type, name, or page: + +```ts +await nango.listFunctions({ uniqueKey: 'github' }, { type: 'action', search: 'issue', page: 0, limit: 20 }); +``` + +**Parameters** + + + + The integration ID. + + + Filter by function type: `sync`, `action`, or `on-event`. + + + Case-insensitive filter on the function name. + + + Page to return (starts at `0`, default `0`). + + + Results per page (1-100, default `20`). + + + +**Example Response** + + +```json +{ + "data": [ + { + "type": "action", + "name": "create-issue", + "description": "Create a GitHub issue", + "returns": ["GithubIssue"], + "json_schema": null, + "id": 42, + "enabled": true, + "last_deployed": "2024-03-28T14:00:00.000Z", + "source": "repo" + }, + { + "type": "sync", + "name": "issues", + "returns": ["GithubIssue"], + "json_schema": null, + "runs": "every hour", + "auto_start": true, + "track_deletes": false, + "id": 43, + "enabled": true, + "last_deployed": "2024-03-28T14:00:00.000Z", + "source": "repo" + } + ], + "pagination": { + "total": 2, + "page": 0, + "limit": 20 + } +} +``` + + +### Get a function + +Retrieves a deployed function of an integration. + +```ts +await nango.getFunction({ uniqueKey: 'github', name: 'create-issue' }); +``` + +Pass `type` to disambiguate when a sync and an action share the same name: + +```ts +await nango.getFunction({ uniqueKey: 'github', name: 'issues' }, { type: 'sync' }); +``` + +**Parameters** + + + + The integration ID. + + + The function name. + + + Disambiguates when functions share a name: `sync`, `action`, or `on-event`. + + + +**Example Response** + + +```json +{ + "data": { + "type": "action", + "name": "create-issue", + "description": "Create a GitHub issue", + "returns": ["GithubIssue"], + "json_schema": null, + "id": 42, + "enabled": true, + "last_deployed": "2024-03-28T14:00:00.000Z", + "source": "repo" + } +} +``` + + +### Get function code + +Retrieves the source code of a deployed function. + +```ts +await nango.getFunctionCode({ uniqueKey: 'github', name: 'create-issue' }, { type: 'action' }); +``` + +**Parameters** + + + + The integration ID. + + + The function name. + + + Disambiguates when functions share a name: `sync`, `action`, or `on-event`. + + + +**Example Response** + + +```json +{ + "type": "action", + "code": "export default createAction({ /* ... */ });" +} +``` + + +### Delete a function + +Deletes a deployed function of an integration. The `type` is required. + +```ts +await nango.deleteFunction({ uniqueKey: 'github', name: 'create-issue' }, { type: 'action' }); +``` + +**Parameters** + + + + The integration ID. + + + The function name. + + + The function type: `sync` or `action`. + + + +**Example Response** + + +```json +{ + "data": { + "success": true + } +} +``` + + +### Get integration functions config + +Return the configuration for all integration functions + +```ts +const scriptsConfig = await nango.getScriptsConfig(); +``` + +**Example Response** + + +```json +[ + { + "providerConfigKey": "demo-github-integration", + "syncs": [ + { + "name": "github-issue-example", + "type": "sync", + "models": [ + { + "name": "GithubIssue", + "fields": [ + { + "name": "id", + "type": "integer" + }, + { + "name": "owner", + "type": "string" + }, + { + "name": "repo", + "type": "string" + }, + { + "name": "issue_number", + "type": "number" + }, + { + "name": "title", + "type": "string" + }, + { + "name": "author", + "type": "string" + }, + { + "name": "author_id", + "type": "string" + }, + { + "name": "state", + "type": "string" + }, + { + "name": "date_created", + "type": "date" + }, + { + "name": "date_last_modified", + "type": "date" + }, + { + "name": "body", + "type": "string" + } + ] + } + ], + "sync_type": "FULL", // DEPRECATED + "runs": "every half hour", + "track_deletes": false, + "auto_start": false, + "last_deployed": "2024-02-28T20:16:38.052Z", + "is_public": false, + "pre_built": false, + "version": "4", + "attributes": {}, + "input": {}, + "returns": [ + "GithubIssue" + ], + "description": "Fetches the Github issues from all a user's repositories.\nDetails: doesn't track deletes, metadata is not required.\n", + "scopes": [ + "public_repo" + ], + "endpoints": [ + { + "GET": "/github/issue-example" + } + ], + "nango_yaml_version": "v2", + "webhookSubscriptions": [] + } + ], + "actions": [ + { + "name": "fetch-issues", + "type": "action", + "models": [ + { + "name": "GithubIssue", + "fields": [ + { + "name": "id", + "type": "integer" + }, + { + "name": "owner", + "type": "string" + }, + { + "name": "repo", + "type": "string" + }, + { + "name": "issue_number", + "type": "number" + }, + { + "name": "title", + "type": "string" + }, + { + "name": "author", + "type": "string" + }, + { + "name": "author_id", + "type": "string" + }, + { + "name": "state", + "type": "string" + }, + { + "name": "date_created", + "type": "date" + }, + { + "name": "date_last_modified", + "type": "date" + }, + { + "name": "body", + "type": "string" + } + ] + } + ], + "runs": "", + "is_public": false, + "pre_built": false, + "version": "4", + "last_deployed": "2024-02-28T20:16:38.052Z", + "attributes": {}, + "returns": [ + "GithubIssue" + ], + "description": "", + "scopes": [], + "input": {}, + "endpoints": [ + { + "GET": "/github/issues" + } + ], + "nango_yaml_version": "v2" + } + ], + "postConnectionScripts": [], + "provider": "github" + } +] +``` + + +You can also pass in an optional argument with the value of `nango` or `openai`. The default is `nango` + +```ts +const scriptsConfig = await nango.getScriptsConfig('openai'); +``` + +```json +{ + "data": [ + { + "name": "calendars", + "description": "Sync the user's calendar list.\nIncludes all calendars the user has access to.", + "parameters": { + "type": "object", + "properties": {}, + "required": [] + } + }, + { + "name": "events", + "description": "Sync calendar events from the primary calendar.\nIncludes events from the past month.", + "parameters": { + "type": "object", + "properties": {}, + "required": [] + } + }, + { + "name": "cancel-event", + "description": "Cancel/delete an event by searching for it.\n\nInput parameters:\n- title: The title of the event to cancel\n- date: The date of the event in ISO format\n- time: The time of the event in 24-hour format (HH:mm)\n- calendar: Calendar ID where to search for the event\n- id: Calendar identifier\n- summary: Calendar name/title\n- description: Calendar description\n- location: Calendar location\n- timeZone: Time zone of the calendar\n- backgroundColor: Calendar color in UI\n- foregroundColor: Text color in UI\n- selected: Whether the calendar is selected in UI\n- accessRole: User's access role for the calendar\n- primary: Whether this is the primary calendar", + "parameters": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Calendar identifier" + }, + "summary": { + "type": "string", + "description": "Calendar name/title" + }, + "description": { + "type": "string", + "description": "Calendar description" + }, + "location": { + "type": "string", + "description": "Calendar location" + }, + "timeZone": { + "type": "string", + "description": "Time zone of the calendar" + }, + "backgroundColor": { + "type": "string", + "description": "Calendar color in UI" + }, + "foregroundColor": { + "type": "string", + "description": "Text color in UI" + }, + "selected": { + "type": "boolean", + "description": "Whether the calendar is selected in UI" + }, + "accessRole": { + "type": "string", + "description": "User's access role for the calendar" + }, + "primary": { + "type": "boolean", + "description": "Whether this is the primary calendar" + }, + "title": { + "type": "string", + "description": "The title of the event to cancel" + }, + "date": { + "type": "string", + "description": "The date of the event in ISO format" + }, + "time": { + "type": "string", + "description": "The time of the event in 24-hour format (HH:mm)" + }, + "calendar": { + "type": "string", + "description": "Calendar ID where to search for the event" + } + }, + "required": [ + "id", + "summary" + ] + } + }, + { + "name": "create-event", + "description": "Create a new calendar event.\n\nInput parameters:\n- summary: The title/summary of the event\n- description: A detailed description of the event\n- location: The location of the event\n- start: The start time of the event in ISO format\n- end: The end time of the event in ISO format\n- attendees: List of email addresses to invite\n- recurrence: List of recurrence rules in RRULE format\n- calendar: Calendar ID to create the event in\n- id: Calendar identifier\n- timeZone: Time zone of the calendar\n- backgroundColor: Calendar color in UI\n- foregroundColor: Text color in UI\n- selected: Whether the calendar is selected in UI\n- accessRole: User's access role for the calendar\n- primary: Whether this is the primary calendar", + "parameters": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Calendar identifier" + }, + "summary": { + "type": "string", + "description": "The title/summary of the event" + }, + "description": { + "type": "string", + "description": "A detailed description of the event" + }, + "location": { + "type": "string", + "description": "The location of the event" + }, + "timeZone": { + "type": "string", + "description": "Time zone of the calendar" + }, + "backgroundColor": { + "type": "string", + "description": "Calendar color in UI" + }, + "foregroundColor": { + "type": "string", + "description": "Text color in UI" + }, + "selected": { + "type": "boolean", + "description": "Whether the calendar is selected in UI" + }, + "accessRole": { + "type": "string", + "description": "User's access role for the calendar" + }, + "primary": { + "type": "boolean", + "description": "Whether this is the primary calendar" + }, + "start": { + "type": "string", + "description": "The start time of the event in ISO format" + }, + "end": { + "type": "string", + "description": "The end time of the event in ISO format" + }, + "attendees": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of email addresses to invite" + }, + "recurrence": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of recurrence rules in RRULE format" + }, + "calendar": { + "type": "string", + "description": "Calendar ID to create the event in" + } + }, + "required": [ + "id", + "summary", + "start", + "end" + ] + } + }, + { + "name": "move-event", + "description": "Move an event to a different time or calendar.\n\nInput parameters:\n- eventId: The ID of the event to move\n- title: The title of the event to move\n- sourceStart: The current start time of the event\n- start: The new start time for the event in ISO format\n- end: The new end time for the event in ISO format\n- calendar: Calendar ID to move the event to\n- id: Calendar identifier\n- summary: Calendar name/title\n- description: Calendar description\n- location: Calendar location\n- timeZone: Time zone of the calendar\n- backgroundColor: Calendar color in UI\n- foregroundColor: Text color in UI\n- selected: Whether the calendar is selected in UI\n- accessRole: User's access role for the calendar\n- primary: Whether this is the primary calendar", + "parameters": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Calendar identifier" + }, + "summary": { + "type": "string", + "description": "Calendar name/title" + }, + "description": { + "type": "string", + "description": "Calendar description" + }, + "location": { + "type": "string", + "description": "Calendar location" + }, + "timeZone": { + "type": "string", + "description": "Time zone of the calendar" + }, + "backgroundColor": { + "type": "string", + "description": "Calendar color in UI" + }, + "foregroundColor": { + "type": "string", + "description": "Text color in UI" + }, + "selected": { + "type": "boolean", + "description": "Whether the calendar is selected in UI" + }, + "accessRole": { + "type": "string", + "description": "User's access role for the calendar" + }, + "primary": { + "type": "boolean", + "description": "Whether this is the primary calendar" + }, + "eventId": { + "type": "string", + "description": "The ID of the event to move" + }, + "title": { + "type": "string", + "description": "The title of the event to move" + }, + "sourceStart": { + "type": "string", + "description": "The current start time of the event" + }, + "start": { + "type": "string", + "description": "The new start time for the event in ISO format" + }, + "end": { + "type": "string", + "description": "The new end time for the event in ISO format" + }, + "calendar": { + "type": "string", + "description": "Calendar ID to move the event to" + } + }, + "required": [ + "id", + "summary", + "start", + "end" + ] + } + }, + { + "name": "whoami", + "description": "Get information about the authenticated user.\n\nNo input parameters.", + "parameters": { + "type": "object", + "properties": {}, + "required": [] + } + }, + { + "name": "invite-user-to-repository", + "description": "Invite a user to a GitHub repository.\n\nInput parameters:\n- owner: The owner (user or organization) of the repository\n- repo: The name of the repository to invite the user to\n- username: The GitHub username of the user to invite\n- permission: The permission level to grant (\"pull\", \"push\", \"admin\", \"maintain\", \"triage\")", + "parameters": { + "type": "object", + "properties": { + "owner": { + "type": "string", + "description": "The owner (user or organization) of the repository" + }, + "repo": { + "type": "string", + "description": "The name of the repository to invite the user to" + }, + "username": { + "type": "string", + "description": "The GitHub username of the user to invite" + }, + "permission": { + "type": "string", + "description": "The permission level to grant (\"pull\", \"push\", \"admin\", \"maintain\", \"triage\")" + } + }, + "required": [ + "owner", + "repo", + "username" + ] + } + } + ] +} +``` + + +## Syncs + +### Get records + +Returns the synced data. + +```ts +import type { ModelName } from '/models' + +const records = await nango.listRecords({ + providerConfigKey: '', + connectionId: '', + model: '' +}); +``` + +**Parameters** + + + + + + The integration ID. + + + + The connection ID. + + + + The name of the model of the data you want to retrieve. + + + + The variant of the model to fetch. When omitted, the default base variant is used. + + + + Each record from this endpoint comes with a synchronization cursor in `_nango_metadata.cursor`. + + Save the last fetched record's cursor to track how far you've synced. + + By providing the cursor to this method, you'll continue syncing from where you left off, receiving only post-cursor changes. + + This same cursor is used to paginate through the results of this endpoint. + + + + The maximum number of records to return. Defaults to 100. + + + + Filter to only show results that have been added or updated or deleted. + + Available options: added, updated, deleted + + + + Timestamp, e.g. 2023-05-31T11:46:13.390Z. If passed, only records modified after this timestamp are returned, otherwise all records are returned. + + + + An array of string containing a list of your records IDs. The list will be filtered to include only the records with a matching ID. + + + + Deprecated. (use modifiedAfter) Timestamp, e.g. 2023-05-31T11:46:13.390Z. If passed, only records modified after this timestamp are returned, otherwise all records are returned. + + + + + +**Example Response** + + +This endpoint returns a list of records, ordered by modification date ascending. If some records are updated while you paginate through this endpoint, you might see these records multiple times. + + + +```json +{ + records: + [ + { + id: 123, + ..., // Fields as specified in the model you queried + _nango_metadata: { + deleted_at: null, + last_action: 'ADDED', + first_seen_at: '2023-09-18T15:20:35.941305+00:00', + last_modified_at: '2023-09-18T15:20:35.941305+00:00', + cursor: 'MjAyNC0wMi0yNlQwMzowMDozOS42MjMzODgtMDU6MDB8fGVlMDYwM2E1LTEwNDktNDA4Zi05YTEwLTJjNzVmNDkwODNjYQ==' + } + }, + ... + ], + next_cursor: "Y3JlYXRlZF9hdF4yMDIzLTExLTE3VDExOjQ3OjE0LjQ0NyswMjowMHxpZF4xYTE2MTYwMS0yMzk5LTQ4MzYtYWFiMi1mNjk1ZWI2YTZhYzI" +} +``` + + +### Prune records + +Prunes record payloads from Nango's cache for a given model and connection up to a specified cursor. The payload is emptied but record metadata is retained. Payload can be restored by re-syncing the data. + +```ts +const result = await nango.pruneRecords({ + providerConfigKey: '', + connectionId: '', + model: '', + untilCursor: '' +}); + +console.log(`Pruned ${result.count} records. More records available: ${result.has_more}`); +``` + +**Parameters** + + + + + + The integration ID. + + + + The connection ID. + + + + The name of the model from which to prune records. + + + + The variant of the model. When omitted, the default base variant is used. + + + + The cursor up to which records should be pruned. Only records with a cursor less than or equal to this value will be pruned. + + + + The maximum number of records to prune in this operation. + + + + + +**Response** + + +```json +{ + "count": 150, + "has_more": true +} +``` + + + The number of records that were pruned in this operation. + + + + Indicates whether there are more records available for pruning that match the criteria. If `true`, you must call the method again to continue pruning records. + + + +### Trigger sync(s) + +Triggers an additional, one-off execution of specified sync(s) for a given connection or all applicable connections if no connection is specified. + +```ts +// Simple usage - trigger sync preserving checkpoint +await nango.triggerSync('', ['SYNC_NAME1', 'SYNC_NAME2'], ''); + +// Reset checkpoint and start fresh +await nango.triggerSync('', ['SYNC_NAME1'], '', { reset: true }); + +// Reset checkpoint and clear all cached records +await nango.triggerSync('', ['SYNC_NAME1'], '', { reset: true, emptyCache: true }); + +// Using variants +await nango.triggerSync('', [ + { name: 'SYNC_NAME1', variant: 'VARIANT_A' }, + 'SYNC_NAME2' // Uses default base variant +], '', { reset: true }); +``` + +**Parameters** + + + + The integration ID. + + + The name of the syncs to trigger. If the array is empty, all syncs are triggered. + Each sync can be specified as either: + - A string: the sync name (uses the default base variant) + - An object: with name and variant properties to target a specific sync variant + + + The connection ID. If omitted, the sync will trigger for all relevant connections. + + + Options for triggering the sync. See the [checkpoints guide](/guides/functions/syncs/checkpoints#re-syncing-resetting-checkpoints-and-the-cache) for details on `reset` and `emptyCache`. + + + If `true`, clears the checkpoint before triggering the sync, causing it to start fresh. + + + If `true`, deletes all cached records associated with the sync before triggering. Must be used with `reset: true`. + + + + + +**Response** + +Empty response. + +### Start schedule for sync(s) + +Starts the schedule of specified sync(s) for a given connection or all applicable connections if no connection is specified. Upon starting the schedule, the sync will execute immediately and then continue to run at the specified frequency. If the schedule was already started, this will have no effect. + +```ts +// Simple usage with sync names +await nango.startSync('', ['SYNC_NAME1', 'SYNC_NAME2'], ''); + +// Using variants +await nango.startSync('', [ + { name: 'SYNC_NAME1', variant: 'VARIANT_A' }, + 'SYNC_NAME2' // Uses default base variant +], ''); +``` + +**Parameters** + + + + The integration ID. + + + The name of the syncs that should be triggered. + Each sync can be specified as either: + - A string: the sync name (uses the default base variant) + - An object: with name and variant properties to target a specific sync variant + + + The connection ID. If omitted, the sync will trigger for all relevant connections. + + + +**Response** + +Empty response. + +### Pause schedule for sync(s) + +Pauses the schedule of specified sync(s) for a given connection or all applicable connections if no connection is specified. + +```ts +// Simple usage with sync names +await nango.pauseSync('', ['SYNC_NAME1', 'SYNC_NAME2'], ''); + +// Using variants +await nango.pauseSync('', [ + { name: 'SYNC_NAME1', variant: 'VARIANT_A' }, + 'SYNC_NAME2' // Uses default base variant +], ''); +``` + +**Parameters** + + + + The integration ID. + + + The name of the syncs that should be paused. + Each sync can be specified as either: + - A string: the sync name (uses the default base variant) + - An object: with name and variant properties to target a specific sync variant + + + The connection ID. If omitted, the sync will pause for all relevant connections. + + + +**Response** + +Empty response. + +### Sync status + +Get the status of specified sync(s) for a given connection or all applicable connections if no connection is specified. + +```ts +// Simple usage with sync names +await nango.syncStatus('', ['SYNC_NAME1', 'SYNC_NAME2'], ''); + +// Using variants +await nango.syncStatus('', [ + { name: 'SYNC_NAME1', variant: 'VARIANT_A' }, + 'SYNC_NAME2' // Uses default base variant +], ''); + +// Get all syncs +await nango.syncStatus('', '*', ''); +``` + +**Parameters** + + + + The integration ID. + + + Either "*" to return all syncs, or an array of syncs to fetch status for. + When using an array, each sync can be specified as either: + - A string: the sync name (uses the default base variant) + - An object: with name and variant properties to target a specific sync variant + + + The connection ID. If omitted, all connections will be surfaced. + + + +**Response** + + +```json +{ + "syncs": [ + { + "id": "", + "connection_id": "", + "name": "", + "variant": "", + "status": "RUNNING", + "type": "INCREMENTAL", // DEPRECATED + "finishedAt": "", + "nextScheduledSyncAt": "", + "frequency": "", + "latestResult": { + "": { + "added": , + "updated": , + "deleted": , + } + }, + "recordCount": { + "": + ... + }, + "checkpoint": { + "": "" + ... + } + } + ] +} +``` + +The `checkpoint` field contains the last saved checkpoint for the sync. Learn more about [checkpoints](/guides/functions/syncs/checkpoints). + + +### Override sync connection frequency + +Override a sync's default frequency for a specific connection, or revert to the default frequency. + +```ts +// For base variant +await nango.updateSyncConnectionFrequency('', 'SYNC_NAME', '', ''); + +// For a specific variant +await nango.updateSyncConnectionFrequency('', { name: 'SYNC_NAME', variant: 'VARIANT_NAME' }, '', ''); +``` + +**Parameters** + + + + The integration ID. + + + The sync to update. Can be specified as either: + - A string: the sync name (uses the default base variant) + - An object: with name and variant properties to target a specific sync variant + + + The connection ID. + + + The frequency you want to set (ex: 'every hour'). Set to `null` to revert to the default frequency. Uses the https://github.com/vercel/ms notations. See [minimum sync frequency](/guides/platform/limits#minimum-sync-frequency) for details. + + + +**Response** + + +```json +{ + "frequency": "" +} +``` + + +### Create sync variant + +Creates a new sync variant for a specific connection. Sync variants allow you to run multiple instances of the same sync with different configurations. + +```ts +await nango.createSyncVariant({ + provider_config_key: '', + connection_id: '', + name: 'SYNC_NAME', + variant: 'VARIANT_NAME' +}); +``` + +**Parameters** + + + + + + The integration ID. + + + The connection ID. + + + The name of the sync. + + + The name of the variant to create. Cannot be "base" (protected name). + + + + + +**Example Response** + + +```json +{ + "id": "12345", + "name": "SYNC_NAME", + "variant": "VARIANT_NAME" +} +``` + + +### Delete sync variant + +Deletes a sync variant for a specific connection. + +```ts +await nango.deleteSyncVariant({ + provider_config_key: '', + connection_id: '', + name: 'SYNC_NAME', + variant: 'VARIANT_NAME' +}); +``` + +**Parameters** + + + + + + The integration ID. + + + The connection ID. + + + The name of the sync. + + + The name of the variant to delete. Cannot be "base" (protected name). + + + + + +**Example Response** + + +```json +{ + "success": true +} +``` + + +### Get environment variables + +Retrieve the environment variables as added in the Nango dashboard. + +```js +await nango.getEnvironmentVariables(); +``` + +**Parameters** + +No parameters. + +**Response** + + +```json +[ + { + "name": "MY_SECRET_KEY", + "value": "SK_373892NSHFNCOWFO..." + } +] +``` + + +## Actions + +### Trigger an action + +Triggers an action for a connection. + +```js +await nango.triggerAction('', '', '', { 'custom_key1': 'custom_value1' }); +``` + +**Parameters** + + + + The integration ID. + + + The connection ID. + + + The name of the action to trigger. + + + The necessary input for your action's `exec` function. + + + +**Response** + + +```json +{ + "your-properties": "The data returned by the action" +} +``` + + + +The output of an action cannot exceed 10MB. + + +### Trigger an action asynchronously + +Triggers an action asynchronously for a connection. This allows you to start an action and retrieve the results later. + +```js +const { id, statusUrl } = await nango.triggerActionAsync('', '', '', { 'custom_key1': 'custom_value1' }); +``` + +**Parameters** + + + + The integration ID. + + + The connection ID. + + + The name of the action to trigger. + + + The necessary input for your action's `exec` function. + + + +**Response** + + +```json +{ + "id": "action_123456", + "statusUrl": "/action/action_123456" +} +``` + + +### Get async action result + +Retrieves the result of an asynchronous action. + +```js +// Using the id +const result = await nango.getAsyncActionResult({ id: 'action_123456' }); + +// OR using the statusUrl +const result = await nango.getAsyncActionResult({ statusUrl: '/action/action_123456' }); +``` + +**Parameters** + + + + + + The ID of the action to retrieve the result for. + + + The URL where the result can be retrieved. + + + + + +**Response** + + +```json +{ + "your-properties": "The data returned by the action" +} +``` + + +## Proxy + +Makes an HTTP request using the [proxy](/guides/platform/proxy-requests): + +```js +const config = { + endpoint: '/some-endpoint', + providerConfigKey: '', + connectionId: '' +}; + +await nango.get(config); // GET request +await nango.post(config); // POST request +await nango.put(config); // PUT request +await nango.patch(config); // PATCH request +await nango.delete(config); // DELETE request +``` + +**Parameters** + + + + + + The endpoint of the request. + + + The integration ID (for credential injection). + + + The connection ID (for credential injection). + + + The headers of the request. + + + The query parameters of the request. + + + The body of the request. + + + The number of retries in case of failure (with exponential back-off). Optional, default 0. + + + Array of additional status codes to retry a request in addition to the 5xx, 429, ECONNRESET, ETIMEDOUT, and ECONNABORTED + + + The API base URL. Can be omitted if the base URL is configured for this API in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml). + + + Override the decompress option when making requests. Optional, defaults to false + + + The type of the response. + + + + + +**Response** + + +The response from the external API is passed back to you exactly as Nango gets it: +- response code +- response headers +- response body + + +## Providers + +### List all providers + +Returns a list of providers. + +```js +await nango.listProviders() +``` + +**Example Response** + + +```json +{ + "data": [ + { + "name": "posthog", + "categories": ["dev-tools"], + "auth_mode": "API_KEY", + "proxy": { + "base_url": "https://api.posthog.com", + }, + "docs": "https://nango.dev/docs/api-integrations/posthog" + } + ] +} +``` + + +### Get a provider + +Returns a specific provider. + +```js +await nango.getProvider({ provider: }) +``` + +**Example Response** + + +```json +{ + "data": { + "name": "posthog", + "categories": ["dev-tools"], + "auth_mode": "API_KEY", + "proxy": { + "base_url": "https://api.posthog.com", }, - "required": [ - "owner", - "repo", - "username" - ] - } + "docs": "https://nango.dev/docs/api-integrations/posthog" } - ] } ``` -## Syncs +### Get provider templates + +Returns the function templates available for a provider. + +```js +await nango.getProviderTemplates({ provider: }) +``` + +**Parameters** + + + + The provider name. + + + +**Example Response** + + +```json +{ + "data": [ + { + "type": "action", + "name": "create-issue", + "description": "Create a GitHub issue", + "returns": ["GithubIssue"], + "json_schema": null + } + ] +} +``` + + +## Webhooks from Nango + +### Verify Webhook Signature + +Asserts that a Webhook is coming from Nango's backend. Verification uses `webhookSigningKey` when the client is constructed with one, otherwise it falls back to `secretKey`. On environments created after 2026-04-20 (or any environment that later rotated its API key), the signing key differs from the API key, so construct the client with `webhookSigningKey` (from **Environment Settings > Webhooks > Signing key**). + +```js +const nango = new Nango({ + apiKey: '', + webhookSigningKey: '' +}); + +async (req, res) => { + const isValid = nango.verifyIncomingWebhookRequest(req.body, req.headers); +} +``` + + +**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + + +## Python + +Source: https://nango.dev/docs/reference/backend/backend-sdk/python.md + +--- +title: 'Python' +sidebarTitle: 'Python' +icon: 'python' +--- + +Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. + +## Java + +Source: https://nango.dev/docs/reference/backend/backend-sdk/java.md + +--- +title: 'Java' +sidebarTitle: 'Java' +icon: 'java' +--- + +Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. + +## Ruby + +Source: https://nango.dev/docs/reference/backend/backend-sdk/ruby.md + +--- +title: 'Ruby' +sidebarTitle: 'Ruby' +icon: 'gem' +--- + +Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. + +## Go + +Source: https://nango.dev/docs/reference/backend/backend-sdk/go.md + +--- +title: 'Go' +sidebarTitle: 'Go' +icon: 'golang' +--- + +Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. + +## Rust + +Source: https://nango.dev/docs/reference/backend/backend-sdk/rust.md + +--- +title: 'Rust' +sidebarTitle: 'Rust' +icon: 'rust' +--- + +Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. + +## Php + +Source: https://nango.dev/docs/reference/backend/backend-sdk/php.md + +--- +title: 'PHP' +sidebarTitle: 'PHP' +icon: 'php' +--- + +Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. + +## Functions Cli + +Source: https://nango.dev/docs/reference/functions/functions-cli.md + +--- +title: 'Functions CLI' +sidebarTitle: 'Functions CLI' +icon: 'terminal' +description: "Full reference of the CLI available to implement, test & deploy Nango Functions." +--- + +### Install the Nango CLI + +Install the Nango CLI globally: +```bash +npm install nango -g +``` + +In the folder where you want your integration folder (e.g. root of your project), run: +```bash +nango init nango-integrations +``` + +This creates the `./nango-integrations` folder with some initial configuration and an example +sync script. The `nango-integrations` directory looks like this: +``` +nango-integrations/ +β”œβ”€β”€ .env +β”œβ”€β”€ index.ts +└── demo-github-integration # this is the integration unique ID and must match an integration ID in the UI + └── syncs/ + └── github-issue-example.ts +``` + +### CLI Authentication + +Add the following env vars. We recommend that you have a `.env` file in `./nango-integrations`: +```bash +NANGO_SECRET_KEY_PROD='' +NANGO_SECRET_KEY_DEV='' +``` + +Get your `prod` and `dev` secret keys from [Environment Settings > API Keys](https://app.nango.dev/environment-settings#api-keys) (toggle between the `prod` and `dev` environment in the left nav bar). + + +For self-hosting, set the `NANGO_HOSTPORT` env variable to `http://localhost:3003` (for local development) or your instance's URL. + + +## All CLI commands & command details + +Check out all CLI commands by running: +```bash +nango +``` + +Get details about a specific command by running: +```bash +nango [command] --help +``` + +## Interactive Mode + +The Nango CLI includes an interactive mode that prompts you for missing arguments. For example, if you run `nango create` without specifying the function type, integration, or name, the CLI will prompt you for them. + +This mode is enabled by default when you're in an interactive terminal session. + +### Usage Examples + +**Interactive Usage:** + +If you run a command without all the required arguments, the CLI will prompt you for them. + +```bash +# Running "nango create" without arguments +$ nango create + +? What type of function do you want to create? +❯ sync + action + on-event +``` + +**Non-Interactive (Explicit) Usage:** + +You can provide all arguments upfront to bypass the interactive prompts. This is ideal for scripting. + +```bash +nango create --sync --integration my-api --name get-contacts +``` + +### Disabling Interactive Mode + +You can disable interactive mode in two ways: + +1. **Using a flag:** Pass the `--no-interactive` flag to any command. + ```bash + nango create --no-interactive + ``` +2. **In a CI environment:** Interactive mode is automatically disabled when the `CI` environment variable is set. This is the standard way to detect CI/CD environments. + +### Backwards Compatibility + +Interactive mode is fully backward compatible. If you provide all the required arguments for a command, the CLI will not prompt you for anything and will behave exactly as it did before. + +## Flags & environment variables + +Global command flags: + +```bash +# Command flag to auto-confirm all prompts (useful for CI). +# Note: Destructive changes (like removing a sync or renaming a model) requires confirmation, even when --auto-confirm is set. To bypass this restriction, the --allow-destructive flag can be passed to nango deploy. +--auto-confirm + +# Command flag to disable interactive mode. +--no-interactive + +# Command flag to skip automatic package.json updates and package installs. +# Recommended in CI and monorepos where dependency updates are managed elsewhere. +--no-dependency-update +``` + +Environment variables: +```bash +# Recommendation: in a ".env" file in ./nango-integrations. + +# Authenticates the CLI (get the keys in the dashboard's Environment Settings > API Keys). +NANGO_SECRET_KEY_DEV=xxxx-xxx-xxxx +NANGO_SECRET_KEY_PROD=xxxx-xxx-xxxx + +# Nango's instance URL (OSS: change to http://localhost:3003 or your instance URL). +NANGO_HOSTPORT=https://api.nango.dev # Default value + +# How to handle CLI upgrades ("prompt", "auto" or "ignore"). +NANGO_CLI_UPGRADE_MODE=prompt # Default value + +# Whether to prompt before deployments. +# Note: Destructive changes (like removing a sync or renaming a model) requires confirmation, even when NANGO_DEPLOY_AUTO_CONFIRM is set to true. To bypass this restriction, the --allow-destructive flag can be passed to nango deploy. +NANGO_DEPLOY_AUTO_CONFIRM=false # Default value + +# Control automatic dependency updates. Set to "false" to skip installs (equivalent to --no-dependency-update). +NANGO_CLI_DEPENDENCY_UPDATE=true # Default value +``` + +## Dependency management + +For Zero YAML projects, the CLI can keep required dev dependencies (for example `nango` and related tooling) in sync and run package installation when needed. + +### `--no-dependency-update` + +Use `--no-dependency-update` to disable automatic `package.json` updates and dependency installs: + +```bash +nango deploy dev --no-dependency-update +``` + +This is especially useful when: + +- your CI pipeline should not modify files +- your monorepo manages dependencies at the workspace root +- you want full control over when `install` runs + +In CI, dependency updates are automatically disabled to avoid hanging. Passing `--no-dependency-update` explicitly is still recommended to make intent clear and silence the warning. + + +When dependency updates are disabled, Nango will not install dependencies for you. Ensure dependencies are already installed before running commands. + + +## Package manager support + +Nango supports all major JavaScript package managers. The CLI automatically detects and uses your package manager for installs. Detection works from the current directory upward (monorepo-aware), in this order: + +1. `package.json` `packageManager` field (Corepack standard) +2. lock files (`pnpm-lock.yaml`, `yarn.lock`, `bun.lockb` / `bun.lock`) +3. fallback to `npm` + +Supported managers are `npm`, `pnpm`, `yarn`, and `bun`. + + +**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + + +## Functions Sdk + +Source: https://nango.dev/docs/reference/functions/functions-sdk.md + +--- +title: "Functions SDK" +sidebarTitle: "Functions SDK" +icon: "code" +description: "Full reference of the SDK available in Nango Functions." +--- + +## Examples + + + + ```ts + import { createSync } from 'nango'; + + const githubIssueDemoSchema = z.object({ ... }); + type GithubIssueDemo = z.infer; + + export default createSync({ + description: `Fetches the Github issues from all a user's repositories.`, + version: '1.0.0', + frequency: 'every hour', + autoStart: true, + metadata: z.void(), + models: { + GithubIssueDemo: githubIssueDemoSchema + }, + + exec: async (nango) => { + // Mark the start of deletion tracking + await nango.trackDeletesStart('GithubIssueDemo'); + + // Fetch issues from GitHub. + const res = await nango.get({ + endpoint: '/repos/NangoHQ/interactive-demo/issues?labels=demo&sort=created&direction=asc' + }); + + // Map issues to your preferred schema. + const issues: GithubIssueDemo[] = res.data.map(({ id, title, html_url }: any) => { + return { id, title, url: html_url }; + }); + + // Persist issues to the Nango cache. + await nango.batchSave(issues, 'GithubIssueDemo'); + + // Detect and mark deleted records + await nango.trackDeletesEnd('GithubIssueDemo'); + }, + }); + ``` + + + ```ts + import { createAction } from 'nango'; + import { GithubCreateIssueInput, GithubCreateIssueResult } from '../../models.js'; + + export default createAction({ + description: `Create an issue in GitHub`, + version: '1.0.0', + input: GithubCreateIssueInput, + output: GithubCreateIssueResult, + + exec: async (nango, input) => { + // Create a GitHub issue. + const res = await nango.post({ + endpoint: '/repos/NangoHQ/interactive-demo/issues', + data: { + title: `[demo] ${input.title}`, + body: `The body of the issue.`, + labels: ['automatic'] + } + }); + + // Send response. + return { url: res.data.html_url, status: res.status }; + }, + }); + ``` + + + +Read more about [integration functions](/guides/functions/functions-guide) to understand what role they play in Nango. -### Get records +## Configuration -Returns the synced data. +### `createSync` -```ts -import type { ModelName } from '/models' + + The description of the sync. + -const records = await nango.listRecords({ - providerConfigKey: '', - connectionId: '', - model: '' -}); + + The function that will be called when the sync is triggered. + + + + The frequency of the sync. + + ```ts + frequency: 'every 1 minute', + frequency: 'every hour', + frequency: 'every 2 days' + frequency: 'every 3 week' + ``` + + + + The models that will be synced by this function. + You need one endpoint per model. + + ```ts + models: { + GithubIssue: z.object({ + id: z.string(), + }), + }, + ``` + + + + Optional schema defining the shape of checkpoint data for this sync. + Use checkpoints to save progress and avoid re-fetching all data on every run. See the [checkpoints guide](/guides/functions/syncs/checkpoints) for details. + + ```ts + checkpoint: z.object({ + cursor: z.string(), + }), + ``` + + + + If `true`, automatically runs the sync when a new connection is created. + Otherwise, it needs to be triggered via the API or Nango UI. + + + + The connection's metadata of the action. + + ```ts + metadata: z.object({ + userId: z.string(), + }); + ``` + + + + The function that will be called when a webhook is received. + + + + The integration's scopes required by the action. + This field is for documentation purposes only and currently not enforced by Nango. + + ```ts + scopes: ['read:user', 'write:user'], + ``` + + + + [DEPRECATED] Instead use `await nango.trackDeletesStart('modelName')` and `await nango.trackDeletesEnd('modelName')` inside the sync `exec` function. + + When `trackDeletes` is set to `true`, Nango automatically detects deleted records **during full syncs only** and marks them as deleted in each record’s metadata (soft delete). These records remain stored in the cache. + + When set to `false`, Nango does not mark missing records as deleted, even if they weren’t returned in the latest full syncβ€”they simply remain in the cache unchanged. + + Defaults to `false`. + + + + The version of the sync. + Use it to track changes to the sync inside Nango's UI. + + + + The webhook subscriptions of the sync. + Specify the types of webhooks the method `onWebhook` will handle. + If a webhook type is not on the list, it will not be handled. + + ```ts + webhookSubscriptions: ['*'], + ``` + + + + [DEPRECATED] Use the [`GET /records`](/reference/backend/http-api/sync/records-list) API endpoint to fetch records. + + +### `createAction` + + + The description of the sync. + + + + + + The function that will be called when the action is triggered. + + + + The input required by the action when triggering it. + + ```ts + input: z.object({ + title: z.string(), + }); + ``` + + + + The output of the action. + + ```ts + output: z.object({ + issueId: z.string(), + }); + ``` + + + + The version of the sync. + Use it to track changes to the sync inside Nango's UI. + + + + The connection's metadata of the action. + + ```ts + metadata: z.object({ + userId: z.string(), + }); + ``` + + + + The integration's scopes required by the action. + This field is for documentation purposes only and currently not enforced by Nango. + + ```ts + scopes: ['read:user', 'write:user'], + ``` + + + + [DEPRECATED] Use the [`POST /action/trigger`](/reference/backend/http-api/action/trigger) API endpoint to trigger actions. + + +### `createOnEvent` + + + The description of the sync. + + + + The event that will trigger this function. + + + + The function that will be called when the action is triggered. + + + + The version of the onEvent function. + Use it to track changes to the onEvent function inside Nango's UI. + + + + The connection's metadata of the function. + + ```ts + metadata: z.object({ + userId: z.string(), + }); + ``` + + +## HTTP requests + +Makes an HTTP request inside an integration function: + +```js +import type { ProxyConfiguration } from 'nango'; + +const config: ProxyConfiguration = { endpoint: '/some-endpoint' }; + +await nango.get(config); // GET request +await nango.post(config); // POST request +await nango.put(config); // PUT request +await nango.patch(config); // PATCH request +await nango.delete(config); // DELETE request ``` + + Note that all HTTP requests benefit from automatic credential injection. Because functions are executed in the context of a specific integration & connection, Nango can automatically retrieve & refresh the relevant API credentials. + + **Parameters** - - The integration ID. + + The endpoint of the request. - - - The connection ID. + + The headers of the request. - - - The name of the model of the data you want to retrieve. + + The query parameters of the request. - - - The variant of the model to fetch. When omitted, the default base variant is used. + + The body of the request. + + + The number of retries in case of failure (with exponential back-off). Optional, default 0. + + + Array of HTTP status codes to retry, in addition to those specified [below](#when-a-failed-request-is-retried). + + + The API base URL. Can be omitted if the base URL is configured for this API in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml). + + + Override the decompress option when making requests. Optional, defaults to false + + The type of the response. + + + + - - Each record from this endpoint comes with a synchronization cursor in `_nango_metadata.cursor`. +**Response** - Save the last fetched record's cursor to track how far you've synced. + + ```json + { + data: {}, // the response provided by the server + status: 200, // the HTTP status code + headers: {}, // the HTTP headers + config: {}, // the config provided for the request + request: {} // the request that generated this response + } + ``` - By providing the cursor to this method, you'll continue syncing from where you left off, receiving only post-cursor changes. + + The response object is an [Axios response](https://axios-http.com/docs/res_schema). + + - This same cursor is used to paginate through the results of this endpoint. - +## HTTP request retries - - The maximum number of records to return. Defaults to 100. - +Configure behavior with two optional fields on your [HTTP request](#http-requests) config: [`retries`](#param-retries) and [`retryOn`](#param-retry-on). - - Filter to only show results that have been added or updated or deleted. +### When a failed request is retried - Available options: added, updated, deleted - +Nango retries only when the failure looks **transient**. Exact rules depend on the integration: - - Timestamp, e.g. 2023-05-31T11:46:13.390Z. If passed, only records modified after this timestamp are returned, otherwise all records are returned. - +| Field | Condition for Retry | +| --- | --- | +| **Network Error** | If code is one of:
`ECONNRESET`, `ETIMEDOUT`, `ECONNABORTED`, `ECONNREFUSED`, `EHOSTUNREACH`, `EAI_AGAIN` | +| **Transient HTTP Error** | If provider specific `proxy.retry.error_code` is configured in [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml), only matching statuses are retried.

Otherwise, by default, status codes `401`, `429`, `5xx` are retried.

Additional status specified in [`retryOn`](#param-retry-on) are always retried in addition to the above statuses. | - - An array of string containing a list of your records IDs. The list will be filtered to include only the records with a matching ID. - +If nothing in the table applies, the error is **not** retried. - - Deprecated. (use modifiedAfter) Timestamp, e.g. 2023-05-31T11:46:13.390Z. If passed, only records modified after this timestamp are returned, otherwise all records are returned. - -
+ +Status `401` is retryable so Nango can recover after refreshing the connection with potentially updated credentials. If a `401` happens and the connection credentials **do not change** on the next fetch, Nango treats that as a definitive authentication failure and stops performing additional retries + + +### Backoff + +Between retry attempts Nango waits with **exponential backoff**: first wait **3000ms**, then each wait doubles, capped at **10 minutes**. + +## Logging + +You can collect logs in integration functions. This is particularly useful when: + +- developing, to debug your integration functions +- in production, to collect information about integration function executions & understand issues + +Collect logs in integration functions as follows: + +```ts +await nango.log("This is a log."); // default log level is 'info' +await nango.log("This is an info log", { level: 'info' }); +await nango.log("This is a warning", { level: 'warn' }); +await nango.log("This is an error", { level: 'error' }); +``` + +### Log Levels + +Nango supports the following log levels (from most to least verbose): `debug`, `info`, `warn`, `error`, `off`. + +Only logs with a level greater than or equal to the configured logger level will surfaced in the Nango UI Logs tab. For example, if the logger level is set to `warn`, only `warn` and `error` logs will be shown. + +**Default log levels:** +- **All cloud environments**: `warn` (only warnings and errors are logged by default) +- **CLI dry-run**: `debug` (all logs are shown in the console) + +### Configuring Log Level + +You can override the default log level in two ways: + +1. **Environment variable**: Set `NANGO_LOGGER_LEVEL` in your environment settings (values: `debug`, `info`, `warn`, `error`, `off`). It will apply to all your functions running in this environment and can be overridden in functions by using `nango.setLogger(...)` + +2. **In your function code**: +```ts +nango.setLogger({ level: 'debug' }); // All logs will show in your cloud environments. It will apply to all `nango.log()` following this statement. +nango.setLogger({ level: 'off' }); // No logs will show +``` + +Logs can be viewed & searched in the Nango UI. We plan to make them exportable in the future as well. + +You can monitor your usage of custom logs in the [billing tab](https://app.nango.dev/prod/team/billing) of your Nango dashboard. + +## Environment variables + +Integration functions sometimes need to access sensitive variables that should not be revealed directly in the code. + +For this, you can define environment variables in the Nango UI, in the _Environment Settings_ tab. Then you can retrieve these environment variables from integration functions with: + +```js +await nango.getEnvironmentVariables(); +``` + +**Parameters** + +No parameters. + +**Response** + + + ```json + [ + { + "name": "MY_SECRET_KEY", + "value": "SK_373892NSHFNCOWFO..." + } + ] + ``` + + +## Trigger action + +You can call action functions from other integration functions with: + +```js +await nango.triggerAction('', { 'custom_key1': 'custom_value1' }); +``` + +**Parameters** + + + + The name of the action to trigger. + + + The necessary input for your action's `exec` function. -**Example Response** +**Response** + + + ```json + { + "your-properties": "The data returned by the action" + } + ``` + + +## Paginate through API responses + +Nango provides a helper to automatically paginate endpoint responses. + +Similar to [HTTP requests](/reference/functions/functions-sdk#http-requests), the `nango.paginate()` method takes in a `ProxyConfiguration` parameter. + +Use the `paginate` field to of the `ProxyConfiguration` to specify how the endpoint's pagination work. Here's an example for a Jira endpoint: + +```ts +const config: ProxyConfiguration = { + // https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-projects/#api-rest-api-3-project-search-get + endpoint: `/ex/jira/${cloud.cloudId}/rest/api/3/project/search`, + params: { + properties: properties + }, + paginate: { + type: 'offset', + offset_name_in_request: 'startAt', + response_path: 'values', + limit_name_in_request: 'maxResults', + limit: 50, + on_page: async ({ nextPageParam, response }) => { + await nango.log(`Next offset value = ${nextPageParam}`); + await nango.log(`Fetched ${response.data.total} records`); + }, + }, + headers: { + 'X-Atlassian-Token': 'no-check' + }, + retries: 10 +}; + +for await (const projects of nango.paginate(config)) { + const projectsToSave = toProjects(projects, cloud.baseUrl); + await nango.batchSave(projectsToSave, 'Project'); +} +``` + +As shown in the example above, use a `for` loop to iterate through the paginated results. -This endpoint returns a list of records, ordered by modification date ascending. If some records are updated while you paginate through this endpoint, you might see these records multiple times. + Nango has pre-configured the pagination settings for some popular APIs, so you don't have to specify them in functions. + + You can view the pre-configured pagination settings for all APIs in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) file. + + Please note that some APIs have diverging pagination strategies per endpoint, so you might still need to override pre-configured pagination settings at times. +The pagination helper supports 3 types of pagination: `cursor`, `link` or `offset` with the following settings: + -```json -{ - records: - [ - { - id: 123, - ..., // Fields as specified in the model you queried - _nango_metadata: { - deleted_at: null, - last_action: 'ADDED', - first_seen_at: '2023-09-18T15:20:35.941305+00:00', - last_modified_at: '2023-09-18T15:20:35.941305+00:00', - cursor: 'MjAyNC0wMi0yNlQwMzowMDozOS42MjMzODgtMDU6MDB8fGVlMDYwM2E1LTEwNDktNDA4Zi05YTEwLTJjNzVmNDkwODNjYQ==' - } - }, - ... - ], - next_cursor: "Y3JlYXRlZF9hdF4yMDIzLTExLTE3VDExOjQ3OjE0LjQ0NyswMjowMHxpZF4xYTE2MTYwMS0yMzk5LTQ4MzYtYWFiMi1mNjk1ZWI2YTZhYzI" -} + + + + + + _For all pagination types._ + + The name of the parameter containing the number of items per page, in the request. Inserted in the query parameters for `GET`/`DELETE`, in the body for `POST`/`PUT`/`PATCH`. + + + _For all pagination types._ + + The maximum number of items per page. If omitted, no limit will be sent to the external endpoint, relying on the endpoint's default limit. + + + _For all pagination types._ + + The path of the field containing the results, in the response. If omitted or empty string, it defaults to the root. Use `.` for nested fields, e.g. `"results.contacts"`. + + + _For all pagination types._ + + The pagination strategy. + + + _For cursor pagination only (required)._ + + The path of the field containing the cursor for the next page, in the response. Use `.` for nested fields, e.g. `"pagination.cursor"`. + + + _For cursor pagination only (required)._ + + The name of the parameter containing the cursor for the next page, in the request. Inserted in the query parameters for `GET`/`DELETE`, in the body for `POST`/`PUT`/`PATCH`. + + + _`For link pagination (required unless link_path_in_response_body is specified).`_ + + The header containing the link to the next page, in the response. + + + _`For link pagination (required unless link_rel_in_response_header is specified).`_ + + The path of the field containing the link to the next page, in the response. Use `.` for nested fields, e.g. `"pagination.link"`. + + + _For offset pagination only (required)._ + + The name of the parameter containing the offset for the next page, in the request. Inserted in the query parameters for `GET`/`DELETE`, in the body for `POST`/`PUT`/`PATCH`. + + + _For offset pagination only (optional)._ + + The initial offset. Defaults to 0, but some APIs start at 1. + + + _For offset pagination only (optional)._ + + The offset calculation method. `by-response-size` (default) means the offset is incremented by the number of results. `per-page` means the offset is incremented by one for each page. + + + _For all pagination types (optional)._ + + A callback function that is called after each page is fetched. Useful for logging or tracking pagination progress. The callback receives the next page parameter and the full Axios response object, which includes the response data, status, headers, and request configuration. + + + + + + + You can find details on the pagination [types](https://github.com/NangoHQ/nango/blob/master/packages/runner-sdk/models.d.ts) and [logic](https://github.com/NangoHQ/nango/blob/master/packages/runner-sdk/lib/paginate.service.ts) in the code. + + + +## Get Integration + +Returns the current integration information + +```js +await nango.getIntegration(); +``` + +With credentials + +```js +await nango.getIntegration({ include: ['credentials'] }); ``` -
-### Prune records +**Parameters** -Prunes record payloads from Nango's cache for a given model and connection up to a specified cursor. The payload is emptied but record metadata is retained. Payload can be restored by re-syncing the data. +See `GET /integrations/{uniqueKey}` query parameters: [documentation](/reference/backend/http-api/integration/get) -```ts -const result = await nango.pruneRecords({ - providerConfigKey: '', - connectionId: '', - model: '', - untilCursor: '' -}); +**Response** -console.log(`Pruned ${result.count} records. More records available: ${result.has_more}`); +See `GET /integrations/{uniqueKey}` response: [documentation](/reference/backend/http-api/integration/get) + +## Manage connection metadata + +### Get connection metadata + +Returns the connection's metadata. + +```js +await nango.getMetadata(); +``` + +Better, you can specify the type of the metadata; + +```ts +interface CustomMetadata { + anyKey: Record; +} +const myTypedMetadata = await nango.getMetadata(); ``` **Parameters** +No parameters. + +**Example Response** + - - - - The integration ID. - + ```json + { + "custom_key1": "custom_value1" + } + ``` + - - The connection ID. - +### Set connection metadata - - The name of the model from which to prune records. - +Set custom metadata for the connection (overrides existing metadata). - - The variant of the model. When omitted, the default base variant is used. - +```js +await nango.setMetadata({ 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); +``` - - The cursor up to which records should be pruned. Only records with a cursor less than or equal to this value will be pruned. - +**Parameters** - - The maximum number of records to prune in this operation. - - + + + The custom metadata to store in the connection. **Response** - -```json -{ - "count": 150, - "has_more": true -} +Empty response. + +### Edit connection metadata + +Edit custom metadata for the connection. Only overrides & adds specified properties, not the entire metadata. + +```js +await nango.updateMetadata({ 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); ``` - - The number of records that were pruned in this operation. - +**Parameters** - - Indicates whether there are more records available for pruning that match the criteria. If `true`, you must call the method again to continue pruning records. - + + + The custom metadata to store in the connection. + -### Trigger sync(s) - -Triggers an additional, one-off execution of specified sync(s) for a given connection or all applicable connections if no connection is specified. +**Response** -```ts -// Simple usage - trigger sync preserving checkpoint -await nango.triggerSync('', ['SYNC_NAME1', 'SYNC_NAME2'], ''); +Empty response. -// Reset checkpoint and start fresh -await nango.triggerSync('', ['SYNC_NAME1'], '', { reset: true }); +## Get the connection credentials -// Reset checkpoint and clear all cached records -await nango.triggerSync('', ['SYNC_NAME1'], '', { reset: true, emptyCache: true }); +Returns a specific connection with credentials. -// Using variants -await nango.triggerSync('', [ - { name: 'SYNC_NAME1', variant: 'VARIANT_A' }, - 'SYNC_NAME2' // Uses default base variant -], '', { reset: true }); +```js +await nango.getConnection(); ``` + + The response content depends on the API authentication type (OAuth 2, OAuth 1, API key, Basic auth, etc.). + + + + When you fetch the connection with this API endpoint, Nango will check if the access token has expired. If it has, it will refresh it. + + We recommend not caching tokens for longer than 5 minutes to ensure they are fresh. + + **Parameters** - - The integration ID. - - - The name of the syncs to trigger. If the array is empty, all syncs are triggered. - Each sync can be specified as either: - - A string: the sync name (uses the default base variant) - - An object: with name and variant properties to target a specific sync variant + + An optional integration ID to override the one from the function context. - - The connection ID. If omitted, the sync will trigger for all relevant connections. + + An optional connection ID to override the one from the function context. - - Options for triggering the sync. See the [checkpoints guide](/guides/functions/syncs/checkpoints#re-syncing-resetting-checkpoints-and-the-cache) for details on `reset` and `emptyCache`. + - - If `true`, clears the checkpoint before triggering the sync, causing it to start fresh. + + Defaults to `false`. If `false`, the token will only be refreshed if it expires within 15 minutes. If `true`, a token refresh attempt will happen on each request. This is only useful for testing and should not be done at high traffic. - - If `true`, deletes all cached records associated with the sync before triggering. Must be used with `reset: true`. + + Defaults to `false`. If `false`, the refresh token is not included in the response, otherwise it is. In production, it is not advised to return the refresh token, for security reasons, since only the access token is needed to sign requests. + + + Defaults to `false`. If true, this will refresh the JWT token for GitHub App / Github App OAuth connections -**Response** +**Example Response** -Empty response. + + ```json + { + "id": 18393, + "created_at": "2023-03-08T09:43:03.725Z", + "updated_at": "2023-03-08T09:43:03.725Z", + "provider_config_key": "github", + "connection_id": "1", + "credentials": { + "type": "OAUTH2", + "access_token": "gho_tsXLG73f....", + "refresh_token": "gho_fjofu84u9....", + "expires_at": "2024-03-08T09:43:03.725Z", + "raw": { // Raw token response from the OAuth provider: Contents vary! + "access_token": "gho_tsXLG73f....", + "refresh_token": "gho_fjofu84u9....", + "token_type": "bearer", + "scope": "public_repo,user" + } + }, + "connection_config": { + "subdomain": "myshop", + "realmId": "XXXXX", + "instance_id": "YYYYYYY" + }, + "account_id": 0, + "metadata": { + "myProperty": "yes", + "filter": "closed=true" + } + } + ``` + -### Start schedule for sync(s) +## Sync-specific helper methods -Starts the schedule of specified sync(s) for a given connection or all applicable connections if no connection is specified. Upon starting the schedule, the sync will execute immediately and then continue to run at the specified frequency. If the schedule was already started, this will have no effect. +Sync functions persist data updates to the Nango cache, which your app later fetches. See the [sync functions section](/guides/functions/syncs/sync-functions). -```ts -// Simple usage with sync names -await nango.startSync('', ['SYNC_NAME1', 'SYNC_NAME2'], ''); +### Checkpoints -// Using variants -await nango.startSync('', [ - { name: 'SYNC_NAME1', variant: 'VARIANT_A' }, - 'SYNC_NAME2' // Uses default base variant -], ''); -``` +Checkpoints allow syncs to save their progress and resume from where they left off. This is useful for: +- Resuming after failures without re-fetching all data +- Tracking pagination state across sync runs +- Storing custom cursor/offset values -**Parameters** +To use checkpoints, define a `checkpoint` schema in your sync configuration (see [Configuration](#createsync)). For a complete guide on implementing incremental syncs with checkpoints, see the [checkpoints guide](/guides/functions/syncs/checkpoints). If you are migrating from `nango.lastSyncDate`, see the [migration guide](/guides/platform/migrations/migrate-to-checkpoints). - - - The integration ID. - - - The name of the syncs that should be triggered. - Each sync can be specified as either: - - A string: the sync name (uses the default base variant) - - An object: with name and variant properties to target a specific sync variant - - - The connection ID. If omitted, the sync will trigger for all relevant connections. - - +#### getCheckpoint() + +Retrieves the current checkpoint. Returns `null` on first run or after a reset. + +```ts +const checkpoint = await nango.getCheckpoint(); +if (checkpoint) { + // Resume from checkpoint + startCursor = checkpoint.cursor; +} +``` **Response** -Empty response. +Returns the checkpoint object matching your schema, or `null` if no checkpoint exists. -### Pause schedule for sync(s) +#### saveCheckpoint() -Pauses the schedule of specified sync(s) for a given connection or all applicable connections if no connection is specified. +Saves the current progress. Call this after processing each batch of data to enable resumption if the sync fails. ```ts -// Simple usage with sync names -await nango.pauseSync('', ['SYNC_NAME1', 'SYNC_NAME2'], ''); - -// Using variants -await nango.pauseSync('', [ - { name: 'SYNC_NAME1', variant: 'VARIANT_A' }, - 'SYNC_NAME2' // Uses default base variant -], ''); +await nango.saveCheckpoint({ cursor: nextCursor }); ``` **Parameters** - - The integration ID. - - - The name of the syncs that should be paused. - Each sync can be specified as either: - - A string: the sync name (uses the default base variant) - - An object: with name and variant properties to target a specific sync variant - - - The connection ID. If omitted, the sync will pause for all relevant connections. - + + The checkpoint data matching your defined schema. + -**Response** +#### clearCheckpoint() -Empty response. +Clears the checkpoint. Use at the end of a full sync so the next run starts from the first page. Checkpoints are also automatically cleared when triggering a sync with `reset: true`. -### Sync status +```ts +await nango.clearCheckpoint(); +``` -Get the status of specified sync(s) for a given connection or all applicable connections if no connection is specified. +### Save records -```ts -// Simple usage with sync names -await nango.syncStatus('', ['SYNC_NAME1', 'SYNC_NAME2'], ''); +Upserts records to the Nango cache (i.e. create new records, update existing ones). Each record needs to contain a unique `id` field used to dedupe records. -// Using variants -await nango.syncStatus('', [ - { name: 'SYNC_NAME1', variant: 'VARIANT_A' }, - 'SYNC_NAME2' // Uses default base variant -], ''); +```js +const githubIssues: GitHubIssue[] = ...; // Fetch issues from GitHub API. -// Get all syncs -await nango.syncStatus('', '*', ''); +await nango.batchSave(githubIssues, 'GitHubIssue'); ``` **Parameters** - - The integration ID. - - - Either "*" to return all syncs, or an array of syncs to fetch status for. - When using an array, each sync can be specified as either: - - A string: the sync name (uses the default base variant) - - An object: with name and variant properties to target a specific sync variant - - - The connection ID. If omitted, all connections will be surfaced. - + + The list of records to persist. + + + The model type of the records to persist. + -**Response** +### Delete records - -```json -{ - "syncs": [ - { - "id": "", - "connection_id": "", - "name": "", - "variant": "", - "status": "RUNNING", - "type": "INCREMENTAL", // DEPRECATED - "finishedAt": "", - "nextScheduledSyncAt": "", - "frequency": "", - "latestResult": { - "": { - "added": , - "updated": , - "deleted": , - } - }, - "recordCount": { - "": - ... - }, - "checkpoint": { - "": "" - ... - } - } - ] -} -``` +Marks records as deleted in the Nango cache. Deleted records are still returned when you fetch them, but they are marked as deleted in the record's metadata (i.e. soft delete). -The `checkpoint` field contains the last saved checkpoint for the sync. Learn more about [checkpoints](/guides/functions/syncs/checkpoints). - + +This does not remove cached payloads. + +`nango.batchDelete()` is used to mark records as deleted in Nango because they were deleted on the external API. Nango may still keep the last-known payload so your customer can react to the deletion event. -### Override sync connection frequency +If you want to permanently remove data from Nango storage for cost or compliance reasons, use [record pruning instead](/reference/backend/http-api/sync/prune-records). + -Override a sync's default frequency for a specific connection, or revert to the default frequency. +To implement deletion detection in your syncs, [follow this guide](/guides/functions/syncs/deletion-detection). -```ts -// For base variant -await nango.updateSyncConnectionFrequency('', 'SYNC_NAME', '', ''); +The only field that needs to be present in each record when calling `batchDelete` is the unique `id`; the other fields are ignored. -// For a specific variant -await nango.updateSyncConnectionFrequency('', { name: 'SYNC_NAME', variant: 'VARIANT_NAME' }, '', ''); +```js +const githubIssuesToDelete: { id: string }[] = ...; // Fetch issues to delete from GitHub API. + +await nango.batchDelete(githubIssuesToDelete, 'GitHubIssue'); ``` **Parameters** - - The integration ID. - - - The sync to update. Can be specified as either: - - A string: the sync name (uses the default base variant) - - An object: with name and variant properties to target a specific sync variant - - - The connection ID. - - - The frequency you want to set (ex: 'every hour'). Set to `null` to revert to the default frequency. Uses the https://github.com/vercel/ms notations. See [minimum sync frequency](/guides/platform/limits#minimum-sync-frequency) for details. - + + The list of records to delete. + + + The model type of the records to delete. + -**Response** +### Detect deletions automatically - -```json -{ - "frequency": "" -} +Automatically detects and marks records as deleted by comparing what existed before `trackDeletesStart` with what was saved between `trackDeletesStart` and `trackDeletesEnd`. + + +This does not remove cached payloads. + +`nango.trackDeletesStart()`/`nango.trackDeletesEnd()` are used to mark records as deleted in Nango because they were not returned by the external API. Nango may still keep the last-known payload so your customer can react to the deletion event. + +If you want to permanently remove data from Nango storage for cost or compliance reasons, use [record pruning instead](/reference/backend/http-api/sync/prune-records). + + +```js +await nango.trackDeletesStart('ModelName'); + +// ... fetch and save all records ... + +await nango.trackDeletesEnd('ModelName'); ``` + +Call `trackDeletesStart` at the beginning of your sync execution, before fetching any data. Call `trackDeletesEnd` after all records have been saved with `batchSave`. Nango will compare the records that existed before `trackDeletesStart` with those saved in the window and mark any missing records as deleted. + +**Parameters** (both functions) + + + + The model type to detect deletions for. + -### Create sync variant +**Important considerations:** -Creates a new sync variant for a specific connection. Sync variants allow you to run multiple instances of the same sync with different configurations. +- Only use within syncs that fetch the complete dataset between `trackDeletesStart` and `trackDeletesEnd` +- If your sync fails or doesn't fetch the complete dataset, avoid calling `trackDeletesEnd` as it may cause false deletions +- Records are soft deleted (marked with `_metadata.deleted = true`) and remain in the cache + + +`deleteRecordsFromPreviousExecutions` is deprecated. Use `trackDeletesStart`/`trackDeletesEnd` instead. + + +For more details on deletion detection strategies, see the [detecting deletes guide](/guides/functions/syncs/deletion-detection). + +### Update records + +Updates records in the Nango cache by merging the given data into the existing record. The `id` field is required in each record and used to determine what existing record to merge into. + +`batchUpdate` is primarily useful in webhook sync functions, where you receive partial updates from a webhook and want to merge them into the existing records. + +The merge algorithm used is a deep merge. Nested objects are merged recursively, while arrays always use the new value for the array. Any fields not present in the update record are left unchanged. ```ts -await nango.createSyncVariant({ - provider_config_key: '', - connection_id: '', - name: 'SYNC_NAME', - variant: 'VARIANT_NAME' -}); +// Create partial GitHub Issue update records with only id and state. +const githubIssues: Pick[] = ...; + +await nango.batchUpdate(githubIssues, 'GitHubIssue'); +``` + +**`Take special care when using batchUpdate with records containing arrays.`** The merge algorithm does not attempt to merge arrays, but rather always uses the value of the new array. + +```ts +// given a an existing record: +// { id: '1', tags: [{id: 12, name: 'Dev'}, {id: 13, name: "QA"}] } +const updates: Pick[] = [ + { id: '1', tags: [{id: 14, name: 'UX'}] } +]; + +// after the update, the record will be: +// { id: '1', tags: [{id: 14, name: "UX"}] } +await nango.batchUpdate(updates, 'Issue'); ``` **Parameters** - - - - The integration ID. - - - The connection ID. - - - The name of the sync. - - - The name of the variant to create. Cannot be "base" (protected name). - - - + + The list of partial records to persist. + + + The model type of the records to persist. + -**Example Response** +### Get records - -```json -{ - "id": "12345", - "name": "SYNC_NAME", - "variant": "VARIANT_NAME" +Fetches records from the Nango cache by ID. Returns a Map where the keys are the requested IDs, and the values are the corresponding records. Any records that are not found will simply be absent from the map. + +Example usage: + +```ts +const records = await nango.getRecordsById(['1', '2', '3'], 'Issue'); + +if (records.has('1')) { + const record = records.get('1'); + await nango.log(record.title); +} else { + await nango.log('Record with id 1 not found.'); } ``` - -### Delete sync variant + + Fetching records by ID is useful when you need to update specific records with a more granular approach than [`nango.batchUpdate()`](/reference/functions/functions-sdk#update-records), which performs a deep merge. Note that `nango.batchUpdate()` is more performant than using `nango.getRecordsById()`, followed by `nango.batchSave()`. -Deletes a sync variant for a specific connection. + A common use case is when handling external webhooks, where only a partial update of a record is received from an API. + + +### Variant + +If you are using sync variants, you can access the current variant name via the `nango.variant` property. ```ts -await nango.deleteSyncVariant({ - provider_config_key: '', - connection_id: '', - name: 'SYNC_NAME', - variant: 'VARIANT_NAME' +export default createSync({ + exec: async (nango) => { + await nango.log(`Running sync with variant: ${nango.variant}`); + + // Customize sync behavior based on variant + const res = await nango.get({ + endpoint: `/spreadsheet/${nango.variant}` + }); + + // Rest of sync implementation... + }, }); ``` -**Parameters** +## Action-specific helper methods - - - - - The integration ID. - - - The connection ID. - - - The name of the sync. - - - The name of the variant to delete. Cannot be "base" (protected name). - - - - +### `ActionError` -**Example Response** +You can use `ActionError` in an action function to return a descriptive error to your app when needed: + +```ts + +export default createAction({ + exec: async (nango) => { + // Something went wrong... + + throw new ActionError({ any_key: 'any_value' }); + }, +}); +``` + +In this case, the response to the trigger action call will be: - ```json { - "success": true + "error_type": "action_script_failure", + "payload": { + "any_key": "any_value" + } } ``` - -### Get environment variables +## Relative imports in functions -Retrieve the environment variables as added in the Nango dashboard. +You can import relative files into your functions to allow for code abstraction and to +maintain DRY (Don't Repeat Yourself) principles. This means you can reuse code across +different functions by importing it. The imported file must live in the `nango-integrations` +directory and can be imported in the following way: -```js -await nango.getEnvironmentVariables(); +```ts +import { issueMapper } from '../mappers/issue-mappper'; + +export default createSync({ + exec: async (nango) => { + // Fetch issues from GitHub. + const res = await nango.get({ + endpoint: '/repos/NangoHQ/interactive-demo/issues?labels=demo&sort=created&direction=asc' + }); + + // Persist issues to the Nango cache. + await nango.batchSave(issueMapper(res.data), 'GithubIssueDemo'); + }, +}); ``` -**Parameters** +Note that you cannot import third-party modules at this time. Additionally, if there is a compilation error in an imported file, the entry point file will also fail to compile. -No parameters. +## Pre-included Dependencies -**Response** +Some libraries are pre-included for usage in functions: - -```json -[ - { - "name": "MY_SECRET_KEY", - "value": "SK_373892NSHFNCOWFO..." - } -] -``` - +- [zod](https://github.com/colinhacks/zod) +- [crypto / node:crypto](https://nodejs.org/api/crypto.html#crypto) +- [url / node:url](https://nodejs.org/api/url.html#url) -## Actions +Please reach out in the [community](https://nango.dev/slack) if you would like to request additional ones. -### Trigger an action + + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + -Triggers an action for a connection. +## Overview -```js -await nango.triggerAction('', '', '', { 'custom_key1': 'custom_value1' }); -``` +Source: https://nango.dev/docs/integrations/overview.md -**Parameters** +--- +title: Explore APIs & integrations +sidebarTitle: Overview +--- - - - The integration ID. - - - The connection ID. - - - The name of the action to trigger. - - - The necessary input for your action's `exec` function. - - + +Nango is the leading provider of **API access for AI agents & apps**. It is designed for developers building integrations for their users, with full flexibility. + -**Response** + + +800+ APIs & thousands of integrations. + + +We deliver them in <48h. + + +It's fast & easy. + + - -```json -{ - "your-properties": "The data returned by the action" -} -``` - +## Api Configuration - -The output of an action cannot exceed 10MB. - +Source: https://nango.dev/docs/integrations/api-configuration.md -### Trigger an action asynchronously +--- +title: 'API configuration (`providers.yaml`)' +sidebarTitle: 'API configuration' +--- -Triggers an action asynchronously for a connection. This allows you to start an action and retrieve the results later. +API configurations are listed in the `providers.yaml` file, located in the [Nango GitHub repository](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml). -```js -const { id, statusUrl } = await nango.triggerActionAsync('', '', '', { 'custom_key1': 'custom_value1' }); +# Examples + + + + +```yaml +hubspot: + display_name: HubSpot + categories: + - marketing + - support + - crm + auth_mode: OAUTH2 + authorization_url: https://app.hubspot.com/oauth/authorize + token_url: https://api.hubapi.com/oauth/v1/token + connection_configuration: + - portalId + post_connection_script: hubspotPostConnection + webhook_routing_script: hubspotWebhookRouting + proxy: + base_url: https://api.hubapi.com + decompress: true + paginate: + type: cursor + cursor_path_in_response: paging.next.after + limit_name_in_request: limit + cursor_name_in_request: after + response_path: results + docs: https://nango.dev/docs/api-integrations/hubspot ``` -**Parameters** + + + +```yaml +salesforce: + display_name: Salesforce + categories: + - crm + auth_mode: OAUTH2 + authorization_url: https://login.salesforce.com/services/oauth2/authorize + token_url: https://login.salesforce.com/services/oauth2/token + authorization_params: + prompt: consent + default_scopes: + - offline_access + token_response_metadata: + - instance_url + proxy: + base_url: ${connectionConfig.instance_url} + webhook_routing_script: salesforceWebhookRouting + post_connection_script: salesforcePostConnection + docs: https://nango.dev/docs/api-integrations/salesforce + connection_config: + instance_url: + type: string + title: Instance URL + description: The instance URL of your Salesforce account + format: uri + pattern: '^https?://.*$' +``` - - - The integration ID. - - - The connection ID. - - - The name of the action to trigger. - - - The necessary input for your action's `exec` function. - - + + + +```yaml +google: + display_name: Google + auth_mode: OAUTH2 + authorization_url: https://accounts.google.com/o/oauth2/v2/auth + token_url: https://oauth2.googleapis.com/token + authorization_params: + response_type: code + access_type: offline + prompt: consent + proxy: + base_url: https://www.googleapis.com + paginate: + type: cursor + cursor_path_in_response: nextPageToken + limit_name_in_request: maxSize + cursor_name_in_request: pageToken + response_path: items + docs: https://nango.dev/docs/api-integrations/google +``` -**Response** + + + +```yaml +notion: + display_name: Notion + categories: + - knowledge-base + - productivity + auth_mode: OAUTH2 + authorization_url: https://api.notion.com/v1/oauth/authorize + token_url: https://api.notion.com/v1/oauth/token + authorization_params: + response_type: code + owner: user + authorization_method: header + body_format: json + proxy: + retry: + after: 'Retry-After' + base_url: https://api.notion.com + headers: + 'Notion-Version': '2022-06-28' + paginate: + type: cursor + cursor_path_in_response: next_cursor + cursor_name_in_request: start_cursor + limit_name_in_request: page_size + response_path: results + docs: https://nango.dev/docs/api-integrations/notion +``` - -```json -{ - "id": "action_123456", - "statusUrl": "/action/action_123456" -} + + + +```yaml +linear: + display_name: Linear + categories: + - productivity + - ticketing + auth_mode: OAUTH2 + authorization_url: https://linear.app/oauth/authorize + token_url: https://api.linear.app/oauth/token + scope_separator: ',' + authorization_params: + prompt: consent + proxy: + base_url: https://api.linear.app + disable_pkce: true + webhook_routing_script: linearWebhookRouting + post_connection_script: linearPostConnection + webhook_user_defined_secret: true + docs: https://nango.dev/docs/api-integrations/linear ``` - -### Get async action result + + + +```yaml +slack: + display_name: Slack + categories: + - productivity + auth_mode: OAUTH2 + authorization_url: https://slack.com/oauth/v2/authorize + token_url: https://slack.com/api/oauth.v2.access + token_response_metadata: + - incoming_webhook.url + - incoming_webhook.channel + - incoming_webhook.channel_id + - bot_user_id + - team.id + proxy: + base_url: https://slack.com/api + paginate: + type: cursor + cursor_path_in_response: response_metadata.next_cursor + cursor_name_in_request: cursor + limit_name_in_request: limit + webhook_routing_script: slackWebhookRouting + docs: https://nango.dev/docs/api-integrations/slack +``` -Retrieves the result of an asynchronous action. + -```js -// Using the id -const result = await nango.getAsyncActionResult({ id: 'action_123456' }); + + +# All configuration fields + +Looking for the JSON Schema, find it in our [GitHub](https://github.com/NangoHQ/nango/blob/master/scripts/validation/providers/schema.json) + + + Allows to extend the configuration of another API. + + + + The display name of the provider, used in the UI. + -// OR using the statusUrl -const result = await nango.getAsyncActionResult({ statusUrl: '/action/action_123456' }); -``` + + The authentication mode. Must be one of: "API_KEY", "APP", "APP_STORE", "BASIC", "NONE", "OAUTH1", "OAUTH2", "OAUTH2_CC", "CUSTOM", "TBA", "JWT", "BILL", "TWO_STEP", "SIGNATURE". + -**Parameters** + + Authentication configuration. + + + The response type for authentication. + + + - - - - - The ID of the action to retrieve the result for. - - - The URL where the result can be retrieved. - - - - + + The authorization method. Must be `header` + -**Response** + + Query parameters of the authorization request. + + + Possible value: "offline" + + + Possible values: "auto", "force" + + + Possible value: "permanent" + + + Possible value: "never" + + + Whether to force verification + + + A unique string to be included in the request + + + Possible value: "consent" + + + The mode of the response + + + The type of the response + + + - -```json -{ - "your-properties": "The data returned by the action" -} -``` - + + The URL to get the OAuth 2 credentials from the external API. + -## Proxy + + Should the `authorization_url` be encoded or not + -Makes an HTTP request using the [proxy](/guides/platform/proxy-requests): + + An object containing key-value pairs for replacements in the authorization URL. + -```js -const config = { - endpoint: '/some-endpoint', - providerConfigKey: '', - connectionId: '' -}; + + The format of the request body. e.g: `json` + -await nango.get(config); // GET request -await nango.post(config); // POST request -await nango.put(config); // PUT request -await nango.patch(config); // PATCH request -await nango.delete(config); // DELETE request -``` + + An array of strings representing the categories of the API. + -**Parameters** + + An array of strings representing the `connectionConfig` that are automatically populated by post-connection functions. + - - - - - The endpoint of the request. - - - The integration ID (for credential injection). - - - The connection ID (for credential injection). - - - The headers of the request. - - - The query parameters of the request. - - - The body of the request. - - - The number of retries in case of failure (with exponential back-off). Optional, default 0. - - - Array of additional status codes to retry a request in addition to the 5xx, 429, ECONNRESET, ETIMEDOUT, and ECONNABORTED - - - The API base URL. Can be omitted if the base URL is configured for this API in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml). - - - Override the decompress option when making requests. Optional, defaults to false - - - The type of the response. - - - - + + Whether to decode the URL or not. + -**Response** + + The minimum list of scopes that are necessary to connect to the API. + - -The response from the external API is passed back to you exactly as Nango gets it: -- response code -- response headers -- response body - + + Disables the [PKCE](https://oauth.net/2/pkce/) extension to the Authorization Code flow. + -## Providers + + The URL to the developer API documentation. + -### List all providers + + The URL to the end user documentation (e.g: how to connect). + -Returns a list of providers. + + The name of the script to run after a connection is established. + -```js -await nango.listProviders() -``` + + Proxy configuration for the API. + + + The base URL for the API. + + + Whether to decompress the response. + + + Headers to be sent with each request. + + + Pagination configuration. + + + The name of the cursor parameter in the request. + + + The path to the cursor value in the response. + + + The name of the limit parameter in the request. + + + The rel attribute of the link header for pagination. + + + The path to the link in the response body. + + + The name of the offset parameter in the request. + + + The method to calculate the offset in the request. Must be one of: "per-page" or "by-response-size". Optional parameter that defaults to "by-response-size". + + + The starting value for the offset. + + + The path to the paginated data in the response. + + + The type of pagination. Must be one of: "link", "cursor", "offset". + + + + + Query parameters to be sent with each request. + + + Retry configuration. + + + The name of the rate-limit header, e.g. `after: 'X-Rate-Limit-Reset'` + + + The name of the rate-limit header, e.g. `at: 'x-ratelimit-reset'` + + + + + Configure a HTTP call to verify if credentials are valid, only used for API Key and Basic auth. + + + The HTTP method for verification. Must be either "GET" or "POST". + + + The endpoint for verification. + + + Override the base URL for verification. + + + Headers for the verification request. + + + + + -**Example Response** + + The metadata to capture from the callback request. + - -```json -{ - "data": [ - { - "name": "posthog", - "categories": ["dev-tools"], - "auth_mode": "API_KEY", - "proxy": { - "base_url": "https://api.posthog.com", - }, - "docs": "https://nango.dev/docs/api-integrations/posthog" - } - ] -} -``` - + + The URL used for refreshing the access token. Defaults to the `token_url` + -### Get a provider + + Parameters used for refreshing the access token. + + + The grant type for refreshing the token. Must be "refresh_token". + + + -Returns a specific provider. + + An object containing request parameters to pass to an authorization request. + -```js -await nango.getProvider({ provider: }) -``` + + The URL for making API an authorization request. + -**Example Response** + + The separator used between scopes in the authorization request. + Defaults to space, but some APIs sur `,` or `+`. + - -```json -{ - "data": { - "name": "posthog", - "categories": ["dev-tools"], - "auth_mode": "API_KEY", - "proxy": { - "base_url": "https://api.posthog.com", - }, - "docs": "https://nango.dev/docs/api-integrations/posthog" - } -} -``` - + + The signature method used for OAuth 1.0. Must be either "HMAC-SHA1" or "PLAINTEXT". + -### Get provider templates + + A buffer time (in seconds) before the token expiration to trigger a refresh. + -Returns the function templates available for a provider. + + Parameters used for obtaining the access token. + + + The grant type for obtaining the token. Must be either "authorization_code" or "client_credentials". + + + Additional request information for obtaining the token. + + + -```js -await nango.getProviderTemplates({ provider: }) -``` + + The authentication method used for token requests. Must be either "basic" or "custom". + -**Parameters** + + The unit of time for token expiration. Must be "milliseconds". + - - - The provider name. - - + + An array of strings representing metadata from the token response that will be saved in `connection.metadata`. + -**Example Response** + + The URL to get the OAuth 2 credentials from the external API. + - -```json -{ - "data": [ - { - "type": "action", - "name": "create-issue", - "description": "Create a GitHub issue", - "returns": ["GithubIssue"], - "json_schema": null - } - ] -} -``` - + + Should the `token_url` be encoded or not + -## Webhooks from Nango -### Verify Webhook Signature + + Wether the webhook secret is set by the user. + -Asserts that a Webhook is coming from Nango's backend. Verification uses `webhookSigningKey` when the client is constructed with one, otherwise it falls back to `secretKey`. On environments created after 2026-04-20 (or any environment that later rotated its API key), the signing key differs from the API key, so construct the client with `webhookSigningKey` (from **Environment Settings > Webhooks > Signing key**). + + Specifies a script to handle external [webhooks](/getting-started/use-cases/webhooks-from-external-apis). + -```js -const nango = new Nango({ - apiKey: '', - webhookSigningKey: '' -}); + + Specifies a fragment to be appended to the authorization URL, typically used to modify the redirection flow or pass additional information in the URL before the query parameters. + -async (req, res) => { - const isValid = nango.verifyIncomingWebhookRequest(req.body, req.headers); -} -``` + + The list of properties available in `${connectionConfig}` and their validation. + + + + + The type of this value. Must be "string". + + + The title of this value. + + + The description of this value. + + + An example of valid value to display in a UI. + + + A regex pattern for the credential. + + + The special format of this value (e.g: `hostname`, `uri`) + + + The order in which this field should be displayed in a UI + + + The documentation section relative to `docs_connect` + + + + + + + + The list of credentials and their validation, only filed if necessary (e.g: API_KEY, BASIC) + + + + + The type of the credential. Must be "string". + + + The title of the credential. + + + The description of the credential. + + + An example of the credential. + + + A pattern for the credential. + + + The format of the credential. + + + The documentation section for the credential. + + + + + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). -## Python - -Source: https://nango.dev/docs/reference/backend/backend-sdk/python.md +## Contribute Or Request Api ---- -title: 'Python' -sidebarTitle: 'Python' -icon: 'python' ---- - -Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. +Source: https://nango.dev/docs/integrations/contribute-or-request-api.md -## Java +--- +title: 'Contribute or request an API' +sidebarTitle: 'Contribute or request an API' +description: 'Add support for a new API to Nango' +--- -Source: https://nango.dev/docs/reference/backend/backend-sdk/java.md +## Option 1: Request a new API (most popular) ---- -title: 'Java' -sidebarTitle: 'Java' -icon: 'java' ---- - -Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. +The easiest way to add a new API is to request it from the Nango team. -## Ruby +If you have a shared Slack channel with Nango, send your request there. Otherwise, post in the `#request-a-new-api` channel of the [community](https://nango.dev/slack). -Source: https://nango.dev/docs/reference/backend/backend-sdk/ruby.md +We'll deliver them according to the SLAs on our [pricing page](https://www.nango.dev/pricing). ---- -title: 'Ruby' -sidebarTitle: 'Ruby' -icon: 'gem' ---- - -Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. +## Option 2: Contribute a new API yourself -## Go +To contribute a new API, follow the steps below and check out past [PRs](https://github.com/NangoHQ/nango/pulls?q=is%3Apr+is%3Aclosed) starting with `feat(integrations)` for examples. -Source: https://nango.dev/docs/reference/backend/backend-sdk/go.md +### Pre-requisites ---- -title: 'Go' -sidebarTitle: 'Go' -icon: 'golang' ---- - -Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. +- You have access to a test account for the API +- The API is publicly accessible +- The API is of type HTTP or SOAP -## Rust +Nango supports all authorization types (OAuth, API key, basic), including custom ones. -Source: https://nango.dev/docs/reference/backend/backend-sdk/rust.md +### Add an API configuration ---- -title: 'Rust' -sidebarTitle: 'Rust' -icon: 'rust' ---- - -Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. +Fork the [repo](https://github.com/NangoHQ/nango) and edit the API configurations file ([providers.yaml](https://nango.dev/providers-yaml)). See the [API configuration reference](/integrations/api-configuration) for the available fields. -## Php +You can test the configuration of your new provider with this command: -Source: https://nango.dev/docs/reference/backend/backend-sdk/php.md +```sh +npx tsx scripts/validation/providers/validate.ts +``` ---- -title: 'PHP' -sidebarTitle: 'PHP' -icon: 'php' ---- - -Coming soon. Use the [REST API](/reference/backend/http-api/authentication) in the meantime. +### Test the API -## Functions Cli +To test your new provider, go to the `nango` repo root and run: -Source: https://nango.dev/docs/reference/functions/functions-cli.md +```bash +docker compose up +``` ---- -title: 'Functions CLI' -sidebarTitle: 'Functions CLI' -icon: 'terminal' -description: "Full reference of the CLI available to implement, test & deploy Nango Functions." ---- - -### Install the Nango CLI - -Install the Nango CLI globally: -```bash -npm install nango -g -``` - -In the folder where you want your integration folder (e.g. root of your project), run: -```bash -nango init nango-integrations -``` - -This creates the `./nango-integrations` folder with some initial configuration and an example -sync script. The `nango-integrations` directory looks like this: -``` -nango-integrations/ -β”œβ”€β”€ .env -β”œβ”€β”€ index.ts -└── demo-github-integration # this is the integration unique ID and must match an integration ID in the UI - └── syncs/ - └── github-issue-example.ts -``` - -### CLI Authentication - -Add the following env vars. We recommend that you have a `.env` file in `./nango-integrations`: -```bash -NANGO_SECRET_KEY_PROD='' -NANGO_SECRET_KEY_DEV='' -``` - -Get your `prod` and `dev` secret keys from [Environment Settings > API Keys](https://app.nango.dev/environment-settings#api-keys) (toggle between the `prod` and `dev` environment in the left nav bar). - - -For self-hosting, set the `NANGO_HOSTPORT` env variable to `http://localhost:3003` (for local development) or your instance's URL. - - -## All CLI commands & command details - -Check out all CLI commands by running: -```bash -nango -``` - -Get details about a specific command by running: -```bash -nango [command] --help -``` - -## Interactive Mode - -The Nango CLI includes an interactive mode that prompts you for missing arguments. For example, if you run `nango create` without specifying the function type, integration, or name, the CLI will prompt you for them. - -This mode is enabled by default when you're in an interactive terminal session. - -### Usage Examples - -**Interactive Usage:** - -If you run a command without all the required arguments, the CLI will prompt you for them. - -```bash -# Running "nango create" without arguments -$ nango create - -? What type of function do you want to create? -❯ sync - action - on-event -``` - -**Non-Interactive (Explicit) Usage:** - -You can provide all arguments upfront to bypass the interactive prompts. This is ideal for scripting. - -```bash -nango create --sync --integration my-api --name get-contacts -``` - -### Disabling Interactive Mode - -You can disable interactive mode in two ways: - -1. **Using a flag:** Pass the `--no-interactive` flag to any command. - ```bash - nango create --no-interactive - ``` -2. **In a CI environment:** Interactive mode is automatically disabled when the `CI` environment variable is set. This is the standard way to detect CI/CD environments. - -### Backwards Compatibility - -Interactive mode is fully backward compatible. If you provide all the required arguments for a command, the CLI will not prompt you for anything and will behave exactly as it did before. - -## Flags & environment variables - -Global command flags: - -```bash -# Command flag to auto-confirm all prompts (useful for CI). -# Note: Destructive changes (like removing a sync or renaming a model) requires confirmation, even when --auto-confirm is set. To bypass this restriction, the --allow-destructive flag can be passed to nango deploy. ---auto-confirm - -# Command flag to disable interactive mode. ---no-interactive - -# Command flag to skip automatic package.json updates and package installs. -# Recommended in CI and monorepos where dependency updates are managed elsewhere. ---no-dependency-update -``` - -Environment variables: -```bash -# Recommendation: in a ".env" file in ./nango-integrations. - -# Authenticates the CLI (get the keys in the dashboard's Environment Settings > API Keys). -NANGO_SECRET_KEY_DEV=xxxx-xxx-xxxx -NANGO_SECRET_KEY_PROD=xxxx-xxx-xxxx - -# Nango's instance URL (OSS: change to http://localhost:3003 or your instance URL). -NANGO_HOSTPORT=https://api.nango.dev # Default value - -# How to handle CLI upgrades ("prompt", "auto" or "ignore"). -NANGO_CLI_UPGRADE_MODE=prompt # Default value - -# Whether to prompt before deployments. -# Note: Destructive changes (like removing a sync or renaming a model) requires confirmation, even when NANGO_DEPLOY_AUTO_CONFIRM is set to true. To bypass this restriction, the --allow-destructive flag can be passed to nango deploy. -NANGO_DEPLOY_AUTO_CONFIRM=false # Default value - -# Control automatic dependency updates. Set to "false" to skip installs (equivalent to --no-dependency-update). -NANGO_CLI_DEPENDENCY_UPDATE=true # Default value -``` - -## Dependency management - -For Zero YAML projects, the CLI can keep required dev dependencies (for example `nango` and related tooling) in sync and run package installation when needed. - -### `--no-dependency-update` - -Use `--no-dependency-update` to disable automatic `package.json` updates and dependency installs: - -```bash -nango deploy dev --no-dependency-update -``` - -This is especially useful when: - -- your CI pipeline should not modify files -- your monorepo manages dependencies at the workspace root -- you want full control over when `install` runs - -In CI, dependency updates are automatically disabled to avoid hanging. Passing `--no-dependency-update` explicitly is still recommended to make intent clear and silence the warning. - - -When dependency updates are disabled, Nango will not install dependencies for you. Ensure dependencies are already installed before running commands. - - -## Package manager support - -Nango supports all major JavaScript package managers. The CLI automatically detects and uses your package manager for installs. Detection works from the current directory upward (monorepo-aware), in this order: - -1. `package.json` `packageManager` field (Corepack standard) -2. lock files (`pnpm-lock.yaml`, `yarn.lock`, `bun.lockb` / `bun.lock`) -3. fallback to `npm` - -Supported managers are `npm`, `pnpm`, `yarn`, and `bun`. - - -**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). + + You can modify the ports in the `docker-compose.yaml` file if there are conflicts with + other local services on your host machine. -## Functions Sdk +When you are ready to test your API: -Source: https://nango.dev/docs/reference/functions/functions-sdk.md +**Create an integration** ---- -title: "Functions SDK" -sidebarTitle: "Functions SDK" -icon: "code" -description: "Full reference of the SDK available in Nango Functions." ---- - -## Examples - - - - ```ts - import { createSync } from 'nango'; - - const githubIssueDemoSchema = z.object({ ... }); - type GithubIssueDemo = z.infer; - - export default createSync({ - description: `Fetches the Github issues from all a user's repositories.`, - version: '1.0.0', - frequency: 'every hour', - autoStart: true, - metadata: z.void(), - models: { - GithubIssueDemo: githubIssueDemoSchema - }, - - exec: async (nango) => { - // Mark the start of deletion tracking - await nango.trackDeletesStart('GithubIssueDemo'); - - // Fetch issues from GitHub. - const res = await nango.get({ - endpoint: '/repos/NangoHQ/interactive-demo/issues?labels=demo&sort=created&direction=asc' - }); - - // Map issues to your preferred schema. - const issues: GithubIssueDemo[] = res.data.map(({ id, title, html_url }: any) => { - return { id, title, url: html_url }; - }); - - // Persist issues to the Nango cache. - await nango.batchSave(issues, 'GithubIssueDemo'); - - // Detect and mark deleted records - await nango.trackDeletesEnd('GithubIssueDemo'); - }, - }); - ``` - - - ```ts - import { createAction } from 'nango'; - import { GithubCreateIssueInput, GithubCreateIssueResult } from '../../models.js'; - - export default createAction({ - description: `Create an issue in GitHub`, - version: '1.0.0', - input: GithubCreateIssueInput, - output: GithubCreateIssueResult, - - exec: async (nango, input) => { - // Create a GitHub issue. - const res = await nango.post({ - endpoint: '/repos/NangoHQ/interactive-demo/issues', - data: { - title: `[demo] ${input.title}`, - body: `The body of the issue.`, - labels: ['automatic'] - } - }); - - // Send response. - return { url: res.data.html_url, status: res.status }; - }, - }); - ``` - - - -Read more about [integration functions](/guides/functions/functions-guide) to understand what role they play in Nango. - -## Configuration - -### `createSync` - - - The description of the sync. - - - - The function that will be called when the sync is triggered. - - - - The frequency of the sync. - - ```ts - frequency: 'every 1 minute', - frequency: 'every hour', - frequency: 'every 2 days' - frequency: 'every 3 week' - ``` - - - - The models that will be synced by this function. - You need one endpoint per model. - - ```ts - models: { - GithubIssue: z.object({ - id: z.string(), - }), - }, - ``` - - - - Optional schema defining the shape of checkpoint data for this sync. - Use checkpoints to save progress and avoid re-fetching all data on every run. See the [checkpoints guide](/guides/functions/syncs/checkpoints) for details. - - ```ts - checkpoint: z.object({ - cursor: z.string(), - }), - ``` - - - - If `true`, automatically runs the sync when a new connection is created. - Otherwise, it needs to be triggered via the API or Nango UI. - - - - The connection's metadata of the action. - - ```ts - metadata: z.object({ - userId: z.string(), - }); - ``` - - - - The function that will be called when a webhook is received. - - - - The integration's scopes required by the action. - This field is for documentation purposes only and currently not enforced by Nango. - - ```ts - scopes: ['read:user', 'write:user'], - ``` - - - - [DEPRECATED] Instead use `await nango.trackDeletesStart('modelName')` and `await nango.trackDeletesEnd('modelName')` inside the sync `exec` function. - - When `trackDeletes` is set to `true`, Nango automatically detects deleted records **during full syncs only** and marks them as deleted in each record’s metadata (soft delete). These records remain stored in the cache. - - When set to `false`, Nango does not mark missing records as deleted, even if they weren’t returned in the latest full syncβ€”they simply remain in the cache unchanged. - - Defaults to `false`. - - - - The version of the sync. - Use it to track changes to the sync inside Nango's UI. - - - - The webhook subscriptions of the sync. - Specify the types of webhooks the method `onWebhook` will handle. - If a webhook type is not on the list, it will not be handled. - - ```ts - webhookSubscriptions: ['*'], - ``` - - - - [DEPRECATED] Use the [`GET /records`](/reference/backend/http-api/sync/records-list) API endpoint to fetch records. - - -### `createAction` - - - The description of the sync. - - - - - - The function that will be called when the action is triggered. - - - - The input required by the action when triggering it. - - ```ts - input: z.object({ - title: z.string(), - }); - ``` - - - - The output of the action. - - ```ts - output: z.object({ - issueId: z.string(), - }); - ``` - - - - The version of the sync. - Use it to track changes to the sync inside Nango's UI. - - - - The connection's metadata of the action. - - ```ts - metadata: z.object({ - userId: z.string(), - }); - ``` - - - - The integration's scopes required by the action. - This field is for documentation purposes only and currently not enforced by Nango. - - ```ts - scopes: ['read:user', 'write:user'], - ``` - - - - [DEPRECATED] Use the [`POST /action/trigger`](/reference/backend/http-api/action/trigger) API endpoint to trigger actions. - - -### `createOnEvent` - - - The description of the sync. - - - - The event that will trigger this function. - - - - The function that will be called when the action is triggered. - - - - The version of the onEvent function. - Use it to track changes to the onEvent function inside Nango's UI. - - - - The connection's metadata of the function. - - ```ts - metadata: z.object({ - userId: z.string(), - }); - ``` - - -## HTTP requests - -Makes an HTTP request inside an integration function: - -```js -import type { ProxyConfiguration } from 'nango'; - -const config: ProxyConfiguration = { endpoint: '/some-endpoint' }; - -await nango.get(config); // GET request -await nango.post(config); // POST request -await nango.put(config); // PUT request -await nango.patch(config); // PATCH request -await nango.delete(config); // DELETE request -``` - - - Note that all HTTP requests benefit from automatic credential injection. Because functions are executed in the context of a specific integration & connection, Nango can automatically retrieve & refresh the relevant API credentials. - - -**Parameters** - - - - - - The endpoint of the request. - - - The headers of the request. - - - The query parameters of the request. - - - The body of the request. - - - The number of retries in case of failure (with exponential back-off). Optional, default 0. - - - Array of HTTP status codes to retry, in addition to those specified [below](#when-a-failed-request-is-retried). - - - The API base URL. Can be omitted if the base URL is configured for this API in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml). - - - Override the decompress option when making requests. Optional, defaults to false - - - The type of the response. - - - - - -**Response** - - - ```json - { - data: {}, // the response provided by the server - status: 200, // the HTTP status code - headers: {}, // the HTTP headers - config: {}, // the config provided for the request - request: {} // the request that generated this response - } - ``` - - - The response object is an [Axios response](https://axios-http.com/docs/res_schema). - - - -## HTTP request retries - -Configure behavior with two optional fields on your [HTTP request](#http-requests) config: [`retries`](#param-retries) and [`retryOn`](#param-retry-on). - -### When a failed request is retried - -Nango retries only when the failure looks **transient**. Exact rules depend on the integration: - -| Field | Condition for Retry | -| --- | --- | -| **Network Error** | If code is one of:
`ECONNRESET`, `ETIMEDOUT`, `ECONNABORTED`, `ECONNREFUSED`, `EHOSTUNREACH`, `EAI_AGAIN` | -| **Transient HTTP Error** | If provider specific `proxy.retry.error_code` is configured in [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml), only matching statuses are retried.

Otherwise, by default, status codes `401`, `429`, `5xx` are retried.

Additional status specified in [`retryOn`](#param-retry-on) are always retried in addition to the above statuses. | - -If nothing in the table applies, the error is **not** retried. - - -Status `401` is retryable so Nango can recover after refreshing the connection with potentially updated credentials. If a `401` happens and the connection credentials **do not change** on the next fetch, Nango treats that as a definitive authentication failure and stops performing additional retries - - -### Backoff - -Between retry attempts Nango waits with **exponential backoff**: first wait **3000ms**, then each wait doubles, capped at **10 minutes**. - -## Logging - -You can collect logs in integration functions. This is particularly useful when: - -- developing, to debug your integration functions -- in production, to collect information about integration function executions & understand issues - -Collect logs in integration functions as follows: - -```ts -await nango.log("This is a log."); // default log level is 'info' -await nango.log("This is an info log", { level: 'info' }); -await nango.log("This is a warning", { level: 'warn' }); -await nango.log("This is an error", { level: 'error' }); -``` - -### Log Levels - -Nango supports the following log levels (from most to least verbose): `debug`, `info`, `warn`, `error`, `off`. - -Only logs with a level greater than or equal to the configured logger level will surfaced in the Nango UI Logs tab. For example, if the logger level is set to `warn`, only `warn` and `error` logs will be shown. - -**Default log levels:** -- **All cloud environments**: `warn` (only warnings and errors are logged by default) -- **CLI dry-run**: `debug` (all logs are shown in the console) - -### Configuring Log Level - -You can override the default log level in two ways: - -1. **Environment variable**: Set `NANGO_LOGGER_LEVEL` in your environment settings (values: `debug`, `info`, `warn`, `error`, `off`). It will apply to all your functions running in this environment and can be overridden in functions by using `nango.setLogger(...)` - -2. **In your function code**: -```ts -nango.setLogger({ level: 'debug' }); // All logs will show in your cloud environments. It will apply to all `nango.log()` following this statement. -nango.setLogger({ level: 'off' }); // No logs will show -``` - -Logs can be viewed & searched in the Nango UI. We plan to make them exportable in the future as well. - -You can monitor your usage of custom logs in the [billing tab](https://app.nango.dev/prod/team/billing) of your Nango dashboard. - -## Environment variables - -Integration functions sometimes need to access sensitive variables that should not be revealed directly in the code. - -For this, you can define environment variables in the Nango UI, in the _Environment Settings_ tab. Then you can retrieve these environment variables from integration functions with: - -```js -await nango.getEnvironmentVariables(); -``` - -**Parameters** - -No parameters. - -**Response** - - - ```json - [ - { - "name": "MY_SECRET_KEY", - "value": "SK_373892NSHFNCOWFO..." - } - ] - ``` - - -## Trigger action - -You can call action functions from other integration functions with: - -```js -await nango.triggerAction('', { 'custom_key1': 'custom_value1' }); -``` - -**Parameters** - - - - The name of the action to trigger. - - - The necessary input for your action's `exec` function. - - - -**Response** - - - ```json - { - "your-properties": "The data returned by the action" - } - ``` - - -## Paginate through API responses - -Nango provides a helper to automatically paginate endpoint responses. - -Similar to [HTTP requests](/reference/functions/functions-sdk#http-requests), the `nango.paginate()` method takes in a `ProxyConfiguration` parameter. - -Use the `paginate` field to of the `ProxyConfiguration` to specify how the endpoint's pagination work. Here's an example for a Jira endpoint: - -```ts -const config: ProxyConfiguration = { - // https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-projects/#api-rest-api-3-project-search-get - endpoint: `/ex/jira/${cloud.cloudId}/rest/api/3/project/search`, - params: { - properties: properties - }, - paginate: { - type: 'offset', - offset_name_in_request: 'startAt', - response_path: 'values', - limit_name_in_request: 'maxResults', - limit: 50, - on_page: async ({ nextPageParam, response }) => { - await nango.log(`Next offset value = ${nextPageParam}`); - await nango.log(`Fetched ${response.data.total} records`); - }, - }, - headers: { - 'X-Atlassian-Token': 'no-check' - }, - retries: 10 -}; - -for await (const projects of nango.paginate(config)) { - const projectsToSave = toProjects(projects, cloud.baseUrl); - await nango.batchSave(projectsToSave, 'Project'); -} -``` - -As shown in the example above, use a `for` loop to iterate through the paginated results. - - - Nango has pre-configured the pagination settings for some popular APIs, so you don't have to specify them in functions. - - You can view the pre-configured pagination settings for all APIs in the [providers.yaml](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml) file. - - Please note that some APIs have diverging pagination strategies per endpoint, so you might still need to override pre-configured pagination settings at times. - - -The pagination helper supports 3 types of pagination: `cursor`, `link` or `offset` with the following settings: - - - - - - - - _For all pagination types._ - - The name of the parameter containing the number of items per page, in the request. Inserted in the query parameters for `GET`/`DELETE`, in the body for `POST`/`PUT`/`PATCH`. - - - _For all pagination types._ - - The maximum number of items per page. If omitted, no limit will be sent to the external endpoint, relying on the endpoint's default limit. - - - _For all pagination types._ - - The path of the field containing the results, in the response. If omitted or empty string, it defaults to the root. Use `.` for nested fields, e.g. `"results.contacts"`. - - - _For all pagination types._ - - The pagination strategy. - - - _For cursor pagination only (required)._ - - The path of the field containing the cursor for the next page, in the response. Use `.` for nested fields, e.g. `"pagination.cursor"`. - - - _For cursor pagination only (required)._ - - The name of the parameter containing the cursor for the next page, in the request. Inserted in the query parameters for `GET`/`DELETE`, in the body for `POST`/`PUT`/`PATCH`. - - - _`For link pagination (required unless link_path_in_response_body is specified).`_ - - The header containing the link to the next page, in the response. - - - _`For link pagination (required unless link_rel_in_response_header is specified).`_ - - The path of the field containing the link to the next page, in the response. Use `.` for nested fields, e.g. `"pagination.link"`. - - - _For offset pagination only (required)._ - - The name of the parameter containing the offset for the next page, in the request. Inserted in the query parameters for `GET`/`DELETE`, in the body for `POST`/`PUT`/`PATCH`. - - - _For offset pagination only (optional)._ - - The initial offset. Defaults to 0, but some APIs start at 1. - - - _For offset pagination only (optional)._ - - The offset calculation method. `by-response-size` (default) means the offset is incremented by the number of results. `per-page` means the offset is incremented by one for each page. - - - _For all pagination types (optional)._ - - A callback function that is called after each page is fetched. Useful for logging or tracking pagination progress. The callback receives the next page parameter and the full Axios response object, which includes the response data, status, headers, and request configuration. - - - - - - - You can find details on the pagination [types](https://github.com/NangoHQ/nango/blob/master/packages/runner-sdk/models.d.ts) and [logic](https://github.com/NangoHQ/nango/blob/master/packages/runner-sdk/lib/paginate.service.ts) in the code. - - - -## Get Integration - -Returns the current integration information - -```js -await nango.getIntegration(); -``` - -With credentials - -```js -await nango.getIntegration({ include: ['credentials'] }); -``` - -**Parameters** - -See `GET /integrations/{uniqueKey}` query parameters: [documentation](/reference/backend/http-api/integration/get) - -**Response** - -See `GET /integrations/{uniqueKey}` response: [documentation](/reference/backend/http-api/integration/get) - -## Manage connection metadata - -### Get connection metadata - -Returns the connection's metadata. - -```js -await nango.getMetadata(); -``` - -Better, you can specify the type of the metadata; - -```ts -interface CustomMetadata { - anyKey: Record; -} -const myTypedMetadata = await nango.getMetadata(); -``` - -**Parameters** - -No parameters. - -**Example Response** - - - ```json - { - "custom_key1": "custom_value1" - } - ``` - - -### Set connection metadata - -Set custom metadata for the connection (overrides existing metadata). - -```js -await nango.setMetadata({ 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); -``` - -**Parameters** - - - - The custom metadata to store in the connection. - - - -**Response** - -Empty response. - -### Edit connection metadata - -Edit custom metadata for the connection. Only overrides & adds specified properties, not the entire metadata. - -```js -await nango.updateMetadata({ 'CUSTOM_KEY1': 'CUSTOM_VALUE1' }); -``` - -**Parameters** - - - - The custom metadata to store in the connection. - - - -**Response** - -Empty response. - -## Get the connection credentials - -Returns a specific connection with credentials. - -```js -await nango.getConnection(); -``` - - - The response content depends on the API authentication type (OAuth 2, OAuth 1, API key, Basic auth, etc.). - - - - When you fetch the connection with this API endpoint, Nango will check if the access token has expired. If it has, it will refresh it. - - We recommend not caching tokens for longer than 5 minutes to ensure they are fresh. - - -**Parameters** - - - - An optional integration ID to override the one from the function context. - - - An optional connection ID to override the one from the function context. - - - - - Defaults to `false`. If `false`, the token will only be refreshed if it expires within 15 minutes. If `true`, a token refresh attempt will happen on each request. This is only useful for testing and should not be done at high traffic. - - - Defaults to `false`. If `false`, the refresh token is not included in the response, otherwise it is. In production, it is not advised to return the refresh token, for security reasons, since only the access token is needed to sign requests. - - - Defaults to `false`. If true, this will refresh the JWT token for GitHub App / Github App OAuth connections - - - - - -**Example Response** - - - ```json - { - "id": 18393, - "created_at": "2023-03-08T09:43:03.725Z", - "updated_at": "2023-03-08T09:43:03.725Z", - "provider_config_key": "github", - "connection_id": "1", - "credentials": { - "type": "OAUTH2", - "access_token": "gho_tsXLG73f....", - "refresh_token": "gho_fjofu84u9....", - "expires_at": "2024-03-08T09:43:03.725Z", - "raw": { // Raw token response from the OAuth provider: Contents vary! - "access_token": "gho_tsXLG73f....", - "refresh_token": "gho_fjofu84u9....", - "token_type": "bearer", - "scope": "public_repo,user" - } - }, - "connection_config": { - "subdomain": "myshop", - "realmId": "XXXXX", - "instance_id": "YYYYYYY" - }, - "account_id": 0, - "metadata": { - "myProperty": "yes", - "filter": "closed=true" - } - } - ``` - - -## Sync-specific helper methods - -Sync functions persist data updates to the Nango cache, which your app later fetches. See the [sync functions section](/guides/functions/syncs/sync-functions). - -### Checkpoints - -Checkpoints allow syncs to save their progress and resume from where they left off. This is useful for: -- Resuming after failures without re-fetching all data -- Tracking pagination state across sync runs -- Storing custom cursor/offset values - -To use checkpoints, define a `checkpoint` schema in your sync configuration (see [Configuration](#createsync)). For a complete guide on implementing incremental syncs with checkpoints, see the [checkpoints guide](/guides/functions/syncs/checkpoints). If you are migrating from `nango.lastSyncDate`, see the [migration guide](/guides/platform/migrations/migrate-to-checkpoints). - -#### getCheckpoint() - -Retrieves the current checkpoint. Returns `null` on first run or after a reset. - -```ts -const checkpoint = await nango.getCheckpoint(); -if (checkpoint) { - // Resume from checkpoint - startCursor = checkpoint.cursor; -} -``` - -**Response** - -Returns the checkpoint object matching your schema, or `null` if no checkpoint exists. - -#### saveCheckpoint() - -Saves the current progress. Call this after processing each batch of data to enable resumption if the sync fails. - -```ts -await nango.saveCheckpoint({ cursor: nextCursor }); -``` - -**Parameters** - - - - The checkpoint data matching your defined schema. - - - -#### clearCheckpoint() - -Clears the checkpoint. Use at the end of a full sync so the next run starts from the first page. Checkpoints are also automatically cleared when triggering a sync with `reset: true`. - -```ts -await nango.clearCheckpoint(); -``` - -### Save records - -Upserts records to the Nango cache (i.e. create new records, update existing ones). Each record needs to contain a unique `id` field used to dedupe records. - -```js -const githubIssues: GitHubIssue[] = ...; // Fetch issues from GitHub API. - -await nango.batchSave(githubIssues, 'GitHubIssue'); -``` - -**Parameters** - - - - The list of records to persist. - - - The model type of the records to persist. - - - -### Delete records - -Marks records as deleted in the Nango cache. Deleted records are still returned when you fetch them, but they are marked as deleted in the record's metadata (i.e. soft delete). - - -This does not remove cached payloads. - -`nango.batchDelete()` is used to mark records as deleted in Nango because they were deleted on the external API. Nango may still keep the last-known payload so your customer can react to the deletion event. - -If you want to permanently remove data from Nango storage for cost or compliance reasons, use [record pruning instead](/reference/backend/http-api/sync/prune-records). - - -To implement deletion detection in your syncs, [follow this guide](/guides/functions/syncs/deletion-detection). - -The only field that needs to be present in each record when calling `batchDelete` is the unique `id`; the other fields are ignored. - -```js -const githubIssuesToDelete: { id: string }[] = ...; // Fetch issues to delete from GitHub API. - -await nango.batchDelete(githubIssuesToDelete, 'GitHubIssue'); -``` - -**Parameters** - - - - The list of records to delete. - - - The model type of the records to delete. - - - -### Detect deletions automatically - -Automatically detects and marks records as deleted by comparing what existed before `trackDeletesStart` with what was saved between `trackDeletesStart` and `trackDeletesEnd`. - - -This does not remove cached payloads. - -`nango.trackDeletesStart()`/`nango.trackDeletesEnd()` are used to mark records as deleted in Nango because they were not returned by the external API. Nango may still keep the last-known payload so your customer can react to the deletion event. - -If you want to permanently remove data from Nango storage for cost or compliance reasons, use [record pruning instead](/reference/backend/http-api/sync/prune-records). - - -```js -await nango.trackDeletesStart('ModelName'); - -// ... fetch and save all records ... - -await nango.trackDeletesEnd('ModelName'); -``` - -Call `trackDeletesStart` at the beginning of your sync execution, before fetching any data. Call `trackDeletesEnd` after all records have been saved with `batchSave`. Nango will compare the records that existed before `trackDeletesStart` with those saved in the window and mark any missing records as deleted. - -**Parameters** (both functions) - - - - The model type to detect deletions for. - - - -**Important considerations:** - -- Only use within syncs that fetch the complete dataset between `trackDeletesStart` and `trackDeletesEnd` -- If your sync fails or doesn't fetch the complete dataset, avoid calling `trackDeletesEnd` as it may cause false deletions -- Records are soft deleted (marked with `_metadata.deleted = true`) and remain in the cache - - -`deleteRecordsFromPreviousExecutions` is deprecated. Use `trackDeletesStart`/`trackDeletesEnd` instead. - - -For more details on deletion detection strategies, see the [detecting deletes guide](/guides/functions/syncs/deletion-detection). - -### Update records - -Updates records in the Nango cache by merging the given data into the existing record. The `id` field is required in each record and used to determine what existing record to merge into. - -`batchUpdate` is primarily useful in webhook sync functions, where you receive partial updates from a webhook and want to merge them into the existing records. - -The merge algorithm used is a deep merge. Nested objects are merged recursively, while arrays always use the new value for the array. Any fields not present in the update record are left unchanged. - -```ts -// Create partial GitHub Issue update records with only id and state. -const githubIssues: Pick[] = ...; - -await nango.batchUpdate(githubIssues, 'GitHubIssue'); -``` - -**`Take special care when using batchUpdate with records containing arrays.`** The merge algorithm does not attempt to merge arrays, but rather always uses the value of the new array. - -```ts -// given a an existing record: -// { id: '1', tags: [{id: 12, name: 'Dev'}, {id: 13, name: "QA"}] } -const updates: Pick[] = [ - { id: '1', tags: [{id: 14, name: 'UX'}] } -]; - -// after the update, the record will be: -// { id: '1', tags: [{id: 14, name: "UX"}] } -await nango.batchUpdate(updates, 'Issue'); -``` - -**Parameters** - - - - The list of partial records to persist. - - - The model type of the records to persist. - - - -### Get records - -Fetches records from the Nango cache by ID. Returns a Map where the keys are the requested IDs, and the values are the corresponding records. Any records that are not found will simply be absent from the map. - -Example usage: - -```ts -const records = await nango.getRecordsById(['1', '2', '3'], 'Issue'); - -if (records.has('1')) { - const record = records.get('1'); - await nango.log(record.title); -} else { - await nango.log('Record with id 1 not found.'); -} -``` - - - Fetching records by ID is useful when you need to update specific records with a more granular approach than [`nango.batchUpdate()`](/reference/functions/functions-sdk#update-records), which performs a deep merge. Note that `nango.batchUpdate()` is more performant than using `nango.getRecordsById()`, followed by `nango.batchSave()`. - - A common use case is when handling external webhooks, where only a partial update of a record is received from an API. - - -### Variant - -If you are using sync variants, you can access the current variant name via the `nango.variant` property. - -```ts -export default createSync({ - exec: async (nango) => { - await nango.log(`Running sync with variant: ${nango.variant}`); - - // Customize sync behavior based on variant - const res = await nango.get({ - endpoint: `/spreadsheet/${nango.variant}` - }); - - // Rest of sync implementation... - }, -}); -``` - -## Action-specific helper methods - -### `ActionError` - -You can use `ActionError` in an action function to return a descriptive error to your app when needed: - -```ts - -export default createAction({ - exec: async (nango) => { - // Something went wrong... - - throw new ActionError({ any_key: 'any_value' }); - }, -}); -``` - -In this case, the response to the trigger action call will be: - -```json -{ - "error_type": "action_script_failure", - "payload": { - "any_key": "any_value" - } -} -``` - -## Relative imports in functions - -You can import relative files into your functions to allow for code abstraction and to -maintain DRY (Don't Repeat Yourself) principles. This means you can reuse code across -different functions by importing it. The imported file must live in the `nango-integrations` -directory and can be imported in the following way: - -```ts -import { issueMapper } from '../mappers/issue-mappper'; - -export default createSync({ - exec: async (nango) => { - // Fetch issues from GitHub. - const res = await nango.get({ - endpoint: '/repos/NangoHQ/interactive-demo/issues?labels=demo&sort=created&direction=asc' - }); - - // Persist issues to the Nango cache. - await nango.batchSave(issueMapper(res.data), 'GithubIssueDemo'); - }, -}); -``` - -Note that you cannot import third-party modules at this time. Additionally, if there is a compilation error in an imported file, the entry point file will also fail to compile. - -## Pre-included Dependencies - -Some libraries are pre-included for usage in functions: - -- [zod](https://github.com/colinhacks/zod) -- [crypto / node:crypto](https://nodejs.org/api/crypto.html#crypto) -- [url / node:url](https://nodejs.org/api/url.html#url) - -Please reach out in the [community](https://nango.dev/slack) if you would like to request additional ones. - - - **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - +Open the [local Nango UI](http://localhost:3003) in your browser and add a new integration with your freshly added API. -## Overview +**Create a connection** -Source: https://nango.dev/docs/integrations/overview.md +Create a new connection for this API in the Nango UI, completing the authorization flow. ---- -title: Explore APIs & integrations -sidebarTitle: Overview ---- - - -Nango is the leading provider of **API access for AI agents & apps**. It is designed for developers building integrations for their users, with full flexibility. - - - - -800+ APIs & thousands of integrations. - - -We deliver them in <48h. - - -It's fast & easy. - - +**Verify the connection** -## Api Configuration +If all goes well, you should see your new connection in the _Connections_ tab. Check the connection details and make sure that the credentials are valid. -Source: https://nango.dev/docs/integrations/api-configuration.md +### Document the API ---- -title: 'API configuration (`providers.yaml`)' -sidebarTitle: 'API configuration' ---- - -API configurations are listed in the `providers.yaml` file, located in the [Nango GitHub repository](https://github.com/NangoHQ/nango/blob/master/packages/providers/providers.yaml). - -# Examples - - - - -```yaml -hubspot: - display_name: HubSpot - categories: - - marketing - - support - - crm - auth_mode: OAUTH2 - authorization_url: https://app.hubspot.com/oauth/authorize - token_url: https://api.hubapi.com/oauth/v1/token - connection_configuration: - - portalId - post_connection_script: hubspotPostConnection - webhook_routing_script: hubspotWebhookRouting - proxy: - base_url: https://api.hubapi.com - decompress: true - paginate: - type: cursor - cursor_path_in_response: paging.next.after - limit_name_in_request: limit - cursor_name_in_request: after - response_path: results - docs: https://nango.dev/docs/api-integrations/hubspot -``` - - - - -```yaml -salesforce: - display_name: Salesforce - categories: - - crm - auth_mode: OAUTH2 - authorization_url: https://login.salesforce.com/services/oauth2/authorize - token_url: https://login.salesforce.com/services/oauth2/token - authorization_params: - prompt: consent - default_scopes: - - offline_access - token_response_metadata: - - instance_url - proxy: - base_url: ${connectionConfig.instance_url} - webhook_routing_script: salesforceWebhookRouting - post_connection_script: salesforcePostConnection - docs: https://nango.dev/docs/api-integrations/salesforce - connection_config: - instance_url: - type: string - title: Instance URL - description: The instance URL of your Salesforce account - format: uri - pattern: '^https?://.*$' -``` - - - - -```yaml -google: - display_name: Google - auth_mode: OAUTH2 - authorization_url: https://accounts.google.com/o/oauth2/v2/auth - token_url: https://oauth2.googleapis.com/token - authorization_params: - response_type: code - access_type: offline - prompt: consent - proxy: - base_url: https://www.googleapis.com - paginate: - type: cursor - cursor_path_in_response: nextPageToken - limit_name_in_request: maxSize - cursor_name_in_request: pageToken - response_path: items - docs: https://nango.dev/docs/api-integrations/google -``` - - - - -```yaml -notion: - display_name: Notion - categories: - - knowledge-base - - productivity - auth_mode: OAUTH2 - authorization_url: https://api.notion.com/v1/oauth/authorize - token_url: https://api.notion.com/v1/oauth/token - authorization_params: - response_type: code - owner: user - authorization_method: header - body_format: json - proxy: - retry: - after: 'Retry-After' - base_url: https://api.notion.com - headers: - 'Notion-Version': '2022-06-28' - paginate: - type: cursor - cursor_path_in_response: next_cursor - cursor_name_in_request: start_cursor - limit_name_in_request: page_size - response_path: results - docs: https://nango.dev/docs/api-integrations/notion -``` - - - - -```yaml -linear: - display_name: Linear - categories: - - productivity - - ticketing - auth_mode: OAUTH2 - authorization_url: https://linear.app/oauth/authorize - token_url: https://api.linear.app/oauth/token - scope_separator: ',' - authorization_params: - prompt: consent - proxy: - base_url: https://api.linear.app - disable_pkce: true - webhook_routing_script: linearWebhookRouting - post_connection_script: linearPostConnection - webhook_user_defined_secret: true - docs: https://nango.dev/docs/api-integrations/linear -``` - - - - -```yaml -slack: - display_name: Slack - categories: - - productivity - auth_mode: OAUTH2 - authorization_url: https://slack.com/oauth/v2/authorize - token_url: https://slack.com/api/oauth.v2.access - token_response_metadata: - - incoming_webhook.url - - incoming_webhook.channel - - incoming_webhook.channel_id - - bot_user_id - - team.id - proxy: - base_url: https://slack.com/api - paginate: - type: cursor - cursor_path_in_response: response_metadata.next_cursor - cursor_name_in_request: cursor - limit_name_in_request: limit - webhook_routing_script: slackWebhookRouting - docs: https://nango.dev/docs/api-integrations/slack -``` - - - - - -# All configuration fields - -Looking for the JSON Schema, find it in our [GitHub](https://github.com/NangoHQ/nango/blob/master/scripts/validation/providers/schema.json) - - - Allows to extend the configuration of another API. - - - - The display name of the provider, used in the UI. - - - - The authentication mode. Must be one of: "API_KEY", "APP", "APP_STORE", "BASIC", "NONE", "OAUTH1", "OAUTH2", "OAUTH2_CC", "CUSTOM", "TBA", "JWT", "BILL", "TWO_STEP", "SIGNATURE". - - - - Authentication configuration. - - - The response type for authentication. - - - - - - The authorization method. Must be `header` - - - - Query parameters of the authorization request. - - - Possible value: "offline" - - - Possible values: "auto", "force" - - - Possible value: "permanent" - - - Possible value: "never" - - - Whether to force verification - - - A unique string to be included in the request - - - Possible value: "consent" - - - The mode of the response - - - The type of the response - - - - - - The URL to get the OAuth 2 credentials from the external API. - - - - Should the `authorization_url` be encoded or not - - - - An object containing key-value pairs for replacements in the authorization URL. - - - - The format of the request body. e.g: `json` - - - - An array of strings representing the categories of the API. - - - - An array of strings representing the `connectionConfig` that are automatically populated by post-connection functions. - - - - Whether to decode the URL or not. - - - - The minimum list of scopes that are necessary to connect to the API. - - - - Disables the [PKCE](https://oauth.net/2/pkce/) extension to the Authorization Code flow. - - - - The URL to the developer API documentation. - - - - The URL to the end user documentation (e.g: how to connect). - - - - The name of the script to run after a connection is established. - - - - Proxy configuration for the API. - - - The base URL for the API. - - - Whether to decompress the response. - - - Headers to be sent with each request. - - - Pagination configuration. - - - The name of the cursor parameter in the request. - - - The path to the cursor value in the response. - - - The name of the limit parameter in the request. - - - The rel attribute of the link header for pagination. - - - The path to the link in the response body. - - - The name of the offset parameter in the request. - - - The method to calculate the offset in the request. Must be one of: "per-page" or "by-response-size". Optional parameter that defaults to "by-response-size". - - - The starting value for the offset. - - - The path to the paginated data in the response. - - - The type of pagination. Must be one of: "link", "cursor", "offset". - - - - - Query parameters to be sent with each request. - - - Retry configuration. - - - The name of the rate-limit header, e.g. `after: 'X-Rate-Limit-Reset'` - - - The name of the rate-limit header, e.g. `at: 'x-ratelimit-reset'` - - - - - Configure a HTTP call to verify if credentials are valid, only used for API Key and Basic auth. - - - The HTTP method for verification. Must be either "GET" or "POST". - - - The endpoint for verification. - - - Override the base URL for verification. - - - Headers for the verification request. - - - - - - - - The metadata to capture from the callback request. - - - - The URL used for refreshing the access token. Defaults to the `token_url` - - - - Parameters used for refreshing the access token. - - - The grant type for refreshing the token. Must be "refresh_token". - - - - - - An object containing request parameters to pass to an authorization request. - - - - The URL for making API an authorization request. - - - - The separator used between scopes in the authorization request. - Defaults to space, but some APIs sur `,` or `+`. - - - - The signature method used for OAuth 1.0. Must be either "HMAC-SHA1" or "PLAINTEXT". - - - - A buffer time (in seconds) before the token expiration to trigger a refresh. - - - - Parameters used for obtaining the access token. - - - The grant type for obtaining the token. Must be either "authorization_code" or "client_credentials". - - - Additional request information for obtaining the token. - - - - - - The authentication method used for token requests. Must be either "basic" or "custom". - - - - The unit of time for token expiration. Must be "milliseconds". - - - - An array of strings representing metadata from the token response that will be saved in `connection.metadata`. - - - - The URL to get the OAuth 2 credentials from the external API. - - - - Should the `token_url` be encoded or not - - - - - Wether the webhook secret is set by the user. - - - - Specifies a script to handle external [webhooks](/getting-started/use-cases/webhooks-from-external-apis). - - - - Specifies a fragment to be appended to the authorization URL, typically used to modify the redirection flow or pass additional information in the URL before the query parameters. - - - - The list of properties available in `${connectionConfig}` and their validation. - - - - - The type of this value. Must be "string". - - - The title of this value. - - - The description of this value. - - - An example of valid value to display in a UI. - - - A regex pattern for the credential. - - - The special format of this value (e.g: `hostname`, `uri`) - - - The order in which this field should be displayed in a UI - - - The documentation section relative to `docs_connect` - - - - - - - - The list of credentials and their validation, only filed if necessary (e.g: API_KEY, BASIC) - - - - - The type of the credential. Must be "string". - - - The title of the credential. - - - The description of the credential. - - - An example of the credential. - - - A pattern for the credential. - - - The format of the credential. - - - The documentation section for the credential. - - - - - - - -**Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). - +Add a `.mdx` file (e.g. `github.mdx`) for your API to the `docs/integrations/all` folder. Check out [other examples](/integrations/overview) to fill out the content of the documentation page. -## Contribute Or Request Api +Reference the page in the `docs/docs.json` file in the `800+ APIs & Integrations` group in alphabetical order. -Source: https://nango.dev/docs/integrations/contribute-or-request-api.md +### Submit a pull request + +Verify your contribution against [examples of past contributions](https://github.com/NangoHQ/nango/pulls?q=is%3Apr+is%3Amerged+label%3Aapi+). ---- -title: 'Contribute or request an API' -sidebarTitle: 'Contribute or request an API' -description: 'Add support for a new API to Nango' ---- - -## Option 1: Request a new API (most popular) - -The easiest way to add a new API is to request it from the Nango team. - -If you have a shared Slack channel with Nango, send your request there. Otherwise, post in the `#request-a-new-api` channel of the [community](https://nango.dev/slack). - -We'll deliver them according to the SLAs on our [pricing page](https://www.nango.dev/pricing). - -## Option 2: Contribute a new API yourself - -To contribute a new API, follow the steps below and check out past [PRs](https://github.com/NangoHQ/nango/pulls?q=is%3Apr+is%3Aclosed) starting with `feat(integrations)` for examples. - -### Pre-requisites - -- You have access to a test account for the API -- The API is publicly accessible -- The API is of type HTTP or SOAP - -Nango supports all authorization types (OAuth, API key, basic), including custom ones. - -### Add an API configuration - -Fork the [repo](https://github.com/NangoHQ/nango) and edit the API configurations file ([providers.yaml](https://nango.dev/providers-yaml)). See the [API configuration reference](/integrations/api-configuration) for the available fields. - -You can test the configuration of your new provider with this command: - -```sh -npx tsx scripts/validation/providers/validate.ts -``` - -### Test the API - -To test your new provider, go to the `nango` repo root and run: - -```bash -docker compose up -``` - - - You can modify the ports in the `docker-compose.yaml` file if there are conflicts with - other local services on your host machine. - - -When you are ready to test your API: - -**Create an integration** - -Open the [local Nango UI](http://localhost:3003) in your browser and add a new integration with your freshly added API. - -**Create a connection** - -Create a new connection for this API in the Nango UI, completing the authorization flow. - -**Verify the connection** - -If all goes well, you should see your new connection in the _Connections_ tab. Check the connection details and make sure that the credentials are valid. - -### Document the API - -Add a `.mdx` file (e.g. `github.mdx`) for your API to the `docs/integrations/all` folder. Check out [other examples](/integrations/overview) to fill out the content of the documentation page. - -Reference the page in the `docs/docs.json` file in the `800+ APIs & Integrations` group in alphabetical order. - -### Submit a pull request - -Verify your contribution against [examples of past contributions](https://github.com/NangoHQ/nango/pulls?q=is%3Apr+is%3Amerged+label%3Aapi+). - -Submit a pull request with the new provider to the Nango repo. Please thoroughly test the integration\! - -Thanks a lot for your contribution\!\! ❀️ - - - **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). +Submit a pull request with the new provider to the Nango repo. Please thoroughly test the integration\! + +Thanks a lot for your contribution\!\! ❀️ + + + **Questions, problems, feedback?** Please reach out in the [Slack community](https://nango.dev/slack). ## API and Integration Catalog