Yodlee: getMFAResponseForSite does not work for TD Canada Trust - yodlee

I'm trying to add one of my bank accounts using the TestDrive application on the Yodlee website and the "Flow: Add account" example but I think the MFA functionality is broken for this particular bank. It works fine for another bank account I have but for this one I get the message:
Credential Re-Verification Required (402): We could not update your account because your username and/or password were reported to be incorrect. Please re-verify your username and password.
But there's nothing wrong with the username and password.
It doesn't seem to be able to retrieve the MFA questions. The example calls getMFAResponseForSite several times and it returns:
{
"isMessageAvailable": false,
"timeOutTime": 150000,
"itemId": 0,
"errorCode": 402,
"memSiteAccId": 10027626,
"retry": false
}
When I login to the site manually, sometimes it asks me one of five security questions, so I expect that getMFAResponseForSite should return one of these questions so that I can send the answer with putMFAResponseForSite. Does this mean that Yodlee is not able to retrieve the MFA questions on this site?
Here's the response from getSiteInfo for the account I'm trying to add:
{
"popularity": 0,
"siteId": 3521,
"orgId": 447,
"defaultDisplayName": "TD Bank (Canada)",
"defaultOrgDisplayName": "TD Waterhouse",
"contentServiceInfos": [
{
"contentServiceId": 3736,
"siteId": 3521,
"containerInfo": {
"containerName": "bank",
"assetType": 1
}
},
{
"contentServiceId": 11037,
"siteId": 3521,
"containerInfo": {
"containerName": "credits",
"assetType": 2
}
},
{
"contentServiceId": 21166,
"siteId": 3521,
"containerInfo": {
"containerName": "stocks",
"assetType": 1
}
},
{
"contentServiceId": 18274,
"siteId": 3521,
"containerInfo": {
"containerName": "loans",
"assetType": 2
}
},
{
"contentServiceId": 19655,
"siteId": 3521,
"containerInfo": {
"containerName": "mortgage",
"assetType": 2
}
}
],
"enabledContainers": [
{
"containerName": "bank",
"assetType": 1
},
{
"containerName": "credits",
"assetType": 2
},
{
"containerName": "stocks",
"assetType": 1
},
{
"containerName": "loans",
"assetType": 2
},
{
"containerName": "mortgage",
"assetType": 2
}
],
"baseUrl": "http://www.tdcanadatrust.com",
"loginForms": [],
"isHeld": false,
"isCustom": false,
"mfaType": {
"typeId": 4,
"typeName": "SECURITY_QUESTION"
},
"mfaCoverage": "FMPA",
"siteSearchVisibility": true
}

Thanks for providing your feedback. We have tested this particular site on TestDrive and it seems like TestDrive needs to be fixed, while fixing the Test Drive tool might take some time. I would suggest you to either add it through FastLink provided recently added within Test Drive tool. That should help you.

Related

MongoDB multiple Lookup into same collection

