According to the Flowboost websites, the communitity edition can connect to Marketo REST APIs. I get the following response when attempting to do so:
{"errorType":"Runtime.UnhandledPromiseRejection","errorMessage":"RangeError: You may only access Marketo-hosted assets with FlowBoost Community Edition.","trace":["Runtime.UnhandledPromiseRejection: RangeError: You may only access Marketo-hosted assets with FlowBoost Community Edition."," at process.on (/var/runtime/index.js:37:15)"," at process.emit (events.js:198:13)"," at emitPromiseRejectionWarnings (internal/process/promises.js:140:18)"," at process._tickCallback (internal/process/next_tick.js:69:34)"]}
Here is the code I am passing in and I have ran this in on a node.js app and it works fine there. Any help would be appreciated.
const apiData = { clientId: "#######################", clientSecret: "#######################" }; const evtData = JSON.parse({{lead.generic2}}); const request = { "input": [{ "activityDate": (new Date().toISOString()), "activityTypeId": 100045, "attributes": [{ "name": "Event Date", "value": evtData.date }, { "name": "Mobile Phone", "value": {{lead.Mobile Phone}} }, { "name": "Send Live Notifications", "value": {{lead.generic1:false}} }, { "name": "Send Recording Notifications", "value": true }], "leadId": {{Lead.Id}}, "primaryAttributeValue": evtData.title }] }; function getAccessToken(cb) { var url = `https://###-###-###.mktorest.com/identity/oauth/token?client_id=${apiData.clientId}&client_secret=${apiData.clientSecret}&grant_type=client_credentials`; FBHttp.fetch(url) .then(r => r.json()) .then(json => { if (typeof cb === "function") cb(json.access_token) }); } function addCustomActivity(accessToken) { var url = `https://###-###-###.mktorest.com/rest/v1/activities/external.json`; FBHttp.fetch(url, { "method": "POST", "headers": { "Authorization": `Bearer ${accessToken}`, "Content-Type": "application/json", "Accept": "application/json" }, "body": JSON.stringify(request) }) .then(r => r.json()) .then(json => response = JSON.stringify(json, null, 5)); } var response = null; getAccessToken(addCustomActivity);
Solved! Go to Solution.
According to the Flowboost websites, the communitity edition can connect to Marketo REST APIs.
Yep, it certainly can. I'm working on such a project w/a Community key as we speak.
FlowBoost determines whether you're connecting to Marketo instance by seeing if the domain exists and either is a CNAME for a Marketo property or ends with .mktorest.com. So the outcome depends on the part of your code that's obfuscated, the
###-###-###.mktorest.com
Are you using v20+, preferably the latest v21?
https://api.teknkl.com/flowboost/v21/run?authoringEnv=pro
Older versions restricted Marketo REST connections to Standard keys only. I think we changed that in v20 so Community keys work, too.
@SanfordWhiteman Tagging you since you are the expert in this field 🙂
According to the Flowboost websites, the communitity edition can connect to Marketo REST APIs.
Yep, it certainly can. I'm working on such a project w/a Community key as we speak.
FlowBoost determines whether you're connecting to Marketo instance by seeing if the domain exists and either is a CNAME for a Marketo property or ends with .mktorest.com. So the outcome depends on the part of your code that's obfuscated, the
###-###-###.mktorest.com
well the entire url https://975-FPO-828.mktorest.com which is our marketo instance and should meet all of the criteria listed and yet I still get the error posted
Are you using v20+, preferably the latest v21?
https://api.teknkl.com/flowboost/v21/run?authoringEnv=pro
Older versions restricted Marketo REST connections to Standard keys only. I think we changed that in v20 so Community keys work, too.
Thanks @SanfordWhiteman That was it. Had just cloned an old webhook and was running v19.
Also after I was finally able to get the calls to work, I realized how terriblly inefficient my orignal code was. Looked at @SanfordWhiteman article https://blog.teknkl.com/and-yes-flowboost-can-be-that-webhook-aggregator/ and refactored to be more Promise oriented. Here is the final result:
const apiData = { clientId: "..........................." , clientSecret: "..........................." }; const evtData = {"title":"An Event Tomorrow","date":"2022-06-26T03:27:00.000Z"}; const request = { "input": [{ "activityDate": (new Date().toISOString()) , "activityTypeId": 100045 , "attributes": [{ "name": "Event Date" , "value": evtData.date } , { "name": "Event Epoch Time" , "value": (new Date(evtData.date).valueOf() / 1000) } , { "name": "Mobile Phone" , "value": "{{lead.Mobile Phone Number}}" } , { "name": "Send Live Notifications" , "value": {{lead.generic1}} } , { "name": "Send Recording Notifications" , "value": true }] , "leadId": {{Lead.Id}} , "primaryAttributeValue": evtData.title }] }; var result = null; let p1 = new Promise((resolve, reject) => { var env = FBHttp; var url = 'https://###-###-###.mktorest.com/identity/oauth/token?client_id=' + apiData.clientId + '&client_secret=' + apiData.clientSecret + '&grant_type=client_credentials'; env.fetch(url) .then(r => r.json()) .then(json => { var url = "https://###-###-###.mktorest.com/rest/v1/activities/external.json"; return env.fetch(url, { "method": "POST" , "headers": { "Authorization": 'Bearer ' + json.access_token , "Content-Type": "application/json" , "Accept": "application/json" } , "body": JSON.stringify(request) }); }) .then(r => r.json()) .then(json => resolve(json)) .catch(error => reject(error)); }); Promise.all([p1]).then(values => { if(typeof values === "object" && values.length) result = values[0]; else result = null; });
This worked much better. Oddly FBHttp was undefined in the within the Promise when I tried to call it the second time. When I pointed it to a local variable within the promise I was able to access it in the "then" but not before.
Thanks again Sanford for "Flowboost", your blog and literally all you do for the Marketo Community.
Thanks again Sanford for "Flowboost", your blog and literally all you do for the Marketo Community.
'welcome!
I'm not able to repro what you're saying about FBHttp being unavailable, btw. But the code would be more compact like this:
const apiData = {
munchkinId: "...",
clientId: "...",
clientSecret: "..."
};
const evtData = {
"title": "An Event Tomorrow",
"date": "2022-06-26T03:27:00.000Z"
};
const eventRequest = {
"input": [{
"activityDate": (new Date().toISOString()),
"activityTypeId": 100045,
"attributes": [
{
"name": "Event Date", "value": evtData.date
},
{
"name": "Event Epoch Time", "value": (new Date(evtData.date).valueOf() / 1000)
},
{
"name": "Mobile Phone", "value": {{lead.Mobile Phone Number}}
},
{
"name": "Send Live Notifications", "value": {{lead.generic1}}
},
{
"name": "Send Recording Notifications", "value": true
}
],
"leadId": "90909",
"primaryAttributeValue": evtData.title
}]
};
var url = `https://${apiData.munchkinId}.mktorest.com/identity/oauth/token?client_id=${encodeURIComponent(apiData.clientId)}&client_secret=${encodeURIComponent(apiData.clientSecret)}&grant_type=client_credentials`;
FBHttp.fetch(url)
.then(identityRespJ => identityRespJ.json())
.then(identityResp => {
var url = `https://${apiData.munchkinId}.mktorest.com/rest/v1/activities/external.json`;
FBHttp.fetch(url, {
"method": "POST",
"headers": {
"Authorization": `Bearer ${identityResp.access_token}`,
"Content-Type": "application/json",
"Accept": "application/json"
},
"body": JSON.stringify(eventRequest)
})
.then(activityRespJ => activityRespJ.json())
.then(success)
})
.catch(failure);
Hi there,
For what it's worth I get the same "ReferenceError: FBHttp is not defined" message in my unhandled promise rejection message, so does seem to be a small issue in the community edition.