> This page is for Unified.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.merge.dev/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.merge.dev/_mcp/server.

# Authorize single integration

> How to pre-select a specific integration in Merge Link so users skip the integration picker and go straight to authorization.

---

## Overview

Naming a single integration on the link token skips integration selection and takes your user straight to that integration's configuration step, instead of showing them a menu of integrations in Merge's integration authorization component.

![Skip integration selection](</_fern-img/ecca78df5f7e221ca4738cb694cff45d6b993b74de37c9e456bf8540899a93e7.webp>)

When you create a link token to initialize a linking flow session (as in Step 1 of the **[Get Started](/merge-unified/merge-link)** guide), add the identifier of the integration you want to display to the `link_token` request parameters. The linking flow then opens directly to the integration configuration input form of just that integration.

```python
	import requests

# Replace api_key with your organization's production API Key
def create_link_token(user, api_key):
    body = {
        "end_user_organization_name": user.organization_name,
        "end_user_email_address": user.email_address,
        "end_user_origin_id": user.id,
        "categories": ["hris"],
        # identifier of desired integration
        "integration": "greenhouse",
    }

    headers = {"Authorization": f"Bearer {api_key}"}

    link_token_url = "https://api.merge.dev/api/integrations/create-link-token"
    link_token_result = requests.post(link_token_url, data=body, headers=headers)
    link_token = link_token_result.json().get("link_token")

    return link_token
```

```ruby
require 'httparty'

# Replace api_key with your organization's production API Key
def create_link_token(user, api_key)
  uri = URI('https://api.merge.dev/api/integrations/create-link-token')
  body = {
    'end_user_organization_name' => user.organization_name,
    'end_user_email_address' => user.email_address,
    'end_user_origin_id' => user.id,
    'categories' => ['hris'],
    # identifier of desired integration
    'integration' => 'greenhouse'
  }
  headers = { 'Authorization' => "Bearer #{api_key}", 'Content-Type' => 'application/json' }

  link_token_response = HTTParty.post(uri, body: body.to_json, headers: headers)

  link_token_response['link_token']
end
```

```node
import { MergeClient, Merge } from '@mergeapi/merge-node-client';

// Swap YOUR_API_KEY below with your production key from:
// https://app.merge.dev/keys
const merge = new MergeClient({apiKey: 'YOUR_API_KEY'});

const linkTokenResponse = await merge.hris.linkToken.create({
  endUserEmailAddress: user.email_address, 
  endUserOrganizationName: user.organization.name, 
  endUserOriginId: user.id, 
  categories: [Merge.hris.CategoriesEnum.Hris], 
  integration: "greenhouse",
  linkExpiryMins: 30});

console.log("Created link token", linkTokenResponse.linkToken);
```

```java
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.HashMap;
import java.util.Map;

public class MergeLinkingFlow {

    public static String createLinkToken(User user, String apiKey)
            throws IOException, InterruptedException {

        Map<Object, Object> data = new HashMap();
        data.put("end_user_organization_name", user.end_user_organization_name);   // Your end user's organization name
        data.put("end_user_email_address", user.end_user_email_address);       // Your end user's email address
        data.put("end_user_origin_id", user.end_user_origin_id);           // Your end user's ID
        String[] categories = {"hris"};                  // Only use one category for single integration
        data.put("categories", categories);             
        data.put("integration", "greenhouse");           // Enter the integration name you want to use
        ObjectMapper mapper = new ObjectMapper();
        String requestBody = mapper.writeValueAsString(data);

        HttpClient client = HttpClient.newHttpClient();
        URI uri = URI.create("https://api.merge.dev/api/integrations/create-link-token");
        HttpRequest request = HttpRequest.newBuilder(uri)
                .header("Content-Type", "application/json")
                .header("Authorization", String.format("Bearer %s", apiKey))
                .POST(HttpRequest.BodyPublishers.ofString(requestBody))
                .build();

        HttpResponse<String> linkTokenResult = client.send(request, HttpResponse.BodyHandlers.ofString());
        String linkToken = new ObjectMapper().readValue(linkTokenResult.body(), ObjectNode.class).get("link_token").textValue();
        return linkToken;
    }
}
```

```elixir
# Replace api_key with your organization's production API Key
def create_link_token(user, api_key) do
  uri = "https://api.merge.dev/api/integrations/create-link-token"

  body =
    %{
      "end_user_organization_name" => user.organization_name,
      "end_user_email_address" => user.email,
      "end_user_origin_id" => user.id,
      "categories" => ["ats"],
      # identifier of desired integration
      "integration" => "greenhouse"
    }
    |> Jason.encode!()

  {:ok, response} =
    Tesla.post(uri, body,
      headers: [{"content-type", "application/json"}, {"Authorization", "Bearer #{api_key}"}]
    )

  link_token_response = Jason.decode!(response.body)
  link_token_response["link_token"]
end
```

## Integration identifiers

These are the identifiers for every documented integration, grouped by category. Pass the one you want as the `integration` parameter shown above. An integration's identifier is not always the same as the last segment of its documentation URL, so copy it from the list below or from your [Merge Dashboard](https://app.merge.dev/integrations) rather than deriving it from a page address.