I have two collections Bill and Employee. Bill contains the information about the monthly student bill and Employee contains all types of people working in the school (Accountant, Teachers, Maintenance etc).
Bill has billVerifyBy and classteacher field which points to the records of Employees.
Bill collection
{
"_id": ObjectId("ab12dns..."), //mongoid
"studentname": "demoUser",
"class": { "section": "A"},
"billVerifiedBy": "121212",
"classteacher": "134239",
}
Employee collection
{
"_id": ObjectId("121212"), // random number
"name": "Darn Morphy",
"department": "Accounts",
"email": "dantest#test.com",
}
{
"_id": ObjectId("134239"),
"name": "Derreck",
"department": "Faculty",
"email": "derrect145#test.com",
}
I need to retrieve the Accounts and Teacher information related to a particular bill. I am using Mongodb lookup to get the information. However, I have to lookup to the same table twice since billVerifiedBy and classteacher belong to the same Employee tables as given below.
db.bill.aggregate([
{
$lookup: {"from": "employee", "localField": "billVerifiedBy", "foreignField": "_id", "as": "accounts"}},
},
{
$lookup: {"from": "employee", "localField": "classteacher", "foreignField": "_id", "as": "faculty"}},
},
{
$project: {
"studentname": 1,
"class": 1,
"verifiedUser": "$accounts.name",
"verifiedByEmail":"$accounts.email",
"facultyName": "$faculty.name",
"facultyEmail": "$faculty.email"
}
}
]
I don't know if this is the good way of arranging the Accounts and Faculty information in the single Employee collection. And is it right thing to lookup twice with same collection. Or should I create separate Accounts and Faculty collection and lookup with it. Please suggest what would be the best approach in terms of performance.
In mongodb, when you want to join multiple documents from the same collection, you can use "$lookup" with its "pipeline" and "let" options. It filters documents that you want to take with defined variables.
db.getCollection('Bill').aggregate([{
"$lookup": {
"as": "lookupUsers",
"from": "Employee",
// define variables that you need to use in pipeline to filter documents
"let": {
"verifier": "$billVerifiedBy",
"teacher": "$classteacher"
},
"pipeline": [{ // filter employees who you need to filter.
"$match": {
"$expr": {
"$or": [{
"$eq": ["$_id", "$$verifier"]
},
{
"$eq": ["$_id", "$$teacher"]
}
]
}
}
},
{ // combine filtered 2 documents in an employee array
"$group": {
"_id": "",
"employee": {
"$addToSet": {
"_id": "$_id",
"name": "$name",
"department": "$department",
"email": "$email"
}
}
}
},
{ // takes item from the array by predefined variable.
"$project": {
"_id": 0,
"billVerifiedBy": {
"$slice": [{
"$filter": {
"input": "$employee",
"cond": {
"$eq": ["$$this._id", "$$verifier"]
}
}
},
1
]
},
"classteacher": {
"$slice": [{
"$filter": {
"input": "$employee",
"cond": {
"$eq": ["$$this._id", "$$teacher"]
}
}
},
1
]
}
}
},
{
"$unwind": "$billVerifiedBy"
},
{
"$unwind": "$classteacher"
},
]
}
},
{
"$unwind": "$lookupUsers"
},
]);
Output is like that:
{
"_id": ObjectId("602916dcf4450742cdebe38d"),
"studentname": "demoUser",
"class": {
"section": "A"
},
"billVerifiedBy": ObjectId("6029172e9ea6c9d4776517ce"),
"classteacher": ObjectId("6029172e9ea6c9d4776517cf"),
"lookupUsers": {
"billVerifiedBy": {
"_id": ObjectId("6029172e9ea6c9d4776517ce"),
"name": "Darn Morphy",
"department": "Accounts",
"email": "dantest#test.com"
},
"classteacher": {
"_id": ObjectId("6029172e9ea6c9d4776517cf"),
"name": "Derreck",
"department": "Faculty",
"email": "derrect145#test.com"
}
}
}

Error creating protected columns with google sheet create api

I am following the google sheet v4 api doumentation to create google sheet with protected columns (https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/create)
I am able to create sheet without using protectedRange in api, using it always gives error, below are request /response i am getting
"properties": {
"title": "NEW SHEET"
},
"sheets": [
{
"data": [
{
"rowData": [
{
"values": [
{
"userEnteredValue": {
"numberValue": 10
}
},
{
"userEnteredValue": {
"numberValue": 20
}
},
{
"userEnteredValue": {
"numberValue": 30
}
}
]
}
]
}
]
},
{
"protectedRanges": [
{
"description": "Locked columns",
"range": {
"sheetId": 0,
"startColumnIndex": 0,
"endColumnIndex": 2
}
}
]
}
]
}
response
{
"error": {
"code": 400,
"message": "Invalid sheets[1].protectedRanges[0]: No grid with id: 0",
"status": "INVALID_ARGUMENT"
}
}
You want to create new Spreadsheet.
When the new Spreadsheet is created, you want to add the protected ranges.
In your sample, you want to create new Spreadsheet including a sheet which has the protected columns "A" and "B" and values of 10, 20, 30 in the cells "A1:C1".
If my understanding is correct, how about this answer? Please think of this as just one of several possible answers.
Issue and solution:
In your request body, please include the property of protectedRanges to the 1st index of sheets.
Please set the sheet ID at properties.
Modified request body:
{
"properties": {
"title": "NEW SHEET"
},
"sheets": [
{
"data": [
{
"rowData": [
{
"values": [
{
"userEnteredValue": {
"numberValue": 10
}
},
{
"userEnteredValue": {
"numberValue": 20
}
},
{
"userEnteredValue": {
"numberValue": 30
}
}
]
}
]
}
],
"protectedRanges": [
{
"description": "Locked columns",
"range": {
"startColumnIndex": 0,
"endColumnIndex": 2,
"sheetId": 0
}
}
],
"properties": {
"sheetId": 0
}
}
]
}
For example, when "sheetId": 123 is set, the sheet is created as the sheet ID of 123.
You can also test above request body at Try this API.
Reference:
Method: spreadsheets.create
If I misunderstood your question and this was not the direction you want, I apologize.

