Repository: prebid/prebid-server

Issue:
how should accounts http API/endpoint be set?
should this work for setting the accounts http endpoint that is mentioned in these docs?  https://docs.prebid.org/prebid-server/hosting/pbs-database.html#account-data

PBS_ACCOUNTS_HTTP_ENDPOINT: http://someendpoint.com/


i cant find any docs anywhere on this accounts http api?


There is/ was mention of Http Api endpoint docs in this issue, but I dont think they exist still.  Could really do with an example?
https://github.com/prebid/prebid-server/issues/2073

Discussion:
@spormeon: i see that this has been released in V3.20.0,  is the param 100% right?   GET {endpoint}?account-id=acc1&account-id=acc2


// NewFetcher returns a Fetcher which uses the Client to pull data from the endpoint.
//
// This file expects the endpoint to satisfy the following API:
//
// Stored requests
// GET {endpoint}?request-ids=["req1","req2"]&imp-ids=["imp1","imp2","imp3"]
//
// If useRfcCompliantBuilder is true (symbols will be URLEncoded)
// GET {endpoint}?request-id=req1&request-id=req2&imp-id=imp1&imp-id=imp2&imp-id=imp3
//
// Accounts
// GET {endpoint}?account-ids=["acc1","acc2"]
//
// If UseRfcCompliantBuilder is true (symbols will be URLEncoded)
// GET {endpoint}?account-id=acc1&account-id=acc2
//
// The above endpoints should return a payload like:
//
//	{
//	  "requests": {
//	    "req1": { ... stored data for req1 ... },
//	    "req2": { ... stored data for req2 ... },
//	  },
//	  "imps": {
//	    "imp1": { ... stored data for imp1 ... },
//	    "imp2": { ... stored data for imp2 ... },
//	    "imp3": null // If imp3 is not found
//	  }
//	}
//
// or
//
//	{
//	  "accounts": {
//	    "acc1": { ... config data for acc1 ... },
//	    "acc2": { ... config data for acc2 ... },
//	  },
//	}@Net-burst: @bsardo could you please point to the documentation if there is any?@spormeon: @bsardo I sort of just need to know if this should work by setting Env variables alone, as I've followed everything I can find and its not even making the call out to the endpoint by the looks of it, where as the stored request ones I've got working fine.  There seems to be some "missing piece", maybe 2,3,4 En variables need to be set, to "get it to call/ switch it on"?@bsardo: @spormeon I'll get back to you by the end of the day on this.@bsardo: @spormeon the only environment variable you should need to set is the one you are using. I just ran a quick test locally to see that a request is being made to the endpoint attempting to fetch the specified account. Note that I don't have an http account endpoint running locally.

I started up PBS with the following env var set:
`export PBS_ACCOUNTS_HTTP_ENDPOINT="http://localhost:8081/envvar/test"`

I then added the following print statement to line 140 of `stored_requests/backends/http_fetcher/fetcher.go` because I noticed the error there was being swallowed:
`fmt.Printf("Error fetching accounts %v via http: %v\n", accountIDs, err)`
https://github.com/prebid/prebid-server/blob/master/stored_requests/backends/http_fetcher/fetcher.go#L140

I sent an example request with `site.publisher.id` set to "2801".

I saw the following printed to the console which is what I expected given that is not a real endpoint: `Error fetching accounts [2801] via http: Get "http://localhost:8081/envvar/test?account-ids=%5B%222801%22%5D": dial tcp [::1]:8081: connect: connection refused`.

Are you able to replicate this?

@spormeon: @bsardo this is what I get using: 

<img width="1249" height="786" alt="Image" src="https://github.com/user-attachments/assets/77a58415-4945-4b4c-b5d0-426eaf1243ec" />


<img width="644" height="304" alt="Image" src="https://github.com/user-attachments/assets/4926c9e1-d6a8-498a-b90e-6179663d44db" />

<img width="1017" height="347" alt="Image" src="https://github.com/user-attachments/assets/351ef90a-eb54-4379-ad58-2d01478fb3b7" />

no call to the endpoint is made, no logs at the endpoint, no "request to endpoint" recorded, not even an error.  So i just dont think its even being called

this is my sample accounts json at the endpoint but its not even hitting this yet:

<img width="1076" height="176" alt="Image" src="https://github.com/user-attachments/assets/821cee67-75a6-4e67-b953-e5f76abfe1bb" />

RFC version:

