--- name: adding-nango-provider-support description: Use when adding support for a new Nango provider - configures provider in providers.yaml, creates documentation (main page, setup guide, connect guide), and updates docs.json following established patterns --- # Adding Provider Support ## Overview Add support for new Nango providers by configuring the provider in `providers.yaml` first, then creating documentation following the established structure: main integration page with 4-step quickstart, separate setup guide (for OAuth), connect guide (for non-OAuth or OAuth with connectionConfig), and proper configuration in docs.json. ## When to Use - Adding support for a brand new provider - Creating provider configuration and docs for an integration that doesn't exist yet - User asks to "add support for [provider]", "add [provider] integration", or "create documentation for [provider]" ## When NOT to Use - Migrating existing docs (use nango-docs-migrator agent instead) - Editing existing integration docs - General documentation changes ## Quick Reference | File | Path | Purpose | |------|------|---------| | Main page | `docs/api-integrations/[slug].mdx` | Quickstart + guide links + syncs section | | Setup guide | `docs/api-integrations/[slug]/how-to-register-your-own-[slug]-oauth-app.mdx` | OAuth app registration steps (OAuth2 only) | | Connect guide | `docs/api-integrations/[slug]/connect.mdx` | Connection UI guide (all non-OAuth2, and OAuth2 with connectionConfig) | | Navigation | `docs/docs.json` | Add to "APIs & Integrations" group | | Provider config | `packages/providers/providers.yaml` | Add docs and setup_guide_url | **Note:** Pre-built syncs snippets are automatically generated by an automated script - you do not need to create them manually. ## Implementation Order **IMPORTANT: Always start by editing `packages/providers/providers.yaml` first.** This file contains all the authentication configuration and connection details needed for the integration. ## Step 1: Configure Provider in providers.yaml Before creating documentation, you must add or update the provider entry in `packages/providers/providers.yaml`. This file contains all authentication configuration. **IMPORTANT: Providers must be added in alphabetical order by their slug (provider key).** Use the existing entries as a reference to find the correct insertion point. ### Common Auth Modes The following auth modes are supported: 1. **API_KEY** - API key authentication 2. **BASIC** - Basic HTTP authentication 3. **OAUTH1** - OAuth 1.0 authentication 4. **OAUTH2** - OAuth 2.0 authentication 5. **OAUTH2_CC** - OAuth 2.0 Client Credentials flow 6. **JWT** - JSON Web Token authentication 7. **TWO_STEP** - Two-step authentication (e.g., username/password then token) 8. **SIGNATURE** - Signature-based authentication ### Examples by Auth Mode #### API_KEY Example ```yaml slab: display_name: Slab categories: - productivity - knowledge-base auth_mode: API_KEY proxy: base_url: https://api.slab.com headers: authorization: Token ${apiKey} content-type: application/json verification: method: POST headers: content-type: application/json endpoints: - /v1/graphql docs: https://nango.dev/docs/api-integrations/slab setup_guide_url: https://nango.dev/docs/api-integrations/slab/how-to-obtain-your-slab-api-key docs_connect: https://nango.dev/docs/api-integrations/slab/connect credentials: apiKey: type: string title: API Token description: Your Slab API token secret: true doc_section: '#step-1-generating-your-slab-api-token' ``` #### OAUTH2 Example (without connectionConfig) ```yaml 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 setup_guide_url: https://nango.dev/docs/integrations/all/acuity-scheduling/how-to-register-your-own-acuity-scheduling-oauth-app ``` #### OAUTH2 Example (with connectionConfig) ```yaml 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/integrations/all/accelo setup_guide_url: https://nango.dev/docs/integrations/all/accelo/how-to-register-your-own-accelo-oauth-app docs_connect: https://nango.dev/docs/integrations/all/accelo/connect 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:// ``` #### BASIC Example ```yaml private-api-basic: display_name: Private API (Basic Auth) 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 ``` #### OAUTH2_CC Example ```yaml 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 docs_connect: https://nango.dev/docs/integrations/all/adobe-umapi/connect connection_config: clientId: type: string title: '' description: '' automated: true ``` #### OAUTH1 Example ```yaml garmin: display_name: Garmin categories: - health 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 ``` #### TWO_STEP Example ```yaml 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 docs_connect: https://nango.dev/docs/integrations/all/jamf-basic/connect 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 ``` #### JWT Example ```yaml ghost: display_name: Ghost categories: - 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: - /site docs: https://nango.dev/docs/integrations/all/ghost docs_connect: https://nango.dev/docs/integrations/all/ghost/connect connection_config: adminDomain: type: string title: Admin Domain description: Your Ghost admin domain format: hostname prefix: https:// example: ghost.example.com doc_section: '#step-1-finding-your-admin-domain' version: type: string title: API Version description: The Ghost API version example: v5.0 doc_section: '#step-2-finding-your-api-version' credentials: privateKey: type: object title: Private Key description: Your Ghost private key properties: id: type: string title: Key ID secret: type: string title: Key Secret secret: true doc_section: '#step-3-generating-your-private-key' ``` #### SIGNATURE Example ```yaml emarsys: display_name: Emarsys 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 docs_connect: https://nango.dev/docs/integrations/all/emarsys/connect credentials: username: type: string title: Username description: Your Emarsys username secretKey: type: string title: Secret Key description: Your Emarsys secret key secret: true ``` ### Categories When adding a provider, you must specify one or more categories from the following allowed list: - `accounting` - `analytics` - `ats` - `banking` - `cms` - `communication` - `crm` - `design` - `dev-tools` - `e-commerce` - `erp` - `gaming` - `hr` - `invoicing` - `knowledge-base` - `legal` - `marketing` - `mcp` - `other` - `payment` - `popular` - `productivity` - `search` - `social` - `sports` - `storage` - `support` - `surveys` - `ticketing` - `video` **Important:** Only use categories from this list. Do not create new categories. ### Key Fields for providers.yaml - **`display_name`**: Required - The display name of the provider - **`categories`**: Required - Array of categories from the allowed list above - **`auth_mode`**: Required - One of the auth modes listed above - **`authorization_url`**: Required for OAUTH2, OAUTH1 - The OAuth authorization URL - **`token_url`**: Required for OAUTH2, OAUTH2_CC, OAUTH1, TWO_STEP, APP - The token endpoint URL - **`proxy.base_url`**: Required - The base URL for API requests - **`proxy.headers`**: Optional - Headers to include in requests (use `${apiKey}`, `${accessToken}`, etc.) - **`proxy.verification`**: Optional - **Only required for API_KEY, BASIC, and JWT auth modes**. Used to verify credentials during connection creation. See verification guidelines below. - **`connection_config`**: Optional - Configuration values end users need to provide (subdomain, domain, etc.) - **`credentials`**: Optional - Credential fields (apiKey, username, password, etc.) - **`docs`**: Required - Link to main documentation page - **`setup_guide_url`**: Required for OAUTH2 - Link to OAuth app registration guide - **`docs_connect`**: Required for non-OAuth2 OR OAuth2 with connectionConfig - Link to connect.mdx guide ### Verification Configuration Guidelines **IMPORTANT:** Only **API_KEY**, **BASIC**, and **JWT** auth modes require a `verification` configuration in the `proxy` section. Other auth modes (OAUTH2, OAUTH1, OAUTH2_CC, TWO_STEP, SIGNATURE) do not need verification. When configuring verification: 1. **Use the simplest endpoint possible** - Choose the most basic endpoint that validates credentials (e.g., `/me`, `/user`, `/profile`, `/account`) 2. **Set limit to 1 if supported** - If the provider accepts a `limit` parameter, set it to `1` to reduce response size and speed up connection creation 3. **Use GET method when possible** - GET requests are typically simpler and faster than POST 4. **Keep it minimal** - The verification endpoint should only verify credentials, not fetch large amounts of data **Example verification configuration:** ```yaml proxy: base_url: https://api.example.com headers: authorization: Bearer ${apiKey} verification: method: GET headers: content-type: application/json endpoints: - /v1/me?limit=1 # Simple endpoint with limit parameter ``` **Note:** For OAuth-based auth modes, credential verification happens automatically during the OAuth flow, so no explicit verification configuration is needed. ## Step 2: Documentation Requirements ### Documentation Files by Auth Mode | Auth Mode | Main Page | Setup Guide | Connect Guide | |-----------|-----------|-------------|---------------| | **API_KEY** | ✅ | ❌ | ✅ (connect.mdx) | | **BASIC** | ✅ | ❌ | ✅ (connect.mdx) | | **OAUTH2** (no connectionConfig) | ✅ | ✅ (how-to-register) | ❌ | | **OAUTH2** (with connectionConfig) | ✅ | ✅ (how-to-register) | ✅ (connect.mdx) | | **OAUTH2_CC** | ✅ | ❌ | ✅ (connect.mdx) | | **OAUTH1** | ✅ | ✅ (how-to-register) | ❌ | | **TWO_STEP** | ✅ | ❌ | ✅ (connect.mdx) | | **JWT** | ✅ | ❌ | ✅ (connect.mdx) | | **SIGNATURE** | ✅ | ❌ | ✅ (connect.mdx) | **Summary:** - **All auth modes** need the main page (`[slug].mdx`) - **OAuth2 and OAuth1** need the setup guide (`how-to-register-your-own-[slug]-oauth-app.mdx`) - **All non-OAuth2 auth modes** need `connect.mdx` - **OAuth2 with connectionConfig** needs both setup guide AND `connect.mdx` ## Required Information Before creating docs, gather: 1. **Integration name** (e.g., "Slack", "Salesforce") 2. **Integration slug** (e.g., "slack", "salesforce", "google-calendar") 3. **Categories** (one or more from the allowed list above - e.g., `productivity`, `crm`, `popular`) 4. **Auth type** (see auth modes above) 5. **API base URL** (for proxy examples) 6. **API documentation URL** (official docs link) 7. **OAuth setup steps** (if OAuth - how to get credentials) 8. **Connection config values** (if connectionConfig exists - what users need to provide) ## File Templates ### Main Integration Page **Path:** `docs/api-integrations/[slug].mdx` ```mdx --- title: '[Integration Name]' sidebarTitle: '[Integration Name]' description: 'Integrate your application with the [Integration Name] API' --- ## 🚀 Quickstart Connect to [Integration Name] 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_ -> _[Integration Name]_. Go to [Connections](https://app.nango.dev/dev/connections) -> _Add Test Connection_ -> _Authorize_, then log in to [Integration Name]. Later, you'll let your users do the same directly from your app. Let's make your first request to the [Integration Name] 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/[example-endpoint]" \ -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: '/[example-endpoint]', 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 [quickstart](/getting-started/quickstart/embed-in-your-app) to integrate Nango in your app. To obtain your own production credentials, follow the setup guide linked below. ## 📚 [Integration Name] Integration Guides Nango-maintained guides for common use cases. - [How to register your own [Integration Name] OAuth app](/api-integrations/[slug]/how-to-register-your-own-[slug]-oauth-app) Register an OAuth app with [Integration Name] and obtain credentials to connect it to Nango - [How do I link my [Integration Name] account?](/api-integrations/[slug]/connect) Learn how to authenticate with [Integration Name] and link your account *Include this line only if connect.mdx exists (for non-OAuth2 or OAuth2 with connectionConfig)* Official docs: [[Integration Name] API docs]([API_DOCS_URL]) ## 🧩 Pre-built syncs & actions for [Integration Name] Enable them in your dashboard. [Extend and customize](/implementation-guides/building-integrations/extend-reference-implementation) to fit your needs. --- ``` ### OAuth Setup Guide (for OAUTH2 and OAUTH1) **Path:** `docs/api-integrations/[slug]/how-to-register-your-own-[slug]-oauth-app.mdx` ```mdx --- title: 'How to register your own [Integration Name] OAuth app' sidebarTitle: '[Integration Name] Setup' description: 'Register an OAuth app with [Integration Name] and connect it to Nango' --- This guide shows you how to register your own app with [Integration Name] to obtain your OAuth credentials (client id & secret). These are required to let your users grant your app access to their [Integration Name] account. Go to [[Integration Name] Developer Portal]([DEVELOPER_PORTAL_URL]) and sign up for a developer account. 1. Navigate to your applications/apps dashboard 2. Click "Create New App" or similar 3. Fill in the required details (app name, description) 1. In your app settings, find OAuth or authentication settings 2. Add the Nango callback URL: `https://api.nango.dev/oauth/callback` 3. Select the scopes your application needs Copy your **Client ID** and **Client Secret** from the app settings. You'll need these when configuring the integration in Nango. Follow the [_Quickstart_](/getting-started/quickstart) to connect your first account. For more details, see [[Integration Name]'s OAuth documentation]([OAUTH_DOCS_URL]). --- ``` ### Connect Guide (for all non-OAuth2, and OAuth2 with connectionConfig) **Path:** `docs/api-integrations/[slug]/connect.mdx` Use this template for API_KEY, BASIC, OAUTH2_CC, TWO_STEP, JWT, SIGNATURE, and OAuth2 with connectionConfig. ```mdx --- title: [Integration Name] - How do I link my account? sidebarTitle: [Integration Name] --- # Overview To authenticate with [Integration Name], you will need: 1. **[Credential/Config Name]** - [Description of what this is]. This guide will walk you through [finding/generating] your **[Credential/Config Name]** within [Integration Name]. ### Prerequisites: - You must have a [Integration Name] account [and any specific requirements]. ### Instructions: #### Step 1: [Finding/Generating] your [Integration Name] [Credential/Config Name] 1. Sign in to your [[Integration Name]]([URL]) account. 2. [Step-by-step instructions for finding/generating the credential or config value] 3. [Continue with detailed steps] [Add more steps as needed] #### Step 2: Enter credentials in the Connect UI Once you have your **[Credential/Config Name]**: 1. Open the form where you need to authenticate with [Integration Name]. 2. Enter your **[Credential/Config Name]** in the respective field. 3. Submit the form, and you should be successfully authenticated. You are now connected to [Integration Name]. ``` **Example (Slab - API_KEY):** ```mdx --- title: Slab - How do I link my account? sidebarTitle: Slab --- # Overview To authenticate with Slab, you will need: 1. **API Token** - Your Slab API token for authentication. This guide will walk you through generating your **API Token** within Slab. ### Prerequisites: - You must have a Slab account with a Business or Enterprise plan ### Instructions: #### Step 1: Generating your Slab API Token 1. Sign in to your [Slab](https://slab.com/) account. 2. Click your team name in the top-left corner of the sidebar. 3. Click **Team settings** in the dropdown menu. 4. Navigate to **Developer** in the left-hand sidebar. 5. You can copy your **API Token**. #### Step 2: Enter credentials in the Connect UI Once you have your **API Token**: 1. Open the form where you need to authenticate with Slab. 2. Enter your **API Token** in the respective field. 3. Submit the form, and you should be successfully authenticated. You are now connected to Slab. ``` ## Configuration Updates ### docs.json Add to the "APIs & Integrations" group in alphabetical order: ```json { "group": "APIs & Integrations", "pages": [ // ... other integrations alphabetically "api-integrations/[slug]", // ... more integrations ] } ``` **Important:** - Add ONLY the main page path (not setup guide or connect guide) - Keep alphabetical order within the group - Setup guides, connect guides and main docs are accessed via links, not navigation ### providers.yaml **IMPORTANT: Providers must be added in alphabetical order by their slug (provider key).** Find the correct insertion point by searching for providers that come before and after your new provider alphabetically. Add or update the provider entry with docs URLs: **For OAuth2 (without connectionConfig):** ```yaml [slug]: display_name: [Integration Name] # ... other provider config ... docs: https://nango.dev/docs/api-integrations/[slug] setup_guide_url: https://nango.dev/docs/api-integrations/[slug]/how-to-register-your-own-[slug]-oauth-app ``` **For OAuth2 (with connectionConfig):** ```yaml [slug]: display_name: [Integration Name] # ... other provider config ... docs: https://nango.dev/docs/api-integrations/[slug] setup_guide_url: https://nango.dev/docs/api-integrations/[slug]/how-to-register-your-own-[slug]-oauth-app docs_connect: https://nango.dev/docs/api-integrations/[slug]/connect ``` **For all non-OAuth2 auth modes:** ```yaml [slug]: display_name: [Integration Name] # ... other provider config ... docs: https://nango.dev/docs/api-integrations/[slug] setup_guide_url: https://nango.dev/docs/api-integrations/[slug]/how-to-obtain-your-[slug]-api-key docs_connect: https://nango.dev/docs/api-integrations/[slug]/connect ``` ## Implementation Checklist - [ ] **Step 1: Configure provider in `packages/providers/providers.yaml`** - [ ] Add provider entry in **alphabetical order** by slug (provider key) - [ ] Add provider entry with correct `auth_mode` - [ ] Add `categories` from the allowed list - [ ] Configure `authorization_url` and `token_url` (if OAuth) - [ ] Set up `proxy.base_url` and headers - [ ] Add `proxy.verification` (only for API_KEY, BASIC, JWT) - use simplest endpoint, set limit=1 if supported - [ ] Add `connection_config` (if needed) - [ ] Add `credentials` (if needed) - [ ] Add `docs` URL - [ ] Add `setup_guide_url` (if OAuth) - [ ] Add `docs_connect` (if needed) - [ ] **Step 2: Create documentation files** - [ ] Create main page at `docs/api-integrations/[slug].mdx` - [ ] Create setup guide (if OAuth2/OAuth1) at `docs/api-integrations/[slug]/how-to-register-your-own-[slug]-oauth-app.mdx` - [ ] Create connect guide (if non-OAuth2 or OAuth2 with connectionConfig) at `docs/api-integrations/[slug]/connect.mdx` - [ ] Note: Pre-built syncs snippets are automatically generated - no manual creation needed - [ ] **Step 3: Update navigation** - [ ] Add to docs.json "APIs & Integrations" group (alphabetically) - [ ] **Step 4: Verify** - [ ] Verify all links work - [ ] Test MDX syntax is valid - [ ] Confirm providers.yaml syntax is correct ## Common Mistakes | Mistake | Fix | |---------|-----| | Not starting with providers.yaml | Always configure provider first - it contains all needed info | | Adding provider in wrong order | Providers must be added in alphabetical order by slug in providers.yaml | | Adding setup guide to docs.json | Only add main page; setup guide accessed via links | | Wrong link format in guides section | Use `/api-integrations/[slug]/how-to-register-your-own-[slug]-oauth-app` | | Missing two spaces after guide links | Add ` ` (two spaces) after closing `)` for proper line breaks | | Wrong slug format | Use lowercase with hyphens (e.g., `google-calendar`, not `googleCalendar`) | | Not updating providers.yaml | Must add `docs` and `setup_guide_url`/`docs_connect` properties | | Missing connect.mdx for non-OAuth2 | All non-OAuth2 auth modes require connect.mdx | | Missing connect.mdx for OAuth2 with connectionConfig | OAuth2 with connectionConfig needs both setup guide AND connect.mdx | | Wrong authorization_url format | Use `${connectionConfig.field}` for dynamic values | | Adding verification for OAuth auth modes | Only API_KEY, BASIC, and JWT need verification configuration | | Using complex endpoints for verification | Use the simplest endpoint possible (e.g., `/me`, `/user`) | | Not setting limit=1 for verification | If provider supports limit, set it to 1 to speed up connection creation | ## Auth Type Variations ### OAuth2 (most common) - Use standard setup guide template (`how-to-register-your-own-[slug]-oauth-app.mdx`) - Link to OAuth documentation - Mention callback URL: `https://api.nango.dev/oauth/callback` - **If connectionConfig exists**: Also create `connect.mdx` to show how to get connection config values ### API Key - Create `connect.mdx` (not setup guide) - Focus on where to find/generate API keys - Use connect.mdx template style - No OAuth callback needed ### Basic Auth - Create `connect.mdx` (not setup guide) - Document username/password or API key requirements - Use connect.mdx template style ### OAuth2_CC (Client Credentials) - Create `connect.mdx` (not setup guide) - Document how to obtain client ID and secret - Use connect.mdx template style ### OAuth1 - Use standard setup guide template - Link to OAuth documentation - Mention callback URL: `https://api.nango.dev/oauth/callback` ### TWO_STEP, JWT, SIGNATURE, APP - Create `connect.mdx` (not setup guide) - Document credential requirements - Use connect.mdx template style - For APP with connectionConfig, also create connect.mdx ## Example: Complete Slab Integration (API_KEY) **Files created:** 1. `packages/providers/providers.yaml` - Provider configuration 2. `docs/api-integrations/slab.mdx` - Main page with quickstart 3. `docs/api-integrations/slab/connect.mdx` - Connect guide 4. Pre-built syncs snippet is automatically generated by the system **docs.json entry:** ```json "api-integrations/slab" ``` **providers.yaml entry:** ```yaml slab: display_name: Slab categories: - productivity - knowledge-base auth_mode: API_KEY proxy: base_url: https://api.slab.com headers: authorization: Token ${apiKey} content-type: application/json verification: method: POST headers: content-type: application/json endpoints: - /v1/graphql docs: https://nango.dev/docs/api-integrations/slab setup_guide_url: https://nango.dev/docs/api-integrations/slab/how-to-obtain-your-slab-api-key docs_connect: https://nango.dev/docs/api-integrations/slab/connect credentials: apiKey: type: string title: API Token description: Your Slab API token secret: true doc_section: '#step-1-generating-your-slab-api-token' ``` ---