Alloy Automation Headless API

The Headless API from Alloy Automation — 5 operation(s) for headless.

Operations 5

POST /headless/credentials Create Credential #
POST /headless/startInstallation Start Installation #
POST /headless/completeInstallation Complete Installation #
POST /headless/editInstallation Edit Installation #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/alloy-automation:alloy-automation-headless-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

alloy-automation-headless-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Embedded 2025-09 Headless API
  version: '5.0'
servers:
- url: https://production.runalloy.com
tags:
- name: Headless
paths:
  /headless/credentials:
    post:
      summary: Create Credential
      description: Use this endpoint to add a credential programmatically via the API. This endpoint should be used primarily for non-OAuth blocks. If you are using custom OAuth with an OAuth block and you have the OAuth tokens already, you can add them to Alloy with this endpoint. Please reference this section of our docs for a complete tutorial on when and how to use this endpoint.
      operationId: create-a-credential
      parameters:
      - name: Authorization
        in: header
        required: true
        schema:
          type: string
          default: bearer YOUR_API_KEY
      - $ref: '#/components/parameters/xApiVersion'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required:
              - credential
              - userId
              properties:
                credential:
                  type: object
                  description: The data for the credential you want to create.
                  properties:
                    type:
                      type: string
                      description: Connector name, e.g., "netsuite".
                    data:
                      type: object
                      description: Connector authentication required parameters.
                      properties:
                        realm:
                          type: string
                        consumerKey:
                          type: string
                        tokenId:
                          type: string
                        tokenSecret:
                          type: string
                userId:
                  type: string
                  description: The id of the currently logged in user
            examples:
              Request Example:
                value:
                  userId: string
                  credential:
                    type: netsuite
                    data:
                      realm: XXX
                      consumerKey: XXX
                      tokenId: XXX
                      tokenSecret: XXX
      responses:
        '200':
          description: '200'
          content:
            application/json:
              examples:
                Result:
                  value:
                    success: true
                    credentialId: 63252d14cc29df15cc481a76
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                    default: true
                  credentialId:
                    type: string
                    example: 63252d14cc29df15cc481a76
      deprecated: false
      security: []
      tags:
      - Headless
  /headless/oauthUrl:
    get:
      summary: Create OAuth Link
      description: 'This endpoint can be used to generate an OAuth link if you want to completely white label your authentication experience. You can use this endpoint to generate a link which your users can click to redirect to the specified application without rendering the Alloy Embedded Modal.


        Note: this endpoint **only** works with OAuth enabled integrations. To add a credential manually, please use the POST Create Credential API.


        This endpoint takes a `userId`, `integrationId`, and `connectorName` as inputs. It should be used in conjunction with the GET Credential Metadata API. `credentialName` represents the name of the integration you want to call.


        If the credential metadata endpoint returns any `properties,` you must pass them as query string parameters at the end of this call.

        For example, to generate a `oAuthURL` for Shopify, you''ll need to add the specify `shopifySubdomain` in the query paramter of the URI. Your URI may look like `/oauthUrl?userId=YOUR_USER_ID&app=shopify&shopSubdomain=YOUR_STORE_NAME`'
      operationId: generate-oauth-link
      parameters:
      - name: Authorization
        in: header
        required: true
        schema:
          type: string
          default: bearer YOUR_API_KEY
      - $ref: '#/components/parameters/xApiVersion'
      - name: userId
        in: query
        description: The id of the user to generate this link for
        required: true
        schema:
          type: string
      - name: app
        in: query
        description: The name of the app you want the user to authorize access to
        required: true
        schema:
          type: string
      x-code-samples:
      - lang: cURL
        source: "curl -X GET \"https://production.runalloy.com/oauthUrl?userId={{userId}}&app=shopify\" \\\n  -H \"Authorization: bearer YOUR_API_KEY\" \\\n  -H \"x-api-version: 2025-09\"\n"
      - lang: Python
        source: "import requests\n\nurl = \"https://production.runalloy.com/oauthUrl\"\nparams = {\"userId\": \"{{userId}}\", \"app\": \"shopify\"}\nheaders = {\n    \"Authorization\": \"bearer YOUR_API_KEY\",\n    \"x-api-version\": \"2025-09\"\n}\n\nresponse = requests.get(url, params=params, headers=headers)\nprint(response.json())\n"
      - lang: JavaScript
        source: "const userId = \"{{userId}}\";\nconst app = \"shopify\";\nconst url = `https://production.runalloy.com/oauthUrl?userId=${userId}&app=${app}`;\n\nfetch(url, {\n  method: \"GET\",\n  headers: {\n    \"Authorization\": \"bearer YOUR_API_KEY\",\n    \"x-api-version\": \"2025-09\"\n  }\n})\n  .then(response => response.json())\n  .then(data => console.log(data))\n  .catch(error => console.error(\"Error:\", error));\n"
      - lang: PHP
        source: "<?php\n$userId = \"{{userId}}\";\n$app = \"shopify\";\n$url = \"https://production.runalloy.com/oauthUrl?userId=\" . urlencode($userId) . \"&app=\" . urlencode($app);\n\n$ch = curl_init($url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\ncurl_setopt($ch, CURLOPT_HTTPHEADER, [\n    \"Authorization: bearer YOUR_API_KEY\",\n    \"x-api-version: 2025-09\"\n]);\n\n$response = curl_exec($ch);\ncurl_close($ch);\n$data = json_decode($response, true);\nprint_r($data);\n?>\n"
      - lang: Go
        source: "package main\n\nimport (\n    \"encoding/json\"\n    \"fmt\"\n    \"io\"\n    \"net/http\"\n    \"net/url\"\n)\n\nfunc main() {\n    userId := \"{{userId}}\"\n    app := \"shopify\"\n    baseURL := \"https://production.runalloy.com/oauthUrl\"\n    params := url.Values{}\n    params.Add(\"userId\", userId)\n    params.Add(\"app\", app)\n    fullURL := baseURL + \"?\" + params.Encode()\n\n    req, _ := http.NewRequest(\"GET\", fullURL, nil)\n    req.Header.Set(\"Authorization\", \"bearer YOUR_API_KEY\")\n    req.Header.Set(\"x-api-version\", \"2025-09\")\n\n    client := &http.Client{}\n    resp, _ := client.Do(req)\n    defer resp.Body.Close()\n\n    body, _ := io.ReadAll(resp.Body)\n    var data map[string]interface{}\n    json.Unmarshal(body, &data)\n    fmt.Println(data)\n}\n"
      - lang: Java
        source: "import java.net.HttpURLConnection;\nimport java.net.URL;\nimport java.io.BufferedReader;\nimport java.io.InputStreamReader;\nimport com.google.gson.Gson;\nimport java.util.Map;\n\npublic class Example {\n    public static void main(String[] args) throws Exception {\n        String userId = \"{{userId}}\";\n        String app = \"shopify\";\n        String urlString = \"https://production.runalloy.com/oauthUrl?userId=\" + java.net.URLEncoder.encode(userId, \"UTF-8\") + \"&app=\" + java.net.URLEncoder.encode(app, \"UTF-8\");\n        \n        URL url = new URL(urlString);\n        HttpURLConnection conn = (HttpURLConnection) url.openConnection();\n        conn.setRequestMethod(\"GET\");\n        conn.setRequestProperty(\"Authorization\", \"bearer YOUR_API_KEY\");\n        conn.setRequestProperty(\"x-api-version\", \"2025-09\");\n        \n        BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));\n        String inputLine;\n        StringBuilder response = new StringBuilder();\n        while ((inputLine = in.readLine()) != null) {\n            response.append(inputLine);\n        }\n        in.close();\n        \n        Gson gson = new Gson();\n        Map<String, Object> data = gson.fromJson(response.toString(), Map.class);\n        System.out.println(data);\n    }\n}\n"
      - lang: Ruby
        source: 'require ''net/http''

          require ''json''

          require ''uri''


          userId = "{{userId}}"

          app = "shopify"

          uri = URI("https://production.runalloy.com/oauthUrl")

          params = { userId: userId, app: app }

          uri.query = URI.encode_www_form(params)


          http = Net::HTTP.new(uri.host, uri.port)

          http.use_ssl = true


          request = Net::HTTP::Get.new(uri)

          request[''Authorization''] = ''bearer YOUR_API_KEY''

          request[''x-api-version''] = ''2025-09''


          response = http.request(request)

          data = JSON.parse(response.body)

          puts data

          '
      responses:
        '200':
          description: '200'
          content:
            application/json:
              examples:
                Result:
                  value:
                    oauthUrl: https://api.runalloy.com/api/strategy/shopify/authorize?userId=xyz123abc098754&shopSubdomain=my-shoe-store
              schema:
                type: object
                properties:
                  oauthUrl:
                    type: string
                    example: https://api.runalloy.com/api/strategy/shopify/authorize?userId=xyz123abc098754&shopSubdomain=my-shoe-store
      deprecated: false
      security: []
      tags:
      - Headless
  /headless/startInstallation:
    post:
      summary: Start Installation
      description: This endpoint will create an installation record and return the information required to create a form for your user to fill out.
      operationId: start-installation
      parameters:
      - name: Authorization
        in: header
        required: true
        schema:
          type: string
          default: bearer YOUR_API_KEY
      - $ref: '#/components/parameters/xApiVersion'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required:
              - userId
              - integrationId
              properties:
                userId:
                  type: string
                  description: ID of the user that will install your integration
                integrationId:
                  type: string
                  description: ID of the integration which is being installed
                credentialIds:
                  type: array
                  description: List of credentials to be used in this installation. If the user has authorized any of the apps in the integration more than once, then this field is required. Otherwise, the user's credentials will be automatically detected.
                  items:
                    type: string
                workflowIds:
                  type: array
                  description: A list of workflows to include in this installation, if only a subset is desired. If every workflow in the integration will be installed, this field is optional.
                  items:
                    type: string
      responses:
        '200':
          description: '200'
          content:
            application/json:
              examples:
                Result:
                  value:
                    data:
                    - workflowId: 65b7005ae9761102a64ddd3b
                      app: netsuite
                      blockId: 3a8a8e50-f0e5-488b-9b7b-53656e93d392
                      fields:
                      - name: customerEmail
                        displayName: Customer's Email
                        type: string
                        required: true
                    installationId: 65b701c2f5ba66db3bc53a68
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        workflowId:
                          type: string
                          example: 65b7005ae9761102a64ddd3b
                        app:
                          type: string
                          example: netsuite
                        blockId:
                          type: string
                          example: 3a8a8e50-f0e5-488b-9b7b-53656e93d392
                        fields:
                          type: array
                          items:
                            type: object
                            properties:
                              name:
                                type: string
                                example: customerEmail
                              displayName:
                                type: string
                                example: Customer's Email
                              type:
                                type: string
                                example: string
                              required:
                                type: boolean
                                example: true
                                default: true
                  installationId:
                    type: string
                    example: 65b701c2f5ba66db3bc53a68
        '400':
          description: '400'
          content:
            application/json:
              examples:
                Result:
                  value: '{"message":"User is not authorized to install integrations for this account"}'
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: User is not authorized to install integrations for this account
      deprecated: false
      tags:
      - Headless
  /headless/completeInstallation:
    post:
      summary: Complete Installation
      description: ''
      operationId: complete-installation
      parameters:
      - name: Authorization
        in: header
        required: true
        schema:
          type: string
          default: bearer YOUR_API_KEY
      - $ref: '#/components/parameters/xApiVersion'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required:
              - installationId
              - data
              properties:
                installationId:
                  type: string
                  description: ID you received when you started the installation.
                data:
                  type: array
                  description: Values filled by user in your installation form
                  items:
                    properties:
                      workflowId:
                        type: string
                      blockId:
                        type: string
                      fields:
                        type: array
                        items:
                          properties:
                            name:
                              type: string
                            value:
                              type: string
                          required:
                          - name
                          - value
                          type: object
                    required:
                    - workflowId
                    - blockId
                    type: object
      responses:
        '200':
          description: '200'
          content:
            application/json:
              examples:
                Result:
                  value:
                    message: Installation completed successfully
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: Installation completed successfully
        '400':
          description: '400'
          content:
            application/json:
              examples:
                Result:
                  value: '{}'
              schema:
                type: object
                properties: {}
      deprecated: false
      tags:
      - Headless
  /headless/editInstallation:
    post:
      summary: Edit Installation
      description: This endpoint allows you to edit an existing installation for a user. The `credentialIds` and `installationId` are optional parameters. If the user has authorized any of the apps in the integration more than once, then `credentialIds` is required. Otherwise, the user's credentials will be automatically detected.
      operationId: edit-installation
      parameters:
      - name: Authorization
        in: header
        required: true
        schema:
          type: string
          default: bearer YOUR_API_KEY
      - $ref: '#/components/parameters/xApiVersion'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - userId
              - integrationId
              properties:
                userId:
                  type: string
                  description: The id of the user to generate this link for.
                  example: string
                integrationId:
                  type: string
                  description: The integration you want to install.
                  example: string
                credentialIds:
                  type: array
                  items:
                    type: string
                  description: List of credentials to be used in this installation. If the user has authorized any of the apps in the integration more than once, then this field is required. Otherwise, the user's credentials will be automatically detected.
                installationId:
                  type: string
                  description: ID you received when you started the installation.
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      installationId:
                        type: string
                        example: 674570d5160c297be4a3ee74
                      integrationId:
                        type: string
                        example: 66fa99433793749b64c1bf82
                      userId:
                        type: string
                        example: 659d28e18c35f07db18fcd8c
                      formData:
                        type: array
                        items: {}
                      credentialIds:
                        type: object
                        additionalProperties:
                          type: string
                        example:
                          klaviyoApi: 66c79e5965ede8edfa909553
                      workflowIds:
                        type: array
                        items:
                          type: string
                        example:
                        - 66fa99453793749b64c1bfa8
                      installedData:
                        type: array
                        items: {}
                      installedAt:
                        type: string
                        format: date-time
                        example: '2024-11-26T06:55:33Z'
      tags:
      - Headless
components:
  parameters:
    xApiVersion:
      name: x-api-version
      in: header
      required: true
      description: The version of the API to use. The current API version is **2025-09**.
      schema:
        type: string
        default: 2025-09
  securitySchemes:
    sec0:
      type: apiKey
      in: header
      name: Authorization
      x-bearer-format: bearer
x-readme:
  headers: []
  explorer-enabled: true
  proxy-enabled: true
x-readme-fauxas: true
x-provenance:
  method: harvested
  publisher: Alloy Automation
  source: https://docs.runalloy.com/openapi/2025-09/embedded/embedded.yaml
  note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
    stamped by stamp-openapi-provenance.py (roadmap#793)