Message: Missing required parameter "content_type"

I have a backend twitch API call that subscribes to when a channel goes live after it goes live I’m trying to send a message to the frontend extension but get the error:

message: Missing required parameter "content_type"

I have a content_type in both header and body, this is what the example from the hello-world app was doing.
I have tried with the /v5/ and without it.
my call is:

axios({
        method: 'post',
        url: 'https://api.twitch.tv/v5/extensions/message/twitchFrontendClientID',
        headers: {
            "Accept": 'application/vnd.twitchtv.v5+json',
            "Client-ID": keys.twitchClientID,
            "Content-Type": 'application/json',
            "Authorization": 'Bearer ' + jwt,
        },
        body: {
            "content_type": 'application/json',
            "message": gameId,
            "targets": ['broadcast'],
        }
    })
    .then(function(response) {
        console.log('msg successfully sent');
    })
    .catch(function(error) {
        console.log('error': error);
    });

You should be sending to

https://api.twitch.tv/v5/extensions/message/CHANNELID

In addition, you need to make sure your body is JSON stringified, I do not know if axios is doing this for you. Your body is just an object in your example

edit: changed body to data: body and now am getting back:
unauthorized jwt could not be verified

im handling the check for the channel going live on the backend, and then wanting to send the data to the frontend extension. is this possible or do i need to initiate this from the frontend app, generate a token using the twitch.onAuthorized() and then pass that to the backend and then back? since i wont have this token on the backend without the front sending it.

the twitchID is the channel names numeric number not the name appearing in the url.
twitchFrontend is the clientID for the extension application found in the overview section of the developers dashboard.

const body = JSON.stringify({
        content_type: 'application/json',
        message: gameId,
        targets: ['broadcast'],
    });


axios({
        method: 'post',
        url: `https://api.twitch.tv/v5/extensions/message/${keys.twitchID}`,
        headers: {
            'Client-ID': `${keys.twitchFrontend}`,
            'Content-Type': 'application/json',
            'Authorization': 'Bearer ' + jwt,
        },
        data: body,
    })
    .then(function(response) {
        console.log('msg successfully sent');
    })
    .catch(function(error, res) {
        console.log('error', error);
    });

the token is created using the twitchID (numeric number of the channel).

const jwt = await makeServerToken(keys.twitchID);

function makeServerToken(channelId) {
const payload = {
    exp: Number(Math.floor(Date.now() / 1000) + 60),
    channel_id: String(channelId),
    user_id: String(channelId),
    role: 'external',
    pubsub_perms: {
    listen: ['broadcast'],
    send: ['*'],
    },
};
    const secret = Buffer.from('sometext', 'base64');
    return jwt.sign(payload, secret, { algorithm: 'HS256' });
}

Pulling from my sender:

Try

const payload = {
    exp: Number(Math.floor(Date.now() / 1000) + 60),
    channel_id: String(channelId),
    role: 'external',
    pubsub_perms: {
        send: [
           'broadcast'
        ]
    },
};

and maybe: (just omit the algo) then your code matches mine

let signedJwt = jwt.sign(payload, secret);