{"_id":"5bb4045fe7222e000334ddae","project":"59f79e3c584eb200345ceafc","version":{"_id":"5ba178b00a916500030c6a21","project":"59f79e3c584eb200345ceafc","__v":24,"forked_from":"59f79e3c584eb200345ceaff","createdAt":"2015-09-17T03:47:20.956Z","releaseDate":"2015-09-17T03:47:20.956Z","categories":["5ba178b00a916500030c69a2","5ba178b00a916500030c69a3","5ba178b00a916500030c69a4","5ba178b00a916500030c69a5","5ba178b00a916500030c69a6","5ba178b00a916500030c69a7","5ba178b00a916500030c69a8","5ba178b00a916500030c69a9","5ba178b00a916500030c69aa","5ba178b00a916500030c69ab","5ba178b00a916500030c69ac","5afb6888212c690003ae3d3b","5ba178b00a916500030c69ad","5ba178b00a916500030c69ae","5ba2dcbc99f53f0003b97e2c","5babd73fa0ab3e0003ead030","5bb4038be7222e000334dd97","5bb55954478c1300031a44c2","5bb665a1607307000327c81e","5bb6f90229a7fb0003a0650d","5bb7f9bc29a7fb0003a07ac1","5bba58bd7ba7710003bd901d","5bba6dac7ba7710003bd908d","5bba6e257ba7710003bd9090","5bbac87810189c0003e619ea","5bbb9d02b5862c00036266b2","5bbbadb6219c3e000376c2de","5bc417751d1b0000182bf7f6","5bc59e3b2a5b4f0044db5b97","5bc7bbce2262cc0041f6eff2","5bce6a3580a7250031199f34","5bcfac2c4082510019f2d91b","5bcfac3757bed90030e45d68","5bcfac45d305bc0049941539","5bd2a43548bb6f00289c8fad","5bd3a42a026ebe001f66259e","5bd9d5afffe003005b02f97b","5becb7ee85c6b300557662b6"],"is_deprecated":false,"is_hidden":false,"is_beta":true,"is_stable":false,"codename":"","version_clean":"3.2.0","version":"3.2"},"category":{"_id":"5bb4038be7222e000334dd97","project":"59f79e3c584eb200345ceafc","version":"5ba178b00a916500030c6a21","__v":0,"sync":{"url":"","isSync":false},"reference":false,"createdAt":"2018-10-02T23:47:23.222Z","from_sync":false,"order":3,"slug":"ach","title":"ACH"},"user":"5a68eb6970ea610012bfb924","__v":116,"parentDoc":null,"updates":[],"next":{"pages":[],"description":""},"createdAt":"2018-10-02T23:50:55.265Z","link_external":false,"link_url":"","sync_unique":"","hidden":false,"api":{"examples":{"codes":[{"language":"http","code":"GET /v3.1/users/594e0fa2838454002ea317a0 HTTP/1.1\nHost: uat-api.synapsefi.com\nX-SP-GATEWAY: client_id_2bb1e412edd311e6bd04e285d6015267|client_secret_2bb1e714edd311e6bd04e285d6015267\nX-SP-USER-IP: 127.0.0.1\nX-SP-USER: |e83cf6ddcf778e37bfe3d48fc78a6502062fc\nContent-Type: application/json","name":"w/o full_dehydrate"},{"name":"with full_dehydrate","language":"http","code":"GET /v3.1/users/594e0fa2838454002ea317a0?full_dehydrate=yes HTTP/1.1\nHost: uat-api.synapsefi.com\nX-SP-GATEWAY: client_id_2bb1e412edd311e6bd04e285d6015267|client_secret_2bb1e714edd311e6bd04e285d6015267\nX-SP-USER-IP: 127.0.0.1\nX-SP-USER: |e83cf6ddcf778e37bfe3d48fc78a6502062fc\nContent-Type: application/json"}]},"method":"get","results":{"codes":[{"status":200,"language":"json","code":"{\n    \"_id\": \"594e0fa2838454002ea317a0\",\n    \"_links\": {\n        \"self\": {\n            \"href\": \"https://uat-api.synapsefi.com/v3.1/users/594e0fa2838454002ea317a0\"\n        }\n    },\n    \"client\": {\n        \"id\": \"589acd9ecb3cd400fa75ac06\",\n        \"name\": \"SynapseFI\"\n    },\n    \"doc_status\": {\n        \"physical_doc\": \"SUBMITTED|VALID\",\n        \"virtual_doc\": \"SUBMITTED|VALID\"\n    },\n    \"documents\": [\n        {\n            \"id\": \"2a4a5957a3a62aaac1a0dd0edcae96ea2cdee688ec6337b20745eed8869e3ac8\",\n            \"name\": \"Test User\",\n            \"permission_scope\": \"SEND|RECEIVE|1000|DAILY\",\n            \"physical_docs\": [\n                {\n                    \"document_type\": \"GOVT_ID\",\n                    \"id\": \"c486c2cb8c1bce695fcfae3197e14aa5b8ddec184c2779d00d581abee5d9a04c\",\n                    \"last_updated\": 1498288034877,\n                    \"status\": \"SUBMITTED|VALID\"\n                }\n            ],\n            \"social_docs\": [\n                {\n                    \"document_type\": \"FACEBOOK\",\n                    \"id\": \"8f314a6a53f36ee569455761e49a2a7fe790d251c5611c65255befdb303602b7\",\n                    \"last_updated\": 1498288034880,\n                    \"status\": \"SUBMITTED|VALID\"\n                },\n                {\n                    \"document_type\": \"PHONE_NUMBER\",\n                    \"id\": \"fda60784d6375bc44edafaaeae149626c4c13dcb92e85a2a7a00eec2cdfd2b6f\",\n                    \"last_updated\": 1498288034880,\n                    \"status\": \"SUBMITTED|VALID\"\n                },\n                {\n                    \"document_type\": \"EMAIL\",\n                    \"id\": \"2c45158f6431ca874bbe82f63d5905567854dde4d8b81539944e5779e5eee741\",\n                    \"last_updated\": 1498288034880,\n                    \"status\": \"SUBMITTED|VALID\"\n                },\n                {\n                    \"document_type\": \"IP\",\n                    \"id\": \"28d9177b22c127d9a51d8903893864accf6e553ac326704a4c0d585eaad2516a\",\n                    \"last_updated\": 1498288034880,\n                    \"status\": \"SUBMITTED|VALID\"\n                }\n            ],\n            \"virtual_docs\": [\n                {\n                    \"document_type\": \"SSN\",\n                    \"id\": \"ee596c2896dddc19b76c07a184fe7d3cf5a04b8e94b9108190cac7890739017f\",\n                    \"last_updated\": 1498288034875,\n                    \"status\": \"SUBMITTED|VALID\"\n                }\n            ]\n        }\n    ],\n    \"emails\": [],\n    \"extra\": {\n        \"cip_tag\": 1,\n        \"date_joined\": 1498288029784,\n        \"extra_security\": false,\n        \"is_business\": false,\n        \"last_updated\": 1498288034864,\n        \"public_note\": null,\n        \"supp_id\": \"122eddfgbeafrfvbbb\"\n    },\n    \"is_hidden\": false,\n    \"legal_names\": [\n        \"Test User\"\n    ],\n    \"logins\": [\n        {\n            \"email\": \"test:::at:::synapsefi.com\",\n            \"scope\": \"READ_AND_WRITE\"\n        }\n    ],\n    \"permission\": \"SEND-AND-RECEIVE\",\n    \"phone_numbers\": [\n        \"[email protected]\",\n        \"901.111.1111\"\n    ],\n    \"photos\": [],\n    \"refresh_token\": \"refresh_ehG7YBS8ZiD0sLa6PQHMUxryovVkJzElC5gWROXq\"\n}","name":"w/o full_dehydrate"},{"code":"{\n    \"_id\": \"594e0fa2838454002ea317a0\",\n    \"_links\": {\n        \"self\": {\n            \"href\": \"https://uat-api.synapsefi.com/v3.1/users/594e0fa2838454002ea317a0\"\n        }\n    },\n    \"_v\": 2,\n    \"client\": {\n        \"id\": \"589acd9ecb3cd400fa75ac06\",\n        \"name\": \"SynapseFI\"\n    },\n    \"doc_status\": {\n        \"physical_doc\": \"SUBMITTED|VALID\",\n        \"virtual_doc\": \"SUBMITTED|VALID\"\n    },\n    \"documents\": [\n        {\n            \"address_city\": \"SF\",\n            \"address_country_code\": \"US\",\n            \"address_postal_code\": \"94114\",\n            \"address_street\": \"1 Market St.\",\n            \"address_subdivision\": \"CA\",\n            \"alias\": \"Test\",\n            \"day\": 2,\n            \"email\": \"[email protected]\",\n            \"entity_scope\": \"Arts & Entertainment\",\n            \"entity_type\": \"M\",\n            \"id\": \"2a4a5957a3a62aaac1a0dd0edcae96ea2cdee688ec6337b20745eed8869e3ac8\",\n            \"ip\": \"::1\",\n            \"month\": 5,\n            \"name\": \"Test User\",\n            \"permission_scope\": \"SEND|RECEIVE|1000|DAILY\",\n            \"phone_number\": \"901.111.1111\",\n            \"physical_docs\": [\n                {\n                    \"document_type\": \"GOVT_ID\",\n                    \"document_value\": \"https://cdn.synapsepay.com/uploads/2017/06/24/DioeVvEbMOfxzpLGZNCPnJKYuHQ7t89s4FBmTk00rRgyc35WXU.gif\",\n                    \"id\": \"c486c2cb8c1bce695fcfae3197e14aa5b8ddec184c2779d00d581abee5d9a04c\",\n                    \"last_updated\": 1498288034877,\n                    \"meta\": {\n                        \"matches\": {\n                            \"address\": \"not_found\",\n                            \"dob\": \"not_found\",\n                            \"identification\": \"not_found\"\n                        }\n                    },\n                    \"status\": \"SUBMITTED|VALID\"\n                }\n            ],\n            \"screening_results\": {\n                \"561\": \"NO_MATCH\",\n                \"aucl\": \"NO_MATCH\",\n                \"concern_location\": \"NO_MATCH\",\n                \"dpl\": \"NO_MATCH\",\n                \"dtc\": \"NO_MATCH\",\n                \"el\": \"NO_MATCH\",\n                \"eucl\": \"NO_MATCH\",\n                \"fatf_non_cooperative_jurisdiction\": \"NO_MATCH\",\n                \"fbi_bank_robbers\": \"NO_MATCH\",\n                \"fbi_counter_intelligence\": \"NO_MATCH\",\n                \"fbi_crimes_against_children\": \"NO_MATCH\",\n                \"fbi_criminal_enterprise_investigations\": \"NO_MATCH\",\n                \"fbi_cyber\": \"NO_MATCH\",\n                \"fbi_domestic_terrorism\": \"NO_MATCH\",\n                \"fbi_human_trafficking\": \"NO_MATCH\",\n                \"fbi_murders\": \"NO_MATCH\",\n                \"fbi_violent_crimes\": \"NO_MATCH\",\n                \"fbi_wanted_terrorists\": \"NO_MATCH\",\n                \"fbi_white_collar\": \"NO_MATCH\",\n                \"fincen_red_list\": \"NO_MATCH\",\n                \"fse\": \"NO_MATCH\",\n                \"fto_sanctions\": \"NO_MATCH\",\n                \"futures_sanctions\": \"NO_MATCH\",\n                \"hkma_sanctions\": \"NO_MATCH\",\n                \"hm_treasury_sanctions\": \"NO_MATCH\",\n                \"isn\": \"NO_MATCH\",\n                \"mas_sanctions\": \"NO_MATCH\",\n                \"monitored_location\": \"NO_MATCH\",\n                \"ns-isa\": \"NO_MATCH\",\n                \"ofac_561_list\": \"NO_MATCH\",\n                \"ofac_eo13645\": \"NO_MATCH\",\n                \"ofac_fse\": \"NO_MATCH\",\n                \"ofac_fse_ir\": \"NO_MATCH\",\n                \"ofac_fse_sy\": \"NO_MATCH\",\n                \"ofac_isa\": \"NO_MATCH\",\n                \"ofac_ns_isa\": \"NO_MATCH\",\n                \"ofac_plc\": \"NO_MATCH\",\n                \"ofac_sdn\": \"NO_MATCH\",\n                \"ofac_ssi\": \"NO_MATCH\",\n                \"ofac_syria\": \"NO_MATCH\",\n                \"ofac_ukraine_eo13662\": \"NO_MATCH\",\n                \"osfi\": \"NO_MATCH\",\n                \"pep\": \"NO_MATCH\",\n                \"plc\": \"NO_MATCH\",\n                \"primary_concern\": \"NO_MATCH\",\n                \"sdn\": \"NO_MATCH\",\n                \"ssi\": \"NO_MATCH\",\n                \"tel_sanctions\": \"NO_MATCH\",\n                \"ukcl\": \"NO_MATCH\",\n                \"uvl\": \"NO_MATCH\"\n            },\n            \"social_docs\": [\n                {\n                    \"document_type\": \"FACEBOOK\",\n                    \"document_value\": \"https://www.facebook.com/valid\",\n                    \"id\": \"8f314a6a53f36ee569455761e49a2a7fe790d251c5611c65255befdb303602b7\",\n                    \"last_updated\": 1498288034880,\n                    \"meta\": {\n                        \"matches\": {\n                            \"address\": \"not_found\",\n                            \"dob\": \"not_found\",\n                            \"identification\": \"not_found\"\n                        }\n                    },\n                    \"status\": \"SUBMITTED|VALID\"\n                },\n                {\n                    \"document_type\": \"PHONE_NUMBER\",\n                    \"document_value\": \"901.111.1111\",\n                    \"id\": \"fda60784d6375bc44edafaaeae149626c4c13dcb92e85a2a7a00eec2cdfd2b6f\",\n                    \"last_updated\": 1498288034880,\n                    \"meta\": {\n                        \"matches\": {\n                            \"address\": \"not_found\",\n                            \"dob\": \"not_found\",\n                            \"identification\": \"not_found\"\n                        }\n                    },\n                    \"status\": \"SUBMITTED|VALID\"\n                },\n                {\n                    \"document_type\": \"EMAIL\",\n                    \"document_value\": \"[email protected]\",\n                    \"id\": \"2c45158f6431ca874bbe82f63d5905567854dde4d8b81539944e5779e5eee741\",\n                    \"last_updated\": 1498288034880,\n                    \"meta\": {\n                        \"matches\": {\n                            \"address\": \"not_found\",\n                            \"dob\": \"not_found\",\n                            \"identification\": \"not_found\"\n                        }\n                    },\n                    \"status\": \"SUBMITTED|VALID\"\n                },\n                {\n                    \"document_type\": \"IP\",\n                    \"document_value\": \"::1\",\n                    \"id\": \"28d9177b22c127d9a51d8903893864accf6e553ac326704a4c0d585eaad2516a\",\n                    \"last_updated\": 1498288034880,\n                    \"meta\": {\n                        \"matches\": {\n                            \"address\": \"not_found\",\n                            \"dob\": \"not_found\",\n                            \"identification\": \"not_found\"\n                        }\n                    },\n                    \"status\": \"SUBMITTED|VALID\"\n                }\n            ],\n            \"virtual_docs\": [\n                {\n                    \"document_type\": \"SSN\",\n                    \"document_value\": \"2222\",\n                    \"id\": \"ee596c2896dddc19b76c07a184fe7d3cf5a04b8e94b9108190cac7890739017f\",\n                    \"last_updated\": 1498288034875,\n                    \"meta\": {\n                        \"matches\": {\n                            \"address\": \"not_found\",\n                            \"dob\": \"not_found\",\n                            \"identification\": \"not_found\"\n                        }\n                    },\n                    \"status\": \"SUBMITTED|VALID\"\n                }\n            ],\n            \"year\": 1989\n        }\n    ],\n    \"emails\": [],\n    \"extra\": {\n        \"cip_tag\": 1,\n        \"date_joined\": 1498288029784,\n        \"extra_security\": false,\n        \"is_business\": false,\n        \"last_updated\": 1498288034864,\n        \"note\": null,\n        \"public_note\": null,\n        \"supp_id\": \"122eddfgbeafrfvbbb\"\n    },\n    \"flag\": \"NOT-FLAGGED\",\n    \"ips\": [\n        \"127.0.0.1\"\n    ],\n    \"is_hidden\": false,\n    \"legal_names\": [\n        \"Test User\"\n    ],\n    \"logins\": [\n        {\n            \"email\": \"[email protected]\",\n            \"scope\": \"READ_AND_WRITE\"\n        }\n    ],\n    \"permission\": \"SEND-AND-RECEIVE\",\n    \"phone_numbers\": [\n        \"[email protected]\",\n        \"901.111.1111\"\n    ],\n    \"photos\": [],\n    \"refresh_token\": \"refresh_ehG7YBS8ZiD0sLa6PQHMUxryovVkJzElC5gWROXq\"\n}","language":"json","name":"with full_dehydrate","status":200}]},"settings":"","auth":"required","params":[{"_id":"58acf7f3e570c62500512a63","ref":"","in":"query","required":false,"desc":"[yes/no] Full Dehydrate yes will return back user's KYC info.","default":"no","type":"string","name":"full_dehydrate"},{"_id":"590ca984ae0df70f0044026c","ref":"","in":"path","required":true,"desc":"The user ID of the user you wish to retrieve","default":"","type":"string","name":"user_id"}],"url":"/v3.1/users/:user_id"},"isReference":false,"order":1,"body":"After you [Create a User](https://docs.synapsefi.com/v3.2/docs/create-a-user-1) and [OAuth the User](https://docs.synapsefi.com/v3.2/docs/oauth-the-user), you are ready to link a bank account.\n\nTo link an ACH account with bank logins (also known as account aggregation), submit a user's online banking credentials (ex: your Chase online banking username/password). This allows us to instantly connect and verify  the account without account/routing number or micro-deposits. [View the full list supported institutions for account aggregation](https://docs.synapsefi.com/v3.2/docs/show-supported-banks). Don't see your bank? [Link with account/routing](https://docs.synapsefi.com/v3.2/docs/linking-an-ach-account-with-accountrouting-number) instead.\n\n**Recommended:** Check out our [Bank Logins UI tool](https://docs.synapsefi.com/v3.2/docs/bank-logins) instead of building your own UI.\n\n## Step 1: Submit Bank Logins\n\n##API ENDPOINT\nhttps://uat-api.synapsefi.com/v3.1/users/:user_id/nodes\n\n##PATH PARAMETER\n[block:html]\n{\n  \"html\": \"<div class=\\\"api-manager\\\"> <div class=\\\"param-table\\\"> <div class=\\\"table\\\"> <div class=\\\"tr\\\"> <div class=\\\"td param\\\"> <strong>user_id <span class=\\\"colon\\\">:</span> </strong> <div class=\\\"required\\\">required</div></div><div class=\\\"td\\\"> <strong class=\\\"param-type\\\">string</strong> <div marked=\\\"\\\" class=\\\"ng-isolate-scope\\\"> <p>The user ID of the user you wish to add the ACH-US node under</p></div></div></div></div></div></div>\"\n}\n[/block]\n##BODY PARAMETER\n[block:html]\n{\n  \"html\": \"<div class=\\\"api-manager\\\"> <div class=\\\"param-table\\\"> <div class=\\\"table\\\"> <div class=\\\"tr\\\"> <div class=\\\"td param\\\"> <strong>type <span class=\\\"colon\\\">:</span> </strong> <div class=\\\"required\\\">required</div></div><div class=\\\"td\\\"> <strong class=\\\"param-type\\\">string</strong> <div marked=\\\"\\\" class=\\\"ng-isolate-scope\\\"> <p>Type of node you wish to add. In this case its always <code>ACH-US</code> </p></div></div></div><div class=\\\"tr\\\"> <div class=\\\"td param\\\"> <strong> <span class=\\\"text-muted\\\">info.</span>bank_id <span class=\\\"colon\\\">:</span> </strong> <div class=\\\"required\\\">required</div></div><div class=\\\"td\\\"> <strong class=\\\"param-type\\\">string</strong> <div marked=\\\"\\\" class=\\\"ng-isolate-scope\\\"> <p>User's online banking username</p></div></div></div><div class=\\\"tr\\\"> <div class=\\\"td param\\\"> <strong> <span class=\\\"text-muted\\\">info.</span>bank_pw <span class=\\\"colon\\\">:</span> </strong> <div class=\\\"required\\\">required</div></div><div class=\\\"td\\\"> <strong class=\\\"param-type\\\">string</strong> <div marked=\\\"\\\" class=\\\"ng-isolate-scope\\\"> <p>User's online banking password</p></div></div></div><div class=\\\"tr\\\"> <div class=\\\"td param\\\"> <strong> <span class=\\\"text-muted\\\">info.</span>bank_name <span class=\\\"colon\\\">:</span> </strong> <div class=\\\"required\\\">required</div></div><div class=\\\"td\\\"> <strong class=\\\"param-type\\\">string</strong> <div marked=\\\"\\\" class=\\\"ng-isolate-scope\\\"> <p>This is the <code>bank_code</code> (i.e. \\\"capone\\\" for Capital One) available at <a href=\\\"https://uat-api.synapsefi.com/v3/institutions/show\\\">here</a> </p></div></div></div></div></div></div>\"\n}\n[/block]\n##Example Request: POST User Credentials\nSubmit the user's online banking username/password. [Learn how to encrypt sensitive data.](https://docs.synapsefi.com/v3.2/docs/linking-an-ach-account-via-bank-logins#section-encrypting-data) \n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"POST /v3.1/users/5bb40f0faadcf0361c91345a/nodes HTTP/1.1\\nHost: uat-api.synapsefi.com\\nX-SP-USER-IP: 127.0.0.1\\nX-SP-USER: oauth_T1ohHB0zsAeWPYUb3Fc9QSKlfXuZa06x5EpgI42R|n38dj3h8NE393bv24ovoRY34kd62\\nContent-Type: application/json\\n\\n{\\n  \\\"type\\\": \\\"ACH-US\\\",\\n  \\\"info\\\":{\\n    \\\"bank_id\\\":\\\"synapse_good\\\",\\n    \\\"bank_pw\\\":\\\"test1234\\\",\\n    \\\"bank_name\\\":\\\"fake\\\"\\n  }\\n}\",\n      \"language\": \"http\"\n    }\n  ]\n}\n[/block]\n##Example Response: Determine whether MFA is Required\nMulti-Factor Authentication (MFA) is determined by the user's bank account settings.\n\nIf there is `\"http_code\":\"200\"`, no MFA is required. The accounts will link and an email notice will send to the email address listed on the bank account.\n\nIf there is `\"http_code\":\"202\"`, MFA is required. Because there may be multiple MFAs in a row, please build your logic to always check for an HTTP code of 202, which means another MFA question was sent. Cycle through MFAs in this way until the HTTP code is 200.\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"{\\n    \\\"error_code\\\": \\\"10\\\",\\n    \\\"http_code\\\": \\\"202\\\",\\n    \\\"mfa\\\": {\\n        \\\"access_token\\\": \\\"fake_cd60680b9addc013ca7fb25b2b704be324d0295b34a6e3d14473e3cc65aa82d3\\\",\\n        \\\"message\\\": \\\"I heard you like questions so we put a question in your question?\\\",\\n        \\\"type\\\": \\\"question\\\"\\n    },\\n    \\\"success\\\": true\\n}\",\n      \"language\": \"json\",\n      \"name\": \"202 MFA Required\"\n    },\n    {\n      \"code\": \"{\\n    \\\"error_code\\\": \\\"0\\\",\\n    \\\"http_code\\\": \\\"200\\\",\\n    \\\"limit\\\": 2,\\n    \\\"node_count\\\": 2,\\n    \\\"nodes\\\": [\\n        {\\n            \\\"_id\\\": \\\"5bb40f5f9a835600b7fb45b0\\\",\\n            \\\"_links\\\": {\\n                \\\"self\\\": {\\n                    \\\"href\\\": \\\"https://uat-api.synapsefi.com/v3.1/users/5bb40f0faadcf0361c91345a/nodes/5bb40f5f9a835600b7fb45b0\\\"\\n                }\\n            },\\n            \\\"allowed\\\": \\\"CREDIT-AND-DEBIT\\\",\\n            \\\"client\\\": {\\n                \\\"id\\\": \\\"5ade26b4567a900029e2afd2\\\",\\n                \\\"name\\\": \\\"YY Test Account\\\"\\n            },\\n            \\\"extra\\\": {\\n                \\\"note\\\": null,\\n                \\\"other\\\": {\\n                    \\\"access_token\\\": \\\"5bb40f5d915131002b282554\\\",\\n                    \\\"updated_on\\\": 1538541470000\\n                },\\n                \\\"supp_id\\\": \\\"\\\"\\n            },\\n            \\\"info\\\": {\\n                \\\"account_num\\\": \\\"8901\\\",\\n                \\\"address\\\": \\\"PO BOX 85139, RICHMOND, VA, US\\\",\\n                \\\"balance\\\": {\\n                    \\\"amount\\\": \\\"800.00\\\",\\n                    \\\"currency\\\": \\\"USD\\\",\\n                    \\\"updated_on\\\": 1538541470000\\n                },\\n                \\\"bank_logo\\\": \\\"https://cdn.synapsepay.com/bank_logos/new/co.png\\\",\\n                \\\"bank_long_name\\\": \\\"CAPITAL ONE N.A.\\\",\\n                \\\"bank_name\\\": \\\"CAPITAL ONE N.A.\\\",\\n                \\\"class\\\": \\\"CHECKING\\\",\\n                \\\"match_info\\\": {\\n                    \\\"email_match\\\": \\\"match\\\",\\n                    \\\"name_match\\\": \\\"match\\\",\\n                    \\\"phonenumber_match\\\": \\\"no_match\\\"\\n                },\\n                \\\"name_on_account\\\": \\\" \\\",\\n                \\\"nickname\\\": \\\"SynapsePay Test Checking Account - 8901\\\",\\n                \\\"routing_num\\\": \\\"6110\\\",\\n                \\\"type\\\": \\\"BUSINESS\\\"\\n            },\\n            \\\"is_active\\\": true,\\n            \\\"timeline\\\": [\\n                {\\n                    \\\"date\\\": 1538527070659,\\n                    \\\"note\\\": \\\"Node created.\\\"\\n                }\\n            ],\\n            \\\"type\\\": \\\"ACH-US\\\",\\n            \\\"user_id\\\": \\\"5bb40f0faadcf0361c91345a\\\"\\n        },\\n        {\\n            \\\"_id\\\": \\\"5bb40f60e552da00a7ed9ea9\\\",\\n            \\\"_links\\\": {\\n                \\\"self\\\": {\\n                    \\\"href\\\": \\\"https://uat-api.synapsefi.com/v3.1/users/5bb40f0faadcf0361c91345a/nodes/5bb40f60e552da00a7ed9ea9\\\"\\n                }\\n            },\\n            \\\"allowed\\\": \\\"CREDIT-AND-DEBIT\\\",\\n            \\\"client\\\": {\\n                \\\"id\\\": \\\"5ade26b4567a900029e2afd2\\\",\\n                \\\"name\\\": \\\"YY Test Account\\\"\\n            },\\n            \\\"extra\\\": {\\n                \\\"note\\\": null,\\n                \\\"other\\\": {\\n                    \\\"access_token\\\": \\\"5bb40f5d915131002b282554\\\",\\n                    \\\"updated_on\\\": 1538541470000\\n                },\\n                \\\"supp_id\\\": \\\"\\\"\\n            },\\n            \\\"info\\\": {\\n                \\\"account_num\\\": \\\"8902\\\",\\n                \\\"address\\\": \\\"PO BOX 85139, RICHMOND, VA, US\\\",\\n                \\\"balance\\\": {\\n                    \\\"amount\\\": \\\"750.00\\\",\\n                    \\\"currency\\\": \\\"USD\\\",\\n                    \\\"updated_on\\\": 1538541470000\\n                },\\n                \\\"bank_logo\\\": \\\"https://cdn.synapsepay.com/bank_logos/new/co.png\\\",\\n                \\\"bank_long_name\\\": \\\"CAPITAL ONE N.A.\\\",\\n                \\\"bank_name\\\": \\\"CAPITAL ONE N.A.\\\",\\n                \\\"class\\\": \\\"SAVINGS\\\",\\n                \\\"match_info\\\": {\\n                    \\\"email_match\\\": \\\"match\\\",\\n                    \\\"name_match\\\": \\\"match\\\",\\n                    \\\"phonenumber_match\\\": \\\"no_match\\\"\\n                },\\n                \\\"name_on_account\\\": \\\" \\\",\\n                \\\"nickname\\\": \\\"SynapsePay Test Savings Account - 8902\\\",\\n                \\\"routing_num\\\": \\\"6110\\\",\\n                \\\"type\\\": \\\"BUSINESS\\\"\\n            },\\n            \\\"is_active\\\": true,\\n            \\\"timeline\\\": [\\n                {\\n                    \\\"date\\\": 1538527071627,\\n                    \\\"note\\\": \\\"Node created.\\\"\\n                }\\n            ],\\n            \\\"type\\\": \\\"ACH-US\\\",\\n            \\\"user_id\\\": \\\"5bb40f0faadcf0361c91345a\\\"\\n        }\\n    ],\\n    \\\"page_count\\\": 1,\\n    \\\"success\\\": true\\n}\",\n      \"language\": \"json\",\n      \"name\": \"200 No MFA Required\"\n    }\n  ]\n}\n[/block]\n##Step 2: Verify with MFA\nVerify the account with Multi-Factor Authentication (MFA) if required.\n\n##PATH PARAMETER\n[block:html]\n{\n  \"html\": \"<div class=\\\"api-manager\\\"> <div class=\\\"param-table\\\"> <div class=\\\"table\\\"> <div class=\\\"tr\\\"> <div class=\\\"td param\\\"> <strong>user_id <span class=\\\"colon\\\">:</span> </strong> <div class=\\\"required\\\">required</div></div><div class=\\\"td\\\"> <strong class=\\\"param-type\\\">string</strong> <div marked=\\\"\\\" class=\\\"ng-isolate-scope\\\"> <p>The user ID of the user you wish to add the ACH-US node under</p></div></div></div></div></div></div>\"\n}\n[/block]\n##BODY PARAMETER\n[block:html]\n{\n  \"html\": \"<div class=\\\"api-manager\\\"> <div class=\\\"param-table\\\"> <div class=\\\"table\\\"> <div class=\\\"tr\\\"> <div class=\\\"td param\\\"> <strong>access_token <span class=\\\"colon\\\">:</span> </strong> <div class=\\\"required\\\">required</div></div><div class=\\\"td\\\"> <strong class=\\\"param-type\\\">string</strong> <div marked=\\\"\\\" class=\\\"ng-isolate-scope\\\"> <p>Access token returned from previous step </p></div></div></div><div class=\\\"tr\\\"> <div class=\\\"td param\\\"> <strong> mfa_answer <span class=\\\"colon\\\">:</span> </strong> <div class=\\\"required\\\">required</div></div><div class=\\\"td\\\"> <strong class=\\\"param-type\\\">string</strong> <div marked=\\\"\\\" class=\\\"ng-isolate-scope\\\"> <p>Answer to the MFA question</p></div></div></div></div></div></div>\"\n}\n[/block]\n##Example Request: Submit MFA Answer\nSubmit the MFA answer. MFAs can be in the form of a code or question.\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"POST /v3.1/users/5bb40f0faadcf0361c91345a/nodes HTTP/1.1\\nHost: uat-api.synapsefi.com\\nX-SP-USER-IP: 127.0.0.1\\nX-SP-USER: oauth_T1ohHB0zsAeWPYUb3Fc9QSKlfXuZa06x5EpgI42R|n38dj3h8NE393bv24ovoRY34kd62\\nContent-Type: application/json\\n\\n{\\n    \\\"access_token\\\":\\\"fake_cd60680b9addc013ca7fb25b2b704ba82d3\\\",\\n    \\\"mfa_answer\\\":\\\"test_answer\\\"\\n}\",\n      \"language\": \"http\"\n    }\n  ]\n}\n[/block]\n##Example Response: Bank Accounts Linked\nWhen a 200 HTTP code is returned, all bank accounts associated with the user's bank login credentials are automatically linked. In some cases this will link to multiple accounts (ex: checking and savings). Please ask the user to designate the preferred ACH-US node and delete extra nodes.\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"{\\n    \\\"error_code\\\": \\\"0\\\",\\n    \\\"http_code\\\": \\\"200\\\",\\n    \\\"limit\\\": 2,\\n    \\\"node_count\\\": 2,\\n    \\\"nodes\\\": [\\n        {\\n            \\\"_id\\\": \\\"5bb40f5f9a835600b7fb45b0\\\",\\n            \\\"_links\\\": {\\n                \\\"self\\\": {\\n                    \\\"href\\\": \\\"https://uat-api.synapsefi.com/v3.1/users/5bb40f0faadcf0361c91345a/nodes/5bb40f5f9a835600b7fb45b0\\\"\\n                }\\n            },\\n            \\\"allowed\\\": \\\"CREDIT-AND-DEBIT\\\",\\n            \\\"client\\\": {\\n                \\\"id\\\": \\\"5ade26b4567a900029e2afd2\\\",\\n                \\\"name\\\": \\\"YY Test Account\\\"\\n            },\\n            \\\"extra\\\": {\\n                \\\"note\\\": null,\\n                \\\"other\\\": {\\n                    \\\"access_token\\\": \\\"5bb40f5d915131002b282554\\\",\\n                    \\\"updated_on\\\": 1538541470000\\n                },\\n                \\\"supp_id\\\": \\\"\\\"\\n            },\\n            \\\"info\\\": {\\n                \\\"account_num\\\": \\\"8901\\\",\\n                \\\"address\\\": \\\"PO BOX 85139, RICHMOND, VA, US\\\",\\n                \\\"balance\\\": {\\n                    \\\"amount\\\": \\\"800.00\\\",\\n                    \\\"currency\\\": \\\"USD\\\",\\n                    \\\"updated_on\\\": 1538541470000\\n                },\\n                \\\"bank_logo\\\": \\\"https://cdn.synapsepay.com/bank_logos/new/co.png\\\",\\n                \\\"bank_long_name\\\": \\\"CAPITAL ONE N.A.\\\",\\n                \\\"bank_name\\\": \\\"CAPITAL ONE N.A.\\\",\\n                \\\"class\\\": \\\"CHECKING\\\",\\n                \\\"match_info\\\": {\\n                    \\\"email_match\\\": \\\"match\\\",\\n                    \\\"name_match\\\": \\\"match\\\",\\n                    \\\"phonenumber_match\\\": \\\"no_match\\\"\\n                },\\n                \\\"name_on_account\\\": \\\" \\\",\\n                \\\"nickname\\\": \\\"SynapsePay Test Checking Account - 8901\\\",\\n                \\\"routing_num\\\": \\\"6110\\\",\\n                \\\"type\\\": \\\"BUSINESS\\\"\\n            },\\n            \\\"is_active\\\": true,\\n            \\\"timeline\\\": [\\n                {\\n                    \\\"date\\\": 1538527070659,\\n                    \\\"note\\\": \\\"Node created.\\\"\\n                }\\n            ],\\n            \\\"type\\\": \\\"ACH-US\\\",\\n            \\\"user_id\\\": \\\"5bb40f0faadcf0361c91345a\\\"\\n        },\\n        {\\n            \\\"_id\\\": \\\"5bb40f60e552da00a7ed9ea9\\\",\\n            \\\"_links\\\": {\\n                \\\"self\\\": {\\n                    \\\"href\\\": \\\"https://uat-api.synapsefi.com/v3.1/users/5bb40f0faadcf0361c91345a/nodes/5bb40f60e552da00a7ed9ea9\\\"\\n                }\\n            },\\n            \\\"allowed\\\": \\\"CREDIT-AND-DEBIT\\\",\\n            \\\"client\\\": {\\n                \\\"id\\\": \\\"5ade26b4567a900029e2afd2\\\",\\n                \\\"name\\\": \\\"YY Test Account\\\"\\n            },\\n            \\\"extra\\\": {\\n                \\\"note\\\": null,\\n                \\\"other\\\": {\\n                    \\\"access_token\\\": \\\"5bb40f5d915131002b282554\\\",\\n                    \\\"updated_on\\\": 1538541470000\\n                },\\n                \\\"supp_id\\\": \\\"\\\"\\n            },\\n            \\\"info\\\": {\\n                \\\"account_num\\\": \\\"8902\\\",\\n                \\\"address\\\": \\\"PO BOX 85139, RICHMOND, VA, US\\\",\\n                \\\"balance\\\": {\\n                    \\\"amount\\\": \\\"750.00\\\",\\n                    \\\"currency\\\": \\\"USD\\\",\\n                    \\\"updated_on\\\": 1538541470000\\n                },\\n                \\\"bank_logo\\\": \\\"https://cdn.synapsepay.com/bank_logos/new/co.png\\\",\\n                \\\"bank_long_name\\\": \\\"CAPITAL ONE N.A.\\\",\\n                \\\"bank_name\\\": \\\"CAPITAL ONE N.A.\\\",\\n                \\\"class\\\": \\\"SAVINGS\\\",\\n                \\\"match_info\\\": {\\n                    \\\"email_match\\\": \\\"match\\\",\\n                    \\\"name_match\\\": \\\"match\\\",\\n                    \\\"phonenumber_match\\\": \\\"no_match\\\"\\n                },\\n                \\\"name_on_account\\\": \\\" \\\",\\n                \\\"nickname\\\": \\\"SynapsePay Test Savings Account - 8902\\\",\\n                \\\"routing_num\\\": \\\"6110\\\",\\n                \\\"type\\\": \\\"BUSINESS\\\"\\n            },\\n            \\\"is_active\\\": true,\\n            \\\"timeline\\\": [\\n                {\\n                    \\\"date\\\": 1538527071627,\\n                    \\\"note\\\": \\\"Node created.\\\"\\n                }\\n            ],\\n            \\\"type\\\": \\\"ACH-US\\\",\\n            \\\"user_id\\\": \\\"5bb40f0faadcf0361c91345a\\\"\\n        }\\n    ],\\n    \\\"page_count\\\": 1,\\n    \\\"success\\\": true\\n}\",\n      \"language\": \"json\"\n    }\n  ]\n}\n[/block]\n\n[block:callout]\n{\n  \"type\": \"info\",\n  \"title\": \"Timeout Windows\",\n  \"body\": \"Bank Logins may take a while. We recommend a timeout window of 100 seconds. This is why most bank login interfaces are interactive to keep people engaged.\"\n}\n[/block]\n##Testing Bank Login Credentials in Sandbox\nFollowing are the sample bank login credentials that you can use to test out your bank login implementation.\n[block:parameters]\n{\n  \"data\": {\n    \"0-0\": \"synapse_good\",\n    \"1-0\": \"synapse_good\",\n    \"2-0\": \"synapse_good\",\n    \"3-0\": \"synapse_good\",\n    \"4-0\": \"synapse_good\",\n    \"5-0\": \"synapse_nomfa\",\n    \"0-2\": \"**again** (to get multiple MFAs) or else **test_answer**\",\n    \"1-2\": \"**again** (to get multiple MFAs) or else **test_answer**\",\n    \"2-2\": \"**again** (to get multiple MFAs) or else **test_answer**\",\n    \"3-2\": \"**again** (to get multiple MFAs) or else **test_answer**\",\n    \"4-2\": \"**again** (to get multiple MFAs) or else **test_answer**\",\n    \"0-3\": \"fake\",\n    \"1-3\": \"fake\",\n    \"2-3\": \"fake\",\n    \"3-3\": \"fake\",\n    \"4-3\": \"fake\",\n    \"5-2\": \"No multi-factor authentication  (\\\"MFA\\\") is necessary\",\n    \"5-1\": \"test1234\",\n    \"4-1\": \"test1234_random\",\n    \"3-1\": \"test1234_savings\",\n    \"2-1\": \"test1234_checking\",\n    \"1-1\": \"test1234_one\",\n    \"0-1\": \"test1234\",\n    \"h-0\": \"Username\",\n    \"h-1\": \"Password\",\n    \"h-2\": \"MFA\",\n    \"h-3\": \"Bank Name\"\n  },\n  \"cols\": 5,\n  \"rows\": 6\n}\n[/block]\n##Testing Login Sync Errors in Sandbox\nWhen adding a new node, append any of these values to the end of the password.  When doing a `force_refresh` on the node, it will trigger the corresponding error.\n\nAppending “_needs_relink” to the password (e.g. “test1234_savings_needs_relink) will link a node that will return the 401/110 error message when you try doing a “force_refresh”. It falls in line with our current sandbox test values so you can add “_needs_relink” to the end of any of the passwords above.\n[block:parameters]\n{\n  \"data\": {\n    \"0-0\": \"503\",\n    \"1-0\": \"400\",\n    \"2-0\": \"401\",\n    \"3-0\": \"500\",\n    \"0-1\": \"503\",\n    \"1-1\": \"410\",\n    \"2-1\": \"110\",\n    \"3-1\": \"500\",\n    \"0-2\": \"_sync_unavailable\",\n    \"1-2\": \"_sync_not_allowed\",\n    \"2-2\": \"_needs_relink\",\n    \"3-2\": \"_sync_unknown_error\",\n    \"0-3\": \"Refresh unavailable.\",\n    \"1-3\": \"Refresh not allowed.\",\n    \"2-3\": \"Bad credentials.\",\n    \"3-3\": \"Unknown refresh error.\",\n    \"h-2\": \"Append to Password\",\n    \"h-3\": \"Description\",\n    \"h-1\": \"ERROR_CODE\",\n    \"h-0\": \"HTTP_CODE\"\n  },\n  \"cols\": 4,\n  \"rows\": 4\n}\n[/block]\n\n[block:callout]\n{\n  \"type\": \"info\",\n  \"title\": \"Sandbox Test Values\",\n  \"body\": \"Test in sandbox with test values for [bank login credentials](https://docs.synapsefi.com/v3.2/docs/sandbox-test-values#section-sample-bank-login-credentials) and [authentication errors](https://docs.synapsefi.com/v3.2/docs/errors#section-bank-login-authentication-errors).\\n\\nAlso test the `force_refresh` [sync feature](https://docs.synapsefi.com/v3.2/docs/sandbox-test-values#section-testing-login-sync-error-scenarios) and [sync errors](https://docs.synapsefi.com/v3.2/docs/errors#section-bank-login-sync-errors).\"\n}\n[/block]\n## Encrypting Data\n\nIf you wish to encrypt bank login info while transmitting the information from the client device, you can use the following encryption key.\n\nThe key works for `bank_id`, `bank_pw` and `mfa_answer`.\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"-----Begin Public Key-----\\n\\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxy7xFpupeVxgUiaPneI1WAioSIeL6+/NAIIjbvDOvdTCNUeI//ob4bfdGLYlXpXOor/5POqfheZnHzkTu6BhDQqGZBc2BLaARlqx0s+twIadPwzqOJETzmp7r5U5ZioluOGDw4CF+JKRL6sBOaYr5wJ3BemZOXqQE7SAqIsi6Sej2ijGzVFq4tR3gogAdMKjGhzDwthqzZViZN1Zhzb8jsX/aCY+OWq9IUp4iX41fYmpfI9klVKnneAuVAIOPhI5zMaZ7JiQ+88ZQngTi6IhieyGIjvfG7FTsLNoYEqu1OeKw3SRt+HSs+LpnO3P9wwWODZtr07H7oxNJDAIoXITPwIDAQAB\\n\\n-----End Public Key-----\",\n      \"language\": \"text\"\n    }\n  ]\n}\n[/block]\n[JSencrypt](https://github.com/travist/jsencrypt) is an easy to use library to use for this purpose, the implementation would look something like this\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"// Encrypt with the public key...\\nvar encrypt = new JSEncrypt();\\nencrypt.setPublicKey($('#pubkey').val());\\nvar encryptedUsername = encrypt.encrypt($('#username').val());\\nvar encryptedPassword = encrypt.encrypt($('#password').val());\\nvar encryptedMFA = encrypt.encrypt($('#mfa').val());\",\n      \"language\": \"javascript\"\n    }\n  ]\n}\n[/block]\n\n[block:callout]\n{\n  \"type\": \"info\",\n  \"title\": \"Subscribe to Webhooks\",\n  \"body\": \"We recommend that you[ subscribe to webhooks](https://docs.synapsefi.com/v3.2/docs/subscribe-to-webhooks) to stay updated on the status of nodes.\"\n}\n[/block]","excerpt":"POST an ACH-US node with Bank Logins","slug":"linking-an-ach-account-via-bank-logins","type":"basic","title":"Link with Bank Logins"}

Link with Bank Logins

POST an ACH-US node with Bank Logins

After you [Create a User](https://docs.synapsefi.com/v3.2/docs/create-a-user-1) and [OAuth the User](https://docs.synapsefi.com/v3.2/docs/oauth-the-user), you are ready to link a bank account. To link an ACH account with bank logins (also known as account aggregation), submit a user's online banking credentials (ex: your Chase online banking username/password). This allows us to instantly connect and verify the account without account/routing number or micro-deposits. [View the full list supported institutions for account aggregation](https://docs.synapsefi.com/v3.2/docs/show-supported-banks). Don't see your bank? [Link with account/routing](https://docs.synapsefi.com/v3.2/docs/linking-an-ach-account-with-accountrouting-number) instead. **Recommended:** Check out our [Bank Logins UI tool](https://docs.synapsefi.com/v3.2/docs/bank-logins) instead of building your own UI. ## Step 1: Submit Bank Logins ##API ENDPOINT https://uat-api.synapsefi.com/v3.1/users/:user_id/nodes ##PATH PARAMETER [block:html] { "html": "<div class=\"api-manager\"> <div class=\"param-table\"> <div class=\"table\"> <div class=\"tr\"> <div class=\"td param\"> <strong>user_id <span class=\"colon\">:</span> </strong> <div class=\"required\">required</div></div><div class=\"td\"> <strong class=\"param-type\">string</strong> <div marked=\"\" class=\"ng-isolate-scope\"> <p>The user ID of the user you wish to add the ACH-US node under</p></div></div></div></div></div></div>" } [/block] ##BODY PARAMETER [block:html] { "html": "<div class=\"api-manager\"> <div class=\"param-table\"> <div class=\"table\"> <div class=\"tr\"> <div class=\"td param\"> <strong>type <span class=\"colon\">:</span> </strong> <div class=\"required\">required</div></div><div class=\"td\"> <strong class=\"param-type\">string</strong> <div marked=\"\" class=\"ng-isolate-scope\"> <p>Type of node you wish to add. In this case its always <code>ACH-US</code> </p></div></div></div><div class=\"tr\"> <div class=\"td param\"> <strong> <span class=\"text-muted\">info.</span>bank_id <span class=\"colon\">:</span> </strong> <div class=\"required\">required</div></div><div class=\"td\"> <strong class=\"param-type\">string</strong> <div marked=\"\" class=\"ng-isolate-scope\"> <p>User's online banking username</p></div></div></div><div class=\"tr\"> <div class=\"td param\"> <strong> <span class=\"text-muted\">info.</span>bank_pw <span class=\"colon\">:</span> </strong> <div class=\"required\">required</div></div><div class=\"td\"> <strong class=\"param-type\">string</strong> <div marked=\"\" class=\"ng-isolate-scope\"> <p>User's online banking password</p></div></div></div><div class=\"tr\"> <div class=\"td param\"> <strong> <span class=\"text-muted\">info.</span>bank_name <span class=\"colon\">:</span> </strong> <div class=\"required\">required</div></div><div class=\"td\"> <strong class=\"param-type\">string</strong> <div marked=\"\" class=\"ng-isolate-scope\"> <p>This is the <code>bank_code</code> (i.e. \"capone\" for Capital One) available at <a href=\"https://uat-api.synapsefi.com/v3/institutions/show\">here</a> </p></div></div></div></div></div></div>" } [/block] ##Example Request: POST User Credentials Submit the user's online banking username/password. [Learn how to encrypt sensitive data.](https://docs.synapsefi.com/v3.2/docs/linking-an-ach-account-via-bank-logins#section-encrypting-data) [block:code] { "codes": [ { "code": "POST /v3.1/users/5bb40f0faadcf0361c91345a/nodes HTTP/1.1\nHost: uat-api.synapsefi.com\nX-SP-USER-IP: 127.0.0.1\nX-SP-USER: oauth_T1ohHB0zsAeWPYUb3Fc9QSKlfXuZa06x5EpgI42R|n38dj3h8NE393bv24ovoRY34kd62\nContent-Type: application/json\n\n{\n \"type\": \"ACH-US\",\n \"info\":{\n \"bank_id\":\"synapse_good\",\n \"bank_pw\":\"test1234\",\n \"bank_name\":\"fake\"\n }\n}", "language": "http" } ] } [/block] ##Example Response: Determine whether MFA is Required Multi-Factor Authentication (MFA) is determined by the user's bank account settings. If there is `"http_code":"200"`, no MFA is required. The accounts will link and an email notice will send to the email address listed on the bank account. If there is `"http_code":"202"`, MFA is required. Because there may be multiple MFAs in a row, please build your logic to always check for an HTTP code of 202, which means another MFA question was sent. Cycle through MFAs in this way until the HTTP code is 200. [block:code] { "codes": [ { "code": "{\n \"error_code\": \"10\",\n \"http_code\": \"202\",\n \"mfa\": {\n \"access_token\": \"fake_cd60680b9addc013ca7fb25b2b704be324d0295b34a6e3d14473e3cc65aa82d3\",\n \"message\": \"I heard you like questions so we put a question in your question?\",\n \"type\": \"question\"\n },\n \"success\": true\n}", "language": "json", "name": "202 MFA Required" }, { "code": "{\n \"error_code\": \"0\",\n \"http_code\": \"200\",\n \"limit\": 2,\n \"node_count\": 2,\n \"nodes\": [\n {\n \"_id\": \"5bb40f5f9a835600b7fb45b0\",\n \"_links\": {\n \"self\": {\n \"href\": \"https://uat-api.synapsefi.com/v3.1/users/5bb40f0faadcf0361c91345a/nodes/5bb40f5f9a835600b7fb45b0\"\n }\n },\n \"allowed\": \"CREDIT-AND-DEBIT\",\n \"client\": {\n \"id\": \"5ade26b4567a900029e2afd2\",\n \"name\": \"YY Test Account\"\n },\n \"extra\": {\n \"note\": null,\n \"other\": {\n \"access_token\": \"5bb40f5d915131002b282554\",\n \"updated_on\": 1538541470000\n },\n \"supp_id\": \"\"\n },\n \"info\": {\n \"account_num\": \"8901\",\n \"address\": \"PO BOX 85139, RICHMOND, VA, US\",\n \"balance\": {\n \"amount\": \"800.00\",\n \"currency\": \"USD\",\n \"updated_on\": 1538541470000\n },\n \"bank_logo\": \"https://cdn.synapsepay.com/bank_logos/new/co.png\",\n \"bank_long_name\": \"CAPITAL ONE N.A.\",\n \"bank_name\": \"CAPITAL ONE N.A.\",\n \"class\": \"CHECKING\",\n \"match_info\": {\n \"email_match\": \"match\",\n \"name_match\": \"match\",\n \"phonenumber_match\": \"no_match\"\n },\n \"name_on_account\": \" \",\n \"nickname\": \"SynapsePay Test Checking Account - 8901\",\n \"routing_num\": \"6110\",\n \"type\": \"BUSINESS\"\n },\n \"is_active\": true,\n \"timeline\": [\n {\n \"date\": 1538527070659,\n \"note\": \"Node created.\"\n }\n ],\n \"type\": \"ACH-US\",\n \"user_id\": \"5bb40f0faadcf0361c91345a\"\n },\n {\n \"_id\": \"5bb40f60e552da00a7ed9ea9\",\n \"_links\": {\n \"self\": {\n \"href\": \"https://uat-api.synapsefi.com/v3.1/users/5bb40f0faadcf0361c91345a/nodes/5bb40f60e552da00a7ed9ea9\"\n }\n },\n \"allowed\": \"CREDIT-AND-DEBIT\",\n \"client\": {\n \"id\": \"5ade26b4567a900029e2afd2\",\n \"name\": \"YY Test Account\"\n },\n \"extra\": {\n \"note\": null,\n \"other\": {\n \"access_token\": \"5bb40f5d915131002b282554\",\n \"updated_on\": 1538541470000\n },\n \"supp_id\": \"\"\n },\n \"info\": {\n \"account_num\": \"8902\",\n \"address\": \"PO BOX 85139, RICHMOND, VA, US\",\n \"balance\": {\n \"amount\": \"750.00\",\n \"currency\": \"USD\",\n \"updated_on\": 1538541470000\n },\n \"bank_logo\": \"https://cdn.synapsepay.com/bank_logos/new/co.png\",\n \"bank_long_name\": \"CAPITAL ONE N.A.\",\n \"bank_name\": \"CAPITAL ONE N.A.\",\n \"class\": \"SAVINGS\",\n \"match_info\": {\n \"email_match\": \"match\",\n \"name_match\": \"match\",\n \"phonenumber_match\": \"no_match\"\n },\n \"name_on_account\": \" \",\n \"nickname\": \"SynapsePay Test Savings Account - 8902\",\n \"routing_num\": \"6110\",\n \"type\": \"BUSINESS\"\n },\n \"is_active\": true,\n \"timeline\": [\n {\n \"date\": 1538527071627,\n \"note\": \"Node created.\"\n }\n ],\n \"type\": \"ACH-US\",\n \"user_id\": \"5bb40f0faadcf0361c91345a\"\n }\n ],\n \"page_count\": 1,\n \"success\": true\n}", "language": "json", "name": "200 No MFA Required" } ] } [/block] ##Step 2: Verify with MFA Verify the account with Multi-Factor Authentication (MFA) if required. ##PATH PARAMETER [block:html] { "html": "<div class=\"api-manager\"> <div class=\"param-table\"> <div class=\"table\"> <div class=\"tr\"> <div class=\"td param\"> <strong>user_id <span class=\"colon\">:</span> </strong> <div class=\"required\">required</div></div><div class=\"td\"> <strong class=\"param-type\">string</strong> <div marked=\"\" class=\"ng-isolate-scope\"> <p>The user ID of the user you wish to add the ACH-US node under</p></div></div></div></div></div></div>" } [/block] ##BODY PARAMETER [block:html] { "html": "<div class=\"api-manager\"> <div class=\"param-table\"> <div class=\"table\"> <div class=\"tr\"> <div class=\"td param\"> <strong>access_token <span class=\"colon\">:</span> </strong> <div class=\"required\">required</div></div><div class=\"td\"> <strong class=\"param-type\">string</strong> <div marked=\"\" class=\"ng-isolate-scope\"> <p>Access token returned from previous step </p></div></div></div><div class=\"tr\"> <div class=\"td param\"> <strong> mfa_answer <span class=\"colon\">:</span> </strong> <div class=\"required\">required</div></div><div class=\"td\"> <strong class=\"param-type\">string</strong> <div marked=\"\" class=\"ng-isolate-scope\"> <p>Answer to the MFA question</p></div></div></div></div></div></div>" } [/block] ##Example Request: Submit MFA Answer Submit the MFA answer. MFAs can be in the form of a code or question. [block:code] { "codes": [ { "code": "POST /v3.1/users/5bb40f0faadcf0361c91345a/nodes HTTP/1.1\nHost: uat-api.synapsefi.com\nX-SP-USER-IP: 127.0.0.1\nX-SP-USER: oauth_T1ohHB0zsAeWPYUb3Fc9QSKlfXuZa06x5EpgI42R|n38dj3h8NE393bv24ovoRY34kd62\nContent-Type: application/json\n\n{\n \"access_token\":\"fake_cd60680b9addc013ca7fb25b2b704ba82d3\",\n \"mfa_answer\":\"test_answer\"\n}", "language": "http" } ] } [/block] ##Example Response: Bank Accounts Linked When a 200 HTTP code is returned, all bank accounts associated with the user's bank login credentials are automatically linked. In some cases this will link to multiple accounts (ex: checking and savings). Please ask the user to designate the preferred ACH-US node and delete extra nodes. [block:code] { "codes": [ { "code": "{\n \"error_code\": \"0\",\n \"http_code\": \"200\",\n \"limit\": 2,\n \"node_count\": 2,\n \"nodes\": [\n {\n \"_id\": \"5bb40f5f9a835600b7fb45b0\",\n \"_links\": {\n \"self\": {\n \"href\": \"https://uat-api.synapsefi.com/v3.1/users/5bb40f0faadcf0361c91345a/nodes/5bb40f5f9a835600b7fb45b0\"\n }\n },\n \"allowed\": \"CREDIT-AND-DEBIT\",\n \"client\": {\n \"id\": \"5ade26b4567a900029e2afd2\",\n \"name\": \"YY Test Account\"\n },\n \"extra\": {\n \"note\": null,\n \"other\": {\n \"access_token\": \"5bb40f5d915131002b282554\",\n \"updated_on\": 1538541470000\n },\n \"supp_id\": \"\"\n },\n \"info\": {\n \"account_num\": \"8901\",\n \"address\": \"PO BOX 85139, RICHMOND, VA, US\",\n \"balance\": {\n \"amount\": \"800.00\",\n \"currency\": \"USD\",\n \"updated_on\": 1538541470000\n },\n \"bank_logo\": \"https://cdn.synapsepay.com/bank_logos/new/co.png\",\n \"bank_long_name\": \"CAPITAL ONE N.A.\",\n \"bank_name\": \"CAPITAL ONE N.A.\",\n \"class\": \"CHECKING\",\n \"match_info\": {\n \"email_match\": \"match\",\n \"name_match\": \"match\",\n \"phonenumber_match\": \"no_match\"\n },\n \"name_on_account\": \" \",\n \"nickname\": \"SynapsePay Test Checking Account - 8901\",\n \"routing_num\": \"6110\",\n \"type\": \"BUSINESS\"\n },\n \"is_active\": true,\n \"timeline\": [\n {\n \"date\": 1538527070659,\n \"note\": \"Node created.\"\n }\n ],\n \"type\": \"ACH-US\",\n \"user_id\": \"5bb40f0faadcf0361c91345a\"\n },\n {\n \"_id\": \"5bb40f60e552da00a7ed9ea9\",\n \"_links\": {\n \"self\": {\n \"href\": \"https://uat-api.synapsefi.com/v3.1/users/5bb40f0faadcf0361c91345a/nodes/5bb40f60e552da00a7ed9ea9\"\n }\n },\n \"allowed\": \"CREDIT-AND-DEBIT\",\n \"client\": {\n \"id\": \"5ade26b4567a900029e2afd2\",\n \"name\": \"YY Test Account\"\n },\n \"extra\": {\n \"note\": null,\n \"other\": {\n \"access_token\": \"5bb40f5d915131002b282554\",\n \"updated_on\": 1538541470000\n },\n \"supp_id\": \"\"\n },\n \"info\": {\n \"account_num\": \"8902\",\n \"address\": \"PO BOX 85139, RICHMOND, VA, US\",\n \"balance\": {\n \"amount\": \"750.00\",\n \"currency\": \"USD\",\n \"updated_on\": 1538541470000\n },\n \"bank_logo\": \"https://cdn.synapsepay.com/bank_logos/new/co.png\",\n \"bank_long_name\": \"CAPITAL ONE N.A.\",\n \"bank_name\": \"CAPITAL ONE N.A.\",\n \"class\": \"SAVINGS\",\n \"match_info\": {\n \"email_match\": \"match\",\n \"name_match\": \"match\",\n \"phonenumber_match\": \"no_match\"\n },\n \"name_on_account\": \" \",\n \"nickname\": \"SynapsePay Test Savings Account - 8902\",\n \"routing_num\": \"6110\",\n \"type\": \"BUSINESS\"\n },\n \"is_active\": true,\n \"timeline\": [\n {\n \"date\": 1538527071627,\n \"note\": \"Node created.\"\n }\n ],\n \"type\": \"ACH-US\",\n \"user_id\": \"5bb40f0faadcf0361c91345a\"\n }\n ],\n \"page_count\": 1,\n \"success\": true\n}", "language": "json" } ] } [/block] [block:callout] { "type": "info", "title": "Timeout Windows", "body": "Bank Logins may take a while. We recommend a timeout window of 100 seconds. This is why most bank login interfaces are interactive to keep people engaged." } [/block] ##Testing Bank Login Credentials in Sandbox Following are the sample bank login credentials that you can use to test out your bank login implementation. [block:parameters] { "data": { "0-0": "synapse_good", "1-0": "synapse_good", "2-0": "synapse_good", "3-0": "synapse_good", "4-0": "synapse_good", "5-0": "synapse_nomfa", "0-2": "**again** (to get multiple MFAs) or else **test_answer**", "1-2": "**again** (to get multiple MFAs) or else **test_answer**", "2-2": "**again** (to get multiple MFAs) or else **test_answer**", "3-2": "**again** (to get multiple MFAs) or else **test_answer**", "4-2": "**again** (to get multiple MFAs) or else **test_answer**", "0-3": "fake", "1-3": "fake", "2-3": "fake", "3-3": "fake", "4-3": "fake", "5-2": "No multi-factor authentication (\"MFA\") is necessary", "5-1": "test1234", "4-1": "test1234_random", "3-1": "test1234_savings", "2-1": "test1234_checking", "1-1": "test1234_one", "0-1": "test1234", "h-0": "Username", "h-1": "Password", "h-2": "MFA", "h-3": "Bank Name" }, "cols": 5, "rows": 6 } [/block] ##Testing Login Sync Errors in Sandbox When adding a new node, append any of these values to the end of the password. When doing a `force_refresh` on the node, it will trigger the corresponding error. Appending “_needs_relink” to the password (e.g. “test1234_savings_needs_relink) will link a node that will return the 401/110 error message when you try doing a “force_refresh”. It falls in line with our current sandbox test values so you can add “_needs_relink” to the end of any of the passwords above. [block:parameters] { "data": { "0-0": "503", "1-0": "400", "2-0": "401", "3-0": "500", "0-1": "503", "1-1": "410", "2-1": "110", "3-1": "500", "0-2": "_sync_unavailable", "1-2": "_sync_not_allowed", "2-2": "_needs_relink", "3-2": "_sync_unknown_error", "0-3": "Refresh unavailable.", "1-3": "Refresh not allowed.", "2-3": "Bad credentials.", "3-3": "Unknown refresh error.", "h-2": "Append to Password", "h-3": "Description", "h-1": "ERROR_CODE", "h-0": "HTTP_CODE" }, "cols": 4, "rows": 4 } [/block] [block:callout] { "type": "info", "title": "Sandbox Test Values", "body": "Test in sandbox with test values for [bank login credentials](https://docs.synapsefi.com/v3.2/docs/sandbox-test-values#section-sample-bank-login-credentials) and [authentication errors](https://docs.synapsefi.com/v3.2/docs/errors#section-bank-login-authentication-errors).\n\nAlso test the `force_refresh` [sync feature](https://docs.synapsefi.com/v3.2/docs/sandbox-test-values#section-testing-login-sync-error-scenarios) and [sync errors](https://docs.synapsefi.com/v3.2/docs/errors#section-bank-login-sync-errors)." } [/block] ## Encrypting Data If you wish to encrypt bank login info while transmitting the information from the client device, you can use the following encryption key. The key works for `bank_id`, `bank_pw` and `mfa_answer`. [block:code] { "codes": [ { "code": "-----Begin Public Key-----\n\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxy7xFpupeVxgUiaPneI1WAioSIeL6+/NAIIjbvDOvdTCNUeI//ob4bfdGLYlXpXOor/5POqfheZnHzkTu6BhDQqGZBc2BLaARlqx0s+twIadPwzqOJETzmp7r5U5ZioluOGDw4CF+JKRL6sBOaYr5wJ3BemZOXqQE7SAqIsi6Sej2ijGzVFq4tR3gogAdMKjGhzDwthqzZViZN1Zhzb8jsX/aCY+OWq9IUp4iX41fYmpfI9klVKnneAuVAIOPhI5zMaZ7JiQ+88ZQngTi6IhieyGIjvfG7FTsLNoYEqu1OeKw3SRt+HSs+LpnO3P9wwWODZtr07H7oxNJDAIoXITPwIDAQAB\n\n-----End Public Key-----", "language": "text" } ] } [/block] [JSencrypt](https://github.com/travist/jsencrypt) is an easy to use library to use for this purpose, the implementation would look something like this [block:code] { "codes": [ { "code": "// Encrypt with the public key...\nvar encrypt = new JSEncrypt();\nencrypt.setPublicKey($('#pubkey').val());\nvar encryptedUsername = encrypt.encrypt($('#username').val());\nvar encryptedPassword = encrypt.encrypt($('#password').val());\nvar encryptedMFA = encrypt.encrypt($('#mfa').val());", "language": "javascript" } ] } [/block] [block:callout] { "type": "info", "title": "Subscribe to Webhooks", "body": "We recommend that you[ subscribe to webhooks](https://docs.synapsefi.com/v3.2/docs/subscribe-to-webhooks) to stay updated on the status of nodes." } [/block]