diff --git a/docs-v2/integrations/all/ashby.mdx b/docs-v2/integrations/all/ashby.mdx index 600cfecbbb3..d8a5a7d8a18 100644 --- a/docs-v2/integrations/all/ashby.mdx +++ b/docs-v2/integrations/all/ashby.mdx @@ -29,4 +29,4 @@ API configuration: [`ashby`](https://nango.dev/providers.yaml) - Ashby gives you only an `API Key` but uses Basic auth for the API. Pass the `API Key` as the username to Nango and leave the password blank. -Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/gong.mdx) +Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/ashby.mdx) diff --git a/docs-v2/integrations/all/freshdesk.mdx b/docs-v2/integrations/all/freshdesk.mdx index 35dbe0b505f..fc9ea3edb95 100644 --- a/docs-v2/integrations/all/freshdesk.mdx +++ b/docs-v2/integrations/all/freshdesk.mdx @@ -48,4 +48,4 @@ For more details, see the [docs here](/integrate/guides/authorize-an-api#apis-re - For Basic Auth, Freshdesk uses API key as a username and dummy characters as a password. - API calls are directed to your subdomain of Freshdesk. -Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/freshservice.mdx) +Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/freshdesk.mdx) diff --git a/docs-v2/integrations/all/greenhouse.mdx b/docs-v2/integrations/all/greenhouse.mdx index f1d2d2b29c5..ecf679a279e 100644 --- a/docs-v2/integrations/all/greenhouse.mdx +++ b/docs-v2/integrations/all/greenhouse.mdx @@ -33,4 +33,4 @@ Greenhouse offers both `Basic` and `OAuth` as authentication and Nango implement - For `Basic` auth pass Greenhouse API token as username and the password should be blank. - If you need to use the proxy, it is important to provide the resource that you will be calling in the config (as green house has many forms for API resource). Please see [here](https://developers.greenhouse.io/) for different types of resources. Once confirmed, you have to add `resource` as a config. -Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/gorgias.mdx) +Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/greenhouse.mdx) diff --git a/docs-v2/integrations/all/guru.mdx b/docs-v2/integrations/all/guru.mdx index fccebe3bd9a..b02f54d1d7a 100644 --- a/docs-v2/integrations/all/guru.mdx +++ b/docs-v2/integrations/all/guru.mdx @@ -29,4 +29,4 @@ API configuration: [`guru`](https://nango.dev/providers.yaml) - For Basic Auth, Guru uses USER or COLLECTION ID as the username and either User token Collection token as the password. -Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/getguru.mdx) +Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/guru.mdx) diff --git a/docs-v2/integrations/all/intercom.mdx b/docs-v2/integrations/all/intercom.mdx index 39dec1162a8..07091eaa903 100644 --- a/docs-v2/integrations/all/intercom.mdx +++ b/docs-v2/integrations/all/intercom.mdx @@ -32,4 +32,4 @@ API configuration: [`intercom`](https://nango.dev/providers.yaml) - Intercom access tokens do not expire. Logically, Intercom doesn't return a refresh token along with the access token. - You do not need to pass API scopes/permissions during the authorization request. Permissions are only set in the Intercom Developer Portal. -Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/instagram.mdx) +Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/intercom.mdx) diff --git a/docs-v2/integrations/all/servicenow.mdx b/docs-v2/integrations/all/servicenow.mdx index cde2d1d4ea4..4f2ce932d74 100644 --- a/docs-v2/integrations/all/servicenow.mdx +++ b/docs-v2/integrations/all/servicenow.mdx @@ -29,4 +29,4 @@ API configuration: [`servicenow`](https://nango.dev/providers.yaml) - For security purposes, access tokens will expire after 30 minutes by default, when this happens you can use `nango.getConnection()` to generate a new set of tokens. -Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/okta.mdx) \ No newline at end of file +Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/servicenow.mdx) \ No newline at end of file diff --git a/docs-v2/integrations/all/stripe-app.mdx b/docs-v2/integrations/all/stripe-app.mdx index 594e6370865..d7abbf2d9af 100644 --- a/docs-v2/integrations/all/stripe-app.mdx +++ b/docs-v2/integrations/all/stripe-app.mdx @@ -38,3 +38,5 @@ nango.auth('stripe-app-sandbox', '', {params: {appDomain: 'Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/stripe-app.mdx) \ No newline at end of file diff --git a/docs-v2/integrations/all/stripe-express.mdx b/docs-v2/integrations/all/stripe-express.mdx index 30730f07b2d..b464a5779f5 100644 --- a/docs-v2/integrations/all/stripe-express.mdx +++ b/docs-v2/integrations/all/stripe-express.mdx @@ -27,4 +27,4 @@ API configuration: [`stripe-express`](https://nango.dev/providers.yaml) ## API gotchas -Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/stripe.mdx) +Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/stripe-express.mdx) diff --git a/docs-v2/integrations/all/teamwork.mdx b/docs-v2/integrations/all/teamwork.mdx index 659156472ab..a405e3bb804 100644 --- a/docs-v2/integrations/all/teamwork.mdx +++ b/docs-v2/integrations/all/teamwork.mdx @@ -27,7 +27,7 @@ API configuration: [`teamwork`](https://nango.dev/providers.yaml) ## API gotchas - There are no scopes needed in the authorization, hence, you can keep the scope field empty. -- Teamwork uses [different domain extensions](https://apidocs.teamwork.com/docs/teamwork/df5a63302d729-getting-started-with-the-teamwork-com-api#getting-your-url) for different regions, i.e `eu` for EU Hosted Customers. For US based clients leave `extension` blank but for EU based customers add `.eu` as your `extension`. -- Also, provide your `yourSiteName` as your connection `subdomain`. If you're using a custom domain, you can override the set `base_url` using `baseUrlOverride`. +- Teamwork utilizes [distinct subdomain extensions and site names](https://apidocs.teamwork.com/guides/teamwork/getting-started-with-the-teamwork-com-api#getting-your-url) tailored to different regions. For instance, European customers are assigned a subdomain with the `.eu` extension, such as `yourSiteName.eu`, whereas US-based clients are provided with a subdomain without any additional extension, like `yourSiteName`. Remember to use the appropriate subdomain for your specific region. +- If you're using a custom domain, you can override the set `base_url` using `baseUrlOverride`. Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/teamwork.mdx) diff --git a/docs-v2/integrations/all/tiktok-ads.mdx b/docs-v2/integrations/all/tiktok-ads.mdx index 26dec4fcbf6..29e50913255 100644 --- a/docs-v2/integrations/all/tiktok-ads.mdx +++ b/docs-v2/integrations/all/tiktok-ads.mdx @@ -28,4 +28,4 @@ API configuration: [`tiktok-ads`](https://nango.dev/providers.yaml) ## API gotchas -Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/tiktok-accounts.mdx) +Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/tiktok-ads.mdx) diff --git a/docs-v2/integrations/all/workable.mdx b/docs-v2/integrations/all/workable.mdx index dd12676f4f0..6d1a3a3f163 100644 --- a/docs-v2/integrations/all/workable.mdx +++ b/docs-v2/integrations/all/workable.mdx @@ -55,4 +55,4 @@ nango.auth('workable', '', { - The API base URL in Nango is set to `https://{subdomain}.workable.com` for future forward compatability. To call endpoints of the V3 API, prefix the endpoint with `/spi/v3/`, e.g. `/spi/v3/candidates`. -Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/gong.mdx) +Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/workable.mdx) diff --git a/docs-v2/integrations/all/zoho-inventory.mdx b/docs-v2/integrations/all/zoho-inventory.mdx index 71916c3bab8..4c6b03f10c5 100644 --- a/docs-v2/integrations/all/zoho-inventory.mdx +++ b/docs-v2/integrations/all/zoho-inventory.mdx @@ -28,7 +28,7 @@ API configuration: [`zoho-inventory`](https://nango.dev/providers.yaml) ## Connection configuration in Nango -Zoho uses [different domain extensions](https://www.zoho.com/crm/developer/docs/api/v3/multi-dc.html) for different regions. +Zoho uses [different domain extensions](https://www.zoho.com/crm/developer/docs/api/v3/multi-dc.html) for different regions. You need to pass the domain extension to use to Nango in the `nango.auth()` call: @@ -41,4 +41,4 @@ For more details, see the [docs here](/integrate/guides/authorize-an-api#apis-re ## API gotchas - You can make your OAuth app cross-data-centers with [these instructions](https://www.zoho.com/crm/developer/docs/api/v3/multi-dc.html). This means that a single OAuth app will be able to query the Zoho API for Zoho accounts from the US, EU, etc. -Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/zoho-books.mdx) +Add Getting Started links and Gotchas by [editing this page](https://github.com/nangohq/nango/tree/master/docs-v2/integrations/all/zoho-inventory.mdx) diff --git a/integration-templates/asana/nango.yaml b/integration-templates/asana/nango.yaml index af4d7b56065..ef5e6bcb5c3 100644 --- a/integration-templates/asana/nango.yaml +++ b/integration-templates/asana/nango.yaml @@ -4,14 +4,12 @@ integrations: asana-tasks: runs: every 30min description: | - Continuously fetches Asana tasks. This is just a trivial example: - it will only get tasks from the first project of the first workspace. - Details: full refresh, doesn't support deletes, sync goes to all time, - metadata is not required. - scopes: default + Fetches a list of tasks from Asana, retrieving tasks from only the first project of the first workspace + scopes: + - default output: AsanaTask sync_type: full - endpoint: /asana/asana-tasks + endpoint: /asana/tasks models: AsanaTask: id: string diff --git a/integration-templates/ashby/ashby-create-application.ts b/integration-templates/ashby/ashby-create-application.ts index 2b718f5af56..d16898f27c0 100644 --- a/integration-templates/ashby/ashby-create-application.ts +++ b/integration-templates/ashby/ashby-create-application.ts @@ -1,13 +1,4 @@ -import type { NangoAction, AshbyCreateApplicationResponse } from './models'; - -interface AshbyCreateCandidateInput { - candidateId: string; - jobId: string; - interviewPlanId?: string; - interviewStageId?: string; - sourceId?: string; - creditedToUserId?: string; -} +import type { NangoAction, AshbyCreateApplicationResponse, AshbyCreateCandidateInput } from './models'; export default async function runAction(nango: NangoAction, input: AshbyCreateCandidateInput): Promise { if (!input.candidateId) { @@ -67,6 +58,8 @@ export default async function runAction(nango: NangoAction, input: AshbyCreateCa appliedViaJobPostingId }; } catch (error: any) { - throw new Error(`Error in runAction: ${error.message}`); + throw new nango.ActionError({ + message: `Error in runAction: ${error.message}` + }); } } diff --git a/integration-templates/ashby/ashby-create-note.ts b/integration-templates/ashby/ashby-create-note.ts index 96f1d3c0ef5..770564c4d4a 100644 --- a/integration-templates/ashby/ashby-create-note.ts +++ b/integration-templates/ashby/ashby-create-note.ts @@ -1,23 +1,13 @@ -import type { NangoAction, AshbyCreateNoteResponse } from './models'; - -interface AshbyCreateNoteInput { - candidateId: string; - note: string | NoteObject; - sendNotifications?: boolean; -} - -interface NoteObject { - value: string; - type: string; -} +import type { NangoAction, AshbyCreateNoteResponse, AshbyCreateNoteInput, NoteObject } from './models'; export default async function runAction(nango: NangoAction, input: AshbyCreateNoteInput): Promise { + //input validation if (!input.candidateId) { throw new nango.ActionError({ message: 'candidateId is a required field' }); } else if (typeof input.note === 'object') { - const noteObject = input.note; + const noteObject: NoteObject = input.note; if (!noteObject.value || !noteObject.type) { throw new nango.ActionError({ message: 'When note is an object, it must have "value" and "type" properties, both of which are required' @@ -45,6 +35,8 @@ export default async function runAction(nango: NangoAction, input: AshbyCreateNo return { id, createdAt, content, author }; } catch (error: any) { - throw new Error(`Error in runAction: ${error.message}`); + throw new nango.ActionError({ + message: `Error in runAction: ${error.message}` + }); } } diff --git a/integration-templates/ashby/ashby-jobs.ts b/integration-templates/ashby/ashby-jobs.ts index 8ba67ce26da..a9f4ad83f2a 100644 --- a/integration-templates/ashby/ashby-jobs.ts +++ b/integration-templates/ashby/ashby-jobs.ts @@ -41,8 +41,8 @@ async function saveAllJobs(nango: NangoSync, jobslastsyncToken: string) { const metadata = (await nango.getMetadata()) || {}; metadata['jobslastsyncToken'] = jobslastsyncToken; await nango.setMetadata(metadata); - } catch (error) { - console.error('Error occurred while fetching and saving jobs:', error); + } catch (error: any) { + throw new Error(`Error in saveAllJobs: ${error.message}`); } } diff --git a/integration-templates/ashby/nango.yaml b/integration-templates/ashby/nango.yaml index b721cb93a85..43a7c00514d 100644 --- a/integration-templates/ashby/nango.yaml +++ b/integration-templates/ashby/nango.yaml @@ -1,29 +1,41 @@ integrations: ashby: - ashby-candidates: - runs: every hour - returns: - - AshbyCandidate - description: | - Fetch a list of all candidates from your ashby account. - Details: Increamental sync, doesn't track deletes, metadata is required. - ashby-jobs: - runs: every hour - returns: - - AshbyJob - description: | - Fetch a list of all jobs from your ashby account. - Details: Increamental sync, doesn't track deletes, metadata is required. - ashby-create-application: - type: action - returns: AshbyCreateApplicationResponse - description: | - Action to consider a candidate for a job. - ashby-create-note: - type: action - returns: AshbyCreateNoteResponse - description: | - Action to create a note on a candidate. + syncs: + ashby-candidates: + runs: every hour + output: AshbyCandidate + description: | + Fetches a list of all candidates from your ashby account + metadata: + description: | + We need to save a candidatelastsyncToken to track and update candidates' synchronizations + scopes: candidatelastsyncToken + sync_type: incremental + endpoint: /ashby/candidates + ashby-jobs: + runs: every hour + output: AshbyJob + description: | + Fetches a list of all jobs from your ashby account + metadata: + description: | + We need to save a jobslastsyncToken to track and update jobs' synchronizations + scopes: jobslastsyncToken + sync_type: incremental + endpoint: /ashby/jobs + actions: + ashby-create-application: + output: AshbyCreateApplicationResponse + input: AshbyCreateCandidateInput + description: | + Action to consider a candidate for a job + endpoint: POST /ashby/create-application + ashby-create-note: + output: AshbyCreateNoteResponse + input: AshbyCreateNoteInput + description: | + Action to create a note on a candidate. + endpoint: POST /ashby/create-note models: AshbyCandidate: id: string @@ -154,3 +166,17 @@ models: firstName: string lastName: string email: string + AshbyCreateCandidateInput: + candidateId: string + jobId: string + interviewPlanId: string | undefined + interviewStageId: string | undefined + sourceId: string | undefined + creditedToUserId: string | undefined + AshbyCreateNoteInput: + candidateId: string + note: string | NoteObject + sendNotifications: boolean | undefined + NoteObject: + value: string + type: string diff --git a/integration-templates/bamboohr-basic/bamboohr-create-employee.ts b/integration-templates/bamboohr-basic/bamboohr-create-employee.ts index 52ca3aa4a4e..191620f0ffe 100644 --- a/integration-templates/bamboohr-basic/bamboohr-create-employee.ts +++ b/integration-templates/bamboohr-basic/bamboohr-create-employee.ts @@ -53,6 +53,8 @@ export default async function runAction(nango: NangoAction, input: BamboohrEmplo status: response.statusText }; } catch (error: any) { - throw new Error(`Error in runAction: ${error.message}`); + throw new nango.ActionError({ + message: `Error in runAction: ${error.message}` + }); } } diff --git a/integration-templates/bamboohr-basic/nango.yaml b/integration-templates/bamboohr-basic/nango.yaml index 917ebd03763..8bf4a850fbc 100644 --- a/integration-templates/bamboohr-basic/nango.yaml +++ b/integration-templates/bamboohr-basic/nango.yaml @@ -4,19 +4,17 @@ integrations: bamboohr-employees: runs: every 6 hours description: | - Fetches employees from bamboohr. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of current employees from bamboohr output: BamboohrEmployee sync_type: incremental endpoint: /bamboohr/employees - scopes: - - default actions: bamboohr-create-employee: description: | - Action to create a new employee. + Action to create a new employee output: BamboohrCreateEmployeeResponse - endpoint: /bamboohr/create-employee + input: BamboohrEmployee + endpoint: POST /bamboohr/create-employee models: BamboohrEmployee: id: string diff --git a/integration-templates/clari-copilot/nango.yaml b/integration-templates/clari-copilot/nango.yaml index c298b49da48..ea2d0e6e182 100644 --- a/integration-templates/clari-copilot/nango.yaml +++ b/integration-templates/clari-copilot/nango.yaml @@ -1,12 +1,13 @@ integrations: clari-copilot: - clari-copilot-call: - runs: every hour - returns: - - ClariCopilotCall - description: | - Fetches calls from your account. For the first sync, it will go back to the past one year. - Details: incremental sync, doesn't track deletes, metadata is not required. + syncs: + clari-copilot-call: + runs: every hour + output: ClariCopilotCall + description: | + Fetches a list of calls from your account. For the first sync, it will go back to the past one year + sync_type: incremental + endpoint: /clari-copilot/call models: ClariCopilotCall: id: string diff --git a/integration-templates/confluence/confluence-pages.ts b/integration-templates/confluence/confluence-pages.ts index d6343669a20..746c0c8883d 100644 --- a/integration-templates/confluence/confluence-pages.ts +++ b/integration-templates/confluence/confluence-pages.ts @@ -9,7 +9,7 @@ export default async function fetchData(nango: NangoSync) { baseUrlOverride: `https://api.atlassian.com/ex/confluence/${cloudId}`, endpoint: `/wiki/api/v2/pages`, paginate: { - limit: 250 + limit: 100 } }; for await (const pageBatch of nango.paginate(proxyConfig)) { diff --git a/integration-templates/confluence/confluence-spaces.ts b/integration-templates/confluence/confluence-spaces.ts index 2a1d83009b8..b5ce4f32fdd 100644 --- a/integration-templates/confluence/confluence-spaces.ts +++ b/integration-templates/confluence/confluence-spaces.ts @@ -18,7 +18,7 @@ export default async function fetchData(nango: NangoSync) { endpoint: `/wiki/api/v2/spaces`, retries: 10, paginate: { - limit: 250 + limit: 100 } }; for await (const spaceBatch of nango.paginate(proxyConfig)) { diff --git a/integration-templates/confluence/nango.yaml b/integration-templates/confluence/nango.yaml index fe392be84a6..793bdd422cc 100644 --- a/integration-templates/confluence/nango.yaml +++ b/integration-templates/confluence/nango.yaml @@ -4,11 +4,15 @@ integrations: confluence-spaces: runs: every 4 hours output: ConfluenceSpace + description: | + Fetches a list of spaces from confluence sync_type: full endpoint: /confluence/spaces confluence-pages: runs: every 4 hours output: ConfluencePage + description: | + Fetches a list of pages from confluence sync_type: full endpoint: /confluence/pages models: diff --git a/integration-templates/evaluagent/nango.yaml b/integration-templates/evaluagent/nango.yaml index ff0f3853673..0cea4d0d915 100644 --- a/integration-templates/evaluagent/nango.yaml +++ b/integration-templates/evaluagent/nango.yaml @@ -4,16 +4,22 @@ integrations: evaluagent-users: runs: every day output: EvaluAgentUser + description: | + Fetches a list of users from evaluagent sync_type: full endpoint: /evaluagent/users evaluagent-groups: runs: every day output: EvaluAgentGroup + description: | + Fetches a list of groups from evaluagent sync_type: full endpoint: /evaluagent/groups evaluagent-roles: runs: every day output: EvaluAgentRole + description: | + Fetches a list of roles from evaluagent sync_type: full endpoint: /evaluagent/roles models: diff --git a/integration-templates/github/github-write-file.ts b/integration-templates/github/github-write-file.ts index f7d3110d816..fa3517ef9e4 100644 --- a/integration-templates/github/github-write-file.ts +++ b/integration-templates/github/github-write-file.ts @@ -1,21 +1,6 @@ -import type { NangoSync } from './models'; +import type { NangoSync, GithubWriteFileInput, GithubWriteFileActionResult } from './models'; -interface FileActionInput { - owner: string; // Owner of the repository - repo: string; // Name of the repository - path: string; // File path including the name, e.g. 'README.md' - message: string; // Commit message - content: string; // Content to be saved, should be Base64 encoded - sha?: string; // SHA of the file to update, required if updating -} - -interface GithubWriteFileActionResult { - url: string; // URL of the file - status: string; // 'success' or 'failure' - sha: string; // SHA of the file to update, required if updating -} - -export default async function runAction(nango: NangoSync, input: FileActionInput): Promise { +export default async function runAction(nango: NangoSync, input: GithubWriteFileInput): Promise { const endpoint = `/repos/${input.owner}/${input.repo}/contents/${input.path}`; let fileSha: string | undefined = undefined; diff --git a/integration-templates/github/nango.yaml b/integration-templates/github/nango.yaml index 9b8438eacb8..82ffd1b84b7 100644 --- a/integration-templates/github/nango.yaml +++ b/integration-templates/github/nango.yaml @@ -7,8 +7,7 @@ integrations: sync_type: full scopes: public_repo description: | - Fetches the Github issues from all a user's repositories. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches Github issues from all a user's repositories endpoint: /github/issues github-issues-lite: runs: every day @@ -17,20 +16,17 @@ integrations: output: Issue scopes: public_repo description: | - Fetches the Github issues but up to a maximum of 15 for demo - purposes. - Details: limited sync, doesn't track deletes, metadata is not required. - endpoint: /github/lite-issues + Fetches Github issues but up to a maximum of 15 + endpoint: /github/issues-lite github-list-files: runs: every hour description: | - Lists all the files of a Github repo given a specific branch. - Details: doesn't track deletes, metadata is required. + Lists all the files of a Github repo given a specific branch sync_type: incremental auto_start: false input: GithubIssueRepoInput output: GithubRepoFile - endpoint: /github/files + endpoint: /github/list-files scopes: repo github-issues-demo: runs: every 5 minutes @@ -46,15 +42,14 @@ integrations: scopes: repo input: GithubWriteFileInput output: GithubWriteFileActionResult - endpoint: PUT /github/file + endpoint: PUT /github/write-file description: | Write content to a particular github file within a repo. If - the file doesn't exist it creates and then writes to it. + the file doesn't exist it creates and then writes to it github-list-repos: scopes: read:org - endpoint: GET /github/repos - output: - - GithubRepo + endpoint: GET /github/list-repos + output: GithubRepo description: | List github repos from an organization. github-create-demo-issue: diff --git a/integration-templates/google-calendar/nango.yaml b/integration-templates/google-calendar/nango.yaml index 39e5e58dbe8..f1b06c9ed32 100644 --- a/integration-templates/google-calendar/nango.yaml +++ b/integration-templates/google-calendar/nango.yaml @@ -4,9 +4,7 @@ integrations: google-calendar-events: description: | Sync calendar events on the primary calendar going back one month and - save the entire object as specified by the Google API. - Details: partial sync, doesn't support deletes, sync goes back one - month, metadata is not required. + save the entire object as specified by the Google API runs: every 5 minutes output: GoogleCalendarEvent sync_type: incremental @@ -14,10 +12,7 @@ integrations: scopes: https://www.googleapis.com/auth/calendar.readonly google-calendars: description: | - Sync the calendars list of the user. - Details: full sync, does support deletes. Sync goes back all time, - metadata not required. - Required scope(s): https://www.googleapis.com/auth/calendar.readonly + Sync the calendars list of the user track_deletes: true runs: every hour output: GoogleCalendar diff --git a/integration-templates/google-drive/nango.yaml b/integration-templates/google-drive/nango.yaml index 48cd1c20e8c..fb4a16de8fc 100644 --- a/integration-templates/google-drive/nango.yaml +++ b/integration-templates/google-drive/nango.yaml @@ -29,7 +29,7 @@ integrations: into a buffer and return a base64 encoded string that can later be converted into a PDF using an external tool. output: string - endpoint: /google-drive/fetch-pdf + endpoint: POST /google-drive/fetch-pdf scopes: https://www.googleapis.com/auth/drive.readonly models: DocumentMetadata: diff --git a/integration-templates/google-mail/nango.yaml b/integration-templates/google-mail/nango.yaml index 19130c03689..45f0f29bffd 100644 --- a/integration-templates/google-mail/nango.yaml +++ b/integration-templates/google-mail/nango.yaml @@ -3,6 +3,8 @@ integrations: syncs: gmail-emails: runs: every hour + description: | + Fetches a list of emails from gmail output: GmailEmail sync_type: incremental endpoint: /google-mail/emails diff --git a/integration-templates/google-workspace/nango.yaml b/integration-templates/google-workspace/nango.yaml index c8133b27706..40572d753b3 100644 --- a/integration-templates/google-workspace/nango.yaml +++ b/integration-templates/google-workspace/nango.yaml @@ -7,7 +7,9 @@ integrations: output: OrganizationalUnit sync_type: full endpoint: /google/workspace-org-unit - scopes: https://www.googleapis.com/auth/admin.directory.orgunit.readonly,https://www.googleapis.com/auth/admin.directory.user.readonly + scopes: + - https://www.googleapis.com/auth/admin.directory.orgunit.readonly + - https://www.googleapis.com/auth/admin.directory.user.readonly google-workspace-users: runs: every hour output: User @@ -18,7 +20,9 @@ integrations: output: GoogleWorkspaceUserToken sync_type: full endpoint: /google/workspace-user-access-tokens - scopes: https://www.googleapis.com/auth/admin.directory.user.readonly,https://www.googleapis.com/auth/admin.directory.user.security + scopes: + - https://www.googleapis.com/auth/admin.directory.user.readonly + - https://www.googleapis.com/auth/admin.directory.user.security models: OrganizationalUnit: id: string diff --git a/integration-templates/greenhouse-basic/nango.yaml b/integration-templates/greenhouse-basic/nango.yaml index e4f1a2992ae..225e99410e0 100644 --- a/integration-templates/greenhouse-basic/nango.yaml +++ b/integration-templates/greenhouse-basic/nango.yaml @@ -4,36 +4,24 @@ integrations: greenhouse-applications: runs: every 6 hours description: | - Fetches all organization's applications from greenhouse. - Details: incremental sync, doesn't track deletes, metadata is not - required. + Fetches a list of all organization's applications from greenhouse output: GreenhouseApplication sync_type: incremental endpoint: /greenhouse-basic/applications - scopes: - - default greenhouse-candidates: runs: every 6 hours description: | - Fetches all organization's candidates from greenhouse. - Details: incremental sync, doesn't track deletes, metadata is not - required. + Fetches a list of all organization's candidates from greenhouse output: GreenhouseCandidate sync_type: incremental endpoint: /greenhouse-basic/candidates - scopes: - - default greenhouse-jobs: runs: every 6 hours description: | - Fetches all organization's jobs from greenhouse. - Details: incremental sync, doesn't track deletes, metadata is not - required. + Fetches a list of all organization's jobs from greenhouse output: GreenhouseJob sync_type: incremental endpoint: /greenhouse-basic/jobs - scopes: - - default models: GreenhouseApplication: id: string diff --git a/integration-templates/hackerrank-work/hackerrank-work-create-interview.ts b/integration-templates/hackerrank-work/hackerrank-work-create-interview.ts index c792cbeb6ed..bdfd39eb629 100644 --- a/integration-templates/hackerrank-work/hackerrank-work-create-interview.ts +++ b/integration-templates/hackerrank-work/hackerrank-work-create-interview.ts @@ -50,6 +50,8 @@ export default async function runAction(nango: NangoAction, input: HackerRankWor report_url: resp.data.report_url }; } catch (error: any) { - throw new Error(`Error in runAction: ${error.data}`); + throw new nango.ActionError({ + message: `Error in runAction: ${error.message}` + }); } } diff --git a/integration-templates/hackerrank-work/hackerrank-work-create-test.ts b/integration-templates/hackerrank-work/hackerrank-work-create-test.ts index b11406e3fd2..f184d48eee7 100644 --- a/integration-templates/hackerrank-work/hackerrank-work-create-test.ts +++ b/integration-templates/hackerrank-work/hackerrank-work-create-test.ts @@ -1,36 +1,4 @@ -import type { NangoAction, HackerRankWorkTest } from './models'; - -interface HackerRankWorkCreateTestInput { - name: string; - starttime: Date; - endtime: Date; - duration: number; - instructions: string; - locked: boolean; - draft: string; - languages: string[]; - candidate_details: string[]; - custom_acknowledge_text: string; - cutoff_score: number; - master_password: string; - hide_compile_test: boolean; - tags: string[]; - role_ids: string[]; - experience: string[]; - questions: string[]; - mcq_incorrect_score: number; - mcq_correct_score: number; - secure: boolean; - shuffle_questions: boolean; - test_admins: string[]; - hide_template: boolean; - enable_acknowledgement: boolean; - enable_proctoring: boolean; - candidate_tab_switch: boolean; - track_editor_paste: boolean; - show_copy_paste_prompt: boolean; - ide_config: string; -} +import type { NangoAction, HackerRankWorkTest, HackerRankWorkCreateTestInput } from './models'; const mapInputToPostData = (input: HackerRankWorkCreateTestInput): Record => { return { ...input }; @@ -74,6 +42,8 @@ export default async function runAction(nango: NangoAction, input: HackerRankWor permission: resp.data.permission }; } catch (error: any) { - throw new Error(`Error in runAction: ${error.message}`); + throw new nango.ActionError({ + message: `Error in runAction: ${error.message}` + }); } } diff --git a/integration-templates/hackerrank-work/nango.yaml b/integration-templates/hackerrank-work/nango.yaml index 261547cce75..62eb673128d 100644 --- a/integration-templates/hackerrank-work/nango.yaml +++ b/integration-templates/hackerrank-work/nango.yaml @@ -4,54 +4,44 @@ integrations: hackerrank-work-interviews: runs: every 6 hours description: | - Fetches interviews from hackerrank work. - Details: incremental sync, doesn't track deletes, metadata is not - required. + Fetches a list of interviews from hackerrank work output: HackerRankWorkInterview sync_type: incremental endpoint: /hackerrank-work/interviews - scopes: - - default hackerrank-work-teams: runs: every 6 hours description: | - Fetches teams from hackerrank work. - Details: incremental sync, doesn't track deletes, metadata is not - required. + Fetches a list of teams from hackerrank work output: HackerRankWorkTeam sync_type: incremental endpoint: /hackerrank-work/teams - scopes: - - default hackerrank-work-tests: runs: every 6 hours description: | - Fetches tests from hackerrank work. - Details: incremental sync, doesn't track deletes, metadata is not - required. + Fetches a list of tests from hackerrank work output: HackerRankWorkTest sync_type: incremental endpoint: /hackerrank-work/tests - scopes: - - default hackerrank-work-users: runs: every 6 hours description: | - Fetches users from hackerrank work. - Details: incremental sync, doesn't track deletes, metadata is not - required. + Fetches a list of users from hackerrank work output: HackerRankWorkUser sync_type: incremental endpoint: /hackerrank-work/users - scopes: - - default actions: + hackerrank-work-create-test: + description: | + Action to create a test on hackerrank work + input: HackerRankWorkCreateTestInput + output: HackerRankWorkTest + endpoint: POST /hackerrank-work/create-test hackerrank-work-create-interview: description: | - Action to create an interview on hackerrank work. + Action to create an interview on hackerrank work input: HackerRankWorkCreateInterviewInput output: HackerRankWorkInterview - endpoint: /hackerrank-work/create-interview + endpoint: POST /hackerrank-work/create-interview models: HackerRankWorkCreateInterviewInput: __extends: HackerRankWorkInterview @@ -143,3 +133,33 @@ models: teams: [] activated: boolean last_activity_time: date + HackerRankWorkCreateTestInput: + name: string + starttime: Date + endtime: Date + duration: number + instructions: string + locked: boolean + draft: string + languages: string[] + candidate_details: string[] + custom_acknowledge_text: string + cutoff_score: number + master_password: string + hide_compile_test: boolean + tags: string[] + role_ids: string[] + experience: string[] + questions: string[] + mcq_incorrect_score: number + mcq_correct_score: number + secure: boolean + shuffle_questions: boolean + test_admins: string[] + hide_template: boolean + enable_acknowledgement: boolean + enable_proctoring: boolean + candidate_tab_switch: boolean + track_editor_paste: boolean + show_copy_paste_prompt: boolean + ide_config: string diff --git a/integration-templates/hibob-service-user/nango.yaml b/integration-templates/hibob-service-user/nango.yaml index 2dbc4d934d5..d0603ca7510 100644 --- a/integration-templates/hibob-service-user/nango.yaml +++ b/integration-templates/hibob-service-user/nango.yaml @@ -4,8 +4,7 @@ integrations: hibob-employees: runs: every hour description: | - Returns a list of all active employees. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of all active employees output: HibobEmployee sync_type: full endpoint: /hibob-service-user/hibob-employees diff --git a/integration-templates/hubspot/nango.yaml b/integration-templates/hubspot/nango.yaml index 0db081e58c0..7debd6eb57f 100644 --- a/integration-templates/hubspot/nango.yaml +++ b/integration-templates/hubspot/nango.yaml @@ -3,26 +3,36 @@ integrations: syncs: hubspot-service-tickets: runs: every half hour + description: | + Fetches a list of service tickets from Hubspot output: HubspotServiceTicket sync_type: incremental endpoint: /hubspot/service-tickets hubspot-contacts: runs: every day + description: | + Fetches a list of contacts from Hubspot output: HubspotContact sync_type: full endpoint: /hubspot/contacts hubspot-owners: runs: every day + description: | + Fetches a list of owners from Hubspot output: HubspotOwner sync_type: full endpoint: /hubspot/owner hubspot-users: runs: every day + description: | + Fetches a list of users from Hubspot output: HubspotUser sync_type: full endpoint: /hubspot/user hubspot-knowledge-base: runs: every day + description: | + Fetches a list of knowledge base from Hubspot output: HubspotKnowledgeBase sync_type: full endpoint: /hubspot/knowledge-base diff --git a/integration-templates/intercom/nango.yaml b/integration-templates/intercom/nango.yaml index 5dd19b6199a..88cc39724a6 100644 --- a/integration-templates/intercom/nango.yaml +++ b/integration-templates/intercom/nango.yaml @@ -3,11 +3,19 @@ integrations: syncs: intercom-conversations: runs: every 6 hours - output: IntercomConversation + description: | + Fetches a list of conversations from Intercom + output: + - IntercomConversation + - IntercomConversationMessage sync_type: incremental - endpoint: /intercom/conversations + endpoint: + - /intercom/conversations + - /intercom/conversations-message intercom-contacts: runs: every 6 hours + description: | + Fetches a list of contacts from Intercom output: IntercomContact sync_type: full endpoint: /intercom/contacts diff --git a/integration-templates/jira/nango.yaml b/integration-templates/jira/nango.yaml index da713282a28..71659818ff8 100644 --- a/integration-templates/jira/nango.yaml +++ b/integration-templates/jira/nango.yaml @@ -3,6 +3,8 @@ integrations: syncs: jira-issues: runs: every 5mins + description: | + Fetches a list of issues from Jira output: JiraIssue sync_type: incremental endpoint: /jira/issues diff --git a/integration-templates/lever/lever-create-note.ts b/integration-templates/lever/lever-create-note.ts index 602d54f5bcb..eb0c8efd028 100644 --- a/integration-templates/lever/lever-create-note.ts +++ b/integration-templates/lever/lever-create-note.ts @@ -1,15 +1,4 @@ -import type { NangoAction, LeverOpportunityNote } from './models'; - -interface LeverCreateNoteInput { - opportunityId: string; - perform_as?: string; - note_id?: string; - value: string; - secret?: boolean; - score?: number; - notifyFollowers?: boolean; - createdAt?: number; -} +import type { NangoAction, LeverOpportunityNote, LeverCreateNoteInput } from './models'; export default async function runAction(nango: NangoAction, input: LeverCreateNoteInput): Promise { if (!input.opportunityId) { @@ -58,6 +47,8 @@ export default async function runAction(nango: NangoAction, input: LeverCreateNo deletedAt: resp.data.data.deletedAt }; } catch (error: any) { - throw new Error(`Error in runAction: ${error.message}`); + throw new nango.ActionError({ + message: `Error in runAction: ${error.message}` + }); } } diff --git a/integration-templates/lever/lever-create-opportunity.ts b/integration-templates/lever/lever-create-opportunity.ts index 0b71ff0f530..1db08f72532 100644 --- a/integration-templates/lever/lever-create-opportunity.ts +++ b/integration-templates/lever/lever-create-opportunity.ts @@ -1,36 +1,6 @@ -import type { NangoAction, LeverOpportunity } from './models'; +import type { NangoAction, LeverOpportunity, LeverCreateOpportunityInput } from './models'; -interface PhoneEntry { - value?: string; - type?: string; -} -interface ArchievedEntry { - archivedAt?: number; - reason?: string; -} -interface LeverCreateNoteInput { - perform_as: string; - parse?: boolean; - perform_as_posting_owner?: boolean; - name?: string; - headline?: string; - stage?: string; - location?: string; - phones?: PhoneEntry[]; - emails?: string; - links?: string[]; - tags?: string[]; - sources?: string[]; - origin?: string; - owner?: string; - followers?: string[]; - postings?: string[]; - createdAt?: number; - archived?: ArchievedEntry; - contact?: string[]; -} - -export default async function runAction(nango: NangoAction, input: LeverCreateNoteInput): Promise { +export default async function runAction(nango: NangoAction, input: LeverCreateOpportunityInput): Promise { if (!input.perform_as) { throw new nango.ActionError({ message: 'perform_as is the only required field' @@ -108,6 +78,8 @@ export default async function runAction(nango: NangoAction, input: LeverCreateNo opportunityLocation: resp.data.data.opportunityLocation }; } catch (error: any) { - throw new Error(`Error in runAction: ${error.message}`); + throw new nango.ActionError({ + message: `Error in runAction: ${error.message}` + }); } } diff --git a/integration-templates/lever/lever-opportunities-offers.ts b/integration-templates/lever/lever-opportunities-offers.ts index 02e6410abda..5c576521776 100644 --- a/integration-templates/lever/lever-opportunities-offers.ts +++ b/integration-templates/lever/lever-opportunities-offers.ts @@ -1,6 +1,6 @@ import type { LeverOpportunityOffer, NangoSync } from './models'; -const LIMIT = 100000; +const LIMIT = 100; export default async function fetchData(nango: NangoSync) { let totalRecords = 0; diff --git a/integration-templates/lever/lever-opportunities.ts b/integration-templates/lever/lever-opportunities.ts index 1c017ab5f7a..e81000a04c0 100644 --- a/integration-templates/lever/lever-opportunities.ts +++ b/integration-templates/lever/lever-opportunities.ts @@ -1,5 +1,7 @@ import type { LeverOpportunity, NangoSync } from './models'; +const LIMIT = 100; + export default async function fetchData(nango: NangoSync) { let totalRecords = 0; @@ -13,7 +15,7 @@ export default async function fetchData(nango: NangoSync) { cursor_name_in_request: 'offset', limit_name_in_request: 'limit', response_path: 'data', - limit: 100 + limit: LIMIT } }; for await (const opportunity of nango.paginate({ ...config, endpoint })) { diff --git a/integration-templates/lever/lever-postings.ts b/integration-templates/lever/lever-postings.ts index c9341a24c45..10dc25696f7 100644 --- a/integration-templates/lever/lever-postings.ts +++ b/integration-templates/lever/lever-postings.ts @@ -1,5 +1,7 @@ import type { LeverPosting, NangoSync } from './models'; +const LIMIT = 100; + export default async function fetchData(nango: NangoSync) { let totalRecords = 0; @@ -12,7 +14,7 @@ export default async function fetchData(nango: NangoSync) { cursor_name_in_request: 'offset', limit_name_in_request: 'limit', response_path: 'data', - limit: 100 + limit: LIMIT } }; for await (const posting of nango.paginate({ ...config, endpoint })) { diff --git a/integration-templates/lever/lever-stage.ts b/integration-templates/lever/lever-stage.ts index 498e747a426..303f55d8679 100644 --- a/integration-templates/lever/lever-stage.ts +++ b/integration-templates/lever/lever-stage.ts @@ -1,5 +1,7 @@ import type { LeverStage, NangoSync } from './models'; +const LIMIT = 100; + export default async function fetchData(nango: NangoSync) { let totalRecords = 0; @@ -12,7 +14,7 @@ export default async function fetchData(nango: NangoSync) { cursor_name_in_request: 'offset', limit_name_in_request: 'limit', response_path: 'data', - limit: 100 + limit: LIMIT } }; for await (const stage of nango.paginate({ ...config, endpoint })) { diff --git a/integration-templates/lever/nango.yaml b/integration-templates/lever/nango.yaml index 82165b56eb1..e6ecbfa636b 100644 --- a/integration-templates/lever/nango.yaml +++ b/integration-templates/lever/nango.yaml @@ -1,19 +1,27 @@ integrations: lever-basic: actions: + lever-create-note: + description: | + Action to create a note and add it to a candidate profile in Lever + output: LeverOpportunityNote + input: LeverCreateNoteInput + endpoint: POST /lever/create-note + scopes: + - notes:write:admin lever-create-opportunity: description: | - Create candidates and opportunities in your Lever account. + Action to create candidates and opportunities in Lever output: LeverOpportunity - endpoint: /lever/create-opportunity - scopes: opportunities:write:admin + input: LeverCreateOpportunityInput + endpoint: POST /lever/create-opportunity + scopes: + - opportunities:write:admin syncs: lever-opportunities: runs: every 6 hours description: | - Fetch all pipeline Opportunities for Contacts in your Lever account. - Details: incremental sync, doesn't track deletes, metadata is not - required. + Fetches a list of all pipeline opportunities for contacts in Lever output: LeverOpportunity sync_type: incremental endpoint: /lever/opportunities @@ -22,8 +30,7 @@ integrations: lever-opportunities-applications: runs: every 6 hours description: | - Fetch all applications for a candidate in your lever account. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of all applications for a candidate in Lever output: LeverOpportunityApplication sync_type: full endpoint: /lever/opportunities-applications @@ -32,9 +39,7 @@ integrations: lever-opportunities-feedbacks: runs: every 6 hours description: | - Fetch all feedback forms for a candidate for a specific Opportunity in - lever. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of all feedback forms for a candidate for a specific Opportunity in lever output: LeverOpportunityFeedback sync_type: full endpoint: /lever/opportunities-feedbacks @@ -43,8 +48,7 @@ integrations: lever-opportunities-interviews: runs: every 6 hours description: | - Fetch all interviewers for a specific Opportunity in lever. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of all interviewers for a specific Opportunity in lever output: LeverOpportunityInterview sync_type: full endpoint: /lever/opportunities-interviews @@ -53,8 +57,7 @@ integrations: lever-opportunities-notes: runs: every 6 hours description: | - Fetch all notes for a specific candidate in lever. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of all notes for a specific candidate in lever output: LeverOpportunityNote sync_type: full endpoint: /lever/opportunities-notes @@ -63,7 +66,7 @@ integrations: lever-opportunities-offers: runs: every 6 hours description: | - Fetch all offers for a specific candidate in lever. + Fetches a list of all offers for a specific candidate in lever. output: LeverOpportunityOffer sync_type: full endpoint: /lever/opportunities-offers @@ -72,8 +75,7 @@ integrations: lever-postings: runs: every 6 hours description: | - Fetch all postings in your Lever account. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of all postings in Lever output: LeverPosting sync_type: full endpoint: /lever/postings @@ -82,11 +84,8 @@ integrations: lever-postings-apply: runs: every 6 hours description: | - Fetch all questions included in a posting’s application form in your - Lever account. - Details: full sync, doesn't track deletes, metadata is not required. - Scope(s): - output: L + Fetches a list of all questions included in a posting’s application form in Lever + output: LeverPostingApply sync_type: full endpoint: /lever/postings-apply scopes: @@ -94,8 +93,7 @@ integrations: lever-stage: runs: every 6 hours description: | - Fetch all pipeline stages in your Lever account. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of all pipeline stages in Lever output: LeverStage sync_type: full endpoint: /lever/stage @@ -273,3 +271,38 @@ models: LeverStage: id: string text: string + LeverCreateNoteInput: + opportunityId: string + perform_as: string | undefined + note_id: string | undefined + value: string | undefined + secret: boolean | undefined + score: number | undefined + notifyFollowers: boolean | undefined + createdAt: number | undefined + PhoneEntry: + value: string | undefined + type: string | undefined + ArchievedEntry: + archivedAt: number | undefined + reason: string | undefined + LeverCreateOpportunityInput: + perform_as: string + parse: boolean | undefined + perform_as_posting_owner: boolean | undefined + name: string | undefined + headline: string | undefined + stage: string | undefined + location: string | undefined + phones: PhoneEntry[] | undefined + emails: string | undefined + links: string[] | undefined + tags: string[] | undefined + sources: string[] | undefined + origin: string | undefined + owner: string | undefined + followers: string[] | undefined + postings: string[] | undefined + createdAt: number | undefined + archived: ArchievedEntry | undefined + contact: string[] | undefined diff --git a/integration-templates/linear/nango.yaml b/integration-templates/linear/nango.yaml index 8029798269e..e1a37f90d29 100644 --- a/integration-templates/linear/nango.yaml +++ b/integration-templates/linear/nango.yaml @@ -3,21 +3,29 @@ integrations: syncs: linear-issues: runs: every 5min + description: | + Fetches a list of issues from Linear output: LinearIssue sync_type: incremental endpoint: /linear/issues linear-projects: runs: every 5min + description: | + Fetches a list of projects from Linear output: LinearProject sync_type: incremental endpoint: /linear/projects linear-teams: runs: every 5min + description: | + Fetches a list of teams from Linear output: LinearTeam sync_type: incremental endpoint: /linear/teams linear-roadmaps: runs: every 5min + description: | + Fetches a list of roadmaps from Linear output: LinearRoadmap sync_type: incremental endpoint: /linear/roadmaps diff --git a/integration-templates/next-cloud-ocs/nango.yaml b/integration-templates/next-cloud-ocs/nango.yaml index 8f48ed22426..21f8f3d8faa 100644 --- a/integration-templates/next-cloud-ocs/nango.yaml +++ b/integration-templates/next-cloud-ocs/nango.yaml @@ -4,13 +4,10 @@ integrations: next-cloud-users: runs: every hour description: | - Fetch all users' details from NextCloud account - Details: full sync, doesn't track deletes, metadata is not required. - output: 'N' + Fetches a list of all users' details from NextCloud account + output: 'NextCloudUser' sync_type: full endpoint: /next-cloud-ocs/next-cloud-users - scopes: - - default models: NextCloudUser: enabled: boolean diff --git a/integration-templates/notion/nango.yaml b/integration-templates/notion/nango.yaml index e2556b7513f..948c09800ef 100644 --- a/integration-templates/notion/nango.yaml +++ b/integration-templates/notion/nango.yaml @@ -8,13 +8,9 @@ integrations: sub-databases and retrieve only the text content and ignores images, files and other blocks that do not have a `rich_text` property. - Details: incremental sync, doesn't support deletes, sync goes to all - time, metadata is not required. - Required scope(s): none output: NotionPage sync_type: incremental endpoint: /notion/pages - scopes: '' notion-rich-pages: runs: every 6 hours track_deletes: true @@ -22,13 +18,9 @@ integrations: Sync pages, subpages, database entries, entries of sub-databases and maps to full markdown. It transforms images, tables, uploaded files, etc into their markdown counterparts. - Details: full sync, tracks deletes, sync goes to all time, metadata is - not required. - Required scope(s): none output: NotionRichPage sync_type: incremental endpoint: /notion/rich-pages - scopes: '' models: NotionPage: id: string diff --git a/integration-templates/pipedrive/nango.yaml b/integration-templates/pipedrive/nango.yaml index c0568e66474..64776375476 100644 --- a/integration-templates/pipedrive/nango.yaml +++ b/integration-templates/pipedrive/nango.yaml @@ -4,8 +4,7 @@ integrations: pipedrive-activities: runs: every hour description: | - Fetches activities from pipedrive. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of activities from pipedrive output: PipeDriveActivity sync_type: incremental endpoint: /pipedrive/activities @@ -14,8 +13,7 @@ integrations: pipedrive-deals: runs: every hour description: | - Fetches deals from pipedrive. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of deals from pipedrive output: PipeDriveDeal sync_type: incremental endpoint: /pipedrive/deals @@ -24,8 +22,7 @@ integrations: pipedrive-organizations: runs: every hour description: | - Fetches organizations from pipedrive. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of organizations from pipedrive output: PipeDriveOrganization sync_type: incremental endpoint: /pipedrive/organizations @@ -34,8 +31,7 @@ integrations: pipedrive-persons: runs: every half hour description: | - Fetches persons from pipedrive. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches persons from pipedrive output: PipeDrivePerson sync_type: incremental endpoint: /pipedrive/persons diff --git a/integration-templates/salesforce/nango.yaml b/integration-templates/salesforce/nango.yaml index 199922965d6..def4ef0e813 100644 --- a/integration-templates/salesforce/nango.yaml +++ b/integration-templates/salesforce/nango.yaml @@ -3,26 +3,36 @@ integrations: syncs: salesforce-accounts: runs: every hour + description: | + Fetches a list of accounts from salesforce output: SalesforceAccount sync_type: incremental endpoint: /salesforce/accounts salesforce-contacts: runs: every hour + description: | + Fetches a list of contacts from salesforce output: SalesforceContact sync_type: incremental endpoint: /salesforce/contacts salesforce-deals: runs: every hour + description: | + Fetches a list of deals from salesforce output: SalesforceDeal sync_type: incremental endpoint: /salesforce/deals salesforce-articles: runs: every day + description: | + Fetches a list of articles from salesforce output: SalesforceArticle sync_type: incremental endpoint: /salesforce/articles salesforce-tickets: runs: every day + description: | + Fetches a list of tickets from salesforce output: SalesforceTicket sync_type: incremental endpoint: /salesforce/tickets diff --git a/integration-templates/slack/nango.yaml b/integration-templates/slack/nango.yaml index 01c7f5978bb..a271fbe2744 100644 --- a/integration-templates/slack/nango.yaml +++ b/integration-templates/slack/nango.yaml @@ -4,7 +4,7 @@ integrations: slack-users: runs: every hour description: | - Syncs information about all Users on the Slack workspace. + Syncs information about all Users on the Slack workspace output: SlackUser sync_type: full endpoint: /slack/users @@ -14,7 +14,7 @@ integrations: runs: every hour description: | Syncs information about all Slack channels. Which channels get synced - (public, private, IMs, group DMs) dependson the scopes. If + (public, private, IMs, group DMs) depends on the scopes. If joinPublicChannels is set to true, the bot will automatically join all public channels as well. Scopes: At least one of channels:read, groups:read, mpim:read, im:read. To also join public channels: @@ -34,10 +34,16 @@ integrations: detection of the channel. For subsequent runs it will sync messages, threads & reactions from the last 10 days. Scopes required: channels:read, and at least one of - channels:history,groups:history,mpim:history,im:history - output: SlackMessage - sync_type: full - endpoint: /slack/messages + channels:history, groups:history, mpim:history, im:history + output: + - SlackMessage + - SlackMessageReply + - SlackMessageReaction + sync_type: incremental + endpoint: + - /slack/messages + - /slack/messages-reply + - /slack/messages-reaction scopes: - channels:read - channels:history diff --git a/integration-templates/teamtailor/nango.yaml b/integration-templates/teamtailor/nango.yaml index 476c1881f48..eee768d2391 100644 --- a/integration-templates/teamtailor/nango.yaml +++ b/integration-templates/teamtailor/nango.yaml @@ -5,10 +5,9 @@ integrations: runs: every 6 hours description: | Fetches a list of all candidates from your teamtailor account. - Details: full sync, doesn't track deletes, metadata is not required. output: TeamtailorCandidate sync_type: full - endpoint: /teamtailor-candidates/candidates + endpoint: /teamtailor/candidates scopes: - Admin models: diff --git a/integration-templates/wildix-pbx/nango.yaml b/integration-templates/wildix-pbx/nango.yaml index fc808d6e2ae..d579f419399 100644 --- a/integration-templates/wildix-pbx/nango.yaml +++ b/integration-templates/wildix-pbx/nango.yaml @@ -3,6 +3,8 @@ integrations: syncs: wildix-pbx-colleagues: runs: every 1 hour + description: | + Fetches a list of users from PBX output: WildixPbxColleague sync_type: full endpoint: /wildix-pbx/colleagues diff --git a/integration-templates/workable/nango.yaml b/integration-templates/workable/nango.yaml index 8604f430ffe..2d0981f07f8 100644 --- a/integration-templates/workable/nango.yaml +++ b/integration-templates/workable/nango.yaml @@ -4,9 +4,7 @@ integrations: workable-candidates: runs: every 6 hours description: | - Fetches candidates from workable. - Details: incremental sync, doesn't track deletes, metadata is not - required. + Fetches a list of candidates from workable output: WorkableCandidate sync_type: incremental endpoint: /workable/candidates @@ -15,8 +13,7 @@ integrations: workable-candidates-activities: runs: every 6 hours description: | - Fetches activity stream of the given candidate - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of activity streams of the given candidate output: WorkableCandidateActivity sync_type: full endpoint: /workable/candidates-activities @@ -25,8 +22,7 @@ integrations: workable-candidates-offer: runs: every 6 hours description: | - Fetches candidate's latest offer from workable. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches candidate's latest offer from workable output: WorkableCandidateOffer sync_type: full endpoint: /workable/candidates-offer @@ -35,9 +31,7 @@ integrations: workable-jobs: runs: every 6 hours description: | - Fetches jobs from workable. - Details: incremental sync, doesn't track deletes, metadata is not - required. + Fetches a list of jobs from workable output: WorkableJob sync_type: incremental endpoint: /workable/jobs @@ -46,8 +40,7 @@ integrations: workable-jobs-candidates: runs: every 6 hours description: | - Fetches candidates for the specified job from workable. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of candidates for the specified job from workable output: WorkableJobsCandidate sync_type: full endpoint: /workable/jobs-candidates @@ -56,8 +49,7 @@ integrations: workable-jobs-questions: runs: every 6 hours description: | - Fetches questions for the specified job from workable. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of questions for the specified job from workable output: WorkableJobQuestion sync_type: full endpoint: /workable/jobs-questions @@ -66,20 +58,28 @@ integrations: workable-members: runs: every 6 hours description: | - Fetches account members from workable. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of account members from workable output: WorkableMember sync_type: full endpoint: /workable/members scopes: - r_jobs actions: + workable-create-candidate: + description: | + Action to create a candidate at the specified job + scopes: + - w_candidates + output: WorkableCreateCandidateResponse + input: WorkableCreateCandidateInput + endpoint: POST /workable/create-candidate workable-create-comment: description: | - Action to create a comment on the applicant's timeline. - Scope(s): w_candidates or w_comments + Action to create a comment on the applicant's timeline + scopes: + - w_candidates or w_comments output: WorkableCreateCommentResponse - endpoint: /workable/create-comment + endpoint: POST /workable/create-comment models: WorkableCandidate: id: string @@ -197,3 +197,65 @@ models: zip_code: string WorkableCreateCommentResponse: id: string + WorkableCreateCandidateInput: + shortcode: string + candidate: + name: string + firstname: string + lastname: string + email: string + headline: string | undefined + summary: string | undefined + address: string | undefined + phone: string | undefined + cover_letter: string | undefined + education_entries: EducationEntry[] | undefined + experience_entries: ExperienceEntry[] | undefined + answers: Answer[] | undefined + skills: string[] | undefined + tags: string[] | undefined + disqualified: boolean | undefined + disqualification_reason: string | undefined + disqualified_at: string | undefined + social_profiles: SocialProfile[] | undefined + domain: string | undefined + recruiter_key: string | undefined + EducationEntry: + school: string + degree: string | undefined + field_of_study: string | undefined + start_date: string | undefined + end_date: string | undefined + ExperienceEntry: + title: string + summary: string | undefined + start_date: string | undefined + end_date: string | undefined + current: boolean | undefined + company: string | undefined + industry: string | undefined + Answer: + question_key: string + body: string | undefined + choices: string[] + checked: boolean | undefined + date: string | undefined + number: number | undefined + file: + name: string + data: string + SocialProfile: + type: string + name: string | undefined + username: string | undefined + url: string + WorkableCreateCommentInput: + id: string + member_id: string + comment: + body: string + policy: string[] | undefined + attachment: Attachment | undefined + Attachment: + name: string + data: string diff --git a/integration-templates/workable/workable-create-candidate.ts b/integration-templates/workable/workable-create-candidate.ts index ea52243557c..400bbb5a4f6 100644 --- a/integration-templates/workable/workable-create-candidate.ts +++ b/integration-templates/workable/workable-create-candidate.ts @@ -1,68 +1,4 @@ -import type { NangoAction, WorkableCreateCandidateResponse } from './models'; - -interface EducationEntry { - school: string; - degree?: string; - field_of_study?: string; - start_date?: string; - end_date?: string; -} - -interface ExperienceEntry { - title: string; - summary?: string; - start_date?: string; - end_date?: string; - current?: boolean; - company?: string; - industry?: string; -} - -interface Answer { - question_key: string; - body?: string; - choices?: string[]; - checked?: boolean; - date?: string; - number?: number; - file?: { - name: string; - data: string; - }; -} - -interface SocialProfile { - type: string; - name?: string; - username?: string; - url: string; -} - -interface WorkableCreateCandidateInput { - shortcode: string; - candidate: { - name: string; - firstname: string; - lastname: string; - email: string; - headline?: string; - summary?: string; - address?: string; - phone?: string; - cover_letter?: string; - education_entries?: EducationEntry[]; - experience_entries?: ExperienceEntry[]; - answers?: Answer[]; - skills?: string[]; - tags?: string[]; - disqualified?: boolean; - disqualification_reason?: string; - disqualified_at?: string; - social_profiles?: SocialProfile[]; - }; - domain?: string; - recruiter_key?: string; -} +import type { NangoAction, WorkableCreateCandidateResponse, WorkableCreateCandidateInput } from './models'; export default async function runAction(nango: NangoAction, input: WorkableCreateCandidateInput): Promise { if (!input.shortcode) { @@ -85,23 +21,39 @@ export default async function runAction(nango: NangoAction, input: WorkableCreat throw new nango.ActionError({ message: 'email is required for the candidate' }); - } else if (input.candidate.education_entries && input.candidate.education_entries.some((entry) => !entry.school)) { + } else if ( + input.candidate.education_entries && + Array.isArray(input.candidate.education_entries) && + input.candidate.education_entries.some((entry: any) => !entry.school) + ) { throw new nango.ActionError({ message: "school is required for the candidate's education entries" }); - } else if (input.candidate.experience_entries && input.candidate.experience_entries.some((entry) => !entry.title)) { + } else if ( + input.candidate.experience_entries && + Array.isArray(input.candidate.experience_entries) && + input.candidate.experience_entries.some((entry: any) => !entry.title) + ) { throw new nango.ActionError({ message: "title is required for the candidate's experience entries" }); - } else if (input.candidate.answers && input.candidate.answers.some((entry) => !entry.question_key)) { + } else if (input.candidate.answers && Array.isArray(input.candidate.answers) && input.candidate.answers.some((entry: any) => !entry.question_key)) { throw new nango.ActionError({ message: "question_key is required for the candidate's answer" }); - } else if (input.candidate.social_profiles && input.candidate.social_profiles.some((entry) => !entry.type)) { + } else if ( + input.candidate.social_profiles && + Array.isArray(input.candidate.social_profiles) && + input.candidate.social_profiles.some((entry: any) => !entry.type) + ) { throw new nango.ActionError({ message: "type is required for the candidate's social profiles" }); - } else if (input.candidate.social_profiles && input.candidate.social_profiles.some((entry) => !entry.url)) { + } else if ( + input.candidate.social_profiles && + Array.isArray(input.candidate.social_profiles) && + input.candidate.social_profiles.some((entry: any) => !entry.url) + ) { throw new nango.ActionError({ message: "url is required for the candidate's social profiles" }); @@ -146,6 +98,8 @@ export default async function runAction(nango: NangoAction, input: WorkableCreat candidate: resp.data.candidate }; } catch (error: any) { - throw new Error(`Error in runAction: ${error.message}`); + throw new nango.ActionError({ + message: `Error in runAction: ${error.message}` + }); } } diff --git a/integration-templates/workable/workable-create-comment.ts b/integration-templates/workable/workable-create-comment.ts index 9878559d0e6..a7c4ac36f5f 100644 --- a/integration-templates/workable/workable-create-comment.ts +++ b/integration-templates/workable/workable-create-comment.ts @@ -1,17 +1,4 @@ -import type { NangoAction, WorkableCreateCommentResponse } from './models'; - -interface WorkableCreateCommentInput { - id: string; - member_id: string; - comment: { - body: string; - policy?: string[]; - attachment?: { - name: string; - data: string; - }; - }; -} +import type { NangoAction, WorkableCreateCommentResponse, WorkableCreateCommentInput } from './models'; export default async function runAction(nango: NangoAction, input: WorkableCreateCommentInput): Promise { if (!input.id) { @@ -53,6 +40,8 @@ export default async function runAction(nango: NangoAction, input: WorkableCreat id: resp.data.id }; } catch (error: any) { - throw new Error(`Error in runAction: ${error.message}`); + throw new nango.ActionError({ + message: `Error in runAction: ${error.message}` + }); } } diff --git a/integration-templates/zendesk/nango.yaml b/integration-templates/zendesk/nango.yaml index 9eeed5f319f..d51214085e6 100644 --- a/integration-templates/zendesk/nango.yaml +++ b/integration-templates/zendesk/nango.yaml @@ -3,11 +3,15 @@ integrations: syncs: zendesk-tickets: runs: every 1 hour + description: | + Fetches a list of tickets from zendesk output: ZendeskTicket sync_type: full endpoint: /zendesk/tickets zendesk-articles: runs: every 6 hours + description: | + Fetches a list of articles in Help center from zendesk output: ZendeskArticle sync_type: full endpoint: /zendesk/articles diff --git a/integration-templates/zoho-crm/nango.yaml b/integration-templates/zoho-crm/nango.yaml index f0959484cbf..8174d95f82b 100644 --- a/integration-templates/zoho-crm/nango.yaml +++ b/integration-templates/zoho-crm/nango.yaml @@ -5,9 +5,7 @@ integrations: runs: every half hour auto_start: false description: | - Fetches accounts from zoho crm. - Details: full sync, doesn't track deletes, metadata is not required. - Scope(s): ZohoCRM.modules.accounts.READ or ZohoCRM.modules.ALL + Fetches a list of accounts from zoho crm output: ZohoCRMAccount sync_type: incremental endpoint: /zoho-crm/accounts @@ -17,9 +15,7 @@ integrations: runs: every half hour auto_start: false description: | - Fetches contacts from zoho crm. - Details: full sync, doesn't track deletes, metadata is not required. - Scope(s): ZohoCRM.modules.contacts.READ or ZohoCRM.modules.ALL + Fetches a list of contacts from zoho crm output: ZohoCRMContact sync_type: incremental endpoint: /zoho-crm/contacts @@ -29,9 +25,7 @@ integrations: runs: every half hour auto_start: false description: | - Fetches deals/opportunities from zoho crm. - Details: full sync, doesn't track deletes, metadata is not required. - Scope(s): ZohoCRM.modules.deals.READ or ZohoCRM.modules.ALL + Fetches a list of deals/opportunities from zoho crm output: ZohoCRMDeal sync_type: incremental endpoint: /zoho-crm/deals diff --git a/packages/shared/flows.yaml b/packages/shared/flows.yaml index c898cc7d25e..a96320048b4 100644 --- a/packages/shared/flows.yaml +++ b/packages/shared/flows.yaml @@ -3,7 +3,7 @@ integrations: actions: algolia-create-contacts: description: | - Action to add a single record contact to an index + Action to add a single record contact to an index in Asana output: AlgoliaContact input: AlgoliaCreateContactInput endpoint: POST /algolia/create-contacts @@ -21,14 +21,12 @@ integrations: asana-tasks: runs: every 30min description: | - Continuously fetches Asana tasks. This is just a trivial example: - it will only get tasks from the first project of the first workspace. - Details: full refresh, doesn't support deletes, sync goes to all time, - metadata is not required. - scopes: default + Fetches tasks from Asana, retrieving tasks from only the first project of the first workspace + scopes: + - default output: AsanaTask sync_type: full - endpoint: /asana/asana-tasks + endpoint: /asana/tasks models: AsanaTask: id: string @@ -38,30 +36,42 @@ integrations: created_at: date modified_at: date ashby: - ashby-candidates: - runs: every hour - returns: - - AshbyCandidate - description: | - Fetch a list of all candidates from your ashby account. - Details: Increamental sync, doesn't track deletes, metadata is required. - ashby-jobs: - runs: every hour - returns: - - AshbyJob - description: | - Fetch a list of all jobs from your ashby account. - Details: Increamental sync, doesn't track deletes, metadata is required. - ashby-create-application: - type: action - returns: AshbyCreateApplicationResponse - description: | - Action to consider a candidate for a job. - ashby-create-note: - type: action - returns: AshbyCreateNoteResponse - description: | - Action to create a note on a candidate. + syncs: + ashby-candidates: + runs: every hour + output: AshbyCandidate + description: | + Fetches a list of all candidates from your ashby account + metadata: + description: | + We need to save a candidatelastsyncToken to track and update candidates' synchronizations + scopes: candidatelastsyncToken + sync_type: incremental + endpoint: /ashby/candidates + ashby-jobs: + runs: every hour + output: AshbyJob + description: | + Fetches a list of all jobs from your ashby account + metadata: + description: | + We need to save a jobslastsyncToken to track and update jobs' synchronizations + scopes: jobslastsyncToken + sync_type: incremental + endpoint: /ashby/jobs + actions: + ashby-create-application: + output: AshbyCreateApplicationResponse + input: AshbyCreateCandidateInput + description: | + Action to consider a candidate for a job + endpoint: POST /ashby/create-application + ashby-create-note: + output: AshbyCreateNoteResponse + input: AshbyCreateNoteInput + description: | + Action to create a note on a candidate. + endpoint: POST /ashby/create-note models: AshbyCandidate: id: string @@ -192,24 +202,36 @@ integrations: firstName: string lastName: string email: string + AshbyCreateCandidateInput: + candidateId: string + jobId: string + interviewPlanId: string | undefined + interviewStageId: string | undefined + sourceId: string | undefined + creditedToUserId: string | undefined + AshbyCreateNoteInput: + candidateId: string + note: string | NoteObject + sendNotifications: boolean | undefined + NoteObject: + value: string + type: string bamboohr-basic: syncs: bamboohr-employees: runs: every 6 hours description: | - Fetches employees from bamboohr. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of current employees from bamboohr output: BamboohrEmployee sync_type: incremental endpoint: /bamboohr/employees - scopes: - - default actions: bamboohr-create-employee: description: | - Action to create a new employee. + Action to create a new employee output: BamboohrCreateEmployeeResponse - endpoint: /bamboohr/create-employee + input: BamboohrEmployee + endpoint: POST /bamboohr/create-employee models: BamboohrEmployee: id: string @@ -244,16 +266,14 @@ integrations: BamboohrCreateEmployeeResponse: status: string clari-copilot: - clari-copilot-call: - runs: every hour - returns: - - ClariCopilotCall - description: > - Fetches calls from your account. For the first sync, it will go back to - the past one year. - - Details: incremental sync, doesn't track deletes, metadata is not - required. + syncs: + clari-copilot-call: + runs: every hour + output: ClariCopilotCall + description: | + Fetches a list of calls from your account. For the first sync, it will go back to the past one year + sync_type: incremental + endpoint: /clari-copilot/call models: ClariCopilotCall: id: string @@ -308,11 +328,15 @@ integrations: confluence-spaces: runs: every 4 hours output: ConfluenceSpace + description: | + Fetches a list of spaces from confluence sync_type: full endpoint: /confluence/spaces confluence-pages: runs: every 4 hours output: ConfluencePage + description: | + Fetches a list of pages from confluence sync_type: full endpoint: /confluence/pages models: @@ -351,16 +375,22 @@ integrations: evaluagent-users: runs: every day output: EvaluAgentUser + description: | + Fetches a list of users from evaluagent sync_type: full endpoint: /evaluagent/users evaluagent-groups: runs: every day output: EvaluAgentGroup + description: | + Fetches a list of groups from evaluagent sync_type: full endpoint: /evaluagent/groups evaluagent-roles: runs: every day output: EvaluAgentRole + description: | + Fetches a list of roles from evaluagent sync_type: full endpoint: /evaluagent/roles models: @@ -393,8 +423,7 @@ integrations: sync_type: full scopes: public_repo description: | - Fetches the Github issues from all a user's repositories. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches Github issues from all a user's repositories endpoint: /github/issues github-issues-lite: runs: every day @@ -402,24 +431,18 @@ integrations: sync_type: full output: Issue scopes: public_repo - description: > - Fetches the Github issues but up to a maximum of 15 for demo - - purposes. - - Details: limited sync, doesn't track deletes, metadata is not - required. - endpoint: /github/lite-issues + description: | + Fetches Github issues but up to a maximum of 15 + endpoint: /github/issues-lite github-list-files: runs: every hour description: | - Lists all the files of a Github repo given a specific branch. - Details: doesn't track deletes, metadata is required. + Lists all the files of a Github repo given a specific branch sync_type: incremental auto_start: false input: GithubIssueRepoInput output: GithubRepoFile - endpoint: /github/files + endpoint: /github/list-files scopes: repo github-issues-demo: runs: every 5 minutes @@ -429,27 +452,24 @@ integrations: scopes: public_repo description: | Fetches GitHub issues from our showcase repository. - endpoint: GET /github/demo-issues + endpoint: /github/demo-issues actions: github-write-file: scopes: repo input: GithubWriteFileInput output: GithubWriteFileActionResult - endpoint: PUT /github/file + endpoint: PUT /github/write-file description: | Write content to a particular github file within a repo. If - the file doesn't exist it creates and then writes to it. + the file doesn't exist it creates and then writes to it github-list-repos: scopes: read:org - endpoint: GET /github/repos - output: - - GithubRepo + endpoint: GET /github/list-repos + output: GithubRepo description: | List github repos from an organization. - github-create-demo-issue: - endpoint: POST /github/create-demo-issue - input: GithubCreateIssueInput - output: GithubCreateIssueResult + github-issues-demo-action: + endpoint: POST /github/demo-write-issue description: | Create a GitHub issue in Nango's showcase repository. models: @@ -510,19 +530,12 @@ integrations: id: integer title: string url: string - GithubCreateIssueInput: - title: string - GithubCreateIssueResult: - url: string | undefined - status: number google-calendar: syncs: google-calendar-events: description: | Sync calendar events on the primary calendar going back one month and - save the entire object as specified by the Google API. - Details: partial sync, doesn't support deletes, sync goes back one - month, metadata is not required. + save the entire object as specified by the Google API runs: every 5 minutes output: GoogleCalendarEvent sync_type: incremental @@ -530,10 +543,7 @@ integrations: scopes: https://www.googleapis.com/auth/calendar.readonly google-calendars: description: | - Sync the calendars list of the user. - Details: full sync, does support deletes. Sync goes back all time, - metadata not required. - Required scope(s): https://www.googleapis.com/auth/calendar.readonly + Sync the calendars list of the user track_deletes: true runs: every hour output: GoogleCalendar @@ -739,6 +749,8 @@ integrations: syncs: gmail-emails: runs: every hour + description: | + Fetches a list of emails from gmail output: GmailEmail sync_type: incremental endpoint: /google-mail/emails @@ -759,8 +771,9 @@ integrations: output: OrganizationalUnit sync_type: full endpoint: /google/workspace-org-unit - scopes: >- - https://www.googleapis.com/auth/admin.directory.orgunit.readonly,https://www.googleapis.com/auth/admin.directory.user.readonly + scopes: + - https://www.googleapis.com/auth/admin.directory.orgunit.readonly + - https://www.googleapis.com/auth/admin.directory.user.readonly google-workspace-users: runs: every hour output: User @@ -771,8 +784,9 @@ integrations: output: GoogleWorkspaceUserToken sync_type: full endpoint: /google/workspace-user-access-tokens - scopes: >- - https://www.googleapis.com/auth/admin.directory.user.readonly,https://www.googleapis.com/auth/admin.directory.user.security + scopes: + - https://www.googleapis.com/auth/admin.directory.user.readonly + - https://www.googleapis.com/auth/admin.directory.user.security models: OrganizationalUnit: id: string @@ -812,36 +826,24 @@ integrations: greenhouse-applications: runs: every 6 hours description: | - Fetches all organization's applications from greenhouse. - Details: incremental sync, doesn't track deletes, metadata is not - required. + Fetches a list of all organization's applications from greenhouse output: GreenhouseApplication sync_type: incremental endpoint: /greenhouse-basic/applications - scopes: - - default greenhouse-candidates: runs: every 6 hours description: | - Fetches all organization's candidates from greenhouse. - Details: incremental sync, doesn't track deletes, metadata is not - required. + Fetches a list of all organization's candidates from greenhouse output: GreenhouseCandidate sync_type: incremental endpoint: /greenhouse-basic/candidates - scopes: - - default greenhouse-jobs: runs: every 6 hours description: | - Fetches all organization's jobs from greenhouse. - Details: incremental sync, doesn't track deletes, metadata is not - required. + Fetches a list of all organization's jobs from greenhouse output: GreenhouseJob sync_type: incremental endpoint: /greenhouse-basic/jobs - scopes: - - default models: GreenhouseApplication: id: string @@ -971,54 +973,44 @@ integrations: hackerrank-work-interviews: runs: every 6 hours description: | - Fetches interviews from hackerrank work. - Details: incremental sync, doesn't track deletes, metadata is not - required. + Fetches a list of interviews from hackerrank work output: HackerRankWorkInterview sync_type: incremental endpoint: /hackerrank-work/interviews - scopes: - - default hackerrank-work-teams: runs: every 6 hours description: | - Fetches teams from hackerrank work. - Details: incremental sync, doesn't track deletes, metadata is not - required. + Fetches a list of teams from hackerrank work output: HackerRankWorkTeam sync_type: incremental endpoint: /hackerrank-work/teams - scopes: - - default hackerrank-work-tests: runs: every 6 hours description: | - Fetches tests from hackerrank work. - Details: incremental sync, doesn't track deletes, metadata is not - required. + Fetches a list of tests from hackerrank work output: HackerRankWorkTest sync_type: incremental endpoint: /hackerrank-work/tests - scopes: - - default hackerrank-work-users: runs: every 6 hours description: | - Fetches users from hackerrank work. - Details: incremental sync, doesn't track deletes, metadata is not - required. + Fetches a list of users from hackerrank work output: HackerRankWorkUser sync_type: incremental endpoint: /hackerrank-work/users - scopes: - - default actions: + hackerrank-work-create-test: + description: | + Action to create a test on hackerrank work + input: HackerRankWorkCreateTestInput + output: HackerRankWorkTest + endpoint: POST /hackerrank-work/create-test hackerrank-work-create-interview: description: | - Action to create an interview on hackerrank work. + Action to create an interview on hackerrank work input: HackerRankWorkCreateInterviewInput output: HackerRankWorkInterview - endpoint: /hackerrank-work/create-interview + endpoint: POST /hackerrank-work/create-interview models: HackerRankWorkCreateInterviewInput: id: string @@ -1129,13 +1121,42 @@ integrations: teams: [] activated: boolean last_activity_time: date + HackerRankWorkCreateTestInput: + name: string + starttime: Date + endtime: Date + duration: number + instructions: string + locked: boolean + draft: string + languages: string[] + candidate_details: string[] + custom_acknowledge_text: string + cutoff_score: number + master_password: string + hide_compile_test: boolean + tags: string[] + role_ids: string[] + experience: string[] + questions: string[] + mcq_incorrect_score: number + mcq_correct_score: number + secure: boolean + shuffle_questions: boolean + test_admins: string[] + hide_template: boolean + enable_acknowledgement: boolean + enable_proctoring: boolean + candidate_tab_switch: boolean + track_editor_paste: boolean + show_copy_paste_prompt: boolean + ide_config: string hibob-service-user: syncs: hibob-employees: runs: every hour description: | - Returns a list of all active employees. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of all active employees output: HibobEmployee sync_type: full endpoint: /hibob-service-user/hibob-employees @@ -1167,26 +1188,36 @@ integrations: syncs: hubspot-service-tickets: runs: every half hour + description: | + Fetches a list of service tickets from Hubspot output: HubspotServiceTicket sync_type: incremental endpoint: /hubspot/service-tickets hubspot-contacts: runs: every day + description: | + Fetches a list of contacts from Hubspot output: HubspotContact sync_type: full endpoint: /hubspot/contacts hubspot-owners: runs: every day + description: | + Fetches a list of owners from Hubspot output: HubspotOwner sync_type: full endpoint: /hubspot/owner hubspot-users: runs: every day + description: | + Fetches a list of users from Hubspot output: HubspotUser sync_type: full endpoint: /hubspot/user hubspot-knowledge-base: runs: every day + description: | + Fetches a list of knowledge base from Hubspot output: HubspotKnowledgeBase sync_type: full endpoint: /hubspot/knowledge-base @@ -1237,11 +1268,19 @@ integrations: syncs: intercom-conversations: runs: every 6 hours - output: IntercomConversation + description: | + Fetches a list of conversations from Intercom + output: + - IntercomConversation + - IntercomConversationMessage sync_type: incremental - endpoint: /intercom/conversations + endpoint: + - /intercom/conversations + - /intercom/conversations-message intercom-contacts: runs: every 6 hours + description: | + Fetches a list of contacts from Intercom output: IntercomContact sync_type: full endpoint: /intercom/contacts @@ -1286,6 +1325,8 @@ integrations: syncs: jira-issues: runs: every 5mins + description: | + Fetches a list of issues from Jira output: JiraIssue sync_type: incremental endpoint: /jira/issues @@ -1301,7 +1342,106 @@ integrations: projectName: string createdAt: date updatedAt: date - lever: + lever-basic: + actions: + lever-create-note: + description: | + Action to create a note and add it to a candidate profile in Lever + output: LeverOpportunityNote + input: LeverCreateNoteInput + endpoint: POST /lever/create-note + scopes: + - notes:write:admin + lever-create-opportunity: + description: | + Action to create candidates and opportunities in Lever + output: LeverOpportunity + input: LeverCreateOpportunityInput + endpoint: POST /lever/create-opportunity + scopes: + - opportunities:write:admin + syncs: + lever-opportunities: + runs: every 6 hours + description: | + Fetches a list of all pipeline opportunities for contacts in Lever + output: LeverOpportunity + sync_type: incremental + endpoint: /lever/opportunities + scopes: + - opportunities:read:admin + lever-opportunities-applications: + runs: every 6 hours + description: | + Fetches a list of all applications for a candidate in Lever + output: LeverOpportunityApplication + sync_type: full + endpoint: /lever/opportunities-applications + scopes: + - applications:read:admin + lever-opportunities-feedbacks: + runs: every 6 hours + description: | + Fetches a list of all feedback forms for a candidate for a specific Opportunity in lever + output: LeverOpportunityFeedback + sync_type: full + endpoint: /lever/opportunities-feedbacks + scopes: + - feedback:read:admin + lever-opportunities-interviews: + runs: every 6 hours + description: | + Fetches a list of all interviewers for a specific Opportunity in lever + output: LeverOpportunityInterview + sync_type: full + endpoint: /lever/opportunities-interviews + scopes: + - interviews:read:admin + lever-opportunities-notes: + runs: every 6 hours + description: | + Fetches a list of all notes for a specific candidate in lever + output: LeverOpportunityNote + sync_type: full + endpoint: /lever/opportunities-notes + scopes: + - notes:read:admin + lever-opportunities-offers: + runs: every 6 hours + description: | + Fetches a list of all offers for a specific candidate in lever. + output: LeverOpportunityOffer + sync_type: full + endpoint: /lever/opportunities-offers + scopes: + - offers:write:admin + lever-postings: + runs: every 6 hours + description: | + Fetches a list of all postings in Lever + output: LeverPosting + sync_type: full + endpoint: /lever/postings + scopes: + - postings:read:admin + lever-postings-apply: + runs: every 6 hours + description: | + Fetches a list of all questions included in a posting’s application form in Lever + output: LeverPostingApply + sync_type: full + endpoint: /lever/postings-apply + scopes: + - postings:read:admin + lever-stage: + runs: every 6 hours + description: | + Fetches a list of all pipeline stages in Lever + output: LeverStage + sync_type: full + endpoint: /lever/stage + scopes: + - stages:read:admin models: LeverOpportunity: id: string @@ -1474,25 +1614,68 @@ integrations: LeverStage: id: string text: string + LeverCreateNoteInput: + opportunityId: string + perform_as: string | undefined + note_id: string | undefined + value: string | undefined + secret: boolean | undefined + score: number | undefined + notifyFollowers: boolean | undefined + createdAt: number | undefined + PhoneEntry: + value: string | undefined + type: string | undefined + ArchievedEntry: + archivedAt: number | undefined + reason: string | undefined + LeverCreateOpportunityInput: + perform_as: string + parse: boolean | undefined + perform_as_posting_owner: boolean | undefined + name: string | undefined + headline: string | undefined + stage: string | undefined + location: string | undefined + phones: PhoneEntry[] | undefined + emails: string | undefined + links: string[] | undefined + tags: string[] | undefined + sources: string[] | undefined + origin: string | undefined + owner: string | undefined + followers: string[] | undefined + postings: string[] | undefined + createdAt: number | undefined + archived: ArchievedEntry | undefined + contact: string[] | undefined linear: syncs: linear-issues: runs: every 5min + description: | + Fetch a list of issues from Linear output: LinearIssue sync_type: incremental endpoint: /linear/issues linear-projects: runs: every 5min + description: | + Fetch a list of projects from Linear output: LinearProject sync_type: incremental endpoint: /linear/projects linear-teams: runs: every 5min + description: | + Fetch a list of teams from Linear output: LinearTeam sync_type: incremental endpoint: /linear/teams linear-roadmaps: runs: every 5min + description: | + Fetch a list of roadmaps from Linear output: LinearRoadmap sync_type: incremental endpoint: /linear/roadmaps @@ -1591,13 +1774,10 @@ integrations: next-cloud-users: runs: every hour description: | - Fetch all users' details from NextCloud account - Details: full sync, doesn't track deletes, metadata is not required. - output: 'N' + Fetch a list of all users' details from NextCloud account + output: 'NextCloudUser' sync_type: full endpoint: /next-cloud-ocs/next-cloud-users - scopes: - - default models: NextCloudUser: enabled: boolean @@ -1656,13 +1836,9 @@ integrations: sub-databases and retrieve only the text content and ignores images, files and other blocks that do not have a `rich_text` property. - Details: incremental sync, doesn't support deletes, sync goes to all - time, metadata is not required. - Required scope(s): none output: NotionPage sync_type: incremental endpoint: /notion/pages - scopes: '' notion-rich-pages: runs: every 6 hours track_deletes: true @@ -1670,13 +1846,9 @@ integrations: Sync pages, subpages, database entries, entries of sub-databases and maps to full markdown. It transforms images, tables, uploaded files, etc into their markdown counterparts. - Details: full sync, tracks deletes, sync goes to all time, metadata is - not required. - Required scope(s): none output: NotionRichPage sync_type: incremental endpoint: /notion/rich-pages - scopes: '' models: NotionPage: id: string @@ -1696,8 +1868,7 @@ integrations: pipedrive-activities: runs: every hour description: | - Fetches activities from pipedrive. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of activities from pipedrive output: PipeDriveActivity sync_type: incremental endpoint: /pipedrive/activities @@ -1706,8 +1877,7 @@ integrations: pipedrive-deals: runs: every hour description: | - Fetches deals from pipedrive. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of deals from pipedrive output: PipeDriveDeal sync_type: incremental endpoint: /pipedrive/deals @@ -1716,8 +1886,7 @@ integrations: pipedrive-organizations: runs: every hour description: | - Fetches organizations from pipedrive. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of organizations from pipedrive output: PipeDriveOrganization sync_type: incremental endpoint: /pipedrive/organizations @@ -1726,8 +1895,7 @@ integrations: pipedrive-persons: runs: every half hour description: | - Fetches persons from pipedrive. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches persons from pipedrive output: PipeDrivePerson sync_type: incremental endpoint: /pipedrive/persons @@ -1834,26 +2002,36 @@ integrations: syncs: salesforce-accounts: runs: every hour + description: | + Fetches a list of accounts from salesforce output: SalesforceAccount sync_type: incremental endpoint: /salesforce/accounts salesforce-contacts: runs: every hour + description: | + Fetches a list of contacts from salesforce output: SalesforceContact sync_type: incremental endpoint: /salesforce/contacts salesforce-deals: runs: every hour + description: | + Fetches a list of deals from salesforce output: SalesforceDeal sync_type: incremental endpoint: /salesforce/deals salesforce-articles: runs: every day + description: | + Fetches a list of articles from salesforce output: SalesforceArticle sync_type: incremental endpoint: /salesforce/articles salesforce-tickets: runs: every day + description: | + Fetches a list of tickets from salesforce output: SalesforceTicket sync_type: incremental endpoint: /salesforce/tickets @@ -1914,7 +2092,7 @@ integrations: slack-users: runs: every hour description: | - Syncs information about all Users on the Slack workspace. + Syncs information about all Users on the Slack workspace output: SlackUser sync_type: full endpoint: /slack/users @@ -1924,7 +2102,7 @@ integrations: runs: every hour description: | Syncs information about all Slack channels. Which channels get synced - (public, private, IMs, group DMs) dependson the scopes. If + (public, private, IMs, group DMs) depends on the scopes. If joinPublicChannels is set to true, the bot will automatically join all public channels as well. Scopes: At least one of channels:read, groups:read, mpim:read, im:read. To also join public channels: @@ -1944,10 +2122,16 @@ integrations: detection of the channel. For subsequent runs it will sync messages, threads & reactions from the last 10 days. Scopes required: channels:read, and at least one of - channels:history,groups:history,mpim:history,im:history - output: SlackMessage - sync_type: full - endpoint: /slack/messages + channels:history, groups:history, mpim:history, im:history + output: + - SlackMessage + - SlackMessageReply + - SlackMessageReaction + sync_type: incremental + endpoint: + - /slack/messages + - /slack/messages-reply + - /slack/messages-reaction scopes: - channels:read - channels:history @@ -2043,11 +2227,10 @@ integrations: teamtailor-candidates: runs: every 6 hours description: | - Fetches a list of all candidates from your teamtailor account. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of all candidates from your teamtailor account output: TeamtailorCandidate sync_type: full - endpoint: /teamtailor-candidates/candidates + endpoint: /teamtailor/candidates scopes: - Admin models: @@ -2147,9 +2330,7 @@ integrations: workable-candidates: runs: every 6 hours description: | - Fetches candidates from workable. - Details: incremental sync, doesn't track deletes, metadata is not - required. + Fetches a list of candidates from workable output: WorkableCandidate sync_type: incremental endpoint: /workable/candidates @@ -2158,8 +2339,7 @@ integrations: workable-candidates-activities: runs: every 6 hours description: | - Fetches activity stream of the given candidate - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of activity streams of the given candidate output: WorkableCandidateActivity sync_type: full endpoint: /workable/candidates-activities @@ -2168,8 +2348,7 @@ integrations: workable-candidates-offer: runs: every 6 hours description: | - Fetches candidate's latest offer from workable. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches candidate's latest offer from workable output: WorkableCandidateOffer sync_type: full endpoint: /workable/candidates-offer @@ -2178,9 +2357,7 @@ integrations: workable-jobs: runs: every 6 hours description: | - Fetches jobs from workable. - Details: incremental sync, doesn't track deletes, metadata is not - required. + Fetches a list of jobs from workable output: WorkableJob sync_type: incremental endpoint: /workable/jobs @@ -2189,8 +2366,7 @@ integrations: workable-jobs-candidates: runs: every 6 hours description: | - Fetches candidates for the specified job from workable. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of candidates for the specified job from workable output: WorkableJobsCandidate sync_type: full endpoint: /workable/jobs-candidates @@ -2199,8 +2375,7 @@ integrations: workable-jobs-questions: runs: every 6 hours description: | - Fetches questions for the specified job from workable. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of questions for the specified job from workable output: WorkableJobQuestion sync_type: full endpoint: /workable/jobs-questions @@ -2209,20 +2384,28 @@ integrations: workable-members: runs: every 6 hours description: | - Fetches account members from workable. - Details: full sync, doesn't track deletes, metadata is not required. + Fetches a list of account members from workable output: WorkableMember sync_type: full endpoint: /workable/members scopes: - r_jobs actions: + workable-create-candidate: + description: | + Action to create a candidate at the specified job + scopes: + - w_candidates + output: WorkableCreateCandidateResponse + input: WorkableCreateCandidateInput + endpoint: POST /workable/create-candidate workable-create-comment: description: | - Action to create a comment on the applicant's timeline. - Scope(s): w_candidates or w_comments + Action to create a comment on the applicant's timeline + scopes: + - w_candidates or w_comments output: WorkableCreateCommentResponse - endpoint: /workable/create-comment + endpoint: POST /workable/create-comment models: WorkableCandidate: id: string @@ -2358,15 +2541,81 @@ integrations: zip_code: string WorkableCreateCommentResponse: id: string + WorkableCreateCandidateInput: + shortcode: string + candidate: + name: string + firstname: string + lastname: string + email: string + headline: string | undefined + summary: string | undefined + address: string | undefined + phone: string | undefined + cover_letter: string | undefined + education_entries: EducationEntry[] | undefined + experience_entries: ExperienceEntry[] | undefined + answers: Answer[] | undefined + skills: string[] | undefined + tags: string[] | undefined + disqualified: boolean | undefined + disqualification_reason: string | undefined + disqualified_at: string | undefined + social_profiles: SocialProfile[] | undefined + domain: string | undefined + recruiter_key: string | undefined + EducationEntry: + school: string + degree: string | undefined + field_of_study: string | undefined + start_date: string | undefined + end_date: string | undefined + ExperienceEntry: + title: string + summary: string | undefined + start_date: string | undefined + end_date: string | undefined + current: boolean | undefined + company: string | undefined + industry: string | undefined + Answer: + question_key: string + body: string | undefined + choices: string[] + checked: boolean | undefined + date: string | undefined + number: number | undefined + file: + name: string + data: string + SocialProfile: + type: string + name: string | undefined + username: string | undefined + url: string + WorkableCreateCommentInput: + id: string + member_id: string + comment: + body: string + policy: string[] | undefined + attachment: Attachment | undefined + Attachment: + name: string + data: string zendesk: syncs: zendesk-tickets: runs: every 1 hour + description: | + Fetches a list of tickets from zendesk output: ZendeskTicket sync_type: full endpoint: /zendesk/tickets zendesk-articles: runs: every 6 hours + description: | + Fetches a list of articles in Help center from zendesk output: ZendeskArticle sync_type: full endpoint: /zendesk/articles @@ -2460,9 +2709,7 @@ integrations: runs: every half hour auto_start: false description: | - Fetches accounts from zoho crm. - Details: full sync, doesn't track deletes, metadata is not required. - Scope(s): ZohoCRM.modules.accounts.READ or ZohoCRM.modules.ALL + Fetches a list of accounts from zoho crm output: ZohoCRMAccount sync_type: incremental endpoint: /zoho-crm/accounts @@ -2472,9 +2719,7 @@ integrations: runs: every half hour auto_start: false description: | - Fetches contacts from zoho crm. - Details: full sync, doesn't track deletes, metadata is not required. - Scope(s): ZohoCRM.modules.contacts.READ or ZohoCRM.modules.ALL + Fetches a list of contacts from zoho crm output: ZohoCRMContact sync_type: incremental endpoint: /zoho-crm/contacts @@ -2484,9 +2729,7 @@ integrations: runs: every half hour auto_start: false description: | - Fetches deals/opportunities from zoho crm. - Details: full sync, doesn't track deletes, metadata is not required. - Scope(s): ZohoCRM.modules.deals.READ or ZohoCRM.modules.ALL + Fetches a list of deals/opportunities from zoho crm output: ZohoCRMDeal sync_type: incremental endpoint: /zoho-crm/deals