NORMAL rules are created active, at the lowest priority. Placement-test rules (EMAIL_PLACEMENT) are one per test: creating again for a ptest_id that already has a rule replaces that rule's configuration and sets its status (default ACTIVE) — the same effect as Update automation rule. The returned id identifies the rule; placement-test rules are nevertheless always addressed by ptest_id.type:NORMAL (default) — watches each selected account's own health metrics (bounce rate, reply rate, warmup health) and throttles the accounts whose metrics cross a threshold.EMAIL_PLACEMENT — attached to one recurring email placement test; reacts to the inbox rate measured by that test's runs.actions for recovery_in days, then their settings are restored per after_recovery. The account owner is notified and the EMAIL_AUTOMATION_RULE_TRIGGERED webhook fires.type: "NORMAL", default)conditions[].field (same names as the account list response):| field | meaning |
|---|---|
3d_recipient_bounce_rate | Bounces caused by the recipient address, past 3 days (%) |
3d_sender_bounce_rate | Bounces caused by your mailbox or domain being rejected, past 3 days (%) |
7d_overall_warmup_health | Overall warmup health score over the past 7 days (%) |
7d_google_warmup_health | Google warmup health score over the past 7 days (%) |
7d_microsoft_warmup_health | Microsoft warmup health score over the past 7 days (%) |
7d_ooo_replyrate | Reply rate incl. out-of-office replies, past 7 days (%) |
14d_ooo_replyrate | Same, past 14 days (%) |
30d_ooo_replyrate | Same, past 30 days (%) |
type: "EMAIL_PLACEMENT")type: "EMAIL_PLACEMENT" and the test's ptest_id — the test's _id in the /email-placement/list/parent-tests response. Only recurring tests (type: AUTOMATIC) can have a rule; a one-off or manual test is rejected with 400. Each placement test holds at most one rule.ORIGINAL restores the settings the account had just before it.conditions[].field. Whole-test fields may be combined (logic AND/OR); inbox_r_account must be the rule's only condition. With a single condition send "logic": "AND".| field | evaluation |
|---|---|
inbox_r_1 | Whole test: one inbox rate for the entire run, all tested senders combined |
inbox_r_2 | Whole test: average of the last 2 runs |
inbox_r_3 | Whole test: average of the last 3 runs |
inbox_r_account | Each tested sender individually: its own inbox rate in the latest run. Only the senders whose own rate meets the condition (for example, below 90%) are actioned; the others are left untouched. |
inbox_r_account when the test covers the accounts you care about directly and only the ones that actually land in spam should be rested.selection.type:| selection.type | with inbox_r_1 / inbox_r_2 / inbox_r_3 | with inbox_r_account |
|---|---|---|
PT_EMAIL_ACCOUNT | every sender tested in the runs that fed the metric (the last 1, 2 or 3 runs), regardless of its own result | only the tested senders whose own rate met the condition |
PT_ALL_ACCOUNT_OF_DOMAIN | every workspace account on those tested senders' domains | every workspace account on a domain where a tested sender met the condition |
TAG / PROVIDER | that group of accounts (the whole-test result is treated as a signal for the group) | not allowed (400) |
ALL_ACCOUNTS and IDS are not allowed for placement-test rules.type=EMAIL_PLACEMENT + ptest_id (never id) in update, detail and enable/disable, e.g. GET /ea-automation-rules/detail?workspace_id=...&type=EMAIL_PLACEMENT&ptest_id=.... They are not returned by the list endpoint, and cannot be deleted or duplicated through this API — disable them instead.{
"workspace_id": "65099a0dd96fae8ab61130c0",
"name": "Throttle senders that land in spam",
"type": "EMAIL_PLACEMENT",
"ptest_id": "695bb72b36a8249fc002f3d9",
"selection": { "type": "PT_EMAIL_ACCOUNT" },
"conditions": { "logic": "AND", "conditions": [
{ "field": "inbox_r_account", "operator": "less_than", "value": "90", "value_type": "PERCENT" } ] },
"actions": { "daily_limit": 0, "is_warmup_max_daily_limit": 1, "warmup_max_daily_limit": 40, "is_warmup_reply_rate": 1, "warmup_reply_rate": 60 },
"recovery_in": 4,
"after_recovery": { "restore_type": "ORIGINAL" }
}curl --location 'https://api.plusvibe.ai/api/v1/ea-automation-rules/' \
--header 'x-api-key: <api-key>' \
--header 'Content-Type: application/json' \
--data '{
"workspace_id": "65099a0dd96fae8ab61130c0",
"name": "Pause bouncing accounts",
"selection": {
"type": "ALL_ACCOUNTS"
},
"conditions": {
"logic": "OR",
"conditions": [
{
"field": "3d_recipient_bounce_rate",
"operator": "greater_than",
"value": "5",
"value_type": "PERCENT"
},
{
"field": "7d_overall_warmup_health",
"operator": "less_than",
"value": "70",
"value_type": "NUMBER"
}
]
},
"actions": {
"daily_limit": 0,
"is_warmup_max_daily_limit": 1,
"warmup_max_daily_limit": 20,
"is_warmup_reply_rate": 0
},
"recovery_in": 3,
"after_recovery": {
"restore_type": "ORIGINAL"
}
}'{
"status": "success",
"id": "665f0a1b2c3d4e5f6a7b8c9d"
}