POST /api/v2/flows/executions returning 400 despite valid payload

Trying to kick off an Architect flow from a Node.js service using the v2 executions endpoint. I’ve got the OAuth token sorted and the flow ID is definitely active. The request keeps dying with a 400 Bad Request. It doesn’t even throw a validation error. Response body comes back completely empty. Here’s the fetch call I’m running:
const res = await fetch(${baseUrl}/api/v2/flows/executions, {
method: ‘POST’,
headers: { ‘Authorization’: Bearer ${token}, ‘Content-Type’: ‘application/json’ },
body: JSON.stringify({
flowId: ‘a1b2c3d4-e5f6-7890-abcd-ef1234567890’,
initialContactUri: ‘task:default:external:trigger:123’,
initialMessage: { text: ‘auto-launch’ }
})
});
Checked the docs three times. The initialContactUri format looks right for a task-based entry. Swapped it to initialMessage alone and still get the same 400. The SDK wrapper just throws a generic NetworkError. Anyone else hit this wall with the executions endpoint? The flow works fine from the test console. Staring at the network tab right now.

The empty 400 response is a known quirk when the payload structure doesn’t match what the Architect engine expects, even if your JSON looks fine. You’re likely missing the explicit contact wrapper or the queueId reference depending on your flow type.

For a simple external trigger, the payload needs to look like this:

{
 "contact": {
 "id": "unique-external-id",
 "type": "external",
 "queueId": "your-queue-id-here",
 "address": {
 "scheme": "http",
 "host": "callback-url"
 }
 }
}

If you’re just passing raw data without the contact object, the server rejects it silently. Also, double-check that the OAuth token has the flow:execute scope. It’s easy to grab a token with read-only scopes during testing. I’ve seen this trip up Node services when the token was generated for analytics instead of execution. Check your logs for the exact scope claims.