Record an outbound shop click
Logs a click for a consumer offer — a lead_gen click returns a redirectUrl (the provider URL with Offergrid attribution merged on); a checkout-mode click is fire-and-forget funnel logging with no redirect. Unauthenticated, lightly rate-limited per IP.
curl --request POST \
--url https://api.offergrid.io/public/shop/clicks \
--header 'Content-Type: application/json' \
--data '
{
"offerId": "<string>",
"sessionId": "a1b2c3d4-shopper-session",
"zip": "78701",
"city": "Austin",
"state": "TX",
"referrer": "https://www.google.com/",
"utm": {
"utm_source": "google",
"utm_campaign": "internet-austin"
},
"enrollment": {
"enrollmentType": "move_in",
"esid": "10443720005941666",
"requestedStartDate": "2026-09-01"
}
}
'import requests
url = "https://api.offergrid.io/public/shop/clicks"
payload = {
"offerId": "<string>",
"sessionId": "a1b2c3d4-shopper-session",
"zip": "78701",
"city": "Austin",
"state": "TX",
"referrer": "https://www.google.com/",
"utm": {
"utm_source": "google",
"utm_campaign": "internet-austin"
},
"enrollment": {
"enrollmentType": "move_in",
"esid": "10443720005941666",
"requestedStartDate": "2026-09-01"
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
offerId: '<string>',
sessionId: 'a1b2c3d4-shopper-session',
zip: '78701',
city: 'Austin',
state: 'TX',
referrer: 'https://www.google.com/',
utm: {utm_source: 'google', utm_campaign: 'internet-austin'},
enrollment: {
enrollmentType: 'move_in',
esid: '10443720005941666',
requestedStartDate: '2026-09-01'
}
})
};
fetch('https://api.offergrid.io/public/shop/clicks', 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://api.offergrid.io/public/shop/clicks",
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([
'offerId' => '<string>',
'sessionId' => 'a1b2c3d4-shopper-session',
'zip' => '78701',
'city' => 'Austin',
'state' => 'TX',
'referrer' => 'https://www.google.com/',
'utm' => [
'utm_source' => 'google',
'utm_campaign' => 'internet-austin'
],
'enrollment' => [
'enrollmentType' => 'move_in',
'esid' => '10443720005941666',
'requestedStartDate' => '2026-09-01'
]
]),
CURLOPT_HTTPHEADER => [
"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://api.offergrid.io/public/shop/clicks"
payload := strings.NewReader("{\n \"offerId\": \"<string>\",\n \"sessionId\": \"a1b2c3d4-shopper-session\",\n \"zip\": \"78701\",\n \"city\": \"Austin\",\n \"state\": \"TX\",\n \"referrer\": \"https://www.google.com/\",\n \"utm\": {\n \"utm_source\": \"google\",\n \"utm_campaign\": \"internet-austin\"\n },\n \"enrollment\": {\n \"enrollmentType\": \"move_in\",\n \"esid\": \"10443720005941666\",\n \"requestedStartDate\": \"2026-09-01\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
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://api.offergrid.io/public/shop/clicks")
.header("Content-Type", "application/json")
.body("{\n \"offerId\": \"<string>\",\n \"sessionId\": \"a1b2c3d4-shopper-session\",\n \"zip\": \"78701\",\n \"city\": \"Austin\",\n \"state\": \"TX\",\n \"referrer\": \"https://www.google.com/\",\n \"utm\": {\n \"utm_source\": \"google\",\n \"utm_campaign\": \"internet-austin\"\n },\n \"enrollment\": {\n \"enrollmentType\": \"move_in\",\n \"esid\": \"10443720005941666\",\n \"requestedStartDate\": \"2026-09-01\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.offergrid.io/public/shop/clicks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"offerId\": \"<string>\",\n \"sessionId\": \"a1b2c3d4-shopper-session\",\n \"zip\": \"78701\",\n \"city\": \"Austin\",\n \"state\": \"TX\",\n \"referrer\": \"https://www.google.com/\",\n \"utm\": {\n \"utm_source\": \"google\",\n \"utm_campaign\": \"internet-austin\"\n },\n \"enrollment\": {\n \"enrollmentType\": \"move_in\",\n \"esid\": \"10443720005941666\",\n \"requestedStartDate\": \"2026-09-01\"\n }\n}"
response = http.request(request)
puts response.read_body{
"statusCode": 404,
"message": "Offer not found",
"error": "Not Found"
}{
"statusCode": 404,
"message": "Offer not found",
"error": "Not Found"
}{
"statusCode": 404,
"message": "Offer not found",
"error": "Not Found"
}Body
The offer this click is for
Anonymous client-generated UUID grouping clicks within one shopper session
"a1b2c3d4-shopper-session"
"78701"
"Austin"
"TX"
"https://www.google.com/"
{
"utm_source": "google",
"utm_campaign": "internet-austin"
}
Optional contact capture before a lead_gen redirect — always skippable. When present, creates a provider lead (Customer + TeamCustomer).
Show child attributes
Show child attributes
Full service address, when the handoff was reached through the checkout wizard. Its city/state/zipCode fill in for any top-level zip/city/state left unset.
Show child attributes
Show child attributes
Optional electricity enrollment details collected before a lead_gen handoff — used to fill the offer's URL template (ESIID, start date, move vs switch) so the partner prefills its signup flow.
Show child attributes
Show child attributes
Response
Click recorded
Was this page helpful?
curl --request POST \
--url https://api.offergrid.io/public/shop/clicks \
--header 'Content-Type: application/json' \
--data '
{
"offerId": "<string>",
"sessionId": "a1b2c3d4-shopper-session",
"zip": "78701",
"city": "Austin",
"state": "TX",
"referrer": "https://www.google.com/",
"utm": {
"utm_source": "google",
"utm_campaign": "internet-austin"
},
"enrollment": {
"enrollmentType": "move_in",
"esid": "10443720005941666",
"requestedStartDate": "2026-09-01"
}
}
'import requests
url = "https://api.offergrid.io/public/shop/clicks"
payload = {
"offerId": "<string>",
"sessionId": "a1b2c3d4-shopper-session",
"zip": "78701",
"city": "Austin",
"state": "TX",
"referrer": "https://www.google.com/",
"utm": {
"utm_source": "google",
"utm_campaign": "internet-austin"
},
"enrollment": {
"enrollmentType": "move_in",
"esid": "10443720005941666",
"requestedStartDate": "2026-09-01"
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
offerId: '<string>',
sessionId: 'a1b2c3d4-shopper-session',
zip: '78701',
city: 'Austin',
state: 'TX',
referrer: 'https://www.google.com/',
utm: {utm_source: 'google', utm_campaign: 'internet-austin'},
enrollment: {
enrollmentType: 'move_in',
esid: '10443720005941666',
requestedStartDate: '2026-09-01'
}
})
};
fetch('https://api.offergrid.io/public/shop/clicks', 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://api.offergrid.io/public/shop/clicks",
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([
'offerId' => '<string>',
'sessionId' => 'a1b2c3d4-shopper-session',
'zip' => '78701',
'city' => 'Austin',
'state' => 'TX',
'referrer' => 'https://www.google.com/',
'utm' => [
'utm_source' => 'google',
'utm_campaign' => 'internet-austin'
],
'enrollment' => [
'enrollmentType' => 'move_in',
'esid' => '10443720005941666',
'requestedStartDate' => '2026-09-01'
]
]),
CURLOPT_HTTPHEADER => [
"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://api.offergrid.io/public/shop/clicks"
payload := strings.NewReader("{\n \"offerId\": \"<string>\",\n \"sessionId\": \"a1b2c3d4-shopper-session\",\n \"zip\": \"78701\",\n \"city\": \"Austin\",\n \"state\": \"TX\",\n \"referrer\": \"https://www.google.com/\",\n \"utm\": {\n \"utm_source\": \"google\",\n \"utm_campaign\": \"internet-austin\"\n },\n \"enrollment\": {\n \"enrollmentType\": \"move_in\",\n \"esid\": \"10443720005941666\",\n \"requestedStartDate\": \"2026-09-01\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
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://api.offergrid.io/public/shop/clicks")
.header("Content-Type", "application/json")
.body("{\n \"offerId\": \"<string>\",\n \"sessionId\": \"a1b2c3d4-shopper-session\",\n \"zip\": \"78701\",\n \"city\": \"Austin\",\n \"state\": \"TX\",\n \"referrer\": \"https://www.google.com/\",\n \"utm\": {\n \"utm_source\": \"google\",\n \"utm_campaign\": \"internet-austin\"\n },\n \"enrollment\": {\n \"enrollmentType\": \"move_in\",\n \"esid\": \"10443720005941666\",\n \"requestedStartDate\": \"2026-09-01\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.offergrid.io/public/shop/clicks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"offerId\": \"<string>\",\n \"sessionId\": \"a1b2c3d4-shopper-session\",\n \"zip\": \"78701\",\n \"city\": \"Austin\",\n \"state\": \"TX\",\n \"referrer\": \"https://www.google.com/\",\n \"utm\": {\n \"utm_source\": \"google\",\n \"utm_campaign\": \"internet-austin\"\n },\n \"enrollment\": {\n \"enrollmentType\": \"move_in\",\n \"esid\": \"10443720005941666\",\n \"requestedStartDate\": \"2026-09-01\"\n }\n}"
response = http.request(request)
puts response.read_body{
"statusCode": 404,
"message": "Offer not found",
"error": "Not Found"
}{
"statusCode": 404,
"message": "Offer not found",
"error": "Not Found"
}{
"statusCode": 404,
"message": "Offer not found",
"error": "Not Found"
}