Error when creating a chart via a batch request

I'm trying to create a new chart, following the examples presented in Google sheets API. I'm getting the following error:
HttpError 400 when requesting
https://slides.googleapis.com/v1/presentations/PRESENTATION_ID:batchUpdate?alt=json
returned "Invalid JSON payload received. Unknown name "add_chart" at
'requests[0]': Cannot find field."
Has anyone encountered this before?
Other requests are working normal (replace text, add text, clone presentation, etc)
this request is being copied from the example in Google sheets API.
sourceSheetId is the id where I have the data for the chart saved in.
{
"addChart": {
"chart": {
"spec": {
"title": "Model Q1 Sales",
"basicChart": {
"chartType": "COLUMN",
"legendPosition": "BOTTOM_LEGEND",
"axis": [
{
"position": "BOTTOM_AXIS",
"title": "Model Numbers"
},
{
"position": "LEFT_AXIS",
"title": "Sales"
}
],
"domains": [
{
"domain": {
"sourceRange": {
"sources": [
{
"sheetId": sourceSheetId,
"startRowIndex": 0,
"endRowIndex": 7,
"startColumnIndex": 0,
"endColumnIndex": 1
}
]
}
}
}
],
"series": [
{
"series": {
"sourceRange": {
"sources": [
{
"sheetId": sourceSheetId,
"startRowIndex": 0,
"endRowIndex": 7,
"startColumnIndex": 1,
"endColumnIndex": 2
}
]
}
},
"targetAxis": "LEFT_AXIS"
},
{
"series": {
"sourceRange": {
"sources": [
{
"sheetId": sourceSheetId,
"startRowIndex": 0,
"endRowIndex": 7,
"startColumnIndex": 2,
"endColumnIndex": 3
}
]
}
},
"targetAxis": "LEFT_AXIS"
},
{
"series": {
"sourceRange": {
"sources": [
{
"sheetId": sourceSheetId,
"startRowIndex": 0,
"endRowIndex": 7,
"startColumnIndex": 3,
"endColumnIndex": 4
}
]
}
},
"targetAxis": "LEFT_AXIS"
}
],
"headerCount": 1
}
},
"position": {
"newSheet": True
}
}
}
}
I was expecting the chart to be created and receive a response with chartId, however I'm getting from the request a 400 status:
HttpError 400 when requesting
https://slides.googleapis.com/v1/presentations/PRESENTATION_ID:batchUpdate?alt=json
returned "Invalid JSON payload received. Unknown name "add_chart" at
'requests[0]': Cannot find field."

Max Response Limitation im OTA_AirLowFareSearchRQ

