Message: Missing required parameter "content_type"

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' });
}