{"permissions":{},"data":{"sort":"-last_modified","schema":{"type":"object","required":["telemetryId","searchPageRegexp","queryParamName","queryParamNames"],"properties":{"isSPA":{"type":"boolean","title":"Is Single Page App","description":"Whether the provider exhibits tendencies of a single page app, namely changes\nthe entire contents of the page without having to reload."},"subframes":{"type":"array","items":{"$ref":"#/definitions/subframe"},"title":"Subframes","description":"An array of methods for determining if a sponsored subframe exists."},"components":{"type":"array","items":{"type":"object","required":["type"],"properties":{"type":{"type":"string","pattern":"^[a-z](?:_?[a-z])*$","description":"The type of component the anchor or DOM element should belong to."},"default":{"type":"boolean","description":"Whether this component should be the fallback option if a link was included in\nboth ad-related regular expressions as well as regular expressions matching\nnon-ad elements but couldn't be categorized. Defaults to false."},"topDown":{"type":"boolean","description":"Whether the component should be found first by using document.querySelectorAll\non the parent selector definition. Defaults to false."},"excluded":{"type":"object","properties":{"parent":{"type":"object","required":["selector"],"properties":{"selector":{"type":"string","description":"The root DOM element that shouldn't be a parent from the context of the anchor\nbeing inspected."}}}},"description":"Conditions that should not be included."},"included":{"type":"object","required":["parent"],"properties":{"parent":{"type":"object","title":"Parent","required":["selector"],"properties":{"selector":{"type":"string","description":"If topDown is true for this component, then this will be the value used in\nquerySelectorAll(). Otherwise, it will be the value to in closest() from the\ncontext of an anchor."},"skipCount":{"$ref":"#/definitions/skipCount"},"eventListeners":{"$ref":"#/definitions/eventListeners"}},"description":"The DOM element that should only contain elements applicable to a single\ncomponent type."},"related":{"type":"object","required":["selector"],"properties":{"selector":{"type":"string","description":"The selector to use querySelectorAll from the context of the parent. Any\nelements specified will have their click events registered and categorized as\nexpanded unless explicitly overwritten in SearchSERPTelemetryChild."}}},"children":{"type":"array","items":{"type":"object","required":["selector"],"properties":{"type":{"type":"string","pattern":"^[a-z](?:_?[a-z])*$","description":"The component type to use if this child is present."},"selector":{"type":"string","description":"The selector to use querySelectorAll from the context of the parent."},"skipCount":{"$ref":"#/definitions/skipCount"},"countChildren":{"type":"boolean","description":"Whether we should count all instances of the child element instead of anchor\nlinks found inside of the parent. Defaults to false."},"eventListeners":{"$ref":"#/definitions/eventListeners"}}},"title":"Children","description":"Child DOM elements of the parent. Optional."}},"description":"Conditions that should be fulfilled."},"dependentRequired":{"topDown":["included"]}}},"title":"Components","description":"An array of components that could be on the SERP."},"searchMode":{"type":"object","title":"Search Mode Param Mapping","properties":{},"description":"A map of param names to search modes, e.g. image_search. Default if not\nspecified is 'normal_search'.","additionalProperties":{"enum":["image_search"]}},"shoppingTab":{"type":"object","title":"Shopping Tab","required":["selector","regexp"],"properties":{"regexp":{"type":"string","description":"The regular expression to match against a possible shopping tab. Must be\nprovided if using this feature."},"selector":{"type":"string","description":"The elements on the page to inspect for the shopping tab. Should be anchor\nelements."},"inspectRegexpInSERP":{"type":"boolean","description":"Whether the regexp should be used against hrefs the selector matches against."}},"description":"Deprecated in Firefox 149."},"taggedCodes":{"type":"array","items":{"type":"string","pattern":"^[a-zA-Z0-9-._]*$"},"title":"Partner Codes","description":"An array of partner codes to match against the parameters in the url. Matching\nthese codes will report the SERP as tagged."},"telemetryId":{"type":"string","title":"Telemetry Id","pattern":"^[a-z0-9-._]*$","description":"The telemetry identifier for the provider."},"organicCodes":{"type":"array","items":{"type":"string","pattern":"^[a-zA-Z0-9-._]*$"},"title":"Organic Codes","description":"An array of partner codes to match against the parameters in the url. Matching\nthese codes will report the SERP as organic:<partner code>, which means the\nsearch was performed organically rather than through a SAP."},"codeParamName":{"type":"string","title":"Partner Code Parameter Name","description":"The name of the query parameter for the partner code."},"pageTypeParam":{"type":"object","title":"Page type param","required":["keys","pageTypes"],"properties":{"keys":{"type":"array","description":"An array of strings representing the key(s) corresponding to the query\nparameter(s) that contains what type of search page is being shown."},"pageTypes":{"type":"array","items":{"type":"object","required":["name","values","enabled"],"properties":{"name":{"type":"string","description":"The name of the page type."},"target":{"type":"string","description":"The target to be recorded in telemetry."},"values":{"type":"array","description":"An array of strings representing the possible page types."},"enabled":{"type":"boolean","description":"Whether we should track this page type."},"isDefault":{"type":"boolean","description":"Whether this page type represents a default SERP. We fall back to this property\nin case, upon a page load, there is a delay in adding the page type param to the\nURL."}}},"description":"A possible page type (ex: 'web', 'shopping' or 'images')."},"enableSPAHandling":{"type":"boolean","description":"Whether a given SERP should be processed using the logic for single-page apps."}}},"accountCookies":{"type":"array","items":{"type":"object","properties":{"host":{"type":"string","description":"The host associated with a given cookie."},"name":{"type":"string","description":"The name associated with a given cookie."}}},"title":"Account Cookies","description":"An array of cookie details that are used to determine whether a client is signed\nin to a provider's account. NOTE: This property appears only in Firefox 127 but\nwas renamed to `signedInCookies` for Firefox 128 and beyond. Therefore do not\nuse this property. Please use `signedInCookies` instead."},"queryParamName":{"type":"string","title":"Search Query Parameter Name","description":"The name of the query parameter for the user's search string. This is\ndeprecated, in preference to queryParamNames, but still defined for older\nclients (pre Firefox 121)."},"alwaysMatchSERP":{"type":"object","title":"Always Match SERP","properties":{"child":{"type":"boolean","description":"Whether to skip the query param check in the child process."},"parent":{"type":"boolean","description":"Whether to skip the query param check in the parent process."}},"description":"If set, any URL matching searchPageRegexp is treated as a SERP without requiring\na query param in the specified process(es). Used for providers where the search\nquery is in the POST body rather than the URL."},"followOnCookies":{"type":"array","items":{"type":"object","properties":{"host":{"type":"string","pattern":"^[a-z0-9-._]*$","description":"The hostname on which the cookie is stored."},"name":{"type":"string","pattern":"^[a-zA-Z0-9-._]*$","description":"The name of the cookie to check."},"codeParamName":{"type":"string","pattern":"^[a-zA-Z0-9-._]*$","description":"The name of parameter within the cookie."},"extraCodePrefixes":{"type":"array","items":{"type":"string","pattern":"^[a-zA-Z0-9-._]*$"},"description":"Possible values for the query parameter in the URL that indicates this might be\na follow-on search."},"extraCodeParamName":{"type":"string","pattern":"^[a-z0-9-._]*$","description":"The query parameter name in the URL that indicates this might be a follow-on\nsearch."}}},"title":"Follow-on Cookies","description":"An array of cookie details that are used to identify follow-on searches."},"queryParamNames":{"type":"array","items":{"type":"string"},"title":"Search Query Parameter Names","description":"An array of query parameters that may be used for the user's search string."},"signedInCookies":{"type":"array","items":{"type":"object","properties":{"host":{"type":"string","description":"The host associated with a given cookie."},"name":{"type":"string","description":"The name associated with a given cookie."}}},"title":"Signed-in Cookies","description":"An array of cookie details that are used to determine whether a client is signed\nin to a provider's account."},"domainExtraction":{"type":"object","title":"Domain Extraction","properties":{"ads":{"type":"array","items":{"$ref":"#/definitions/extraction"},"description":"An array of methods for extracting domains from ads."},"nonAds":{"type":"array","items":{"$ref":"#/definitions/extraction"},"description":"An array of methods for extracting domains from non-ads."}},"description":"An array of methods for extracting domains from a SERP result."},"searchPageRegexp":{"type":"string","title":"Search Page Regular Expression","description":"A regular expression which matches the search page of the provider."},"ignoreLinkRegexps":{"type":"array","items":{"type":"string","description":"The matching regular expression."},"title":"Ignore links matching regular expressions","description":"Regular expressions matching links that should be ignored by the network\nobserver."},"nonAdsLinkRegexps":{"type":"array","items":{"type":"string","description":"The matching regular expression."},"title":"Non-ads link matching regular expressions","description":"An array containing known patterns that match non-ad links from a search\nprovider."},"searchPageMatches":{"type":"array","items":{"type":"string"},"title":"Search Page Matches","description":"An array containing match expressions used to match on URLs."},"adServerAttributes":{"type":"array","items":{"type":"string"},"title":"Ad Server Attributes","description":"An array of strings that potentially match data-attribute keys of anchors."},"followOnParamNames":{"type":"array","items":{"type":"string","pattern":"^[a-z0-9-._]*$"},"title":"Follow-on Search Parameter Names","description":"An array of query parameter names that are used when a follow-on search occurs."},"expectedOrganicCodes":{"type":"array","items":{"type":"string","pattern":"^[a-zA-Z0-9-._]*$"},"title":"Expected Organic Codes","description":"An array of partner codes to match against the parameters in the url. Matching\nthese codes will report the SERP as organic:none which means the user has done a\nsearch through the search engine's website rather than through SAP."},"impressionAttributes":{"type":"array","items":{"type":"object","required":["key"],"properties":{"key":{"type":"string","description":"The identifier for this impression attribute."},"url":{"type":"object","properties":{"regexp":{"type":"string","description":"A regular expression to match against the page URL."}},"description":"URL-based matching."},"value":{"type":"string","description":"A value to set for the attribute automatically. Useful if the attribute isn't\navailable for the provider."},"element":{"type":"object","required":["selector"],"properties":{"regexp":{"type":"string","description":"A regular expression to match against the attribute's value."},"selector":{"type":"string","description":"The CSS selector to use querySelectorAll from the context of the SERP."},"component":{"type":"object","required":["type"],"properties":{"type":{"type":"string","pattern":"^[a-z](?:_?[a-z])*$","description":"The type of component the element belongs to."},"countImpressions":{"type":"boolean","description":"Whether to count impressions for this component when the element is found."}},"description":"Component information for the element."},"attributeName":{"type":"string","description":"The attribute name to inspect on the selected elements. If not provided, the\npresence of the element is used."}},"description":"DOM element-based matching criteria."}}},"title":"Impression Attributes","description":"An array of attributes to check and record for SERP impressions. Only supported\nin Firefox 149 onwards."},"defaultPageQueryParam":{"type":"object","title":"Default page query parameter","required":["key","value"],"properties":{"key":{"type":"string","description":"The key corresponding to the query parameter that contains what type of search\npage is being shown."},"value":{"type":"string","description":"The value corresponding to the query parameter that should be matched against."}}},"extraAdServersRegexps":{"type":"array","items":{"type":"string"},"title":"Extra Ad Server Regular Expressions","description":"An array of regular expressions that match URLs of potential ad servers."},"nonAdsLinkQueryParamNames":{"type":"array","items":{"type":"string","string":"The query param name to examine."},"title":"Non-ads link query param names","description":"Query param names present in non-ads link that recover the link that will be\nredirected to."}},"definitions":{"subframe":{"type":"object","title":"Subframe","properties":{"regexp":{"type":"string","description":"A regular expression that matches subframes that hold sponsored content."},"inspectRegexpInSERP":{"type":"boolean","description":"Whether the regexp should be used to inspect subframes in the content process."},"inspectRegexpInParent":{"type":"boolean","description":"Whether the regexp should be used to inspect network events in the parent\nprocess."}},"description":"Ways to look for sponsored subframes"},"skipCount":{"type":"boolean","title":"Skip Count","description":"Whether to skip reporting of the count of these elements to ad_impressions.\nDefaults to false."},"extraction":{"anyOf":[{"type":"object","required":["selectors","method","options"],"properties":{"method":{"enum":["dataAttribute"],"description":"The extraction method used for the query."},"options":{"type":"object","required":["dataAttributeKey"],"properties":{"dataAttributeKey":{"type":"string","description":"The data attribute key that will be looked up in order to retrieve its data\nattribute value."}}},"selectors":{"type":"string","description":"The query to inspect all elements on the SERP."}}},{"type":"object","required":["selectors","method"],"properties":{"method":{"enum":["href"],"description":"The extraction method to use for the query."},"options":{"type":"object","required":["queryParamKey"],"properties":{"queryParamKey":{"type":"string","description":"The query parameter key to inspect in the href."},"queryParamValueIsHref":{"type":"boolean","description":"Whether the query param value is expected to contain an href."}}},"selectors":{"type":"string","description":"The query to use to inspect all elements on the SERP."}}},{"type":"object","required":["selectors","method"],"properties":{"method":{"enum":["textContent"],"description":"The extraction method to use for the query."},"selectors":{"type":"string","description":"The query to use to inspect all elements on the SERP."}}}]},"eventListener":{"type":"object","title":"Event Listener","required":["eventType"],"properties":{"action":{"type":"string","title":"Action","pattern":"^[a-z](?:_?[a-z])*$","description":"The action to report when the event is triggered. If the event type is 'click',\ndefaults to clicked. Otherwise, this should be provided."},"target":{"type":"string","title":"Target","pattern":"^[a-z](?:_?[a-z])*$","description":"The component type to report when the event is triggered. Uses the child\ncomponent type (if exists), otherwise uses the parent component type."},"eventType":{"type":"string","title":"Event Type","pattern":"^[a-z][A-Za-z]*$","description":"The type of event to listen for. Custom events, especially those with special\nlogic like keydownEnter, can be used if the Desktop code has been updated."}},"description":"Event listeners attached to a component."},"eventListeners":{"type":"array","items":{"$ref":"#/definitions/eventListener"},"title":"Event Listeners","description":"An array of Event Listeners to apply to elements."}}},"signature":{"ref":"1jcg7z6z7ilmg12c0l8ru9j2cy","x5u":"https://content-signature-2.cdn.mozilla.net/g/chains/202402/remote-settings.content-signature.mozilla.org-2026-07-06-11-44-42.chain","mode":"p384ecdsa","type":"contentsignaturepki","signature":"ZAG816K4xj3UsBce0n7jqWhTRtxFecFQ3Pi-eff5s0um9rrdzKbiiVAWErO0AixtaODfR1-2qrUZb4j5njqqNmrngSVKeJrLV7HTobQto-ruJfR00VAvo7vGIh8WYuud","signer_id":"remote-settings_202402","public_key":"MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE1ekd4Ug0hbwLwc56u4NZROdRzQOpiRkTRI+O1YEv759O6TS4ECOmyDXdntce6MPdvQhyKgZpU76GXQvOpY6vxRnYshVAWgvZJcCIAX+CdiLdtAs8uoO+o6kyJ6tQErkC"},"attachment":{"enabled":false,"required":false},"signatures":[{"ref":"1jcg7z6z7ilmg12c0l8ru9j2cy","x5u":"https://content-signature-2.cdn.mozilla.net/g/chains/202402/remote-settings.content-signature.mozilla.org-2026-07-06-11-44-42.chain","mode":"p384ecdsa","type":"contentsignaturepki","signature":"ZAG816K4xj3UsBce0n7jqWhTRtxFecFQ3Pi-eff5s0um9rrdzKbiiVAWErO0AixtaODfR1-2qrUZb4j5njqqNmrngSVKeJrLV7HTobQto-ruJfR00VAvo7vGIh8WYuud","signer_id":"remote-settings_202402","public_key":"MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE1ekd4Ug0hbwLwc56u4NZROdRzQOpiRkTRI+O1YEv759O6TS4ECOmyDXdntce6MPdvQhyKgZpU76GXQvOpY6vxRnYshVAWgvZJcCIAX+CdiLdtAs8uoO+o6kyJ6tQErkC"}],"displayFields":["telemetryId"],"id":"search-telemetry-v2","last_modified":1779580811014}}