curl --request POST \
--url https://production.runalloy.com/headless/editInstallation \
--header 'Authorization: <authorization>' \
--header 'Content-Type: application/json' \
--header 'x-api-version: <x-api-version>' \
--data '
{
"userId": "string",
"integrationId": "string",
"credentialIds": [
"<string>"
],
"installationId": "<string>"
}
'import requests
url = "https://production.runalloy.com/headless/editInstallation"
payload = {
"userId": "string",
"integrationId": "string",
"credentialIds": ["<string>"],
"installationId": "<string>"
}
headers = {
"Authorization": "<authorization>",
"x-api-version": "<x-api-version>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Authorization: '<authorization>',
'x-api-version': '<x-api-version>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
userId: 'string',
integrationId: 'string',
credentialIds: ['<string>'],
installationId: '<string>'
})
};
fetch('https://production.runalloy.com/headless/editInstallation', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://production.runalloy.com/headless/editInstallation",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'userId' => 'string',
'integrationId' => 'string',
'credentialIds' => [
'<string>'
],
'installationId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: application/json",
"x-api-version: <x-api-version>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://production.runalloy.com/headless/editInstallation"
payload := strings.NewReader("{\n \"userId\": \"string\",\n \"integrationId\": \"string\",\n \"credentialIds\": [\n \"<string>\"\n ],\n \"installationId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<authorization>")
req.Header.Add("x-api-version", "<x-api-version>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://production.runalloy.com/headless/editInstallation")
.header("Authorization", "<authorization>")
.header("x-api-version", "<x-api-version>")
.header("Content-Type", "application/json")
.body("{\n \"userId\": \"string\",\n \"integrationId\": \"string\",\n \"credentialIds\": [\n \"<string>\"\n ],\n \"installationId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://production.runalloy.com/headless/editInstallation")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<authorization>'
request["x-api-version"] = '<x-api-version>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"userId\": \"string\",\n \"integrationId\": \"string\",\n \"credentialIds\": [\n \"<string>\"\n ],\n \"installationId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"installationId": "674570d5160c297be4a3ee74",
"integrationId": "66fa99433793749b64c1bf82",
"userId": "659d28e18c35f07db18fcd8c",
"formData": [
"<unknown>"
],
"credentialIds": {
"klaviyoApi": "66c79e5965ede8edfa909553"
},
"workflowIds": [
"66fa99453793749b64c1bfa8"
],
"installedData": [
"<unknown>"
],
"installedAt": "2024-11-26T06:55:33Z"
}
}Edit Installation
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.
curl --request POST \
--url https://production.runalloy.com/headless/editInstallation \
--header 'Authorization: <authorization>' \
--header 'Content-Type: application/json' \
--header 'x-api-version: <x-api-version>' \
--data '
{
"userId": "string",
"integrationId": "string",
"credentialIds": [
"<string>"
],
"installationId": "<string>"
}
'import requests
url = "https://production.runalloy.com/headless/editInstallation"
payload = {
"userId": "string",
"integrationId": "string",
"credentialIds": ["<string>"],
"installationId": "<string>"
}
headers = {
"Authorization": "<authorization>",
"x-api-version": "<x-api-version>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Authorization: '<authorization>',
'x-api-version': '<x-api-version>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
userId: 'string',
integrationId: 'string',
credentialIds: ['<string>'],
installationId: '<string>'
})
};
fetch('https://production.runalloy.com/headless/editInstallation', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://production.runalloy.com/headless/editInstallation",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'userId' => 'string',
'integrationId' => 'string',
'credentialIds' => [
'<string>'
],
'installationId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: application/json",
"x-api-version: <x-api-version>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://production.runalloy.com/headless/editInstallation"
payload := strings.NewReader("{\n \"userId\": \"string\",\n \"integrationId\": \"string\",\n \"credentialIds\": [\n \"<string>\"\n ],\n \"installationId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<authorization>")
req.Header.Add("x-api-version", "<x-api-version>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://production.runalloy.com/headless/editInstallation")
.header("Authorization", "<authorization>")
.header("x-api-version", "<x-api-version>")
.header("Content-Type", "application/json")
.body("{\n \"userId\": \"string\",\n \"integrationId\": \"string\",\n \"credentialIds\": [\n \"<string>\"\n ],\n \"installationId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://production.runalloy.com/headless/editInstallation")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<authorization>'
request["x-api-version"] = '<x-api-version>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"userId\": \"string\",\n \"integrationId\": \"string\",\n \"credentialIds\": [\n \"<string>\"\n ],\n \"installationId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"installationId": "674570d5160c297be4a3ee74",
"integrationId": "66fa99433793749b64c1bf82",
"userId": "659d28e18c35f07db18fcd8c",
"formData": [
"<unknown>"
],
"credentialIds": {
"klaviyoApi": "66c79e5965ede8edfa909553"
},
"workflowIds": [
"66fa99453793749b64c1bfa8"
],
"installedData": [
"<unknown>"
],
"installedAt": "2024-11-26T06:55:33Z"
}
}Headers
The version of the API to use. The current API version is 2025-09.
Body
The id of the user to generate this link for.
"string"
The integration you want to install.
"string"
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.
ID you received when you started the installation.
Response
Successful response
Show child attributes
Show child attributes

