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/docs/getting-started/rest-api-reference.mdx b/docs/getting-started/rest-api-reference.mdx index f03b0dbd..0498292e 100644 --- a/docs/getting-started/rest-api-reference.mdx +++ b/docs/getting-started/rest-api-reference.mdx @@ -323,6 +323,12 @@ 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 the following endpoints. Exceeding the limit returns a 429 (Too Many Requests) error. + +| Endpoint | Limit | +| --- | --- | +| [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/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:
- + @@ -3468,7 +3468,7 @@ Create a new campaign in pending or draft status. - + @@ -3496,7 +3496,7 @@ Create a new campaign in pending or draft status. - + @@ -4197,7 +4197,7 @@ If campaign is in draft status, this API will automatically update st - + @@ -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/docs/guidelines/user-api.mdx b/docs/guidelines/user-api.mdx index 78d88822..c37a1bc1 100644 --- a/docs/guidelines/user-api.mdx +++ b/docs/guidelines/user-api.mdx @@ -2975,6 +2975,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 +3157,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/docs/guidelines/workspace-api.mdx b/docs/guidelines/workspace-api.mdx index 19278af9..2d547024 100644 --- a/docs/guidelines/workspace-api.mdx +++ b/docs/guidelines/workspace-api.mdx @@ -2303,7 +2303,11 @@ 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. + +:::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 +2318,8 @@ Send an email to help a user locate their Workspace.
`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
`deviceType`
string
Comma separated [device type IDs](/guidelines/master-api#get-device-type).
Comma separated device type IDs.
`trafficType`
string
`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
`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
`deviceType`
string
Comma separated [device type IDs](/guidelines/master-api#get-device-type) for targeting.
Comma separated device type IDs for targeting.
`trafficType`
string
- - + +
`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 +2338,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 +2361,9 @@ interface Responses { content: { "application/json": { success: boolean; - data: string; + data: { + message: string; + }; }; }; }; 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/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' }, +]; 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' }, +];