<img width="935" height="124" alt="Image" src="https://github.com/user-attachments/assets/0fa29488-c4a6-4fae-abe1-13a23e2c8347" />

If I set PBS_ACCOUNT_DEFAULTS_DISABLED: false   ,   I dont get any error for "account not found" but there is still no call to the endpoint, again, no log, no recorded request at endpoint etc

Arnt we better confirming here that it works , rather than it doesnt work?


stored requests work fine, with the same sort of endpoint setup etc@spormeon: @bsardo i've found a bit more info here, these "accounts" env var's just dont seem to be being set for some reason in logs, no clue why, where as "stored requests" are?  This would account for why i'm seeing no "hits" at the endpoint etc I guess

stored requests ones being set
<img width="1384" height="323" alt="Image" src="https://github.com/user-attachments/assets/ac515779-4f95-49a1-9769-37f3167fac43" />


accounts ones not being set,  I have just duplicated them in effect but with e.g. PBS_ACCOUNTS_HTTP_ENDPOINT and the revalent settings/ endpoints:

<img width="1440" height="854" alt="Image" src="https://github.com/user-attachments/assets/c7206b58-b718-4667-88ab-2b7ae01c04dd" />

@bsardo: @spormeon thanks for the additional info. I will give this another look today and get back to you.@spormeon: @bsardo If you want I can email you the "endpoint" with a few account Ids etc?,  I just dont want to put it in a public forum@spormeon: still the best i can get is this "Invalid request: Prebid-server could not verify the Account ID. Please reach out to the prebid server host."   with no "call out" to the endpoint, so I guess its working in that its not allowing an account through but thats because its not even trying to make the call to the endpoint, so throwing "invalid" in effect, i guess@bsardo: > [@bsardo](https://github.com/bsardo) If you want I can email you the "endpoint" with a few account Ids etc?, I just dont want to put it in a public forum

@spormeon connect with me on linkedIn and send me the info.@spormeon: @bsardo connection sent@bsardo: > [@bsardo](https://github.com/bsardo) i've found a bit more info here, these "accounts" env var's just dont seem to be being set for some reason in logs, no clue why, where as "stored requests" are? This would account for why i'm seeing no "hits" at the endpoint etc I guess

@spormeon you are correct. These environment variables are not being set. There is a bug. In order for our config package viper to be able to read these account http fields as environment variables we need to call the viper function `SetDefault` for each field.
e.g.
```
v.SetDefault("accounts.http.endpoint", "")
v.SetDefault("accounts.http.amp_endpoint", "")
v.SetDefault("accounts.http.use_rfc3986_compliant_request_builder", false)
```

After I did this I was able to hit your endpoint. I will put up a PR to fix this tomorrow.

I should also note that once you pick up this fix you will end up seeing a malformed account error. The config returned from your endpoint looks like this: `{"accounts":{"10001001":{"id":"10001001"...` but I believe you just want to return `{"10001001":{"id":"10001001"...`

@spormeon: @bsardo  i've just noticed as well, do these also have to go in for "accounts"  , so as the accounts are cached for X time, so as the endpoint isnt hit on every request?  cache them for 15, 30 mins or so

v.SetDefault("stored_requests.in_memory_cache.type", "none")
	v.SetDefault("stored_requests.in_memory_cache.ttl_seconds", 0)
	v.SetDefault("stored_requests.in_memory_cache.request_cache_size_bytes", 0)
	v.SetDefault("stored_requests.in_memory_cache.imp_cache_size_bytes", 0)
	v.SetDefault("stored_requests.cache_events_api", false)
	v.SetDefault("stored_requests.http_events.endpoint", "")
	v.SetDefault("stored_requests.http_events.amp_endpoint", "")
	v.SetDefault("stored_requests.http_events.refresh_rate_seconds", 0)
	v.SetDefault("stored_requests.http_events.timeout_ms", 0)

Solution patch:
diff --git a/adapters/thetradedesk/thetradedesk.go b/adapters/thetradedesk/thetradedesk.go
index 2fdf227d1..f22744ffd 100644
--- a/adapters/thetradedesk/thetradedesk.go
+++ b/adapters/thetradedesk/thetradedesk.go
@@ -6,6 +6,8 @@ import (
 	"fmt"
 	"net/http"
 	"regexp"
+	"strconv"
+	"strings"
 	"text/template"
 
 	"github.com/prebid/prebid-server/v3/adapters"
@@ -176,6 +178,7 @@ func (a *adapter) MakeBids(internalRequest *openrtb2.BidRequest, externalRequest
 		for _, bid := range seatBid.Bid {
 			bid := bid
 
+			resolveAuctionPriceMacros(&bid)
 			bidType, err := getBidType(bid.MType)
 
 			if err != nil {
@@ -232,3 +235,12 @@ func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server co
 		templateEndpoint:       template,
 	}, nil
 }
+
+func resolveAuctionPriceMacros(bid *openrtb2.Bid) {
+	if bid == nil {
+		return
+	}
+	price := strconv.FormatFloat(bid.Price, 'f', -1, 64)
+	bid.NURL = strings.Replace(bid.NURL, "${AUCTION_PRICE}", price, -1)
+	bid.AdM = strings.Replace(bid.AdM, "${AUCTION_PRICE}", price, -1)
+}
diff --git a/config/config.go b/config/config.go
index 422af3d44..80cdaa333 100644
--- a/config/config.go
+++ b/config/config.go
@@ -1083,7 +1083,16 @@ func SetupViper(v *viper.Viper, filename string, bidderInfos BidderInfos) {
 
 	v.SetDefault("accounts.filesystem.enabled", false)
 	v.SetDefault("accounts.filesystem.directorypath", "./stored_requests/data/by_id")
+	v.SetDefault("accounts.http.endpoint", "")
+	v.SetDefault("accounts.http.use_rfc3986_compliant_request_builder", false)
 	v.SetDefault("accounts.in_memory_cache.type", "none")
+	v.SetDefault("accounts.in_memory_cache.ttl_seconds", 0)
+	v.SetDefault("accounts.in_memory_cache.size_bytes", 0)
+	v.SetDefault("accounts.cache_events.enabled", false)
+	v.SetDefault("accounts.cache_events.endpoint", "")
+	v.SetDefault("accounts.http_events.endpoint", "")
+	v.SetDefault("accounts.http_events.refresh_rate_seconds", 0)
+	v.SetDefault("accounts.http_events.timeout_ms", 0)
 
 	v.BindEnv("user_sync.external_url")
 	v.BindEnv("user_sync.coop_sync.default")



Test patch:
diff --git a/adapters/thetradedesk/thetradedesk_test.go b/adapters/thetradedesk/thetradedesk_test.go
index 22fdcebee..11ffda30d 100644
--- a/adapters/thetradedesk/thetradedesk_test.go
+++ b/adapters/thetradedesk/thetradedesk_test.go
@@ -451,3 +451,147 @@ func TestTheTradeDeskAdapter_BuildEndpoint(t *testing.T) {
 		})
 	}
 }
+
+func TestResolveAuctionPriceMacros(t *testing.T) {
+	tests := []struct {
+		name         string
+		bid          *openrtb2.Bid
+		expectedNURL string
+		expectedAdM  string
+	}{
+		{
+			name: "nil_bid",
+			bid:  nil,
+		},
+		{
+			name: "no_macros",
+			bid: &openrtb2.Bid{
+				Price: 1.23,
+				NURL:  "http://example.com/nurl",
+				AdM:   "<div>Ad content</div>",
+			},
+			expectedNURL: "http://example.com/nurl",
+			expectedAdM:  "<div>Ad content</div>",
+		},
+		{
+			name: "macros_in_both_nurl_and_adm",
+			bid: &openrtb2.Bid{
+				Price: 1.50,
+				NURL:  "http://example.com/nurl?price=${AUCTION_PRICE}",
+				AdM:   "<div>Ad content with price ${AUCTION_PRICE}</div>",
+			},
+			expectedNURL: "http://example.com/nurl?price=1.5",
+			expectedAdM:  "<div>Ad content with price 1.5</div>",
+		},
+		{
+			name: "macro_only_in_nurl",
+			bid: &openrtb2.Bid{
+				Price: 2.75,
+				NURL:  "http://example.com/nurl?price=${AUCTION_PRICE}",
+				AdM:   "<div>Ad content</div>",
+			},
+			expectedNURL: "http://example.com/nurl?price=2.75",
+			expectedAdM:  "<div>Ad content</div>",
+		},
+		{
+			name: "macro_only_in_adm",
+			bid: &openrtb2.Bid{
+				Price: 0.99,
+				NURL:  "http://example.com/nurl",
+				AdM:   "<div>Price: ${AUCTION_PRICE}</div>",
+			},
+			expectedNURL: "http://example.com/nurl",
+			expectedAdM:  "<div>Price: 0.99</div>",
+		},
+		{
+			name: "multiple_macros_in_same_field",
+			bid: &openrtb2.Bid{
+				Price: 3.14,
+				NURL:  "http://example.com/nurl?price=${AUCTION_PRICE}&backup_price=${AUCTION_PRICE}",
+				AdM:   "<div>Price: ${AUCTION_PRICE}, Backup: ${AUCTION_PRICE}</div>",
+			},
+			expectedNURL: "http://example.com/nurl?price=3.14&backup_price=3.14",
+			expectedAdM:  "<div>Price: 3.14, Backup: 3.14</div>",
+		},
+		{
+			name: "zero_price",
+			bid: &openrtb2.Bid{
+				Price: 0.0,
+				NURL:  "http://example.com/nurl?price=${AUCTION_PRICE}",
+				AdM:   "<div>Price: ${AUCTION_PRICE}</div>",
+			},
+			expectedNURL: "http://example.com/nurl?price=0",
+			expectedAdM:  "<div>Price: 0</div>",
+		},
+		{
+			name: "very_small_price",
+			bid: &openrtb2.Bid{
+				Price: 0.001,
+				NURL:  "http://example.com/nurl?price=${AUCTION_PRICE}",
+				AdM:   "<div>Price: ${AUCTION_PRICE}</div>",
+			},
+			expectedNURL: "http://example.com/nurl?price=0.001",
+			expectedAdM:  "<div>Price: 0.001</div>",
+		},
+		{
+			name: "large_price",
+			bid: &openrtb2.Bid{
+				Price: 999.999,
+				NURL:  "http://example.com/nurl?price=${AUCTION_PRICE}",
+				AdM:   "<div>Price: ${AUCTION_PRICE}</div>",
+			},
+			expectedNURL: "http://example.com/nurl?price=999.999",
+			expectedAdM:  "<div>Price: 999.999</div>",
+		},
+		{
+			name: "integer_price",
+			bid: &openrtb2.Bid{
+				Price: 5.0,
+				NURL:  "http://example.com/nurl?price=${AUCTION_PRICE}",
+				AdM:   "<div>Price: ${AUCTION_PRICE}</div>",
+			},
+			expectedNURL: "http://example.com/nurl?price=5",
+			expectedAdM:  "<div>Price: 5</div>",
+		},
+		{
+			name: "empty_nurl_and_adm",
+			bid: &openrtb2.Bid{
+				Price: 1.23,
+				NURL:  "",
+				AdM:   "",
+			},
+			expectedNURL: "",
+			expectedAdM:  "",
+		},
+		{
+			name: "case_sensitive_macro_not_replaced",
+			bid: &openrtb2.Bid{
+				Price: 1.50,
+				NURL:  "http://example.com/nurl?price=${auction_price}",
+				AdM:   "<div>Price: ${Auction_Price}</div>",
+			},
+			expectedNURL: "http://example.com/nurl?price=${auction_price}",
+			expectedAdM:  "<div>Price: ${Auction_Price}</div>",
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			var testBid *openrtb2.Bid
+			if tt.bid != nil {
+				bidCopy := *tt.bid
+				testBid = &bidCopy
+			}
+
+			resolveAuctionPriceMacros(testBid)
+
+			if tt.bid == nil {
+				assert.Nil(t, testBid)
+				return
+			}
+
+			assert.Equal(t, tt.expectedNURL, testBid.NURL, "NURL should match expected value")
+			assert.Equal(t, tt.expectedAdM, testBid.AdM, "AdM should match expected value")
+		})
+	}
+}
diff --git a/adapters/thetradedesk/thetradedesktest/supplemental/auction-price-macro-replacement.json b/adapters/thetradedesk/thetradedesktest/supplemental/auction-price-macro-replacement.json
new file mode 100644
index 000000000..2629242b0
--- /dev/null
+++ b/adapters/thetradedesk/thetradedesktest/supplemental/auction-price-macro-replacement.json
@@ -0,0 +1,142 @@
+{
+  "mockBidRequest": {
+    "id": "test-request-id",
+    "site": {
+      "id": "site-id", 
+      "page": "ttd.com",
+      "publisher": {
+        "id": "123456"
+      }
+    },
+    "device": {
+      "os": "android",
+      "ip": "91.199.242.236",
+      "ua": "random user agent"
+    },
+    "imp": [
+      {
+        "id": "test-imp-id", 
+        "banner": {
+          "format": [
+            {
+              "w": 300,
+              "h": 250
+            }
+          ],
+          "w": 100,
+          "h": 150
+        },
+        "ext": {
+          "bidder": {
+            "publisherId": "123456"
+          }
+        }
+      }
+    ]
+  },
+  "httpCalls": [
+    {
+      "expectedRequest": {
+        "uri": "https://direct.adsrvr.org/bid/bidder/ttd",
+        "headers": {
+          "Content-Type": [
+            "application/json;charset=utf-8"
+          ],
+          "Accept": [
+            "application/json"
+          ]
+        },
+        "body": {
+          "id": "test-request-id",
+          "site": {
+            "id": "site-id",
+            "page": "ttd.com", 
+            "publisher": {
+              "id": "123456"
+            }
+          },
+          "device": {
+            "os": "android",
+            "ip": "91.199.242.236",
+            "ua": "random user agent"
+          },
+          "imp": [
+            {
+              "id": "test-imp-id",
+              "banner": {
+                "format": [
+                  {
+                    "w": 300,
+                    "h": 250
+                  }
+                ],
+                "w": 300,
+                "h": 250
+              },
+              "ext": {
+                "bidder": {
+                  "publisherId": "123456"
+                }
+              }
+            }
+          ]
+        },
+        "impIDs":["test-imp-id"]
+      },
+      "mockResponse": {
+        "status": 200,
+        "body": {
+          "currency": "USD",
+          "seatbid": [
+            {
+              "bid": [
+                {
+                  "id": "test-slot-id",
+                  "impid": "test-imp-id",
+                  "price": 1.50,
+                  "crid": "creative-123",
+                  "adm": "<iframe src='http://creative-url.ttd.com?price=${AUCTION_PRICE}'></iframe>",
+                  "nurl": "http://win-notification.ttd.com?wp=${AUCTION_PRICE}&id=test-slot-id",
+                  "w": 300,
+                  "h": 250,
+                  "ext": {
+                    "prebid": {
+                      "type": "banner"
+                    }
+                  },
+                  "mtype": 1
+                }
+              ]
+            }
+          ]
+        }
+      }
+    }
+  ],
+  "expectedBidResponses": [
+    {
+      "currency": "USD",
+      "bids": [
+        {
+          "bid": {
+            "id": "test-slot-id",
+            "impid": "test-imp-id",
+            "price": 1.50,
+            "crid": "creative-123",
+            "adm": "<iframe src='http://creative-url.ttd.com?price=1.5'></iframe>",
+            "nurl": "http://win-notification.ttd.com?wp=1.5&id=test-slot-id",
+            "w": 300,
+            "h": 250,
+            "ext": {
+              "prebid": {
+                "type": "banner"
+              }
+            },
+            "mtype": 1
+          },
+          "type": "banner"
+        }
+      ]
+    }
+  ]
+} 
\ No newline at end of file
diff --git a/config/config_test.go b/config/config_test.go
index d1493afce..49248e8ed 100644
--- a/config/config_test.go
+++ b/config/config_test.go
@@ -167,6 +167,18 @@ func TestDefaults(t *testing.T) {
 	cmpStrings(t, "stored_requests.http.endpoint", "", cfg.StoredRequests.HTTP.Endpoint)
 	cmpStrings(t, "stored_requests.http.amp_endpoint", "", cfg.StoredRequests.HTTP.AmpEndpoint)
 	cmpBools(t, "stored_requests.http.use_rfc3986_compliant_request_builder", false, cfg.StoredRequests.HTTP.UseRfcCompliantBuilder)
+	cmpBools(t, "accounts.filesystem.enabled", false, cfg.Accounts.Files.Enabled)
+	cmpStrings(t, "accounts.filesystem.directorypath", "./stored_requests/data/by_id", cfg.Accounts.Files.Path)
+	cmpStrings(t, "accounts.http.endpoint", "", cfg.Accounts.HTTP.Endpoint)
+	cmpBools(t, "accounts.http.use_rfc3986_compliant_request_builder", false, cfg.Accounts.HTTP.UseRfcCompliantBuilder)
+	cmpStrings(t, "accounts.in_memory_cache.type", "none", cfg.Accounts.InMemoryCache.Type)
+	cmpInts(t, "accounts.in_memory_cache.ttl_seconds", 0, cfg.Accounts.InMemoryCache.TTL)
+	cmpInts(t, "accounts.in_memory_cache.size_bytes", 0, cfg.Accounts.InMemoryCache.Size)
+	cmpBools(t, "accounts.cache_events.enabled", false, cfg.Accounts.CacheEvents.Enabled)
+	cmpStrings(t, "accounts.cache_events.endpoint", "", cfg.Accounts.CacheEvents.Endpoint)
+	cmpStrings(t, "accounts.http_events.endpoint", "", cfg.Accounts.HTTPEvents.Endpoint)
+	cmpInts(t, "accounts.http_events.refresh_rate_seconds", 0, int(cfg.Accounts.HTTPEvents.RefreshRate))
+	cmpInts(t, "accounts.http_events.timeout_ms", 0, int(cfg.Accounts.HTTPEvents.Timeout))
 	cmpBools(t, "auto_gen_source_tid", true, cfg.AutoGenSourceTID)
 	cmpBools(t, "generate_bid_id", false, cfg.GenerateBidID)
 	cmpStrings(t, "experiment.adscert.mode", "off", cfg.Experiment.AdCerts.Mode)
@@ -350,6 +362,24 @@ func TestDefaults(t *testing.T) {
 
 // When adding a new field, make sure the indentations are spaces not tabs otherwise read config may fail to parse the new field value.
 var fullConfig = []byte(`
+accounts:
+  filesystem:
+    enabled: true
+    directorypath: "./example_directory"
+  http:
+    endpoint: "https://prebid.org"
+    use_rfc3986_compliant_request_builder: true
+  in_memory_cache:
+    type: "lru"
+    ttl_seconds: 300
+    size_bytes: 1000
+  cache_events:
+    enabled: true
+    endpoint: "https://prebid.org"
+  http_events:
+    endpoint: "https://prebid.org"
+    refresh_rate_seconds: 300
+    timeout_ms: 100
 gdpr:
   host_vendor_id: 15
   default_value: "1"
@@ -624,6 +654,18 @@ func TestFullConfig(t *testing.T) {
 	cmpStrings(t, "stored_requests.http.endpoint", "", cfg.StoredRequests.HTTP.Endpoint)
 	cmpStrings(t, "stored_requests.http.amp_endpoint", "", cfg.StoredRequests.HTTP.AmpEndpoint)
 	cmpBools(t, "stored_requests.http.use_rfc3986_compliant_request_builder", false, cfg.StoredRequests.HTTP.UseRfcCompliantBuilder)
+	cmpBools(t, "accounts.filesystem.enabled", true, cfg.Accounts.Files.Enabled)
+	cmpStrings(t, "accounts.filesystem.directorypath", "./example_directory", cfg.Accounts.Files.Path)
+	cmpStrings(t, "accounts.http.endpoint", "https://prebid.org", cfg.Accounts.HTTP.Endpoint)
+	cmpBools(t, "accounts.http.use_rfc3986_compliant_request_builder", true, cfg.Accounts.HTTP.UseRfcCompliantBuilder)
+	cmpStrings(t, "accounts.in_memory_cache.type", "lru", cfg.Accounts.InMemoryCache.Type)
+	cmpInts(t, "accounts.in_memory_cache.ttl_seconds", 300, cfg.Accounts.InMemoryCache.TTL)
+	cmpInts(t, "accounts.in_memory_cache.size_bytes", 1000, cfg.Accounts.InMemoryCache.Size)
+	cmpBools(t, "accounts.cache_events.enabled", true, cfg.Accounts.CacheEvents.Enabled)
+	cmpStrings(t, "accounts.cache_events.endpoint", "https://prebid.org", cfg.Accounts.CacheEvents.Endpoint)
+	cmpStrings(t, "accounts.http_events.endpoint", "https://prebid.org", cfg.Accounts.HTTPEvents.Endpoint)
+	cmpInts(t, "accounts.http_events.refresh_rate_seconds", 300, int(cfg.Accounts.HTTPEvents.RefreshRate))
+	cmpInts(t, "accounts.http_events.timeout_ms", 100, int(cfg.Accounts.HTTPEvents.Timeout))
 	cmpStrings(t, "cache.scheme", "http", cfg.CacheURL.Scheme)
 	cmpStrings(t, "cache.host", "prebidcache.net", cfg.CacheURL.Host)
 	cmpStrings(t, "cache.query", "uuid=%PBS_CACHE_UUID%", cfg.CacheURL.Query)