From ee4ea35441ac98a57aa560a11707857163c31c43 Mon Sep 17 00:00:00 2001 From: Conor Teichroeb Date: Fri, 16 Oct 2026 09:57:07 -0700 Subject: [PATCH 1/6] Fix campaign-api deviceType pointing to the wrong ID set campaign-api's deviceType field was linked to master-api's "Get device type" and used its EnumWidget, both of which reflect the 2030000x IDs Planner (HCP/Political) uses. campaign-api validates deviceType against its own master_device_type table via a hardcoded DeviceTypeEnum (11 Mobile, 12 Tablet, 13 Connected TV, 15 Desktop) - confirmed in source (CampaignDBValidationUtil, DeviceTypeEnum.java) - and the 2030000x IDs don't appear anywhere in campaign-api. The request examples already used the right IDs (13,15,11,12); only the field descriptions/widgets were wrong, in 5 places. There's no list endpoint for this set, so added a dedicated campaignDeviceTypes enum widget instead of a (nonexistent) link. Co-Authored-By: Claude Sonnet 5 --- docs/guidelines/campaign-api.mdx | 12 ++++++------ src/data/enums/campaignDeviceTypes.ts | 12 ++++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 src/data/enums/campaignDeviceTypes.ts diff --git a/docs/guidelines/campaign-api.mdx b/docs/guidelines/campaign-api.mdx index 31e4211e..041b4b2c 100644 --- a/docs/guidelines/campaign-api.mdx +++ b/docs/guidelines/campaign-api.mdx @@ -20,7 +20,7 @@ import { ioStatus } from '@site/src/data/enums/ioStatus'; import { budgetDistributionMethods } from '@site/src/data/enums/budgetDistributionMethods'; import { companySize } from '@site/src/data/enums/companySize'; import { campaignGoals } from '@site/src/data/enums/campaignGoals'; -import { deviceType } from '@site/src/data/enums/deviceType'; +import { campaignDeviceTypes } from '@site/src/data/enums/campaignDeviceTypes'; # Campaign API @@ -198,7 +198,7 @@ Use the following header parameters for all requests: `deviceType`
string -Comma separated [device type IDs](/guidelines/master-api#get-device-type).
+Comma separated device type IDs.
`trafficType`
string @@ -3468,7 +3468,7 @@ Create a new campaign in pending or draft status. `deviceType`
string optional - Comma separated [device type IDs](/guidelines/master-api#get-device-type) for targeting.
+ Comma separated device type IDs for targeting.
`trafficType`
string optional @@ -3496,7 +3496,7 @@ Create a new campaign in pending or draft status. `device`
string optional - Comma separated [device type IDs](/guidelines/master-api#get-device-type) for targeting.
+ Comma separated device type IDs for targeting.
`publisherAdCategory`
string @@ -4197,7 +4197,7 @@ If campaign is in draft status, this API will automatically update st `deviceType`
string -Comma separated [device type IDs](/guidelines/master-api#get-device-type) for targeting.
+Comma separated device type IDs for targeting.
`trafficType`
string @@ -7306,7 +7306,7 @@ Include or exclude device type targeting for a given campaign. | Request schema | | | --- | --- | -| `ids`
string | Comma-separated [device type](/guidelines/master-api#get-device-type) IDs to target or block.
| +| `ids`
string | Comma-separated device type IDs to target or block.
| | `isExcluded`
integer | Target entity: 0.
Block entity: 1. | | `campaignId`
integer | [Campaign ID](/guidelines/campaign-api#get-list-of-campaigns). | diff --git a/src/data/enums/campaignDeviceTypes.ts b/src/data/enums/campaignDeviceTypes.ts new file mode 100644 index 00000000..83a3ffe7 --- /dev/null +++ b/src/data/enums/campaignDeviceTypes.ts @@ -0,0 +1,12 @@ +import type { EnumValue } from '@site/src/components/EnumWidget'; + +// Source: campaign-api's DeviceTypeEnum.java. Validated against the +// master_device_type table, but there's no list endpoint for it - this is a +// distinct, smaller set from master-api's "Get device type" (2030000x IDs), +// which is used by Planner (HCP/Political), not by campaign-api. +export const campaignDeviceTypes: EnumValue[] = [ + { id: 11, label: 'Mobile' }, + { id: 12, label: 'Tablet' }, + { id: 13, label: 'Connected TV' }, + { id: 15, label: 'Desktop' }, +]; From 6744d51d959b3e196214d2e41db21ca250cede76 Mon Sep 17 00:00:00 2001 From: Conor Teichroeb Date: Fri, 16 Oct 2026 10:03:28 -0700 Subject: [PATCH 2/6] Fix Send find my Workspace email's response shape and behavior This section already existed (contrary to it appearing undocumented), but matched the controller's own stale swagger example: a flat "data": "Email sent to..." string. The real service always returns the same generic message regardless of whether the email matches a Workspace - a deliberate anti-enumeration measure - and sends the actual email asynchronously in the background. Fixed the response shape to {"data": {"message": "..."}} with the real constant text, and documented the behavior. Co-Authored-By: Claude Sonnet 5 --- docs/guidelines/workspace-api.mdx | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/docs/guidelines/workspace-api.mdx b/docs/guidelines/workspace-api.mdx index 19278af9..7c8b80c6 100644 --- a/docs/guidelines/workspace-api.mdx +++ b/docs/guidelines/workspace-api.mdx @@ -2303,7 +2303,13 @@ function GetWorkspaceChatBotAppIdByWorkspaceDomain(): Promise {
-Send an email to help a user locate their Workspace. +Send an email listing the Workspace domain(s) associated with the given email address, for users who've forgotten which Workspace they belong to. No authentication is required. + +The response is always the same generic message, regardless of whether the email address is associated with any Workspace -- this is intentional, so that the response content and timing don't reveal whether an account exists. If a match is found, the email itself is sent asynchronously in the background after the response is returned. + +:::info +This endpoint is rate limited to 100 requests per minute, per IP. Exceeding it returns a 429 (Too Many Requests) error. See [Rate limits](/getting-started/rest-api-reference#rate-limits). +::: | Request schema | | | ---- | --- | @@ -2314,8 +2320,8 @@ Send an email to help a user locate their Workspace. - - + +
`data`
string
Confirmation message indicating the email was sent.`message`
string
Generic confirmation message, always the same regardless of whether the email matches a Workspace.
@@ -2334,7 +2340,9 @@ Send an email to help a user locate their Workspace. ```json title="Response 200" { "success": true, - "data": "Email sent to user@example.com" + "data": { + "message": "If an account exists for this email address, an email has been sent." + } } ``` @@ -2355,7 +2363,9 @@ interface Responses { content: { "application/json": { success: boolean; - data: string; + data: { + message: string; + }; }; }; }; From fd8c8e9a23f6319e838c726ff68b1c7dee6c5de9 Mon Sep 17 00:00:00 2001 From: Conor Teichroeb Date: Fri, 16 Oct 2026 10:03:36 -0700 Subject: [PATCH 3/6] Replace stale rate limit info with the real 4 rate-limited endpoints rest-api-reference.mdx claimed a blanket 20 req/min "message rate limit", which doesn't match current behavior. Confirmed in source (grep for @RateLimit across user-api) that exactly 4 endpoints have per-IP rate limiting, each with its own policy - replaced the old claim with a table linking to all 4, and added an :::info callout on each endpoint's own section. Documenting the login endpoint's rate limit surfaced that it applies to an entirely undocumented endpoint: POST /api/v4/ua/login (KeycloakLoginController), a separate, newer, Keycloak-backed login distinct from the already-documented POST /api/v3/ua/login. It's form-urlencoded, supports 5 grant types, and - unlike the rest of this API - returns Keycloak's token response as-is rather than wrapping it in the standard success/data envelope. Added it as "External login", following the existing OAuth token section's conventions, plus a sidebar entry. Co-Authored-By: Claude Sonnet 5 --- docs/getting-started/rest-api-reference.mdx | 9 +- docs/guidelines/user-api.mdx | 105 ++++++++++++++++++++ sidebars.js | 7 ++ 3 files changed, 120 insertions(+), 1 deletion(-) diff --git a/docs/getting-started/rest-api-reference.mdx b/docs/getting-started/rest-api-reference.mdx index f03b0dbd..ad153ae9 100644 --- a/docs/getting-started/rest-api-reference.mdx +++ b/docs/getting-started/rest-api-reference.mdx @@ -323,6 +323,13 @@ API calls return a JSON formatted response consisting of a success bo ## Rate limits -The message rate limit is 20 requests per minute. Exceeding the limit will cause a 429 (Too Many Requests) error. +Per-IP rate limiting currently applies to 4 endpoints. Exceeding the limit returns a 429 (Too Many Requests) error. No other endpoints are rate limited by IP. + +| Endpoint | Limit | +| --- | --- | +| [POST /api/v4/ua/login](/guidelines/user-api#external-login) | 100 requests per minute | +| [POST /api/v3/ua/find-my-workspace](/guidelines/workspace-api#send-find-my-workspace-email) | 100 requests per minute | +| [POST /api/v3/ua/user/email/validate](/guidelines/user-api#validate-user-email) | 500 requests per minute | +| [POST /api/v3/ua/invite/validate](/guidelines/user-api#validate-user-invite) | 50 requests per minute | The maximum data size per page is 1K rows. \ No newline at end of file diff --git a/docs/guidelines/user-api.mdx b/docs/guidelines/user-api.mdx index 78d88822..8de683a0 100644 --- a/docs/guidelines/user-api.mdx +++ b/docs/guidelines/user-api.mdx @@ -224,6 +224,103 @@ function Login(): Promise < Responses > { --- +### External login + + + +
+
+ +Forwards the request to the external identity provider's (Keycloak) token endpoint as application/x-www-form-urlencoded, using the provider's own field names, and returns its response as-is -- unlike the rest of this API, the response is not wrapped in the standard success/data envelope. + +The grant_type field selects which OAuth2 grant is used, which determines which of the other fields are required: password, client_credentials, refresh_token, authorization_code, or device_code. + +:::info +This endpoint is rate limited to 100 requests per minute, per IP. Exceeding it returns a 429 (Too Many Requests) error. See [Rate limits](/getting-started/rest-api-reference#rate-limits). +::: + +| Request parameters | | +| --- | --- | +| `grant_type`
string required | OAuth2 grant type: password, client_credentials, refresh_token, authorization_code, or device_code. | +| `client_id`
string | External login client ID. | +| `client_secret`
string | External login client secret, for confidential clients. | +| `username`
string | Required for the password grant. | +| `password`
string | Required for the password grant. | +| `refresh_token`
string | Required for the refresh_token grant. | +| `code`
string | Required for the authorization_code grant. | +| `redirect_uri`
string | Required for the authorization_code grant. | +| `device_code`
string | Required for the device_code grant. | +| `scope`
string | Optional OAuth2 scope. | + +
+Response properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
`access_token`
string
Access token issued by the external login provider.
`expires_in`
integer
Access token expiry, in seconds.
`refresh_expires_in`
integer
Refresh token expiry, in seconds.
`refresh_token`
string
Refresh token issued by the external login provider.
`token_type`
string
Token type.
`id_token`
string
OpenID Connect ID token, present when the openid scope is granted.
`not-before-policy`
integer
External login not-before-policy value.
`session_state`
string
External login session state identifier.
`scope`
string
Granted scope.
+
+ +
+
+ +```curl title="Request sample (password)" +curl -i --location 'https://api.iqm.com/api/v4/ua/login' \ +--header 'Content-Type: application/x-www-form-urlencoded' \ +--data-urlencode 'grant_type=password' \ +--data-urlencode 'username=user@example.com' \ +--data-urlencode 'password=UserPassword123!' +``` + +```json title="Response 200" +{ + "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", + "expires_in": 300, + "refresh_expires_in": 1800, + "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", + "token_type": "Bearer", + "scope": "openid profile email" +} +``` + +
+ +--- + ### OAuth token @@ -2975,6 +3072,10 @@ function GetRemainingApplications(params: { The invited user will receive an email with a link and a hash which can be validated. +:::info +This endpoint is rate limited to 50 requests per minute, per IP. Exceeding it returns a 429 (Too Many Requests) error. See [Rate limits](/getting-started/rest-api-reference#rate-limits). +::: + | Request schema| | | ---- | --- | | `inviteHash`
string | Unique invite hash sent to invited user. @@ -3153,6 +3254,10 @@ Validate the password reset hash sent to a user's email. Check if a user's email is already registered. +:::info +This endpoint is rate limited to 500 requests per minute, per IP. Exceeding it returns a 429 (Too Many Requests) error. See [Rate limits](/getting-started/rest-api-reference#rate-limits). +::: + | Request schema | | | ---- | --- | | `email`
string | User's email. | diff --git a/sidebars.js b/sidebars.js index 1a9fa9c2..6d9427c2 100644 --- a/sidebars.js +++ b/sidebars.js @@ -4815,6 +4815,13 @@ const sidebars = { customProps: { method: 'POST' }, className: 'sidebarItem' }, + { + type: 'link', + label: 'External login', + href: '/guidelines/user-api#external-login', + customProps: { method: 'POST' }, + className: 'sidebarItem' + }, { type: 'link', label: 'OAuth token', From f98055cc4b667662e53a517cbef4612f7d6222e9 Mon Sep 17 00:00:00 2001 From: Conor Teichroeb Date: Fri, 16 Oct 2026 10:20:11 -0700 Subject: [PATCH 4/6] Remove undocumented External login endpoint pending confirmation POST /api/v4/ua/login isn't confirmed ready to document publicly yet. Pulled the new section, its sidebar entry, and its row in the rate limits table. The other 3 rate-limited endpoints (find-my-workspace, validate user email, validate user invite) are unaffected and remain documented with their rate limit callouts. Co-Authored-By: Claude Sonnet 5 --- docs/getting-started/rest-api-reference.mdx | 3 +- docs/guidelines/user-api.mdx | 97 --------------------- sidebars.js | 7 -- 3 files changed, 1 insertion(+), 106 deletions(-) diff --git a/docs/getting-started/rest-api-reference.mdx b/docs/getting-started/rest-api-reference.mdx index ad153ae9..0498292e 100644 --- a/docs/getting-started/rest-api-reference.mdx +++ b/docs/getting-started/rest-api-reference.mdx @@ -323,11 +323,10 @@ API calls return a JSON formatted response consisting of a success bo ## Rate limits -Per-IP rate limiting currently applies to 4 endpoints. Exceeding the limit returns a 429 (Too Many Requests) error. No other endpoints are rate limited by IP. +Per-IP rate limiting currently applies to the following endpoints. Exceeding the limit returns a 429 (Too Many Requests) error. | Endpoint | Limit | | --- | --- | -| [POST /api/v4/ua/login](/guidelines/user-api#external-login) | 100 requests per minute | | [POST /api/v3/ua/find-my-workspace](/guidelines/workspace-api#send-find-my-workspace-email) | 100 requests per minute | | [POST /api/v3/ua/user/email/validate](/guidelines/user-api#validate-user-email) | 500 requests per minute | | [POST /api/v3/ua/invite/validate](/guidelines/user-api#validate-user-invite) | 50 requests per minute | diff --git a/docs/guidelines/user-api.mdx b/docs/guidelines/user-api.mdx index 8de683a0..c37a1bc1 100644 --- a/docs/guidelines/user-api.mdx +++ b/docs/guidelines/user-api.mdx @@ -224,103 +224,6 @@ function Login(): Promise < Responses > { --- -### External login - - - -
-
- -Forwards the request to the external identity provider's (Keycloak) token endpoint as application/x-www-form-urlencoded, using the provider's own field names, and returns its response as-is -- unlike the rest of this API, the response is not wrapped in the standard success/data envelope. - -The grant_type field selects which OAuth2 grant is used, which determines which of the other fields are required: password, client_credentials, refresh_token, authorization_code, or device_code. - -:::info -This endpoint is rate limited to 100 requests per minute, per IP. Exceeding it returns a 429 (Too Many Requests) error. See [Rate limits](/getting-started/rest-api-reference#rate-limits). -::: - -| Request parameters | | -| --- | --- | -| `grant_type`
string required | OAuth2 grant type: password, client_credentials, refresh_token, authorization_code, or device_code. | -| `client_id`
string | External login client ID. | -| `client_secret`
string | External login client secret, for confidential clients. | -| `username`
string | Required for the password grant. | -| `password`
string | Required for the password grant. | -| `refresh_token`
string | Required for the refresh_token grant. | -| `code`
string | Required for the authorization_code grant. | -| `redirect_uri`
string | Required for the authorization_code grant. | -| `device_code`
string | Required for the device_code grant. | -| `scope`
string | Optional OAuth2 scope. | - -
-Response properties - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
`access_token`
string
Access token issued by the external login provider.
`expires_in`
integer
Access token expiry, in seconds.
`refresh_expires_in`
integer
Refresh token expiry, in seconds.
`refresh_token`
string
Refresh token issued by the external login provider.
`token_type`
string
Token type.
`id_token`
string
OpenID Connect ID token, present when the openid scope is granted.
`not-before-policy`
integer
External login not-before-policy value.
`session_state`
string
External login session state identifier.
`scope`
string
Granted scope.
-
- -
-
- -```curl title="Request sample (password)" -curl -i --location 'https://api.iqm.com/api/v4/ua/login' \ ---header 'Content-Type: application/x-www-form-urlencoded' \ ---data-urlencode 'grant_type=password' \ ---data-urlencode 'username=user@example.com' \ ---data-urlencode 'password=UserPassword123!' -``` - -```json title="Response 200" -{ - "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", - "expires_in": 300, - "refresh_expires_in": 1800, - "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", - "token_type": "Bearer", - "scope": "openid profile email" -} -``` - -
- ---- - ### OAuth token diff --git a/sidebars.js b/sidebars.js index 6d9427c2..1a9fa9c2 100644 --- a/sidebars.js +++ b/sidebars.js @@ -4815,13 +4815,6 @@ const sidebars = { customProps: { method: 'POST' }, className: 'sidebarItem' }, - { - type: 'link', - label: 'External login', - href: '/guidelines/user-api#external-login', - customProps: { method: 'POST' }, - className: 'sidebarItem' - }, { type: 'link', label: 'OAuth token', From 48f3d3c34b3d49bc3107c73a5090f75d26bfec85 Mon Sep 17 00:00:00 2001 From: Conor Teichroeb Date: Fri, 16 Oct 2026 10:22:44 -0700 Subject: [PATCH 5/6] Update workspace-api.mdx Refines /find-my-workspace description. --- docs/guidelines/workspace-api.mdx | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/guidelines/workspace-api.mdx b/docs/guidelines/workspace-api.mdx index 7c8b80c6..2d547024 100644 --- a/docs/guidelines/workspace-api.mdx +++ b/docs/guidelines/workspace-api.mdx @@ -2305,8 +2305,6 @@ function GetWorkspaceChatBotAppIdByWorkspaceDomain(): Promise { Send an email listing the Workspace domain(s) associated with the given email address, for users who've forgotten which Workspace they belong to. No authentication is required. -The response is always the same generic message, regardless of whether the email address is associated with any Workspace -- this is intentional, so that the response content and timing don't reveal whether an account exists. If a match is found, the email itself is sent asynchronously in the background after the response is returned. - :::info This endpoint is rate limited to 100 requests per minute, per IP. Exceeding it returns a 429 (Too Many Requests) error. See [Rate limits](/getting-started/rest-api-reference#rate-limits). ::: From 16a81f364d39d9cd41fbb8ecc86310f0ea2bfba4 Mon Sep 17 00:00:00 2001 From: Conor Teichroeb Date: Fri, 16 Oct 2026 10:30:11 -0700 Subject: [PATCH 6/6] Fix HCP enum widgets that don't match planner-api code Verified each against the real enums (AudienceSelectionMethodEnum, DataPartnersEnum, planner-api's own CreativeTypeEnum/DeviceTypeEnum): - audienceSelectionMethods.ts (HCP-exclusive): was missing id 4 (Account based/ABM). Also fixed id 1's label and the static list's own JSON example, both of which said "Filter Audience" instead of the real "Filter Based" displayName. - dataPartners.ts was the wrong enum entirely for HCP - it's audience-api's Matched audience data partners list (7, 8, 10), while HCP has its own DataPartnersEnum (7, 8, 11, 12 - id 10/IQVIA is inactive there). Added a separate hcpDataPartners.ts since dataPartners.ts is correct as-is for its other (audience-api) callers, fixed the 4 field descriptions and their links, and fixed the "Get data partners list" JSON example (showed 7/8/10, missing 11/12). Also noted that ABM blocks can only use 7 and 12. - creativeTypes.ts and deviceType.ts are correct for their other callers but include values HCP's own enums don't (0/All and 20399999/Unknown respectively) - filtered both in place across all 9 usages in hcp.mdx, matching the filtering convention hcp.mdx already uses for plannerFileTypes. - proposalStatus.ts already has id 7 (IO Created) from an earlier fix this session - confirmed still correct, no change needed. Co-Authored-By: Claude Sonnet 5 --- docs/_partials/planner-api/hcp.mdx | 58 ++++++++++++++-------- src/data/enums/audienceSelectionMethods.ts | 5 +- src/data/enums/hcpDataPartners.ts | 12 +++++ 3 files changed, 51 insertions(+), 24 deletions(-) create mode 100644 src/data/enums/hcpDataPartners.ts diff --git a/docs/_partials/planner-api/hcp.mdx b/docs/_partials/planner-api/hcp.mdx index 6112bc76..1b7a975f 100644 --- a/docs/_partials/planner-api/hcp.mdx +++ b/docs/_partials/planner-api/hcp.mdx @@ -3,7 +3,7 @@ import Caret from '@site/static/img/caret.svg' import { creativeTypes } from '@site/src/data/enums/creativeTypes'; import { frequencyCapTypes } from '@site/src/data/enums/frequencyCapTypes'; import { deviceType } from '@site/src/data/enums/deviceType'; -import { dataPartners } from '@site/src/data/enums/dataPartners'; +import { hcpDataPartners } from '@site/src/data/enums/hcpDataPartners'; import { npiTypes } from '@site/src/data/enums/npiTypes'; import { audienceSelectionMethods } from '@site/src/data/enums/audienceSelectionMethods'; import { hcpAccountTypes } from '@site/src/data/enums/hcpAccountTypes'; @@ -190,7 +190,7 @@ import { audienceTypes } from '@site/src/data/enums/audienceTypes'; - + @@ -252,7 +252,7 @@ import { audienceTypes } from '@site/src/data/enums/audienceTypes';
`id`
integer
[Data Partner ID](/guidelines/audience-api/#data-partners-list-for-matched-audience).
[Data Partner ID](#get-data-partners-list).
`selected`
boolean
- + @@ -289,7 +289,7 @@ import { audienceTypes } from '@site/src/data/enums/audienceTypes';
`deviceTypeIds`
array of integers
[Device type IDs](/guidelines/master-api/#get-device-type).
When allDeviceTypesSelected is false, must match the device dimension's splitStrategy[].selectedValueIds and every campaigns[].targeting.deviceTypeIds used, see [Targeting consistency rule](#targeting-consistency-rule).
[Device type IDs](/guidelines/master-api/#get-device-type).
When allDeviceTypesSelected is false, must match the device dimension's splitStrategy[].selectedValueIds and every campaigns[].targeting.deviceTypeIds used, see [Targeting consistency rule](#targeting-consistency-rule).
v.id !== 20399999)} />
`allDeviceTypesSelected`
boolean
- + @@ -478,15 +478,15 @@ import { audienceTypes } from '@site/src/data/enums/audienceTypes';
`creativeTypeIds`
array of integers
[Creative type IDs](/guidelines/creative-api/#get-creative-types-list).
When allCreativeTypesSelected is false, must match the creative dimension's splitStrategy[].selectedValueIds and every campaigns[].targeting.creativeTypeId used, see [Targeting consistency rule](#targeting-consistency-rule).
[Creative type IDs](/guidelines/creative-api/#get-creative-types-list).
When allCreativeTypesSelected is false, must match the creative dimension's splitStrategy[].selectedValueIds and every campaigns[].targeting.creativeTypeId used, see [Targeting consistency rule](#targeting-consistency-rule).
v.id !== 0)} />
`allCreativeTypesSelected`
boolean
- + - + - + @@ -1662,7 +1662,7 @@ Use this API to visualize how different targeting dimensions are distributed acr
`dataPartnerIds`
array of integers
[Data partner IDs](/guidelines/audience-api/#data-partners-list-for-matched-audience).
Must match the partner dimension's plan-level/split-strategy selection, see [Targeting consistency rule](#targeting-consistency-rule).
[Data partner IDs](#get-data-partners-list).
Must match the partner dimension's plan-level/split-strategy selection, see [Targeting consistency rule](#targeting-consistency-rule).
`creativeTypeId`
integer
[Creative type ID](/guidelines/creative-api/#get-creative-types-list).
Singular: one creative type per campaign. Must match the creative dimension's plan-level/split-strategy selection, see [Targeting consistency rule](#targeting-consistency-rule).
[Creative type ID](/guidelines/creative-api/#get-creative-types-list).
Singular: one creative type per campaign. Must match the creative dimension's plan-level/split-strategy selection, see [Targeting consistency rule](#targeting-consistency-rule).
v.id !== 0)} />
`deviceTypeIds`
array of integers
[Device type IDs](/guidelines/master-api/#get-device-type).
Must match the device dimension's plan-level/split-strategy selection, see [Targeting consistency rule](#targeting-consistency-rule).
[Device type IDs](/guidelines/master-api/#get-device-type).
Must match the device dimension's plan-level/split-strategy selection, see [Targeting consistency rule](#targeting-consistency-rule).
v.id !== 20399999)} />
`npiTypeId`
integer
- + @@ -1699,7 +1699,7 @@ Use this API to visualize how different targeting dimensions are distributed acr
`deviceTypeIds`
array of integers
[Device type IDs](/guidelines/master-api/#get-device-type).
[Device type IDs](/guidelines/master-api/#get-device-type).
v.id !== 20399999)} />
`allDeviceTypesSelected`
boolean
- + @@ -1818,7 +1818,7 @@ Use this API to visualize how different targeting dimensions are distributed acr
`creativeTypeIds`
array of integers
[Creative type IDs](/guidelines/creative-api/#get-creative-types-list).
[Creative type IDs](/guidelines/creative-api/#get-creative-types-list).
v.id !== 0)} />
`allCreativeTypesSelected`
boolean
- + @@ -2095,7 +2095,7 @@ Use this API to get an audience composition analysis for a single targeting conf
`creativeTypeId`
integer
[Creative type ID](/guidelines/creative-api/#get-creative-types-list).
[Creative type ID](/guidelines/creative-api/#get-creative-types-list).
v.id !== 0)} />
`impressions`
integer
- + @@ -2575,7 +2575,7 @@ Use this API to preview the size and composition of each audience block before g
`dataPartnerIds`
array of integers
[Data partner IDs](/guidelines/audience-api/#data-partners-list-for-matched-audience).
[Data partner IDs](#get-data-partners-list).
`allDataPartnersSelected`
boolean
- + @@ -2615,7 +2615,7 @@ Use this API to preview the size and composition of each audience block before g
`dataPartnerIds`
array of integers
[Data partner IDs](/guidelines/audience-api/#data-partners-list-for-matched-audience).
[Data partner IDs](#get-data-partners-list).
`allDataPartnersSelected`
boolean
- + @@ -2652,7 +2652,7 @@ Use this API to preview the size and composition of each audience block before g
`deviceTypeIds`
array of integers
[Device type IDs](/guidelines/master-api/#get-device-type).
[Device type IDs](/guidelines/master-api/#get-device-type).
v.id !== 20399999)} />
`allDeviceTypesSelected`
boolean
- + @@ -3574,7 +3574,7 @@ Get the list of available geography segments for HCP Planners.
-Get the list of available data partners for HCP Planners. +Get the list of available data partners for HCP Planners. For Account Based (ABM) audience blocks specifically, only Healthlink (7) and RevOptimal (12) can be selected.
Response properties @@ -3630,12 +3630,20 @@ Get the list of available data partners for HCP Planners. "logoUrl": "https://advp0had0vuj7rad3niaw1eus2-stage.s3.us-east-1.amazonaws.com/data_partner/D360.png" }, { - "id": 10, - "name": "iqvia_npi_id", - "order": 9, - "displayName": "IQVIA ID", - "dataCost": 25, - "logoUrl": "https://advp0had0vuj7rad3niaw1eus2-stage.s3.us-east-1.amazonaws.com/data_partner/iqvia.png" + "id": 11, + "name": "pl_npi_id", + "order": 10, + "displayName": "Purple Lab ID", + "dataCost": 15, + "logoUrl": "https://advp0had0vuj7rad3niaw1eus2-stage.s3.us-east-1.amazonaws.com/data_partner/pl.png" + }, + { + "id": 12, + "name": "ro_npi_id", + "order": 11, + "displayName": "RevOptimal ID", + "dataCost": 8, + "logoUrl": "https://advp0had0vuj7rad3niaw1eus2-stage.s3.us-east-1.amazonaws.com/data_partner/ro.png" } ] } @@ -3688,7 +3696,7 @@ Get the list of available audience selection methods for HCP Planners. "id": 1, "name": "filter_based", "order": 1, - "displayName": "Filter Audience" + "displayName": "Filter Based" }, { "id": 2, @@ -3701,6 +3709,12 @@ Get the list of available audience selection methods for HCP Planners. "name": "existing_audience", "order": 3, "displayName": "Existing Audience" + }, + { + "id": 4, + "name": "abm_block", + "order": 4, + "displayName": "Account Based" } ] } diff --git a/src/data/enums/audienceSelectionMethods.ts b/src/data/enums/audienceSelectionMethods.ts index 0f666996..3e2e70e3 100644 --- a/src/data/enums/audienceSelectionMethods.ts +++ b/src/data/enums/audienceSelectionMethods.ts @@ -1,8 +1,9 @@ import type { EnumValue } from '@site/src/components/EnumWidget'; -// Source: "Get audience selection methods list" response in hcp.mdx (HCP planner) +// Source: AudienceSelectionMethodEnum.java (all values currently active) export const audienceSelectionMethods: EnumValue[] = [ - { id: 1, label: 'Filter audience' }, + { id: 1, label: 'Filter based' }, { id: 2, label: 'Upload NPI list' }, { id: 3, label: 'Existing audience' }, + { id: 4, label: 'Account based' }, ]; diff --git a/src/data/enums/hcpDataPartners.ts b/src/data/enums/hcpDataPartners.ts new file mode 100644 index 00000000..3606d5a7 --- /dev/null +++ b/src/data/enums/hcpDataPartners.ts @@ -0,0 +1,12 @@ +import type { EnumValue } from '@site/src/components/EnumWidget'; + +// Source: DataPartnersEnum.java (planner-api) - a different, HCP-specific set +// from the shared dataPartners.ts (audience-api's Matched audience data +// partners). Excludes id 10 (IQVIA), which is inactive here. ABM audience +// blocks are further restricted to only 7 (Healthlink) and 12 (RevOptimal). +export const hcpDataPartners: EnumValue[] = [ + { id: 7, label: 'Healthlink ID' }, + { id: 8, label: 'Data360 ID' }, + { id: 11, label: 'Purple Lab ID' }, + { id: 12, label: 'RevOptimal ID' }, +];
`creativeTypeIds`
array of integers
[Creative type IDs](/guidelines/creative-api/#get-creative-types-list).
[Creative type IDs](/guidelines/creative-api/#get-creative-types-list).
v.id !== 0)} />
`allCreativeTypesSelected`
boolean