#### HRIS

* `7shifts`
* `adp-decidium`
* `adp-next-gen`
* `adp-run`
* `adp-workforce-now`
* `alliancehcm`
* `altera-payroll`
* `bamboohr`
* `breathe`
* `brighthr`
* `cezanne-hr`
* `charlie`
* `charthop`
* `clayhr`
* `coolcare`
* `cyberark`
* `darwinbox`
* `dayforce`
* `deel`
* `employment-hero`
* `factorial`
* `folks-hr`
* `fourth`
* `freshteam`
* `generic-sftp`
* `google-workspace`
* `gusto`
* `hailey-hr`
* `hibob`
* `hr-cloud`
* `hr-partner`
* `hrworks`
* `humaans`
* `humi`
* `insperity-premier`
* `intellihr`
* `iris-cascade`
* `isolved`
* `itrent`
* `jumpcloud`
* `justworks`
* `kallidus`
* `keka`
* `kenjo`
* `lano`
* `leapsome`
* `lucca`
* `microsoft-entra-id`
* `namely`
* `nmbrs`
* `officient`
* `okta`
* `omnihr`
* `onelogin`
* `oracle-cloud-human-capital-management-hcm`
* `oysterhr`
* `paycaptain`
* `paychex`
* `paycom`
* `paycor`
* `payfit`
* `paylocity`
* `peoplehr`
* `personio`
* `pingone`
* `planday`
* `prismhr`
* `proliant`
* `remote`
* `revolut-people`
* `rippling`
* `sage-hr`
* `sage-people`
* `sap-successfactors`
* `sesame`
* `shapes`
* `simployer`
* `square-payroll`
* `trinet`
* `trinet-hr-platform`
* `ukg-pro`
* `ukg-pro-workforce-management`
* `ukg-ready`
* `warp`
* `workday`
* `zelt`
* `zoho-people`

#### ATS

* `applicantstack`
* `ashby`
* `asymbl`
* `bamboohr`
* `breezy`
* `bullhorn`
* `bullhorn-recruitment-cloud`
* `cats`
* `clayhr`
* `clockwork`
* `comeet`
* `cornerstone-talentlink`
* `crelate`
* `dayforce`
* `dvinci`
* `easycruit`
* `engageats`
* `eploy`
* `flatchr`
* `fountain`
* `freshteam`
* `gem`
* `greenhouse`
* `greenhouse-job-board-api`
* `harbour-ats`
* `homerun`
* `hr-cloud`
* `icims`
* `infinite-brassring`
* `jazzhr`
* `jobadder`
* `jobdiva`
* `jobscore`
* `jobsoid`
* `jobvite`
* `join`
* `lano`
* `lever`
* `manatal`
* `occupop`
* `onlyfy`
* `oracle-fusion-recruiting-cloud`
* `oracle-taleo`
* `personio-recruiting`
* `pinpoint`
* `polymer`
* `recruiterflow`
* `recruitive`
* `sage-hr`
* `sap-successfactors`
* `smartrecruiters`
* `taleez`
* `talentlyft`
* `talentreef`
* `teamtailor`
* `tellent-recruitee`
* `traffit`
* `tribepad`
* `ukg-pro-recruiting`
* `welcome-to-the-jungle`
* `workable`
* `workday`
* `zoho-recruit`

#### Accounting

* `clear-books`
* `freeagent`
* `freshbooks`
* `microsoft-dynamics-365-business-central`
* `moneybird`
* `netsuite`
* `oracle-fusion-cloud-erp`
* `quickbooks-online`
* `sage-business-cloud-accounting`
* `sage-intacct`
* `wave-financial`
* `workday`
* `xero`
* `zoho-books`

#### Ticketing

* `aha`
* `asana`
* `azure-devops`
* `basecamp`
* `bitbucket`
* `clickup`
* `dixa`
* `freshdesk`
* `freshservice`
* `front`
* `github-issues`
* `gitlab`
* `gladly`
* `gorgias`
* `help-scout`
* `hive`
* `hubspot-ticketing`
* `intercom`
* `ironclad`
* `jira`
* `jira-data-center`
* `jira-service-management`
* `kustomer`
* `linear`
* `pivotal-tracker`
* `rally`
* `reamaze`
* `salesforce-service-cloud`
* `servicenow`
* `shortcut`
* `spotdraft`
* `teamwork`
* `trello`
* `wrike`
* `zendesk`
* `zoho-bugtracker`
* `zoho-desk`

#### CRM

* `accelo`
* `activecampaign`
* `affinity`
* `capsule`
* `close`
* `copper`
* `hubspot`
* `insightly`
* `keap`
* `microsoft-dynamics-365-sales`
* `nutshell`
* `pipedrive`
* `pipeliner`
* `salesflare`
* `salesforce`
* `sugarcrm`
* `teamleader`
* `teamwork-crm`
* `vtiger`
* `zendesk-sell`
* `zoho-crm`

#### File Storage

* `box`
* `dropbox`
* `google-drive`
* `onedrive`
* `sharepoint`

#### Knowledge Base

* `confluence`
* `notion`

#### Chat

* `microsoft-teams`