Node.js EventBridge subscription POST 400 on interaction state filter matrix

HTTP 400 Bad Request: validation_failed. The payload is getting rejected on the filter attribute matrix. I’m trying to expose a state subscriber for automated interaction management via EventBridge using Node.js, but the atomic POST keeps bombing. The docs mention max subscriber count limits, yet the error doesn’t say anything about hitting a ceiling. It’s just a generic schema mismatch on the delivery endpoint directive. I thought maybe the OAuth token refresh logic is messing with the grant types again, but the bearer token looks fresh. Here’s the JSON I’m sending to the subscription API: { “topicId”: “interaction:state:change”, “filter”: { “attributes”: { “routing.queue.id”: “eq:12345678-1234-1234-1234-123456789012” } }, “deliveryEndpoint”: { “url”: “Checking your browser...”, “type”: “webhook” } }. The format verification passes locally, but the server hates the filter structure. Token scopes are set to event:write, so it’s not an auth issue.

I added a health check endpoint on my side to verify the webhook callbacks for the external monitoring dashboards, and the latency tracking shows zero delivery attempts because the subscription never registers. The payload transformation pipeline is supposed to handle the state events, but it’s never getting triggered. I’m looping through the error logs trying to find why the automatic acknowledgment triggers fail. Maybe the topic ID reference is wrong? I can’t find a valid example for the interaction state topic in the Node SDK. The audit logs are empty too. Routing failures seem to happen before the message even leaves the bus. Just getting 400s every time.

Try restructuring the Node.js object like this:

{
 "delivery": {
 "type": "webhook",
 "url": "https://your-endpoint/callback"
 },
 "conditions": {
 "filters": [
 {
 "attribute": "interaction.state",
 "operator": "eq",
 "value": "active"
 }
 ]
 }
}

The 400 error usually triggers when the filters array sits at the wrong level. The validation acts like a keyboard trap in your automation. The system refuses to move focus to the next state if the previous step isn’t structured right. Genesys expects the interaction state rules to live inside a conditions wrapper. A schema mismatch behaves exactly like a screen reader announcing a dead link. It’s a strict check. The parser stops reading the rest of the payload when it hits the wrong type.

The operator field must match exactly. Genesys doesn’t accept aliases here. The validation step changes completely depending on whether you use webhook or sqs in the delivery block.

Are you passing the correct scope in the token payload? The token refresh shouldn’t cause a 400, but a missing eventbridge:subscribe claim will quietly drop the request before it even hits the filter parser. The docs skip this part entirely.

The request ID usually points to the exact validation rule that failed.