curl --request PATCH \
--url https://panel.metricanic.com/api/v1/offers/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"appendClickId": false
}
'import requests
url = "https://panel.metricanic.com/api/v1/offers/{id}"
payload = { "appendClickId": False }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({appendClickId: false})
};
fetch('https://panel.metricanic.com/api/v1/offers/{id}', 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://panel.metricanic.com/api/v1/offers/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'appendClickId' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://panel.metricanic.com/api/v1/offers/{id}"
payload := strings.NewReader("{\n \"appendClickId\": false\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://panel.metricanic.com/api/v1/offers/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"appendClickId\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://panel.metricanic.com/api/v1/offers/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"appendClickId\": false\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"data": null
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}Update offer
Updates the supplied offer fields. Changes can take time to apply to campaigns using the offer.
curl --request PATCH \
--url https://panel.metricanic.com/api/v1/offers/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"appendClickId": false
}
'import requests
url = "https://panel.metricanic.com/api/v1/offers/{id}"
payload = { "appendClickId": False }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({appendClickId: false})
};
fetch('https://panel.metricanic.com/api/v1/offers/{id}', 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://panel.metricanic.com/api/v1/offers/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'appendClickId' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://panel.metricanic.com/api/v1/offers/{id}"
payload := strings.NewReader("{\n \"appendClickId\": false\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://panel.metricanic.com/api/v1/offers/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"appendClickId\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://panel.metricanic.com/api/v1/offers/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"appendClickId\": false\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"data": null
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}{
"ok": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"requestId": "<string>"
}Authorizations
Workspace-scoped token sent in the Authorization header as Bearer . Access depends on the credential's allowed operations, read or write scope, and workspace subscription. Use an API key issued in the tracker for Public API v1. MCP uses separate OAuth credentials.
Path Parameters
Body
Partial offer update. All fields are optional.
1 - 160Public HTTPS URL template, trimmed before saving. Supports tracker macros such as {click_id} and {token1:hash} through {token15:hash} for short token codes.
1 - 2048^\s*[hH][tT][tT][pP][sS]://UUIDv4 of the affiliate network, trimmed and lowercased before lookup. Null clears the reference.
When enabled, a change to url, affiliateNetworkId or appendClickId requires the selected network's clickIdParam query parameter exactly once in the resulting URL with {click_id} as its value. Supply the complete URL, including this parameter.
Supported ISO 3166-1 alpha-2 country code, case-insensitive and trimmed. ZZ, Global, and an empty string normalize to ZZ (Global). This controls asset compatibility, not visitor filtering.