I'm working with Sabre REST API. I have a issue with the OTA_AirLowFareSearchRQ, I try limit the response number using the MaxResponses in the json structure but seems that I make something wrong because the response give to me 95 answers in the cert environment (https://api.cert.sabre.com/).
The json request that I use is:
{
"OTA_AirLowFareSearchRQ": {
"Target": "Production",
"PrimaryLangID": "ES",
"MaxResponses": "15",
"POS": {
"Source": [{
"RequestorID": {
"Type": "1",
"ID": "1",
"CompanyName": {}
}
}]
},
"OriginDestinationInformation": [{
"RPH": "1",
"DepartureDateTime": "2016-04-01T11:00:00",
"OriginLocation": {
"LocationCode": "BOG"
},
"DestinationLocation": {
"LocationCode": "CTG"
},
"TPA_Extensions": {
"SegmentType": {
"Code": "O"
}
}
}],
"TravelPreferences": {
"ValidInterlineTicket": true,
"CabinPref": [{
"Cabin": "Y",
"PreferLevel": "Preferred"
}],
"TPA_Extensions": {
"TripType": {
"Value": "Return"
},
"LongConnectTime": {
"Min": 780,
"Max": 1200,
"Enable": true
},
"ExcludeCallDirectCarriers": {
"Enabled": true
}
}
},
"TravelerInfoSummary": {
"SeatsRequested": [1],
"AirTravelerAvail": [{
"PassengerTypeQuantity": [{
"Code": "ADT",
"Quantity": 1
}]
}]
},
"TPA_Extensions": {
"IntelliSellTransaction": {
"RequestType": {
"Name": "10ITINS"
}
}
}
}
}
MaxResponses could be something for internal development which is part of the schema but does not affect the response.
What you can modify is in the IntelliSellTransaction. You used 10ITINS, but the values that will work should be 50ITINS, 100ITINS and 200ITINS.
EDIT2 (as Panagiotis Kanavos said):
RequestType values depend on the business agreement between your company and Sabre. You can't use 100 or 200 without modifying the agreement.
"TPA_Extensions": {
"IntelliSellTransaction": {
"RequestType": {
"Name": "50ITINS"
}
}
}
EDIT1:
I have searched a bit more and found:
OTA_AirLowFareSearchRQ.TravelPreferences.TPA_Extensions.NumTrips
Required: false
Type: object
Description: This element allows a user to specify the number of itineraries returned.

Is it possible to RECEIVE job applications through the LinkedIn API?

I see LinkedIn documentation on how to post job, apply for jobs, and search jobs. But I'm curious if it's possible to post a job on LinkedIn normally and then receive an API notification when people apply to it. In other words, I want to integrate with the application rather then the job posting. Is this possible?
Yes this is possible, you want to integrate the job applications you receive with your own Applicant Tracking System. Check the processing job applications developer documentation for more details.
Yes. It looks like documentation moved to microsoft: https://learn.microsoft.com/en-us/linkedin/talent/apply-connect/receive-applications
Essentially you create a webhook and register it with the job post. Then linkedin will POST the job application to that hook.
"Content-Type":"application/json",
"X-LI-Signature":"d3756e445a8065c0f38c2182c502f8229800eb2c6a9f3b4a1fdf152af867e6fc",
"Content-Length":"107",
"Connection":"Keep-Alive",
"Accept-Encoding":"gzip,deflate"
{
"type": "JOB_APPLICATION_EXPORT",
"externalJobId": "jobIdOnAtsPartner",
"jobApplicationId": "urn:li:jobApplication:12345678",
"jobApplicant": "urn:li:person:abc123",
"appliedAt": 1602137400011,
"applicantSkills": [
{
"skillUrn": "urn:li:skill:12345",
"skillName": "Java",
"jobMatched": true,
"assessmentVerified": true
}
],
"questionResponses": {
"resumeQuestionResponses":
{"resumeQuestionAnswer":
{"mediaUrl":"https://www.linkedin.com/ambry/?x-li-ambry-ep=AQFBV...",
"mediaUrn":"urn:li:media:AgAAA..."}​
},
"contactInformationQuestionResponses": {
"firstNameAnswer": {
"value": "First"
},
"lastNameAnswer": {
"value": "Last"
},
"emailAnswer": {
"value": "applicant#linkedin.com"
}
},
"voluntarySelfIdentificationQuestionResponses": {
"disabilityAnswer": "NO",
"genderAnswer": "MALE",
"raceAnswer": "ASIAN",
"veteranStatusAnswer": "NOT_PROTECTED_VETERAN"
},
"educationQuestionResponses": {
"educationExperienceQuestionSetResponses": [
{
"school": {
"value": "UC Berkeley"
}
}
]
},
"workQuestionResponses": {
"workExperienceQuestionSetResponses": [
{
"company": {
"value": "LinkedIn"
},
"title": {
"value": "Software Engineer"
}
}
]
},
"additionalQuestionResponses": {
"customQuestionSetResponses": [
{
"customQuestionResponses": [
{
"questionIdentifier": "question1",
"answer": {
"multipleChoiceAnswerValue": {
"symbolicNames": [
"right"
]
}
}
}
]
}
]
}
}
}