NAV
Atrium Verification Guide
cURL C# Go Java Node PHP Python Ruby
  • Verification overview
  • Using the Connect widget
  • Using Atrium endpoints
  • Testing verification
  • Changelog
  • Verification overview

    Atrium's verification allows partners to retrieve the account and routing information for an end user in just a few simple steps. These steps are very similar to those for standard aggregation.

    Partners may optionally use the Connect widget as part of this process. The Connect widget simplifies creating members and answering multi-factor authentication while providing a ready-made user interface for these verification steps.

    The general workflows you'll follow depend on whether you decide to use the Connect widget or build your own UI that relies on Atrium.

    These workflows are a simplified summary, and some will require multiple requests to different endpoints. The exact details are laid out in our technical reference.

    If a verification is already running, a 202 Accepted status will be returned. If another aggregation-type process is already running — like standard aggregation or extended transaction history — a 409 Conflict will be returned.

    For more information on other aggregation-type processes, please see our developer guide

    For important information on errors, standards and conventions, and resource structure in Atrium, please see our technical reference.

    Workflow with the Connect widget

    1. Creating a user;
    2. Loading the Connect widget for that user;
      • The end user will use Connect to create a member, start a verification job, and answer multi-factor authentication if necessary;
      • Listen for the messages sent by the Connect widget;
    3. Poll the member's verification status until an end state is reached;
      • A verification is successful when the connection_status is CONNECTED and the the is_aggregating field changes from true to false;
    4. Answer MFA, if necessary;
    5. If the verification is successful, reading the new member's account numbers.

    Workflow with API requests only

    1. Creating a user;
    2. Creating a member using the correct institution code and credentials required by that institution;
      • When a member is created, a standard aggregation is automatically started; this can be stopped with the skip_aggregation parameter;
    3. Calling the verify endpoint;
    4. Poll the member's verification status;
    5. Answering MFA, if necessary;
    6. Answer the special account-selection challenge (the legacy flow skips this step and instead verifies all accounts);
    7. Poll the verification status until an end state is reached;
      • A verification is successful when the connection_status is CONNECTED and the the is_aggregating field changes from true to false;
    8. If the verification is successful, listing the new member's account numbers.

    Using the Connect widget

    1. Create a user

    Endpoint: POST /users

    Example request

    $ curl -i -X POST 'https://vestibule.mx.com/users' \
      -H 'Accept: application/vnd.mx.atrium.v1+json' \
      -H 'Content-Type: application/json' \
      -H 'MX-API-Key: {mx_api_key}' \
      -H 'MX-Client-ID: {mx_client_id}' \
      -d '{
            "user": {
              "identifier": "unique_id",
              "metadata": "{\"first_name\": \"Steven\"}"
            }
          }'
    
    using System;
    using Atrium.Api;
    using Atrium.Model;
    
    namespace Example
    {
        public class CreateUserExample
        {
            public void main()
            {
                var client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
                var body = new UserCreateRequestBody(); // UserCreateRequestBody | User object to be created with optional parameters (identifier, is_disabled, metadata)
    
                try
                {
                    // Create user
                    UserResponseBody response = client.users.CreateUser(body);
                    Console.WriteLine(response);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception when calling UsersApi.CreateUser: " + e.Message );
                }
            }
        }
    }
    
    package main
    
    import (
      "context"
      "fmt"
      "github.com/mxenabled/atrium-go"
    )
    
    func main() {
      client := atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
      ctx := context.Background()
    
      body := atrium.UserCreateRequestBody{} // UserCreateRequestBody | User object to be created with optional parameters (identifier, is_disabled, metadata)
    
      response, _, err := client.Users.CreateUser(ctx, body)
      if err != nil {
        fmt.Printf("Error: %v\n", err)
      } else {
        fmt.Printf("Response: %s\n", response)
      }
    }
    
    import com.mx.atrium.*;
    import com.mx.model.*;
    
    public class UsersApiExample {
        public static void main(String[] args) {
            AtriumClient client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
            UserCreateRequestBody body = new UserCreateRequestBody(); // UserCreateRequestBody | User object to be created with optional parameters (identifier, is_disabled, metadata)
    
            try {
                UserResponseBody response = client.users.createUser(body);
                System.out.println(response);
            } catch (ApiException e) {
                System.err.println("Exception when calling UsersApi#createUser");
                e.printStackTrace();
            }
        }
    }
    
    var atrium = require('./atrium.js');
    
    var client = new atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
    var body = new atrium.UserCreateRequestBody(); // UserCreateRequestBody | User object to be created with optional parameters (identifier, is_disabled, metadata)
    
    var response = client.users.createUser(body);
    
    response.then(function(value) {
      console.log(value);
    });
    
    <?php
    require_once(__DIR__ . '/vendor/autoload.php');
    
    $client = new atrium\Api\AtriumClient(
        "YOUR_API_KEY",
        "YOUR_CLIENT_ID",
        new GuzzleHttp\Client()
    );
    
    $body = new \atrium\model\UserCreateRequestBody(); // \atrium\model\UserCreateRequestBody | User object to be created with optional parameters (identifier, is_disabled, metadata)
    
    try {
        $result = $client->users->createUser($body);
        print_r($result);
    } catch (Exception $e) {
        echo 'Exception when calling UsersApi->createUser: ', $e->getMessage(), PHP_EOL;
    }
    ?>
    
    from __future__ import print_function
    import time
    import atrium
    from atrium.rest import ApiException
    from pprint import pprint
    
    # create an instance of the AtriumClient
    client = atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    body = atrium.UserCreateRequestBody() # UserCreateRequestBody | User object to be created with optional parameters (identifier, is_disabled, metadata)
    
    try:
        # Create user
        response = client.users.create_user(body)
        pprint(response)
    except ApiException as e:
        print("Exception when calling UsersApi->create_user: %s\n" % e)
    
    # load the gem
    require 'atrium-ruby'
    
    client = Atrium::AtriumClient.new("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    body = Atrium::UserCreateRequestBody.new # UserCreateRequestBody | User object to be created with optional parameters (identifier, is_disabled, metadata)
    
    begin
      #Create user
      response = client.users.create_user(body)
      p response
    rescue Atrium::ApiError => e
      puts "Exception when calling UsersApi->create_user: #{e}"
    end
    

    Example response

    Status: 200 OK
    
    {
      "user": {
        "guid": "USR-fa7537f3-48aa-a683-a02a-b18940482f54",
        "identifier": "unique_id",
        "is_disabled": false,
        "metadata": "{\"first_name\": \"Steven\"}"
      }
    }
    
    class UserResponseBody {
      User:
        class User {
          Guid: USR-d74cb14f-fd0a-449f-991b-e0362a63d9c6
          Identifier: My-Unique-ID
          IsDisabled: false
          Metadata: {"first_name": "Steven", "last_name": "Universe"}
        }
    }
    
    {
      User:
        {
          Guid: USR-d74cb14f-fd0a-449f-991b-e0362a63d9c6
          Identifier: My-Unique-ID
          IsDisabled: false
          Metadata: {"first_name": "Steven", "last_name": "Universe"}
        }
    }
    
    class UserResponseBody {
      user:
        class User {
          guid: USR-d74cb14f-fd0a-449f-991b-e0362a63d9c6
          identifier: My-Unique-ID
          isDisabled: false
          metadata: {"first_name": "Steven", "last_name": "Universe"}
        }
    }
    
    UserResponseBody {
      user:
        User {
          guid: USR-d74cb14f-fd0a-449f-991b-e0362a63d9c6
          identifier: My-Unique-ID
          isDisabled: false
          metadata: {"first_name": "Steven", "last_name": "Universe"}
        }
    }
    
    atrium/model/UserResponseBody Object (
      [user] =>
        atrium/model/User Object (
          [guid] => USR-d74cb14f-fd0a-449f-991b-e0362a63d9c6
          [identifier] => My-Unique-ID
          [is_disabled] => false
          [metadata] => {"first_name": "Steven", "last_name": "Universe"}
        )
    )
    
    {
      'user':
        {
          'guid': USR-d74cb14f-fd0a-449f-991b-e0362a63d9c6
          'identifier': My-Unique-ID
          'is_disabled': false
          'metadata': {"first_name": "Steven", "last_name": "Universe"}
        }
    }
    
    #<MX::UserResponseBody
      @user=
        #<MX::User
          @guid= USR-d74cb14f-fd0a-449f-991b-e0362a63d9c6
          @identifier= My-Unique-ID
          @is_disabled= false
          @metadata= {"first_name": "Steven", "last_name": "Universe"}
        >
    >
    

    Call this endpoint to create a new user. Atrium will respond with the newly-created user object if successful.

    This endpoint accepts several parameters: identifier, metadata, and is_disabled. The identifier and metadata fields are discussed above.

    Disabling a user means that accounts and transactions associated with it will not be updated in the background by MX. It will also restrict access to that user's data until they are no longer disabled.

    Parameters

    Field Data Type Description Required?
    identifier String A unique, enforced identifier for the user, defined by you. No
    is_disabled Boolean True if you want the user disabled, false otherwise. No
    metadata String Additional information you can store about this user. MX recommends using JSON-structured data. No

    2. Load the Connect widget in verification mode

    Get a URL

    Endpoint: POST /users/{user_guid}/connect_widget_url

    Example request

    $ curl -i -X POST 'https://vestibule.mx.com/users/{user_guid}/connect_widget_url' \
      -H 'Accept: application/vnd.mx.atrium.v1+json' \
      -H 'Content-Type: application/json' \
      -H 'MX-API-Key: {mx_api_key}' \
      -H 'MX-Client-ID: {mx_client_id}'
      -d '{
            "color_scheme": "dark",
            "mode": "verification"
          }'
    
    using System;
    using Atrium.Api;
    using Atrium.Model;
    
    namespace Example
    {
        public class GetConnectWidgetExample
        {
            public void main()
            {
                var client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
                var userGuid = "USR-123";  // string | The unique identifier for a `user`.
                var body = new ConnectWidgetRequestBody(); // ConnectWidgetRequestBody | Optional config options for WebView (is_mobile_webview, current_institution_code, current_member_guid, update_credentials)
    
                try
                {
                    // Embedding in a website
                    ConnectWidgetResponseBody response = client.connectWidget.GetConnectWidget(userGuid, body);
                    Console.WriteLine(response);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception when calling ConnectWidgetApi.GetConnectWidget: " + e.Message );
                }
            }
        }
    }
    
    package main
    
    import (
      "context"
      "fmt"
      "github.com/mxenabled/atrium-go"
    )
    
    func main() {
      client := atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
      ctx := context.Background()
    
      userGUID := "USR-123" // string | The unique identifier for a `user`.
      body := atrium.ConnectWidgetRequestBody{} // ConnectWidgetRequestBody | Optional config options for WebView (is_mobile_webview, current_institution_code, current_member_guid, update_credentials)
    
      response, _, err := client.ConnectWidget.GetConnectWidget(ctx, userGUID, body)
      if err != nil {
        fmt.Printf("Error: %v\n", err)
      } else {
        fmt.Printf("Response: %s\n", response)
      }
    }
    
    import com.mx.atrium.*;
    import com.mx.model.*;
    
    public class ConnectWidgetApiExample {
        public static void main(String[] args) {
            AtriumClient client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
            String userGuid = "USR-123"; // String | The unique identifier for a `user`.
            ConnectWidgetRequestBody body = new ConnectWidgetRequestBody(); // ConnectWidgetRequestBody | Optional config options for WebView (is_mobile_webview, current_institution_code, current_member_guid, update_credentials)
    
            try {
                ConnectWidgetResponseBody response = client.connectWidget.getConnectWidget(userGuid, body);
                System.out.println(response);
            } catch (ApiException e) {
                System.err.println("Exception when calling ConnectWidgetApi#getConnectWidget");
                e.printStackTrace();
            }
        }
    }
    
    var atrium = require("./atrium.js");
    
    var client = new atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
    var userGuid = "USR-123"; // string | The unique identifier for a `user`.
    var body = new atrium.ConnectWidgetRequestBody(); // ConnectWidgetRequestBody | Optional config options for WebView (is_mobile_webview, current_institution_code, current_member_guid, update_credentials)
    
    var response = client.connectWidget.getConnectWidget(userGuid, body);
    
    response.then(function (value) {
      console.log(value);
    });
    
    <?php
    require_once(__DIR__ . '/vendor/autoload.php');
    
    $client = new atrium\Api\AtriumClient(
        "YOUR_API_KEY",
        "YOUR_CLIENT_ID",
        new GuzzleHttp\Client()
    );
    
    $user_guid = "USR-123"; // string | The unique identifier for a `user`.
    $body = new \atrium\model\ConnectWidgetRequestBody(); // \atrium\model\ConnectWidgetRequestBody | Optional config options for WebView (is_mobile_webview, current_institution_code, current_member_guid, update_credentials)
    
    try {
        $result = $client->connectWidget->getConnectWidget($user_guid, $body);
        print_r($result);
    } catch (Exception $e) {
        echo 'Exception when calling ConnectWidgetApi->getConnectWidget: ', $e->getMessage(), PHP_EOL;
    }
    ?>
    
    from __future__ import print_function
    import time
    import atrium
    from atrium.rest import ApiException
    from pprint import pprint
    
    # create an instance of the AtriumClient
    client = atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    user_guid = "USR-123" # str | The unique identifier for a `user`.
    body = atrium.ConnectWidgetRequestBody() # ConnectWidgetRequestBody | Optional config options for WebView (is_mobile_webview, current_institution_code, current_member_guid, update_credentials)
    
    try:
        # Embedding in a website
        response = client.connect_widget.get_connect_widget(user_guid, body)
        pprint(response)
    except ApiException as e:
        print("Exception when calling ConnectWidgetApi->get_connect_widget: %s\n" % e)
    
    # load the gem
    require 'atrium-ruby'
    
    client = Atrium::AtriumClient.new("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    user_guid = "USR-123" # String | The unique identifier for a `user`.
    body = Atrium::ConnectWidgetRequestBody.new # ConnectWidgetRequestBody | Optional config options for WebView (is_mobile_webview, current_institution_code, current_member_guid, update_credentials)
    
    begin
      #Embedding in a website
      response = client.connectWidget.get_connect_widget(user_guidbody)
      p response
    rescue Atrium::ApiError => e
      puts "Exception when calling ConnectWidgetApi->get_connect_widget: #{e}"
    end
    

    Example response

    Status: 200 OK
    
    {
      "user": {
        "connect_widget_url": "https://int-widgets.moneydesktop.com/md/connect/jb1rA14m85tw2lyvpgfx4gc6d3Z8z8Ayb8",
        "guid": "USR-fa7537f3-48aa-a683-a02a-b18940482f54"
      }
    }
    
    class ConnectWidgetResponseBody {
      User:
        class ConnectWidget {
          ConnectWidgetUrl: https://int-widgets.moneydesktop.com/md/connect/jb1rA14m85tw2lyvpgfx4gc6d3Z8z8Ayb8
          Guid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    {
      User:
        {
          ConnectWidgetUrl: https://int-widgets.moneydesktop.com/md/connect/jb1rA14m85tw2lyvpgfx4gc6d3Z8z8Ayb8
          Guid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    class ConnectWidgetResponseBody {
      user:
        class ConnectWidget {
          connectWidgetUrl: https://int-widgets.moneydesktop.com/md/connect/jb1rA14m85tw2lyvpgfx4gc6d3Z8z8Ayb8
          guid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    ConnectWidgetResponseBody {
      user:
        ConnectWidget {
          connectWidgetUrl: https://int-widgets.moneydesktop.com/md/connect/jb1rA14m85tw2lyvpgfx4gc6d3Z8z8Ayb8
          guid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    atrium/model/ConnectWidgetResponseBody Object (
      [user] =>
        atrium/model/ConnectWidget Object (
          [connect_widget_url] => https://int-widgets.moneydesktop.com/md/connect/jb1rA14m85tw2lyvpgfx4gc6d3Z8z8Ayb8
          [guid] => USR-fa7537f3-48aa-a683-a02a-b18940482f54
        )
    )
    
    {
      'user':
        {
          'connect_widget_url': https://int-widgets.moneydesktop.com/md/connect/jb1rA14m85tw2lyvpgfx4gc6d3Z8z8Ayb8
          'guid': USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    #<MX::ConnectWidgetResponseBody
      @user=
        #<MX::ConnectWidget
          @connect_widget_url= https://int-widgets.moneydesktop.com/md/connect/jb1rA14m85tw2lyvpgfx4gc6d3Z8z8Ayb8
          @guid= USR-fa7537f3-48aa-a683-a02a-b18940482f54
        >
    >
    

    To get started with Connect, you will first need to create a user and then get a widget URL by making a POST request to /users/{user_guid}/connect_widget_url. You can also use one of our wrapper libraries to make this request.

    3. Poll the member status endpoint

    GET /users/{user_guid}/members/{member_guid}/status
    

    Example request

    $ curl -i -X GET 'https://vestibule.mx.com/users/{user_guid}/members/{member_guid}/status' \
      -H 'Accept: application/vnd.mx.atrium.v1+json' \
      -H 'MX-API-Key: {mx_api_key}' \
      -H 'MX-Client-ID: {mx_client_id}'
    
    using System;
    using Atrium.Api;
    using Atrium.Model;
    
    namespace Example
    {
        public class ReadMemberStatusExample
        {
            public void main()
            {
                var client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
                var memberGuid = "MBR-123";  // string | The unique identifier for a `member`.
                var userGuid = "USR-123";  // string | The unique identifier for a `user`.
    
                try
                {
                    // Read member connection status
                    MemberConnectionStatusResponseBody response = client.members.ReadMemberStatus(memberGuid, userGuid);
                    Console.WriteLine(response);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception when calling MembersApi.ReadMemberStatus: " + e.Message );
                }
            }
        }
    }
    
    package main
    
    import (
      "context"
      "fmt"
      "github.com/mxenabled/atrium-go"
    )
    
    func main() {
      client := atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
      ctx := context.Background()
    
      memberGUID := "MBR-123" // string | The unique identifier for a `member`.
      userGUID := "USR-123" // string | The unique identifier for a `user`.
    
      response, _, err := client.Members.ReadMemberStatus(ctx, memberGUID, userGUID)
      if err != nil {
        fmt.Printf("Error: %v\n", err)
      } else {
        fmt.Printf("Response: %s\n", response)
      }
    }
    
    import com.mx.atrium.*;
    import com.mx.model.*;
    
    public class MembersApiExample {
        public static void main(String[] args) {
            AtriumClient client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
            String memberGuid = "MBR-123"; // String | The unique identifier for a `member`.
            String userGuid = "USR-123"; // String | The unique identifier for a `user`.
    
            try {
                MemberConnectionStatusResponseBody response = client.members.readMemberStatus(memberGuid, userGuid);
                System.out.println(response);
            } catch (ApiException e) {
                System.err.println("Exception when calling MembersApi#readMemberStatus");
                e.printStackTrace();
            }
        }
    }
    
    var atrium = require('./atrium.js');
    
    var client = new atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
    var memberGuid = "MBR-123"; // string | The unique identifier for a `member`.
    var userGuid = "USR-123"; // string | The unique identifier for a `user`.
    
    var response = client.members.readMemberStatus(memberGuid, userGuid);
    
    response.then(function(value) {
      console.log(value);
    });
    
    <?php
    require_once(__DIR__ . '/vendor/autoload.php');
    
    $client = new atrium\Api\AtriumClient(
        "YOUR_API_KEY",
        "YOUR_CLIENT_ID",
        new GuzzleHttp\Client()
    );
    
    $member_guid = "MBR-123"; // string | The unique identifier for a `member`.
    $user_guid = "USR-123"; // string | The unique identifier for a `user`.
    
    try {
        $result = $client->members->readMemberStatus($member_guid, $user_guid);
        print_r($result);
    } catch (Exception $e) {
        echo 'Exception when calling MembersApi->readMemberStatus: ', $e->getMessage(), PHP_EOL;
    }
    ?>
    
    from __future__ import print_function
    import time
    import atrium
    from atrium.rest import ApiException
    from pprint import pprint
    
    # create an instance of the AtriumClient
    client = atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    member_guid = "MBR-123" # str | The unique identifier for a `member`.
    user_guid = "USR-123" # str | The unique identifier for a `user`.
    
    try:
        # Read member connection status
        response = client.members.read_member_status(member_guid, user_guid)
        pprint(response)
    except ApiException as e:
        print("Exception when calling MembersApi->read_member_status: %s\n" % e)
    
    # load the gem
    require 'atrium-ruby'
    
    client = Atrium::AtriumClient.new("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    member_guid = "MBR-123" # String | The unique identifier for a `member`.
    user_guid = "USR-123" # String | The unique identifier for a `user`.
    
    begin
      #Read member connection status
      response = client.members.read_member_status(member_guid, user_guid)
      p response
    rescue Atrium::ApiError => e
      puts "Exception when calling MembersApi->read_member_status: #{e}"
    end
    

    Example response

    Status: 200 OK
    
    {
      "member": {
        "aggregated_at": "2019-06-08T17:21:05Z",
        "connection_status": "CONNECTED",
        "guid": "MBR-a4652b66-3ee5-cb9f-295a-72eddef61db5",
        "has_processed_accounts": true,
        "has_processed_transactions": true,
        "is_authenticated": true,
        "is_being_aggregated": false,
        "status": "COMPLETED",
        "successfully_aggregated_at": "2019-06-07T21:16:03Z"
      }
    }
    
    class MemberConnectionStatusResponseBody {
      Member:
        class MemberConnectionStatus {
          AggregatedAt: 2016-10-13T18:07:57+00:00
          ConnectionStatus: CONNECTED
          Guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          HasProcessedAccounts: true
          HasProcessedTransactions: false
          IsAuthenticated: true
          IsBeingAggregated: false
          Status: COMPLETED
          SuccessfullyAggregatedAt: 2016-10-13T17:57:38+00:00
        }
    }
    
    {
      Member:
        {
          AggregatedAt: 2016-10-13T18:07:57+00:00
          ConnectionStatus: CONNECTED
          Guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          HasProcessedAccounts: true
          HasProcessedTransactions: false
          IsAuthenticated: true
          IsBeingAggregated: false
          Status: COMPLETED
          SuccessfullyAggregatedAt: 2016-10-13T17:57:38+00:00
        }
    }
    
    class MemberConnectionStatusResponseBody {
      member:
        class MemberConnectionStatus {
          aggregatedAt: 2016-10-13T18:07:57+00:00
          connectionStatus: CONNECTED
          guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          hasProcessedAccounts: true
          hasProcessedTransactions: false
          isAuthenticated: true
          isBeingAggregated: false
          status: COMPLETED
          successfullyAggregatedAt: 2016-10-13T17:57:38+00:00
        }
    }
    
    MemberConnectionStatusResponseBody {
      member:
        MemberConnectionStatus {
          aggregatedAt: 2016-10-13T18:07:57+00:00
          connectionStatus: CONNECTED
          guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          hasProcessedAccounts: true
          hasProcessedTransactions: false
          isAuthenticated: true
          isBeingAggregated: false
          status: COMPLETED
          successfullyAggregatedAt: 2016-10-13T17:57:38+00:00
        }
    }
    
    atrium/model/MemberConnectionStatusResponseBody Object (
      [member] =>
        atrium/model/MemberConnectionStatus Object (
          [aggregated_at] => 2016-10-13T18:07:57+00:00
          [connection_status] => CONNECTED
          [guid] => MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          [has_processed_accounts] => true
          [has_processed_transactions] => false
          [is_authenticated] => true
          [is_being_aggregated] => false
          [status] => COMPLETED
          [successfully_aggregated_at] => 2016-10-13T17:57:38+00:00
        )
    )
    
    {
      'member':
        {
          'aggregated_at': 2016-10-13T18:07:57+00:00
          'connection_status': CONNECTED
          'guid': MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          'has_processed_accounts': true
          'has_processed_transactions': false
          'is_authenticated': true
          'is_being_aggregated': false
          'status': COMPLETED
          'successfully_aggregated_at': 2016-10-13T17:57:38+00:00
        }
    }
    
    #<MX::MemberConnectionStatusResponseBody
      @member=
        #<MX::MemberConnectionStatus
          @aggregated_at= 2016-10-13T18:07:57+00:00
          @connection_status= CONNECTED
          @guid= MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          @has_processed_accounts= true
          @has_processed_transactions= false
          @is_authenticated= true
          @is_being_aggregated= false
          @status= COMPLETED
          @successfully_aggregated_at= 2016-10-13T17:57:38+00:00
        >
    >
    

    Example response for status CHALLENGED

    Status: 200 OK
    
    {
      "member": {
        "aggregated_at": "2016-10-13T18:24:37+00:00",
        "challenges": [
          {
            "field_name": null,
            "guid": "CRD-1ec152cd-e628-e81a-e852-d1e7104624da",
            "label": "What city were you born in?",
            "type": "TEXT"
          }
        ],
        "connection_status": "CHALLENGED",
        "guid": "MBR-7c6f361b-e582-15b6-60c0-358f12466b4b",
        "has_processed_accounts": false,
        "has_processed_transactions": false,
        "is_authenticated": false,
        "is_being_aggregated": true,
        "status": "CHALLENGED",
        "successfully_aggregated_at": "2016-10-13T18:08:04+00:00"
      }
    }
    
    class MemberConnectionStatusResponseBody {
      Member:
        class MemberConnectionStatus {
          AggregatedAt: 2016-10-13T18:07:57+00:00
          Challenges: [
            class Challenge {
              FieldName: Who is this guy?
              Guid: CRD-ce76d2e3-86bd-ec4a-ec52-eb53b5194bf5
              ImageData: Who is this guy?
              Label: Who is this guy?
              Options: [
                class ChallengeOption {
                  ImageData: data:image/png;base64,iVBORw0KGgoAAAANSUh ... more image data ...
                  Label: IMAGE_1
                  Value: image_data
                }
              ]
              Type: IMAGE_DATA
            }
          ]
          ConnectionStatus: CHALLENGED
          Guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          HasProcessedAccounts: false
          HasProcessedTransactions: false
          IsAuthenticated: true
          IsBeingAggregated: false
          Status: COMPLETED
          SuccessfullyAggregatedAt: 2016-10-13T17:57:38+00:00
        }
    }
    
    {
      Member:
        {
          AggregatedAt: 2016-10-13T18:07:57+00:00
          Challenges: [
            {
              FieldName: Who is this guy?
              Guid: CRD-ce76d2e3-86bd-ec4a-ec52-eb53b5194bf5
              ImageData: Who is this guy?
              Label: Who is this guy?
              Options: [
                {
                  ImageData: data:image/png;base64,iVBORw0KGgoAAAANSUh ... more image data ...
                  Label: IMAGE_1
                  Value: image_data
                }
              ]
              Type: IMAGE_DATA
            }
          ]
          ConnectionStatus: CHALLENGED
          Guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          HasProcessedAccounts: false
          HasProcessedTransactions: false
          IsAuthenticated: true
          IsBeingAggregated: false
          Status: COMPLETED
          SuccessfullyAggregatedAt: 2016-10-13T17:57:38+00:00
        }
    }
    
    class MemberConnectionStatusResponseBody {
      member:
        class MemberConnectionStatus {
          aggregatedAt: 2016-10-13T18:07:57+00:00
          challenges: [
            class Challenge {
              fieldName: Who is this guy?
              guid: CRD-ce76d2e3-86bd-ec4a-ec52-eb53b5194bf5
              imageData: Who is this guy?
              label: Who is this guy?
              options: [
                class ChallengeOption {
                  imageData: data:image/png;base64,iVBORw0KGgoAAAANSUh ... more image data ...
                  label: IMAGE_1
                  value: image_data
                }
              ]
              type: IMAGE_DATA
            }
          ]
          connectionStatus: CHALLENGED
          guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          hasProcessedAccounts: false
          hasProcessedTransactions: false
          isAuthenticated: true
          isBeingAggregated: false
          status: COMPLETED
          successfullyAggregatedAt: 2016-10-13T17:57:38+00:00
        }
    }
    
    MemberConnectionStatusResponseBody {
      member:
        MemberConnectionStatus {
          aggregatedAt: 2016-10-13T18:07:57+00:00
          challenges: [
            Challenge {
              fieldName: Who is this guy?
              guid: CRD-ce76d2e3-86bd-ec4a-ec52-eb53b5194bf5
              imageData: Who is this guy?
              label: Who is this guy?
              options: [
                ChallengeOption {
                  imageData: data:image/png;base64,iVBORw0KGgoAAAANSUh ... more image data ...
                  label: IMAGE_1
                  value: image_data
                }
              ]
              type: IMAGE_DATA
            }
          ]
          connectionStatus: CHALLENGED
          guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          hasProcessedAccounts: false
          hasProcessedTransactions: false
          isAuthenticated: true
          isBeingAggregated: false
          status: COMPLETED
          successfullyAggregatedAt: 2016-10-13T17:57:38+00:00
        }
    }
    
    atrium/model/MemberConnectionStatusResponseBody Object (
      [member] =>
        atrium/model/MemberConnectionStatus Object (
          [aggregated_at] => 2016-10-13T18:07:57+00:00
          [challenges] => Array (
            atrium/model/Challenge Object (
              [field_name] => Who is this guy?
              [guid] => CRD-ce76d2e3-86bd-ec4a-ec52-eb53b5194bf5
              [image_data] => Who is this guy?
              [label] => Who is this guy?
              [options] => Array (
                atrium/model/ChallengeOption Object (
                  [image_data] => data:image/png;base64,iVBORw0KGgoAAAANSUh ... more image data ...
                  [label] => IMAGE_1
                  [value] => image_data
                )
              )
              [type] => IMAGE_DATA
            )
          )
          [connection_status] => CHALLENGED
          [guid] => MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          [has_processed_accounts] => false
          [has_processed_transactions] => false
          [is_authenticated] => true
          [is_being_aggregated] => false
          [status] => COMPLETED
          [successfully_aggregated_at] => 2016-10-13T17:57:38+00:00
        )
    )
    
    {
      'member':
        {
          'aggregated_at': 2016-10-13T18:07:57+00:00
          'challenges': [
            {
              'field_name': Who is this guy?
              'guid': CRD-ce76d2e3-86bd-ec4a-ec52-eb53b5194bf5
              'image_data': Who is this guy?
              'label': Who is this guy?
              'options': [
                {
                  'image_data': data:image/png;base64,iVBORw0KGgoAAAANSUh ... more image data ...
                  'label': IMAGE_1
                  'value': image_data
                }
              ]
              'type': IMAGE_DATA
            }
          ]
          'connection_status': CHALLENGED
          'guid': MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          'has_processed_accounts': false
          'has_processed_transactions': false
          'is_authenticated': true
          'is_being_aggregated': false
          'status': COMPLETED
          'successfully_aggregated_at': 2016-10-13T17:57:38+00:00
        }
    }
    
    #<MX::MemberConnectionStatusResponseBody
      @member=
        #<MX::MemberConnectionStatus
          @aggregated_at= 2016-10-13T18:07:57+00:00
          @challenges= [
            #<MX::Challenge
              @field_name= Who is this guy?
              @guid= CRD-ce76d2e3-86bd-ec4a-ec52-eb53b5194bf5
              @image_data= Who is this guy?
              @label= Who is this guy?
              @options= [
                #<MX::ChallengeOption
                  @image_data= data:image/png;base64,iVBORw0KGgoAAAANSUh ... more image data ...
                  @label= IMAGE_1
                  @value= image_data
                >
              ]
              @type= IMAGE_DATA
            >
          ]
          @connection_status= CHALLENGED
          @guid= MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          @has_processed_accounts= false
          @has_processed_transactions= false
          @is_authenticated= true
          @is_being_aggregated= false
          @status= COMPLETED
          @successfully_aggregated_at= 2016-10-13T17:57:38+00:00
        >
    >
    

    This endpoint provides the status of the member's most recent aggregation-type event. This is an important step in the aggregation process (as well as identification, verification, etc.), and the results returned by this endpoint should determine what you do next in order to successfully aggregate a member.

    MX has introduced new, more detailed information on the current status of a member's connection to a financial institution and the state of its aggregation: the connection_status field. These are intended to replace and expand upon the information provided in the status field, which will soon be deprecated; support for the status field remains for the time being.

    Member connection statuses should be used in conjunction with all the fields described below. For instance, when is_being_aggregated switches from true to false and the value of connection_status is CONNECTED, you can stop polling the status and list the member's transactions or list the transactions for a specific account.

    The response for this endpoint is not the same as the read member endpoint; this endpoint returns fields which are specifically focused on the state of the member's aggregation, as well as including MFA challenges when the connection_status is CHALLENGED.

    MX recommends a minimum polling interval of 3 seconds when using this endpoint.

    Read member connection status fields

    Field Data type Description
    aggregated_at String The date and time the account was last aggregated.
    challenges Array An array containing MFA challenges that have been issued. challenges will only be present when the connection_status is CHALLENGED.
    connection_status String The status of a member's aggregation. Read more about these statuses here.
    guid String A unique identifier for the member. Defined by MX.
    has_processed_accounts Boolean true when accounts have been processed for a member, false otherwise. Resets each time /aggregate is called.
    has_processed_transactions Boolean true when transactions have been processed for a member, false otherwise. Resets each time /aggregate is called.
    is_authenticated Boolean If the member’s credentials were authenticated during the most recent aggregation, this field will be true. Otherwise, this field will be false. Resets to false each time /aggregate is called. This field does not indicate that an aggregation is completed — only that the credentials used were good; MFA or other connection problems may occur while this value is true.
    is_being_aggregated Boolean This value is true if the member is being aggregated at the time of the request and false otherwise.
    status String The status of a member's aggregation. This field will soon be deprecated. Use connection_status above as more detailed indicator of a member's status.
    successfully_aggregated_at String The date and time the member was successfully aggregated.

    Connection status definitions

    Connection status id (integer) Connection status (string) Definition Next steps End-user message
    null null The member exists but does not have credentials. None. None.
    0 CREATED The member is new and has not yet been aggregated. Aggregate the member once the end user logs in; poll for a status update. Connecting to {...} ...
    1 PREVENTED MX is preventing aggregation until the member’s credentials have been updated. Display end-user message; after end user has updated their credentials, aggregate again. The last 3 attempts to connect have failed. Please re-enter your credentials to continue importing data.
    2 DENIED The credentials provided for the member were invalid. Display end-user message; after end user has updated their credentials, aggregate again. The credentials entered do not match your credentials at this institution. Please re-enter your credentials to continue importing data.
    3 CHALLENGED The member has been challenged by multi-factor authentication. Display end-user message; follow MFA pathway; after the user answers MFA, poll for a status update. To authenticate your connection to {...}, please answer the following challenge(s).
    4 REJECTED An MFA challenge was answered incorrectly. Display end-user message; another challenge may follow or aggregation may need to be restarted. The answer or answers provided were incorrect. Please try again.
    5 LOCKED The financial institution is preventing authentication. The end user must contact the financial institution. Display end-user message. Your account is locked. Please log in to the appropriate website for {...} and follow the steps to resolve the issue.
    6 CONNECTED The member was successfully authenticated and data is now aggregating. Display the account as having been connected. Connected to [...] ...
    7 IMPEDED The end user’s attention is required at their online banking institution, e.g., there is a marketing message that must be viewed, terms and conditions that must be accepted, etc. Display end-user message. Your attention is needed at this institution's website. Please log in to the appropriate website for {...} and follow the steps to resolve the issue.
    8 RECONNECTED The member has been migrated to a new data source and aggregation is likely to trigger one-time password MFA. MX will not perform background aggregation in order to avoid unnecessarily disruptive texts, emails, etc. The member must be re-aggregated in the foreground with the end user present. Aggregate the member once the end user logs in; poll for a status update. Reconnecting to {...} ...
    9 DEGRADED Aggregation has failed at least three times within a short period of time. Display end-user message. We are upgrading this connection. Please try again later.
    10 DISCONNECTED Aggregation has failed at least three times and has not succeeded for at least two weeks. Display end-user message. It looks like your data from {...} cannot be imported. We are working to resolve the issue.
    11 DISCONTINUED The connection to this financial institution is no longer available. Display end-user message. Connections to this institution are no longer supported. You may create a manual account and use manual transactions to track data for this account.
    12 CLOSED The end user, MX, the client, or a partner has marked the member as closed. Display end-user message. This connection has been closed. You may track this account manually. If reopened, you may connect the institution again.
    13 DELAYED Aggregating the member has taken longer than expected and it has not yet been connected. Display end-user message; poll for a status update. Importing your data from {...} may take a while. Please check back later.
    14 FAILED Aggregation failed without being connected. Display end-user message; try aggregating again later. There was a problem validating your credentials with {...}. Please try again later.
    15 UPDATED The member has been updated — i.e., credentials have been updated — but it has not yet been connected. Aggregate the member once the end user logs in; poll for a status update. Connecting to {...} ...
    16 DISABLED Aggregation has been momentarily paused, but the member is still connected. Display end-user message. Importing data from this institution has been disabled. Please contact us if you believe it has been disabled in error.
    17 IMPORTED MX does not have credentials and will not try to aggregate the member until the end user provides credentials. Display end-user message; re-aggregate after the end user updates credentials. You must re-authenticate before your data can be imported. Please enter your credentials for {...}.
    18 RESUMED The answer to an MFA challenge was received, but it is not yet clear whether it was correct. Poll for a status update. Connecting to {...} ...
    19 EXPIRED The MFA answer was not provided within the time allotted by the financial institution. Display end-user message; re-aggregate the member if the end user initiates it. The answer or answers were not provided in time. Please try again.
    20 IMPAIRED The member is missing some or all credentials needed in order to connect. Display end-user message; re-aggregate after the end user updates credentials. You must re-authenticate before your data can be imported. Please enter your credentials for {...}.
    21 PENDING The member is using OAuth to authenticate credentials and still needs to go through the financial institution's OAuth process. A PENDING status will appear only on members less than one hour old with is_oauth: true. Members that stay PENDING longer than one hour will be deleted by MX. Redirect the end user to the oauth_window_uri provided in the create member response, or request one through the generate OAuth window URI endpoint. None.

    Status definitions (soon to be deprecated)

    status Description Next steps
    INITIATED Aggregation has started.
    REQUESTED Request to get the data has started.
    CHALLENGED MFA challenged returned. Resume member with updated credentials.
    RECEIVED Received response back from the request.
    TRANSFERRED Start saving the data into the MX Platform.
    PROCESSED Data has been processed into the MX Platform.
    COMPLETED Aggregation is complete. List member accounts and transactions.
    PREVENTED Aggregation was prevented due to too many login attempts. List member credentials, update member.
    DENIED Authentication failed due to invalid credentials or incorrect MFA answer. List member credentials, update member. If MFA was answered incorrectly, restart aggregation.
    HALTED An exception occurred that was unrelated to authentication. Retry aggregation tomorrow. If the member hits the HALTED status for 3 or more days, leave the member in its current state and contact support by submitting a ticket here.

    4. Answer MFA, if necessary

    PUT /users/{user_guid}/members/{member_guid}/resume
    

    Example request

    $ curl -i -X PUT 'https://vestibule.mx.com/users/{user_guid}/members/{member_guid}/resume' \
      -H 'Accept: application/vnd.mx.atrium.v1+json' \
      -H 'Content-Type: application/json' \
      -H 'MX-API-Key: {mx_api_key}' \
      -H 'MX-Client-ID: {mx_client_id}' \
      -d '{
            "member":{
              "challenges":[
                {
                   "guid": "institution-credential-guid",
                   "value": "user-entered-value"
                },
                {
                  "guid": "institution-credential-guid",
                   "value": "user-entered-value"
                }
              ]
            }
          }'
    
    using System;
    using Atrium.Api;
    using Atrium.Model;
    
    namespace Example
    {
        public class ResumeMemberExample
        {
            public void main()
            {
                var client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
                var memberGuid = "MBR-123";  // string | The unique identifier for a `member`.
                var userGuid = "USR-123";  // string | The unique identifier for a `user`.
                var body = new MemberResumeRequestBody(); // MemberResumeRequestBody | Member object with MFA challenge answers
    
                try
                {
                    // Resume aggregation from MFA
                    MemberResponseBody response = client.members.ResumeMember(memberGuid, userGuid, body);
                    Console.WriteLine(response);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception when calling MembersApi.ResumeMember: " + e.Message );
                }
            }
        }
    }
    
    package main
    
    import (
      "context"
      "fmt"
      "github.com/mxenabled/atrium-go"
    )
    
    func main() {
      client := atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
      ctx := context.Background()
    
      memberGUID := "MBR-123" // string | The unique identifier for a `member`.
      userGUID := "USR-123" // string | The unique identifier for a `user`.
      body := atrium.MemberResumeRequestBody{} // MemberResumeRequestBody | Member object with MFA challenge answers
    
      response, _, err := client.Members.ResumeMember(ctx, memberGUID, userGUID, body)
      if err != nil {
        fmt.Printf("Error: %v\n", err)
      } else {
        fmt.Printf("Response: %s\n", response)
      }
    }
    
    import com.mx.atrium.*;
    import com.mx.model.*;
    
    public class MembersApiExample {
        public static void main(String[] args) {
            AtriumClient client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
            String memberGuid = "MBR-123"; // String | The unique identifier for a `member`.
            String userGuid = "USR-123"; // String | The unique identifier for a `user`.
            MemberResumeRequestBody body = new MemberResumeRequestBody(); // MemberResumeRequestBody | Member object with MFA challenge answers
    
            try {
                MemberResponseBody response = client.members.resumeMember(memberGuid, userGuid, body);
                System.out.println(response);
            } catch (ApiException e) {
                System.err.println("Exception when calling MembersApi#resumeMember");
                e.printStackTrace();
            }
        }
    }
    
    var atrium = require('./atrium.js');
    
    var client = new atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
    var memberGuid = "MBR-123"; // string | The unique identifier for a `member`.
    var userGuid = "USR-123"; // string | The unique identifier for a `user`.
    var body = new atrium.MemberResumeRequestBody(); // MemberResumeRequestBody | Member object with MFA challenge answers
    
    var response = client.members.resumeMember(memberGuid, userGuid, body);
    
    response.then(function(value) {
      console.log(value);
    });
    
    <?php
    require_once(__DIR__ . '/vendor/autoload.php');
    
    $client = new atrium\Api\AtriumClient(
        "YOUR_API_KEY",
        "YOUR_CLIENT_ID",
        new GuzzleHttp\Client()
    );
    
    $member_guid = "MBR-123"; // string | The unique identifier for a `member`.
    $user_guid = "USR-123"; // string | The unique identifier for a `user`.
    $body = new \atrium\model\MemberResumeRequestBody(); // \atrium\model\MemberResumeRequestBody | Member object with MFA challenge answers
    
    try {
        $result = $client->members->resumeMember($member_guid, $user_guid, $body);
        print_r($result);
    } catch (Exception $e) {
        echo 'Exception when calling MembersApi->resumeMember: ', $e->getMessage(), PHP_EOL;
    }
    ?>
    
    from __future__ import print_function
    import time
    import atrium
    from atrium.rest import ApiException
    from pprint import pprint
    
    # create an instance of the AtriumClient
    client = atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    member_guid = "MBR-123" # str | The unique identifier for a `member`.
    user_guid = "USR-123" # str | The unique identifier for a `user`.
    body = atrium.MemberResumeRequestBody() # MemberResumeRequestBody | Member object with MFA challenge answers
    
    try:
        # Resume aggregation from MFA
        response = client.members.resume_member(member_guid, user_guid, body)
        pprint(response)
    except ApiException as e:
        print("Exception when calling MembersApi->resume_member: %s\n" % e)
    
    # load the gem
    require 'atrium-ruby'
    
    client = Atrium::AtriumClient.new("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    member_guid = "MBR-123" # String | The unique identifier for a `member`.
    user_guid = "USR-123" # String | The unique identifier for a `user`.
    body = Atrium::MemberResumeRequestBody.new # MemberResumeRequestBody | Member object with MFA challenge answers
    
    begin
      #Resume aggregation from MFA
      response = client.members.resume_member(member_guid, user_guidbody)
      p response
    rescue Atrium::ApiError => e
      puts "Exception when calling MembersApi->resume_member: #{e}"
    end
    

    Example response

    Status: 202 Accepted
    
    {
      "member": {
        "aggregated_at": "2016-09-30T14:31:45-06:00",
        "connection_status": "CHALLENGED",
        "guid": "MBR-7c6f361b-e582-15b6-60c0-358f12466b4b",
        "identifier":"unique_id",
        "institution_code": "chase",
        "is_being_aggregated": true,
        "is_oauth": false,
        "metadata": "{\"credentials_last_refreshed_at\": \"2015-10-15\"}",
        "name": "Bank Name",
        "status": "CHALLENGED",
        "successfully_aggregated_at": null,
        "user_guid": "USR-fa7537f3-48aa-a683-a02a-b18940482f54"
      }
    }
    
    class MemberResponseBody {
      Member:
        class Member {
          AggregatedAt: 2016-10-13T18:07:57+00:00
          ConnectionStatus: CONNECTED
          Guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          Identifier: unique_id
          InstitutionCode: chase
          IsBeingAggregated: false
          IsOauth: false
          Metadata: {"credentials_last_refreshed_at": "2015-10-15"}
          Name: Chase Bank
          OauthWindowUri: oauth_window_uri_example
          Status: COMPLETED
          SuccessfullyAggregatedAt: 2016-10-13T17:57:38+00:00
          UserGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    {
      Member:
        {
          AggregatedAt: 2016-10-13T18:07:57+00:00
          ConnectionStatus: CONNECTED
          Guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          Identifier: unique_id
          InstitutionCode: chase
          IsBeingAggregated: false
          IsOauth: false
          Metadata: {"credentials_last_refreshed_at": "2015-10-15"}
          Name: Chase Bank
          OauthWindowUri: oauth_window_uri_example
          Status: COMPLETED
          SuccessfullyAggregatedAt: 2016-10-13T17:57:38+00:00
          UserGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    class MemberResponseBody {
      member:
        class Member {
          aggregatedAt: 2016-10-13T18:07:57+00:00
          connectionStatus: CONNECTED
          guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          identifier: unique_id
          institutionCode: chase
          isBeingAggregated: false
          isOauth: false
          metadata: {"credentials_last_refreshed_at": "2015-10-15"}
          name: Chase Bank
          oauthWindowUri: oauth_window_uri_example
          status: COMPLETED
          successfullyAggregatedAt: 2016-10-13T17:57:38+00:00
          userGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    MemberResponseBody {
      member:
        Member {
          aggregatedAt: 2016-10-13T18:07:57+00:00
          connectionStatus: CONNECTED
          guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          identifier: unique_id
          institutionCode: chase
          isBeingAggregated: false
          isOauth: false
          metadata: {"credentials_last_refreshed_at": "2015-10-15"}
          name: Chase Bank
          oauthWindowUri: oauth_window_uri_example
          status: COMPLETED
          successfullyAggregatedAt: 2016-10-13T17:57:38+00:00
          userGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    atrium/model/MemberResponseBody Object (
      [member] =>
        atrium/model/Member Object (
          [aggregated_at] => 2016-10-13T18:07:57+00:00
          [connection_status] => CONNECTED
          [guid] => MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          [identifier] => unique_id
          [institution_code] => chase
          [is_being_aggregated] => false
          [is_oauth] => false
          [metadata] => {"credentials_last_refreshed_at": "2015-10-15"}
          [name] => Chase Bank
          [oauth_window_uri] => oauth_window_uri_example
          [status] => COMPLETED
          [successfully_aggregated_at] => 2016-10-13T17:57:38+00:00
          [user_guid] => USR-fa7537f3-48aa-a683-a02a-b18940482f54
        )
    )
    
    {
      'member':
        {
          'aggregated_at': 2016-10-13T18:07:57+00:00
          'connection_status': CONNECTED
          'guid': MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          'identifier': unique_id
          'institution_code': chase
          'is_being_aggregated': false
          'is_oauth': false
          'metadata': {"credentials_last_refreshed_at": "2015-10-15"}
          'name': Chase Bank
          'oauth_window_uri': oauth_window_uri_example
          'status': COMPLETED
          'successfully_aggregated_at': 2016-10-13T17:57:38+00:00
          'user_guid': USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    #<MX::MemberResponseBody
      @member=
        #<MX::Member
          @aggregated_at= 2016-10-13T18:07:57+00:00
          @connection_status= CONNECTED
          @guid= MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          @identifier= unique_id
          @institution_code= chase
          @is_being_aggregated= false
          @is_oauth= false
          @metadata= {"credentials_last_refreshed_at": "2015-10-15"}
          @name= Chase Bank
          @oauth_window_uri= oauth_window_uri_example
          @status= COMPLETED
          @successfully_aggregated_at= 2016-10-13T17:57:38+00:00
          @user_guid= USR-fa7537f3-48aa-a683-a02a-b18940482f54
        >
    >
    

    This endpoint answers the challenges needed when a member has been challenged by multi-factor authentication.

    5. Read the account numbers

    Read account numbers by member

    Endpoint: GET /users/{user_guid}/members/{member_guid}/account_numbers

    Example request

    $ curl -i -X GET 'https://vestibule.mx.com/users/{user_guid}/members/{member_guid}/account_numbers' \
      -H 'Accept: application/vnd.mx.atrium.v1+json' \
      -H 'MX-API-Key: {mx_api_key}' \
      -H 'MX-Client-ID: {mx_client_id}'
    
    using System;
    using Atrium.Api;
    using Atrium.Model;
    
    namespace Example
    {
        public class ListAccountNumbersExample
        {
            public void main()
            {
                var client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
                var memberGuid = "MBR-123";  // string | The unique identifier for a `member`.
                var userGuid = "USR-123";  // string | The unique identifier for a `user`.
    
                try
                {
                    // Read account numbers
                    AccountNumbersResponseBody response = client.verification.ListAccountNumbers(memberGuid, userGuid);
                    Console.WriteLine(response);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception when calling VerificationApi.ListAccountNumbers: " + e.Message );
                }
            }
        }
    }
    
    package main
    
    import (
      "context"
      "fmt"
      "github.com/mxenabled/atrium-go"
    )
    
    func main() {
      client := atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
      ctx := context.Background()
    
      memberGUID := "MBR-123" // string | The unique identifier for a `member`.
      userGUID := "USR-123" // string | The unique identifier for a `user`.
    
      response, _, err := client.Verification.ListAccountNumbers(ctx, memberGUID, userGUID)
      if err != nil {
        fmt.Printf("Error: %v\n", err)
      } else {
        fmt.Printf("Response: %s\n", response)
      }
    }
    
    import com.mx.atrium.*;
    import com.mx.model.*;
    
    public class VerificationApiExample {
        public static void main(String[] args) {
            AtriumClient client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
            String memberGuid = "MBR-123"; // String | The unique identifier for a `member`.
            String userGuid = "USR-123"; // String | The unique identifier for a `user`.
    
            try {
                AccountNumbersResponseBody response = client.verification.listAccountNumbers(memberGuid, userGuid);
                System.out.println(response);
            } catch (ApiException e) {
                System.err.println("Exception when calling VerificationApi#listAccountNumbers");
                e.printStackTrace();
            }
        }
    }
    
    var atrium = require('./atrium.js');
    
    var client = new atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
    var memberGuid = "MBR-123"; // string | The unique identifier for a `member`.
    var userGuid = "USR-123"; // string | The unique identifier for a `user`.
    
    var response = client.verification.listAccountNumbers(memberGuid, userGuid);
    
    response.then(function(value) {
      console.log(value);
    });
    
    <?php
    require_once(__DIR__ . '/vendor/autoload.php');
    
    $client = new atrium\Api\AtriumClient(
        "YOUR_API_KEY",
        "YOUR_CLIENT_ID",
        new GuzzleHttp\Client()
    );
    
    $member_guid = "MBR-123"; // string | The unique identifier for a `member`.
    $user_guid = "USR-123"; // string | The unique identifier for a `user`.
    
    try {
        $result = $client->verification->listAccountNumbers($member_guid, $user_guid);
        print_r($result);
    } catch (Exception $e) {
        echo 'Exception when calling VerificationApi->listAccountNumbers: ', $e->getMessage(), PHP_EOL;
    }
    ?>
    
    from __future__ import print_function
    import time
    import atrium
    from atrium.rest import ApiException
    from pprint import pprint
    
    # create an instance of the AtriumClient
    client = atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    member_guid = "MBR-123" # str | The unique identifier for a `member`.
    user_guid = "USR-123" # str | The unique identifier for a `user`.
    
    try:
        # Read account numbers
        response = client.verification.list_account_numbers(member_guid, user_guid)
        pprint(response)
    except ApiException as e:
        print("Exception when calling VerificationApi->list_account_numbers: %s\n" % e)
    
    # load the gem
    require 'atrium-ruby'
    
    client = Atrium::AtriumClient.new("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    member_guid = "MBR-123" # String | The unique identifier for a `member`.
    user_guid = "USR-123" # String | The unique identifier for a `user`.
    
    begin
      #Read account numbers
      response = client.verification.list_account_numbers(member_guid, user_guid)
      p response
    rescue Atrium::ApiError => e
      puts "Exception when calling VerificationApi->list_account_numbers: #{e}"
    end
    

    Example response:

    Status: 200 OK
    
    {
      "account_numbers": [
        {
          "account_guid": "ACT-123",
          "account_number": "10001",
          "institution_number": null,
          "member_guid": "MBR-7c6f361b-e582-15b6-60c0-358f12466b4b",
          "routing_number": "68899990000000",
          "transit_number": null,
          "user_guid": "USR-fa7537f3-48aa-a683-a02a-b18940482f54"
        }
      ],
      "pagination": {
        "current_page": 1,
        "per_page": 25,
        "total_entries": 1,
        "total_pages": 1
      }
    }
    
    class AccountNumbersResponseBody {
      AccountNumbers: [
        class AccountNumber {
          AccountGuid: ACT-123
          AccountNumber: 10001
          MemberGuid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          RoutingNumber: 68899990000000
          UserGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    {
      AccountNumbers: [
        {
          AccountGuid: ACT-123
          AccountNumber: 10001
          MemberGuid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          RoutingNumber: 68899990000000
          UserGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    class AccountNumbersResponseBody {
      account_numbers: [
        class AccountNumber {
          accountGuid: ACT-123
          accountNumber: 10001
          memberGuid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          routingNumber: 68899990000000
          userGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    AccountNumbersResponseBody {
      account_numbers: [
        AccountNumber {
          accountGuid: ACT-123
          accountNumber: 10001
          memberGuid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          routingNumber: 68899990000000
          userGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    atrium/model/AccountNumbersResponseBody Object (
      [account_numbers] => Array (
        atrium/model/AccountNumber Object (
          [account_guid] => ACT-123
          [account_number] => 10001
          [member_guid] => MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          [routing_number] => 68899990000000
          [user_guid] => USR-fa7537f3-48aa-a683-a02a-b18940482f54
        )  
      )
    )
    
    {
      'account_numbers': [
        {
          'account_guid': ACT-123
          'account_number': 10001
          'member_guid': MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          'routing_number': 68899990000000
          'user_guid': USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    #<MX::AccountNumbersResponseBody
      @account_numbers= [
        #<MX::AccountNumber
          @account_guid= ACT-123
          @account_number= 10001
          @member_guid= MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          @routing_number= 68899990000000
          @user_guid= USR-fa7537f3-48aa-a683-a02a-b18940482f54
        >  
      ]
    >
    

    Use this endpoint to check whether account and routing numbers are available for accounts associated with a particular member. It returns the account_numbers object, which contains account and routing number data for each account associated with the member.

    Read account numbers by account

    Endpoint: GET /users/{user_guid}/accounts/{account_guid}/account_numbers

    Example request

    $ curl -i -X GET 'https://vestibule.mx.com/users/{user_guid}/accounts/{account_guid}/account_numbers' \
      -H 'Accept: application/vnd.mx.atrium.v1+json' \
      -H 'MX-API-Key: {mx_api_key}' \
      -H 'MX-Client-ID: {mx_client_id}'
    
    using System;
    using Atrium.Api;
    using Atrium.Model;
    
    namespace Example
    {
        public class ListAccountNumbersByAccountExample
        {
            public void main()
            {
                var client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
                var accountGuid = "ACT-123";  // string | The unique identifier for an `account`.
                var userGuid = "USR-123";  // string | The unique identifier for a `user`.
    
                try
                {
                    // Read account numbers by account GUID
                    AccountNumbersResponseBody response = client.verification.ListAccountNumbersByAccount(accountGuid, userGuid);
                    Console.WriteLine(response);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception when calling VerificationApi.ListAccountNumbersByAccount: " + e.Message );
                }
            }
        }
    }
    
    package main
    
    import (
      "context"
      "fmt"
      "github.com/mxenabled/atrium-go"
    )
    
    func main() {
      client := atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
      ctx := context.Background()
    
      accountGUID := "ACT-123" // string | The unique identifier for an `account`.
      userGUID := "USR-123" // string | The unique identifier for a `user`.
    
      response, _, err := client.Verification.ListAccountNumbersByAccount(ctx, accountGUID, userGUID)
      if err != nil {
        fmt.Printf("Error: %v\n", err)
      } else {
        fmt.Printf("Response: %s\n", response)
      }
    }
    
    import com.mx.atrium.*;
    import com.mx.model.*;
    
    public class VerificationApiExample {
        public static void main(String[] args) {
            AtriumClient client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
            String accountGuid = "ACT-123"; // String | The unique identifier for an `account`.
            String userGuid = "USR-123"; // String | The unique identifier for a `user`.
    
            try {
                AccountNumbersResponseBody response = client.verification.listAccountNumbersByAccount(accountGuid, userGuid);
                System.out.println(response);
            } catch (ApiException e) {
                System.err.println("Exception when calling VerificationApi#listAccountNumbersByAccount");
                e.printStackTrace();
            }
        }
    }
    
    var atrium = require('./atrium.js');
    
    var client = new atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
    var accountGuid = "ACT-123"; // string | The unique identifier for an `account`.
    var userGuid = "USR-123"; // string | The unique identifier for a `user`.
    
    var response = client.verification.listAccountNumbersByAccount(accountGuid, userGuid);
    
    response.then(function(value) {
      console.log(value);
    });
    
    <?php
    require_once(__DIR__ . '/vendor/autoload.php');
    
    $client = new atrium\Api\AtriumClient(
        "YOUR_API_KEY",
        "YOUR_CLIENT_ID",
        new GuzzleHttp\Client()
    );
    
    $account_guid = "ACT-123"; // string | The unique identifier for an `account`.
    $user_guid = "USR-123"; // string | The unique identifier for a `user`.
    
    try {
        $result = $client->verification->listAccountNumbersByAccount($account_guid, $user_guid);
        print_r($result);
    } catch (Exception $e) {
        echo 'Exception when calling VerificationApi->listAccountNumbersByAccount: ', $e->getMessage(), PHP_EOL;
    }
    ?>
    
    from __future__ import print_function
    import time
    import atrium
    from atrium.rest import ApiException
    from pprint import pprint
    
    # create an instance of the AtriumClient
    client = atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    account_guid = "ACT-123" # str | The unique identifier for an `account`.
    user_guid = "USR-123" # str | The unique identifier for a `user`.
    
    try:
        # Read account numbers by account GUID
        response = client.verification.list_account_numbers_by_account(account_guid, user_guid)
        pprint(response)
    except ApiException as e:
        print("Exception when calling VerificationApi->list_account_numbers_by_account: %s\n" % e)
    
    # load the gem
    require 'atrium-ruby'
    
    client = Atrium::AtriumClient.new("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    account_guid = "ACT-123" # String | The unique identifier for an `account`.
    user_guid = "USR-123" # String | The unique identifier for a `user`.
    
    begin
      #Read account numbers by account GUID
      response = client.verification.list_account_numbers_by_account(account_guid, user_guid)
      p response
    rescue Atrium::ApiError => e
      puts "Exception when calling VerificationApi->list_account_numbers_by_account: #{e}"
    end
    

    Example response:

    Status: 200 OK
    
    {
      "account_numbers": [
        {
          "account_guid": "ACT-123",
          "account_number": "10001",
          "institution_number": null,
          "member_guid": "MBR-7c6f361b-e582-15b6-60c0-358f12466b4b",
          "routing_number": "68899990000000",
          "transit_number": null,
          "user_guid": "USR-fa7537f3-48aa-a683-a02a-b18940482f54"
        }
      ],
      "pagination": {
        "current_page": 1,
        "per_page": 25,
        "total_entries": 1,
        "total_pages": 1
      }
    }
    
    class AccountNumbersResponseBody {
      AccountNumbers: [
        class AccountNumber {
          AccountGuid: ACT-123
          AccountNumber: 10001
          MemberGuid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          RoutingNumber: 68899990000000
          UserGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    {
      AccountNumbers: [
        {
          AccountGuid: ACT-123
          AccountNumber: 10001
          MemberGuid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          RoutingNumber: 68899990000000
          UserGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    class AccountNumbersResponseBody {
      account_numbers: [
        class AccountNumber {
          accountGuid: ACT-123
          accountNumber: 10001
          memberGuid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          routingNumber: 68899990000000
          userGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    AccountNumbersResponseBody {
      account_numbers: [
        AccountNumber {
          accountGuid: ACT-123
          accountNumber: 10001
          memberGuid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          routingNumber: 68899990000000
          userGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    atrium/model/AccountNumbersResponseBody Object (
      [account_numbers] => Array (
        atrium/model/AccountNumber Object (
          [account_guid] => ACT-123
          [account_number] => 10001
          [member_guid] => MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          [routing_number] => 68899990000000
          [user_guid] => USR-fa7537f3-48aa-a683-a02a-b18940482f54
        )  
      )
    )
    
    {
      'account_numbers': [
        {
          'account_guid': ACT-123
          'account_number': 10001
          'member_guid': MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          'routing_number': 68899990000000
          'user_guid': USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    #<MX::AccountNumbersResponseBody
      @account_numbers= [
        #<MX::AccountNumber
          @account_guid= ACT-123
          @account_number= 10001
          @member_guid= MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          @routing_number= 68899990000000
          @user_guid= USR-fa7537f3-48aa-a683-a02a-b18940482f54
        >  
      ]
    >
    

    Use this endpoint to check whether account and routing numbers are available for a specific account. It returns the account_numbers object, which contains account and routing number data.

    Using Atrium endpoints

    1. Create a user

    Endpoint: POST /users

    Example request

    $ curl -i -X POST 'https://vestibule.mx.com/users' \
      -H 'Accept: application/vnd.mx.atrium.v1+json' \
      -H 'Content-Type: application/json' \
      -H 'MX-API-Key: {mx_api_key}' \
      -H 'MX-Client-ID: {mx_client_id}' \
      -d '{
            "user": {
              "identifier": "unique_id",
              "metadata": "{\"first_name\": \"Steven\"}"
            }
          }'
    
    using System;
    using Atrium.Api;
    using Atrium.Model;
    
    namespace Example
    {
        public class CreateUserExample
        {
            public void main()
            {
                var client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
                var body = new UserCreateRequestBody(); // UserCreateRequestBody | User object to be created with optional parameters (identifier, is_disabled, metadata)
    
                try
                {
                    // Create user
                    UserResponseBody response = client.users.CreateUser(body);
                    Console.WriteLine(response);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception when calling UsersApi.CreateUser: " + e.Message );
                }
            }
        }
    }
    
    package main
    
    import (
      "context"
      "fmt"
      "github.com/mxenabled/atrium-go"
    )
    
    func main() {
      client := atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
      ctx := context.Background()
    
      body := atrium.UserCreateRequestBody{} // UserCreateRequestBody | User object to be created with optional parameters (identifier, is_disabled, metadata)
    
      response, _, err := client.Users.CreateUser(ctx, body)
      if err != nil {
        fmt.Printf("Error: %v\n", err)
      } else {
        fmt.Printf("Response: %s\n", response)
      }
    }
    
    import com.mx.atrium.*;
    import com.mx.model.*;
    
    public class UsersApiExample {
        public static void main(String[] args) {
            AtriumClient client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
            UserCreateRequestBody body = new UserCreateRequestBody(); // UserCreateRequestBody | User object to be created with optional parameters (identifier, is_disabled, metadata)
    
            try {
                UserResponseBody response = client.users.createUser(body);
                System.out.println(response);
            } catch (ApiException e) {
                System.err.println("Exception when calling UsersApi#createUser");
                e.printStackTrace();
            }
        }
    }
    
    var atrium = require('./atrium.js');
    
    var client = new atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
    var body = new atrium.UserCreateRequestBody(); // UserCreateRequestBody | User object to be created with optional parameters (identifier, is_disabled, metadata)
    
    var response = client.users.createUser(body);
    
    response.then(function(value) {
      console.log(value);
    });
    
    <?php
    require_once(__DIR__ . '/vendor/autoload.php');
    
    $client = new atrium\Api\AtriumClient(
        "YOUR_API_KEY",
        "YOUR_CLIENT_ID",
        new GuzzleHttp\Client()
    );
    
    $body = new \atrium\model\UserCreateRequestBody(); // \atrium\model\UserCreateRequestBody | User object to be created with optional parameters (identifier, is_disabled, metadata)
    
    try {
        $result = $client->users->createUser($body);
        print_r($result);
    } catch (Exception $e) {
        echo 'Exception when calling UsersApi->createUser: ', $e->getMessage(), PHP_EOL;
    }
    ?>
    
    from __future__ import print_function
    import time
    import atrium
    from atrium.rest import ApiException
    from pprint import pprint
    
    # create an instance of the AtriumClient
    client = atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    body = atrium.UserCreateRequestBody() # UserCreateRequestBody | User object to be created with optional parameters (identifier, is_disabled, metadata)
    
    try:
        # Create user
        response = client.users.create_user(body)
        pprint(response)
    except ApiException as e:
        print("Exception when calling UsersApi->create_user: %s\n" % e)
    
    # load the gem
    require 'atrium-ruby'
    
    client = Atrium::AtriumClient.new("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    body = Atrium::UserCreateRequestBody.new # UserCreateRequestBody | User object to be created with optional parameters (identifier, is_disabled, metadata)
    
    begin
      #Create user
      response = client.users.create_user(body)
      p response
    rescue Atrium::ApiError => e
      puts "Exception when calling UsersApi->create_user: #{e}"
    end
    

    Example response

    Status: 200 OK
    
    {
      "user": {
        "guid": "USR-fa7537f3-48aa-a683-a02a-b18940482f54",
        "identifier": "unique_id",
        "is_disabled": false,
        "metadata": "{\"first_name\": \"Steven\"}"
      }
    }
    
    class UserResponseBody {
      User:
        class User {
          Guid: USR-d74cb14f-fd0a-449f-991b-e0362a63d9c6
          Identifier: My-Unique-ID
          IsDisabled: false
          Metadata: {"first_name": "Steven", "last_name": "Universe"}
        }
    }
    
    {
      User:
        {
          Guid: USR-d74cb14f-fd0a-449f-991b-e0362a63d9c6
          Identifier: My-Unique-ID
          IsDisabled: false
          Metadata: {"first_name": "Steven", "last_name": "Universe"}
        }
    }
    
    class UserResponseBody {
      user:
        class User {
          guid: USR-d74cb14f-fd0a-449f-991b-e0362a63d9c6
          identifier: My-Unique-ID
          isDisabled: false
          metadata: {"first_name": "Steven", "last_name": "Universe"}
        }
    }
    
    UserResponseBody {
      user:
        User {
          guid: USR-d74cb14f-fd0a-449f-991b-e0362a63d9c6
          identifier: My-Unique-ID
          isDisabled: false
          metadata: {"first_name": "Steven", "last_name": "Universe"}
        }
    }
    
    atrium/model/UserResponseBody Object (
      [user] =>
        atrium/model/User Object (
          [guid] => USR-d74cb14f-fd0a-449f-991b-e0362a63d9c6
          [identifier] => My-Unique-ID
          [is_disabled] => false
          [metadata] => {"first_name": "Steven", "last_name": "Universe"}
        )
    )
    
    {
      'user':
        {
          'guid': USR-d74cb14f-fd0a-449f-991b-e0362a63d9c6
          'identifier': My-Unique-ID
          'is_disabled': false
          'metadata': {"first_name": "Steven", "last_name": "Universe"}
        }
    }
    
    #<MX::UserResponseBody
      @user=
        #<MX::User
          @guid= USR-d74cb14f-fd0a-449f-991b-e0362a63d9c6
          @identifier= My-Unique-ID
          @is_disabled= false
          @metadata= {"first_name": "Steven", "last_name": "Universe"}
        >
    >
    

    Call this endpoint to create a new user. Atrium will respond with the newly-created user object if successful.

    This endpoint accepts several parameters: identifier, metadata, and is_disabled. The identifier and metadata fields are discussed above.

    Disabling a user means that accounts and transactions associated with it will not be updated in the background by MX. It will also restrict access to that user's data until they are no longer disabled.

    Parameters

    Field Data Type Description Required?
    identifier String A unique, enforced identifier for the user, defined by you. No
    is_disabled Boolean True if you want the user disabled, false otherwise. No
    metadata String Additional information you can store about this user. MX recommends using JSON-structured data. No

    2. Create a member

    Creating a member is a multi-request process that includes searching for a specific institution, getting that institution's required credentials, and then creating the member using those required credentials.

    2.1. Get the institution code

    GET /institutions
    

    Example request

    $ curl -i -X GET 'https://vestibule.mx.com/institutions?name=chase' \
      -H 'Accept: application/vnd.mx.atrium.v1+json' \
      -H 'MX-API-Key: {mx_api_key}' \
      -H 'MX-Client-ID: {mx_client_id}'
    
    using System;
    using Atrium.Api;
    using Atrium.Model;
    
    namespace Example
    {
        public class ListInstitutionsExample
        {
            public void main()
            {
                var client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
                var name = name_example;  // string | This will list only institutions in which the appended string appears. (optional)
                var page = 1;  // int? | Specify current page. (optional)
                var recordsPerPage = 12;  // int? | Specify records per page. (optional)
                var supportsAccountIdentification = true;  // bool? | Filter only institutions which support account identification. (optional)
                var supportsAccountStatement = true;  // bool? | Filter only institutions which support account statements. (optional)
                var supportsAccountVerification = true;  // bool? | Filter only institutions which support account verification. (optional)
                var supportsTransactionHistory = true;  // bool? | Filter only institutions which support extended transaction history. (optional)
    
                try
                {
                    // List institutions
                    InstitutionsResponseBody response = client.institutions.ListInstitutions(name, page, recordsPerPage, supportsAccountIdentification, supportsAccountStatement, supportsAccountVerification, supportsTransactionHistory);
                    Console.WriteLine(response);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception when calling InstitutionsApi.ListInstitutions: " + e.Message );
                }
            }
        }
    }
    
    package main
    
    import (
      "context"
      "fmt"
      "github.com/mxenabled/atrium-go"
      "github.com/antihax/optional"
    )
    
    func main() {
      client := atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
      ctx := context.Background()
    
      opts := &atrium.ListInstitutionsOpts{
        Name: optional.NewString(name_example), // string | This will list only institutions in which the appended string appears.
        Page: optional.NewInt32(1), // int32 | Specify current page.
        RecordsPerPage: optional.NewInt32(12), // int32 | Specify records per page.
        SupportsAccountIdentification: optional.NewBool(true), // bool | Filter only institutions which support account identification.
        SupportsAccountStatement: optional.NewBool(true), // bool | Filter only institutions which support account statements.
        SupportsAccountVerification: optional.NewBool(true), // bool | Filter only institutions which support account verification.
        SupportsTransactionHistory: optional.NewBool(true), // bool | Filter only institutions which support extended transaction history.
      }
    
      response, _, err := client.Institutions.ListInstitutions(ctx, opts)
      if err != nil {
        fmt.Printf("Error: %v\n", err)
      } else {
        fmt.Printf("Response: %s\n", response)
      }
    }
    
    import com.mx.atrium.*;
    import com.mx.model.*;
    
    public class InstitutionsApiExample {
        public static void main(String[] args) {
            AtriumClient client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
            String name = name_example; // String | This will list only institutions in which the appended string appears.
            Integer page = 1; // Integer | Specify current page.
            Integer recordsPerPage = 12; // Integer | Specify records per page.
            Boolean supportsAccountIdentification = true; // Boolean | Filter only institutions which support account identification.
            Boolean supportsAccountStatement = true; // Boolean | Filter only institutions which support account statements.
            Boolean supportsAccountVerification = true; // Boolean | Filter only institutions which support account verification.
            Boolean supportsTransactionHistory = true; // Boolean | Filter only institutions which support extended transaction history.
    
            try {
                InstitutionsResponseBody response = client.institutions.listInstitutions(name, page, recordsPerPage, supportsAccountIdentification, supportsAccountStatement, supportsAccountVerification, supportsTransactionHistory);
                System.out.println(response);
            } catch (ApiException e) {
                System.err.println("Exception when calling InstitutionsApi#listInstitutions");
                e.printStackTrace();
            }
        }
    }
    
    var atrium = require('./atrium.js');
    
    var client = new atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
    var name = name_example; // string | This will list only institutions in which the appended string appears. (optional)
    var page = 1; // number | Specify current page. (optional)
    var recordsPerPage = 12; // number | Specify records per page. (optional)
    var supportsAccountIdentification = true; // boolean | Filter only institutions which support account identification. (optional)
    var supportsAccountStatement = true; // boolean | Filter only institutions which support account statements. (optional)
    var supportsAccountVerification = true; // boolean | Filter only institutions which support account verification. (optional)
    var supportsTransactionHistory = true; // boolean | Filter only institutions which support extended transaction history. (optional)
    
    var response = client.institutions.listInstitutions(name, page, recordsPerPage, supportsAccountIdentification, supportsAccountStatement, supportsAccountVerification, supportsTransactionHistory);
    
    response.then(function(value) {
      console.log(value);
    });
    
    <?php
    require_once(__DIR__ . '/vendor/autoload.php');
    
    $client = new atrium\Api\AtriumClient(
        "YOUR_API_KEY",
        "YOUR_CLIENT_ID",
        new GuzzleHttp\Client()
    );
    
    $name = name_example; // string | This will list only institutions in which the appended string appears.
    $page = 1; // int | Specify current page.
    $records_per_page = 12; // int | Specify records per page.
    $supports_account_identification = true; // bool | Filter only institutions which support account identification.
    $supports_account_statement = true; // bool | Filter only institutions which support account statements.
    $supports_account_verification = true; // bool | Filter only institutions which support account verification.
    $supports_transaction_history = true; // bool | Filter only institutions which support extended transaction history.
    
    try {
        $result = $client->institutions->listInstitutions($name, $page, $records_per_page, $supports_account_identification, $supports_account_statement, $supports_account_verification, $supports_transaction_history);
        print_r($result);
    } catch (Exception $e) {
        echo 'Exception when calling InstitutionsApi->listInstitutions: ', $e->getMessage(), PHP_EOL;
    }
    ?>
    
    from __future__ import print_function
    import time
    import atrium
    from atrium.rest import ApiException
    from pprint import pprint
    
    # create an instance of the AtriumClient
    client = atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    name = name_example # str | This will list only institutions in which the appended string appears. (optional)
    page = 1 # int | Specify current page. (optional)
    records_per_page = 12 # int | Specify records per page. (optional)
    supports_account_identification = true # bool | Filter only institutions which support account identification. (optional)
    supports_account_statement = true # bool | Filter only institutions which support account statements. (optional)
    supports_account_verification = true # bool | Filter only institutions which support account verification. (optional)
    supports_transaction_history = true # bool | Filter only institutions which support extended transaction history. (optional)
    
    try:
        # List institutions
        response = client.institutions.list_institutions(name=name, page=page, records_per_page=records_per_page, supports_account_identification=supports_account_identification, supports_account_statement=supports_account_statement, supports_account_verification=supports_account_verification, supports_transaction_history=supports_transaction_history)
        pprint(response)
    except ApiException as e:
        print("Exception when calling InstitutionsApi->list_institutions: %s\n" % e)
    
    # load the gem
    require 'atrium-ruby'
    
    client = Atrium::AtriumClient.new("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    opts = {
      name: name_example, # String | This will list only institutions in which the appended string appears.
      page: 1, # Integer | Specify current page.
      records_per_page: 12, # Integer | Specify records per page.
      supports_account_identification: true, # BOOLEAN | Filter only institutions which support account identification.
      supports_account_statement: true, # BOOLEAN | Filter only institutions which support account statements.
      supports_account_verification: true, # BOOLEAN | Filter only institutions which support account verification.
      supports_transaction_history: true # BOOLEAN | Filter only institutions which support extended transaction history.
    }
    
    begin
      #List institutions
      response = client.institutions.list_institutions(opts)
      p response
    rescue Atrium::ApiError => e
      puts "Exception when calling InstitutionsApi->list_institutions: #{e}"
    end
    

    Example response

    {
      "institutions": [
        {
          "code": "chase",
          "medium_logo_url": "https://content.moneydesktop.com/storage/MD_Assets/Ipad%20Logos/100x100/default_100x100.png",
          "name": "Chase Bank",
          "small_logo_url": "https://content.moneydesktop.com/storage/MD_Assets/Ipad%20Logos/50x50/default_50x50.png",
          "supports_account_identification": true,
          "supports_account_statement": true,
          "supports_account_verification": true,
          "supports_transaction_history": true,
          "url": "https://www.chase.com"
        }
      ],
      "pagination": {
        "current_page": 1,
        "per_page": 25,
        "total_entries": 1,
        "total_pages": 1
      }
    }
    
    class InstitutionsResponseBody {
      Institutions: [
        class Institution {
          Code: chase
          MediumLogoUrl: https://content.moneydesktop.com/storage/MD_Assets/Ipad%20Logos/100x100/default_100x100.png
          Name: Chase Bank
          SmallLogoUrl: https://content.moneydesktop.com/storage/MD_Assets/Ipad%20Logos/50x50/default_50x50.png
          SupportsAccountIdentification: true
          SupportsAccountStatement: true
          SupportsAccountVerification: true
          SupportsTransactionHistory: true
          Url: https://www.chase.com
        }
      ]
      Pagination:
        class Pagination {
          CurrentPage: 1
          PerPage: 25
          TotalEntries: 1
          TotalPages: 1
        }
    }
    
    {
      Institutions: [
        {
          Code: chase
          MediumLogoUrl: https://content.moneydesktop.com/storage/MD_Assets/Ipad%20Logos/100x100/default_100x100.png
          Name: Chase Bank
          SmallLogoUrl: https://content.moneydesktop.com/storage/MD_Assets/Ipad%20Logos/50x50/default_50x50.png
          SupportsAccountIdentification: true
          SupportsAccountStatement: true
          SupportsAccountVerification: true
          SupportsTransactionHistory: true
          Url: https://www.chase.com
        }
      ]
      Pagination:
        {
          CurrentPage: 1
          PerPage: 25
          TotalEntries: 1
          TotalPages: 1
        }
    }
    
    class InstitutionsResponseBody {
      institutions: [
        class Institution {
          code: chase
          mediumLogoUrl: https://content.moneydesktop.com/storage/MD_Assets/Ipad%20Logos/100x100/default_100x100.png
          name: Chase Bank
          smallLogoUrl: https://content.moneydesktop.com/storage/MD_Assets/Ipad%20Logos/50x50/default_50x50.png
          supportsAccountIdentification: true
          supportsAccountStatement: true
          supportsAccountVerification: true
          supportsTransactionHistory: true
          url: https://www.chase.com
        }
      ]
      pagination:
        class Pagination {
          currentPage: 1
          perPage: 25
          totalEntries: 1
          totalPages: 1
        }
    }
    
    InstitutionsResponseBody {
      institutions: [
        Institution {
          code: chase
          mediumLogoUrl: https://content.moneydesktop.com/storage/MD_Assets/Ipad%20Logos/100x100/default_100x100.png
          name: Chase Bank
          smallLogoUrl: https://content.moneydesktop.com/storage/MD_Assets/Ipad%20Logos/50x50/default_50x50.png
          supportsAccountIdentification: true
          supportsAccountStatement: true
          supportsAccountVerification: true
          supportsTransactionHistory: true
          url: https://www.chase.com
        }
      ]
      pagination:
        Pagination {
          currentPage: 1
          perPage: 25
          totalEntries: 1
          totalPages: 1
        }
    }
    
    atrium/model/InstitutionsResponseBody Object (
      [institutions] => Array (
        atrium/model/Institution Object (
          [code] => chase
          [medium_logo_url] => https://content.moneydesktop.com/storage/MD_Assets/Ipad%20Logos/100x100/default_100x100.png
          [name] => Chase Bank
          [small_logo_url] => https://content.moneydesktop.com/storage/MD_Assets/Ipad%20Logos/50x50/default_50x50.png
          [supports_account_identification] => true
          [supports_account_statement] => true
          [supports_account_verification] => true
          [supports_transaction_history] => true
          [url] => https://www.chase.com
        )
      )
      [pagination] =>
        atrium/model/Pagination Object (
          [current_page] => 1
          [per_page] => 25
          [total_entries] => 1
          [total_pages] => 1
        )
    )
    
    {
      'institutions': [
        {
          'code': chase
          'medium_logo_url': https://content.moneydesktop.com/storage/MD_Assets/Ipad%20Logos/100x100/default_100x100.png
          'name': Chase Bank
          'small_logo_url': https://content.moneydesktop.com/storage/MD_Assets/Ipad%20Logos/50x50/default_50x50.png
          'supports_account_identification': true
          'supports_account_statement': true
          'supports_account_verification': true
          'supports_transaction_history': true
          'url': https://www.chase.com
        }
      ]
      'pagination':
        {
          'current_page': 1
          'per_page': 25
          'total_entries': 1
          'total_pages': 1
        }
    }
    
    #<MX::InstitutionsResponseBody
      @institutions= [
        #<MX::Institution
          @code= chase
          @medium_logo_url= https://content.moneydesktop.com/storage/MD_Assets/Ipad%20Logos/100x100/default_100x100.png
          @name= Chase Bank
          @small_logo_url= https://content.moneydesktop.com/storage/MD_Assets/Ipad%20Logos/50x50/default_50x50.png
          @supports_account_identification= true
          @supports_account_statement= true
          @supports_account_verification= true
          @supports_transaction_history= true
          @url= https://www.chase.com
        >
      ]
      @pagination=
        #<MX::Pagination
          @current_page= 1
          @per_page= 25
          @total_entries= 1
          @total_pages= 1
        >
    >
    

    This endpoint allows you to see what institutions are available for connection. Information returned will include the institution_code assigned to a particular institution, URLs for the financial institution's logo, and the URL for its website.

    This endpoint takes certain optional query string parameters to facilitate searching for specific institutions.

    Parameter Results
    name={string} Only institutions whose name contains the appended string will be returned.
    supports_account_identification=true Only institutions which support identity will be returned.
    supports_account_statement=true Only institutions which offer access to account statements will be returned.
    supports_account_verification=true Only institutions which support account verification will be returned.
    supports_transaction_history=true Only institutions which offer an extended transaction history will be returned.

    2.2. Get the institution's required credentials

    GET /institutions/{institution_code}/credentials
    

    Example request

    $ curl -i -X GET 'https://vestibule.mx.com/institutions/chase/credentials' \
      -H 'Accept: application/vnd.mx.atrium.v1+json' \
      -H 'MX-API-Key: {mx_api_key}' \
      -H 'MX-Client-ID: {mx_client_id}'
    
    using System;
    using Atrium.Api;
    using Atrium.Model;
    
    namespace Example
    {
        public class ReadInstitutionCredentialsExample
        {
            public void main()
            {
                var client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
                var institutionCode = "example_institution_code";  // string | The institution_code of the institution.
    
                try
                {
                    // Read institution credentials
                    CredentialsResponseBody response = client.institutions.ReadInstitutionCredentials(institutionCode);
                    Console.WriteLine(response);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception when calling InstitutionsApi.ReadInstitutionCredentials: " + e.Message );
                }
            }
        }
    }
    
    package main
    
    import (
      "context"
      "fmt"
      "github.com/mxenabled/atrium-go"
    )
    
    func main() {
      client := atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
      ctx := context.Background()
    
      institutionCode := "example_institution_code" // string | The institution_code of the institution.
    
      response, _, err := client.Institutions.ReadInstitutionCredentials(ctx, institutionCode)
      if err != nil {
        fmt.Printf("Error: %v\n", err)
      } else {
        fmt.Printf("Response: %s\n", response)
      }
    }
    
    import com.mx.atrium.*;
    import com.mx.model.*;
    
    public class InstitutionsApiExample {
        public static void main(String[] args) {
            AtriumClient client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
            String institutionCode = "example_institution_code"; // String | The institution_code of the institution.
    
            try {
                CredentialsResponseBody response = client.institutions.readInstitutionCredentials(institutionCode);
                System.out.println(response);
            } catch (ApiException e) {
                System.err.println("Exception when calling InstitutionsApi#readInstitutionCredentials");
                e.printStackTrace();
            }
        }
    }
    
    var atrium = require('./atrium.js');
    
    var client = new atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
    var institutionCode = "example_institution_code"; // string | The institution_code of the institution.
    
    var response = client.institutions.readInstitutionCredentials(institutionCode);
    
    response.then(function(value) {
      console.log(value);
    });
    
    <?php
    require_once(__DIR__ . '/vendor/autoload.php');
    
    $client = new atrium\Api\AtriumClient(
        "YOUR_API_KEY",
        "YOUR_CLIENT_ID",
        new GuzzleHttp\Client()
    );
    
    $institution_code = "example_institution_code"; // string | The institution_code of the institution.
    
    try {
        $result = $client->institutions->readInstitutionCredentials($institution_code);
        print_r($result);
    } catch (Exception $e) {
        echo 'Exception when calling InstitutionsApi->readInstitutionCredentials: ', $e->getMessage(), PHP_EOL;
    }
    ?>
    
    from __future__ import print_function
    import time
    import atrium
    from atrium.rest import ApiException
    from pprint import pprint
    
    # create an instance of the AtriumClient
    client = atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    institution_code = "example_institution_code" # str | The institution_code of the institution.
    
    try:
        # Read institution credentials
        response = client.institutions.read_institution_credentials(institution_code)
        pprint(response)
    except ApiException as e:
        print("Exception when calling InstitutionsApi->read_institution_credentials: %s\n" % e)
    
    # load the gem
    require 'atrium-ruby'
    
    client = Atrium::AtriumClient.new("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    institution_code = "example_institution_code" # String | The institution_code of the institution.
    
    begin
      #Read institution credentials
      response = client.institutions.read_institution_credentials(institution_code)
      p response
    rescue Atrium::ApiError => e
      puts "Exception when calling InstitutionsApi->read_institution_credentials: #{e}"
    end
    

    Example response

    Status: 200 OK
    
    {
        "credentials": [
            {
                "field_name": "login_email",
                "guid": "CRD-12ce94ad-032b-5441-8cb3-d7ebe3a35676",
                "label": "Email Address",
                "display_order": 0,
                "type": "LOGIN"
            },
            {
                "field_name": "login_password",
                "guid": "CRD-305767e4-f464-765b-8f83-881b5bd307ec",
                "label": "PayPal password",
                "display_order": 1,
                "type": "PASSWORD"
            }
        ]
    }
    
    class CredentialsResponseBody {
      Credentials: [
        class CredentialResponse {
          FieldName: LOGIN
          Guid: CRD-1ec152cd-e628-e81a-e852-d1e7104624da
          Label: Username
          Options: [
            class CredentialOption {
              Label: option_label
              Value: option_value
            }      
          ]
          Type: LOGIN
        }  
      ]
    }
    
    {
      Credentials: [
        {
          FieldName: LOGIN
          Guid: CRD-1ec152cd-e628-e81a-e852-d1e7104624da
          Label: Username
          Options: [
            {
              Label: option_label
              Value: option_value
            }      
          ]
          Type: LOGIN
        }  
      ]
    }
    
    class CredentialsResponseBody {
      credentials: [
        class CredentialResponse {
          fieldName: LOGIN
          guid: CRD-1ec152cd-e628-e81a-e852-d1e7104624da
          label: Username
          options: [
            class CredentialOption {
              label: option_label
              value: option_value
            }      
          ]
          type: LOGIN
        }  
      ]
    }
    
    CredentialsResponseBody {
      credentials: [
        CredentialResponse {
          fieldName: LOGIN
          guid: CRD-1ec152cd-e628-e81a-e852-d1e7104624da
          label: Username
          options: [
            CredentialOption {
              label: option_label
              value: option_value
            }      
          ]
          type: LOGIN
        }  
      ]
    }
    
    atrium/model/CredentialsResponseBody Object (
      [credentials] => Array (
        atrium/model/CredentialResponse Object (
          [field_name] => LOGIN
          [guid] => CRD-1ec152cd-e628-e81a-e852-d1e7104624da
          [label] => Username
          [options] => Array (
            atrium/model/CredentialOption Object (
              [label] => option_label
              [value] => option_value
            )      
          )
          [type] => LOGIN
        )  
      )
    )
    
    {
      'credentials': [
        {
          'field_name': LOGIN
          'guid': CRD-1ec152cd-e628-e81a-e852-d1e7104624da
          'label': Username
          'options': [
            {
              'label': option_label
              'value': option_value
            }      
          ]
          'type': LOGIN
        }  
      ]
    }
    
    #<MX::CredentialsResponseBody
      @credentials= [
        #<MX::CredentialResponse
          @field_name= LOGIN
          @guid= CRD-1ec152cd-e628-e81a-e852-d1e7104624da
          @label= Username
          @options= [
            #<MX::CredentialOption
              @label= option_label
              @value= option_value
            >      
          ]
          @type= LOGIN
        >  
      ]
    >
    

    Use this endpoint to see which credentials will be needed to create a member for a specific institution.

    Field Data type Description
    display_order Integer The order in which the credential should be displayed to the end user; lower numbers should be displayed first.
    field_name String Name of the credential field for the institution, e.g., "LOGIN"
    guid String A unique identifier for the credential. Defined by MX.
    label String A label for the credential, intended to be readable by the end user, e.g., "Username"
    type String A name for the type of field, e.g., "PASSWORD"
    options Array See explanation that immediately follows.

    For credentials with the type OPTIONS, the credentials object will contain a nested array called options. This array lists various choices available for credential prompts, and includes further attributes.

    Field Data type Description
    label String A label for the credential prompt.
    value String A response for the credential prompt.

    2.3. Create the member

    POST /users/{user_guid}/members
    

    Example request

    $ curl -i -X POST 'https://vestibule.mx.com/users/{user_guid}/members' \
      -H 'Accept: application/vnd.mx.atrium.v1+json' \
      -H 'Content-Type: application/json' \
      -H 'MX-API-Key: {mx_api_key}' \
      -H 'MX-Client-ID: {mx_client_id}' \
      -d '{
            "member": {
              "institution_code": "chase",
              "credentials": [
                {
                  "guid": "CRD-1ec152cd-e628-e81a-e852-d1e7104624da",
                  "value": "ExampleUsername"
                },
                {
                  "guid": "CRD-1ec152cd-e628-e81a-e852-d1e7104624da",
                  "value": "Pa$$vv@Rd"
                }
              ],
              "skip_aggregation": true
            }
          }'
    
    using System;
    using Atrium.Api;
    using Atrium.Model;
    
    namespace Example
    {
        public class CreateMemberExample
        {
            public void main()
            {
                var client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
                var userGuid = "USR-123";  // string | The unique identifier for a `user`.
                var body = new MemberCreateRequestBody(); // MemberCreateRequestBody | Member object to be created with optional parameters (identifier and metadata) and required parameters (credentials and institution_code)
    
                try
                {
                    // Create member
                    MemberResponseBody response = client.members.CreateMember(userGuid, body);
                    Console.WriteLine(response);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception when calling MembersApi.CreateMember: " + e.Message );
                }
            }
        }
    }
    
    package main
    
    import (
      "context"
      "fmt"
      "github.com/mxenabled/atrium-go"
    )
    
    func main() {
      client := atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
      ctx := context.Background()
    
      userGUID := "USR-123" // string | The unique identifier for a `user`.
      body := atrium.MemberCreateRequestBody{} // MemberCreateRequestBody | Member object to be created with optional parameters (identifier and metadata) and required parameters (credentials and institution_code)
    
      response, _, err := client.Members.CreateMember(ctx, userGUID, body)
      if err != nil {
        fmt.Printf("Error: %v\n", err)
      } else {
        fmt.Printf("Response: %s\n", response)
      }
    }
    
    import com.mx.atrium.*;
    import com.mx.model.*;
    
    public class MembersApiExample {
        public static void main(String[] args) {
            AtriumClient client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
            String userGuid = "USR-123"; // String | The unique identifier for a `user`.
            MemberCreateRequestBody body = new MemberCreateRequestBody(); // MemberCreateRequestBody | Member object to be created with optional parameters (identifier and metadata) and required parameters (credentials and institution_code)
    
            try {
                MemberResponseBody response = client.members.createMember(userGuid, body);
                System.out.println(response);
            } catch (ApiException e) {
                System.err.println("Exception when calling MembersApi#createMember");
                e.printStackTrace();
            }
        }
    }
    
    var atrium = require('./atrium.js');
    
    var client = new atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
    var userGuid = "USR-123"; // string | The unique identifier for a `user`.
    var body = new atrium.MemberCreateRequestBody(); // MemberCreateRequestBody | Member object to be created with optional parameters (identifier and metadata) and required parameters (credentials and institution_code)
    
    var response = client.members.createMember(userGuid, body);
    
    response.then(function(value) {
      console.log(value);
    });
    
    <?php
    require_once(__DIR__ . '/vendor/autoload.php');
    
    $client = new atrium\Api\AtriumClient(
        "YOUR_API_KEY",
        "YOUR_CLIENT_ID",
        new GuzzleHttp\Client()
    );
    
    $user_guid = "USR-123"; // string | The unique identifier for a `user`.
    $body = new \atrium\model\MemberCreateRequestBody(); // \atrium\model\MemberCreateRequestBody | Member object to be created with optional parameters (identifier and metadata) and required parameters (credentials and institution_code)
    
    try {
        $result = $client->members->createMember($user_guid, $body);
        print_r($result);
    } catch (Exception $e) {
        echo 'Exception when calling MembersApi->createMember: ', $e->getMessage(), PHP_EOL;
    }
    ?>
    
    from __future__ import print_function
    import time
    import atrium
    from atrium.rest import ApiException
    from pprint import pprint
    
    # create an instance of the AtriumClient
    client = atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    user_guid = "USR-123" # str | The unique identifier for a `user`.
    body = atrium.MemberCreateRequestBody() # MemberCreateRequestBody | Member object to be created with optional parameters (identifier and metadata) and required parameters (credentials and institution_code)
    
    try:
        # Create member
        response = client.members.create_member(user_guid, body)
        pprint(response)
    except ApiException as e:
        print("Exception when calling MembersApi->create_member: %s\n" % e)
    
    # load the gem
    require 'atrium-ruby'
    
    client = Atrium::AtriumClient.new("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    user_guid = "USR-123" # String | The unique identifier for a `user`.
    body = Atrium::MemberCreateRequestBody.new # MemberCreateRequestBody | Member object to be created with optional parameters (identifier and metadata) and required parameters (credentials and institution_code)
    
    begin
      #Create member
      response = client.members.create_member(user_guidbody)
      p response
    rescue Atrium::ApiError => e
      puts "Exception when calling MembersApi->create_member: #{e}"
    end
    

    Example response

    Status: 202 Accepted
    
    {
      "member": {
        "aggregated_at": "2016-10-13T17:57:36+00:00",
        "connection_status": "CONNECTED",
        "guid": "MBR-7c6f361b-e582-15b6-60c0-358f12466b4b",
        "identifier": "unique_id",
        "institution_code": "chase",
        "is_being_aggregated": true,
        "is_oauth": false,
        "metadata": "{\"credentials_last_refreshed_at\": \"2015-10-15\"}",
        "name": "Chase Bank",
        "status": "INITIATED",
        "successfully_aggregated_at": null,
        "user_guid": "USR-fa7537f3-48aa-a683-a02a-b18940482f54"
      }
    }
    
    class MemberResponseBody {
      Member:
        class Member {
          AggregatedAt: 2016-10-13T18:07:57+00:00
          ConnectionStatus: CONNECTED
          Guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          Identifier: unique_id
          InstitutionCode: chase
          IsBeingAggregated: false
          IsOauth: false
          Metadata: {"credentials_last_refreshed_at": "2015-10-15"}
          Name: Chase Bank
          OauthWindowUri: oauth_window_uri_example
          Status: COMPLETED
          SuccessfullyAggregatedAt: 2016-10-13T17:57:38+00:00
          UserGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    {
      Member:
        {
          AggregatedAt: 2016-10-13T18:07:57+00:00
          ConnectionStatus: CONNECTED
          Guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          Identifier: unique_id
          InstitutionCode: chase
          IsBeingAggregated: false
          IsOauth: false
          Metadata: {"credentials_last_refreshed_at": "2015-10-15"}
          Name: Chase Bank
          OauthWindowUri: oauth_window_uri_example
          Status: COMPLETED
          SuccessfullyAggregatedAt: 2016-10-13T17:57:38+00:00
          UserGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    class MemberResponseBody {
      member:
        class Member {
          aggregatedAt: 2016-10-13T18:07:57+00:00
          connectionStatus: CONNECTED
          guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          identifier: unique_id
          institutionCode: chase
          isBeingAggregated: false
          isOauth: false
          metadata: {"credentials_last_refreshed_at": "2015-10-15"}
          name: Chase Bank
          oauthWindowUri: oauth_window_uri_example
          status: COMPLETED
          successfullyAggregatedAt: 2016-10-13T17:57:38+00:00
          userGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    MemberResponseBody {
      member:
        Member {
          aggregatedAt: 2016-10-13T18:07:57+00:00
          connectionStatus: CONNECTED
          guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          identifier: unique_id
          institutionCode: chase
          isBeingAggregated: false
          isOauth: false
          metadata: {"credentials_last_refreshed_at": "2015-10-15"}
          name: Chase Bank
          oauthWindowUri: oauth_window_uri_example
          status: COMPLETED
          successfullyAggregatedAt: 2016-10-13T17:57:38+00:00
          userGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    atrium/model/MemberResponseBody Object (
      [member] =>
        atrium/model/Member Object (
          [aggregated_at] => 2016-10-13T18:07:57+00:00
          [connection_status] => CONNECTED
          [guid] => MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          [identifier] => unique_id
          [institution_code] => chase
          [is_being_aggregated] => false
          [is_oauth] => false
          [metadata] => {"credentials_last_refreshed_at": "2015-10-15"}
          [name] => Chase Bank
          [oauth_window_uri] => oauth_window_uri_example
          [status] => COMPLETED
          [successfully_aggregated_at] => 2016-10-13T17:57:38+00:00
          [user_guid] => USR-fa7537f3-48aa-a683-a02a-b18940482f54
        )
    )
    
    {
      'member':
        {
          'aggregated_at': 2016-10-13T18:07:57+00:00
          'connection_status': CONNECTED
          'guid': MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          'identifier': unique_id
          'institution_code': chase
          'is_being_aggregated': false
          'is_oauth': false
          'metadata': {"credentials_last_refreshed_at": "2015-10-15"}
          'name': Chase Bank
          'oauth_window_uri': oauth_window_uri_example
          'status': COMPLETED
          'successfully_aggregated_at': 2016-10-13T17:57:38+00:00
          'user_guid': USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    #<MX::MemberResponseBody
      @member=
        #<MX::Member
          @aggregated_at= 2016-10-13T18:07:57+00:00
          @connection_status= CONNECTED
          @guid= MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          @identifier= unique_id
          @institution_code= chase
          @is_being_aggregated= false
          @is_oauth= false
          @metadata= {"credentials_last_refreshed_at": "2015-10-15"}
          @name= Chase Bank
          @oauth_window_uri= oauth_window_uri_example
          @status= COMPLETED
          @successfully_aggregated_at= 2016-10-13T17:57:38+00:00
          @user_guid= USR-fa7537f3-48aa-a683-a02a-b18940482f54
        >
    >
    

    Example request for OAuth member

    $ curl -i -X POST 'https://vestibule.mx.com/users/USR-fa7537f3-48aa-a683-a02a-b18940482f54/members' \
      -H 'Accept: application/vnd.mx.atrium.v1+json' \
      -H 'Content-Type: application/json' \
      -H 'MX-API-Key: {mx_api_key}' \
      -H 'MX-Client-ID: {mx_client_id}' \
      -d '{
            "member":{
              "institution_code":"chase",
              "metadata": "Additional information",
              "is_oauth": true
            },
            "referral_source": "APP",
            "ui_message_webview_url_scheme": "yourapp"
          }'
    

    Example response

    {
      "member": {
        "aggregated_at": "2016-10-13T17:57:36+00:00",
        "connection_status": "PENDING",
        "guid": "MBR-7c6f361b-e582-15b6-60c0-358f12466b4b",
        "identifier": "unique_id",
        "institution_code": "chase",
        "is_being_aggregated": true,
        "is_oauth": true,
        "metadata": "Additional information",
        "name": "Chase Bank",
        "oauth_window_uri": "https://dev-firefly1.moneydesktop.com/oauth/predirect_to/MBR-7aa13bdb-2866-ba38-b326-d9fb32268f9b/lk76038j23cAstpxnt4g58vybqZqg9vnn0lz29bwmvc40tss5rhjxlyf53pns05vfd99y5m766fdj7njpf615A5j3013xmdqA9mwz5nAgs9gr2887h0krh1l4gbAxfp8ztnpd47wk6j2ztjbz1f0lyr73nbxft0pwjwkqdjnfpA8ktn9tbvAbxqn40645vs4kxxcAx2rjc0vyxhtfhsk5vpq3Anrmdjtfj8qlpc617bkntbAwlpylfqf4AshyvA6lpmn5ptrzqhd933k98rzymzmjgqy9m25np0fqm7zw6Akr8qyy5ckb6wxxA31vfjw5xm7td8z6vh7d0djwsgw34Awvj58psh2l7xk9414?referral_source=APP&ui_message_webview_url_scheme=yourapp",
        "status": null,
        "successfully_aggregated_at": null,
        "user_guid": "USR-fa7537f3-48aa-a683-a02a-b18940482f54"
      }
    }
    

    This endpoint allows you to create a new member. Standard members are created with the required parameters credentials and institution_code.

    When creating a standard member, you'll need to include the correct type of credential required by the financial institution, with values provided by the end user. You can find out which credential type is required with the read institution credentials endpoint.

    Once you successfully create a standard member, MX will immediately validate the provided credentials and attempt to aggregate data for accounts and transactions. You can prevent this automatic aggregation by setting the skip_aggregation parameter to true.

    OAuth members can only be created with institutions that support it. OAuth members require no credentials, but do require you to set the is_oauth parameter to true.

    OAuth members will be created with a connection status of PENDING; a one-time use redirect URI will be provided in the oauth_window_uri field of the response. Making a separate request to the oauth_window_uri will then take the end user to the registered OAuth application where they can provide credentials and choose what data to share with MX.

    After completing the OAuth process, aggregation automatically will begin and the connection status will be updated, unless the skip_aggregation parameter was set to true.

    Parameter Data type Description Required?
    identifier String A unique enforced identifier for the member, defined by you. No
    institution_code String Unique code for the institution to which the member will connect. Yes
    metadata String Additional information you can store on this member. No
    skip_aggregation Boolean Setting this parameter to true will prevent the member from automatically aggregating when it is created. No
    is_oauth Boolean The member does not require credentials when being created; instead, the member is created with a PENDING status and the response to the request will contain the oauth_window_uri attribute; the end user authenticates credentials with OAuth. No
    referral_source String Should be either BROWSER or APP depending on the implementation. Default is BROWSER. This field should not be nested under the member when given in a request body; it can also be sent as a query parameter to the the generate OAuth window URI endpoint. No
    ui_message_webview_url_scheme String A scheme for routing the user back to the application state they were previously in. This field should not be nested under the member when given in a request body; it can also be sent as a query parameter to the the generate OAuth window URI endpoint. No

    3. Verify the member

    Endpoint: POST /users/{user_guid}/members/{member_guid}/verify

    Example request:

    curl -i -X POST 'https://vestibule.mx.com/users/{user_guid}/members/{member_guid}/verify' \
      -H 'Accept: application/vnd.mx.atrium.v1+json' \
      -H 'Content-Type: application/json' \
      -H 'MX-API-Key: {mx_api_key}' \
      -H 'MX-Client-ID: {mx_client_id}'
    
    using System;
    using Atrium.Api;
    using Atrium.Model;
    
    namespace Example
    {
        public class VerifyMemberExample
        {
            public void main()
            {
                var client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
                var memberGuid = "MBR-123";  // string | The unique identifier for a `member`.
                var userGuid = "USR-123";  // string | The unique identifier for a `user`.
    
                try
                {
                    // Verify
                    MemberResponseBody response = client.verification.VerifyMember(memberGuid, userGuid);
                    Console.WriteLine(response);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception when calling VerificationApi.VerifyMember: " + e.Message );
                }
            }
        }
    }
    
    package main
    
    import (
      "context"
      "fmt"
      "github.com/mxenabled/atrium-go"
    )
    
    func main() {
      client := atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
      ctx := context.Background()
    
      memberGUID := "MBR-123" // string | The unique identifier for a `member`.
      userGUID := "USR-123" // string | The unique identifier for a `user`.
    
      response, _, err := client.Verification.VerifyMember(ctx, memberGUID, userGUID)
      if err != nil {
        fmt.Printf("Error: %v\n", err)
      } else {
        fmt.Printf("Response: %s\n", response)
      }
    }
    
    import com.mx.atrium.*;
    import com.mx.model.*;
    
    public class VerificationApiExample {
        public static void main(String[] args) {
            AtriumClient client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
            String memberGuid = "MBR-123"; // String | The unique identifier for a `member`.
            String userGuid = "USR-123"; // String | The unique identifier for a `user`.
    
            try {
                MemberResponseBody response = client.verification.verifyMember(memberGuid, userGuid);
                System.out.println(response);
            } catch (ApiException e) {
                System.err.println("Exception when calling VerificationApi#verifyMember");
                e.printStackTrace();
            }
        }
    }
    
    var atrium = require('./atrium.js');
    
    var client = new atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
    var memberGuid = "MBR-123"; // string | The unique identifier for a `member`.
    var userGuid = "USR-123"; // string | The unique identifier for a `user`.
    
    var response = client.verification.verifyMember(memberGuid, userGuid);
    
    response.then(function(value) {
      console.log(value);
    });
    
    <?php
    require_once(__DIR__ . '/vendor/autoload.php');
    
    $client = new atrium\Api\AtriumClient(
        "YOUR_API_KEY",
        "YOUR_CLIENT_ID",
        new GuzzleHttp\Client()
    );
    
    $member_guid = "MBR-123"; // string | The unique identifier for a `member`.
    $user_guid = "USR-123"; // string | The unique identifier for a `user`.
    
    try {
        $result = $client->verification->verifyMember($member_guid, $user_guid);
        print_r($result);
    } catch (Exception $e) {
        echo 'Exception when calling VerificationApi->verifyMember: ', $e->getMessage(), PHP_EOL;
    }
    ?>
    
    from __future__ import print_function
    import time
    import atrium
    from atrium.rest import ApiException
    from pprint import pprint
    
    # create an instance of the AtriumClient
    client = atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    member_guid = "MBR-123" # str | The unique identifier for a `member`.
    user_guid = "USR-123" # str | The unique identifier for a `user`.
    
    try:
        # Verify
        response = client.verification.verify_member(member_guid, user_guid)
        pprint(response)
    except ApiException as e:
        print("Exception when calling VerificationApi->verify_member: %s\n" % e)
    
    # load the gem
    require 'atrium-ruby'
    
    client = Atrium::AtriumClient.new("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    member_guid = "MBR-123" # String | The unique identifier for a `member`.
    user_guid = "USR-123" # String | The unique identifier for a `user`.
    
    begin
      #Verify
      response = client.verification.verify_member(member_guid, user_guid)
      p response
    rescue Atrium::ApiError => e
      puts "Exception when calling VerificationApi->verify_member: #{e}"
    end
    

    Example response:

    Status: 200 OK
    
    {
        "member": {
            "aggregated_at": "2018-06-25T20:04:19Z",
            "connection_status": "CONNECTED",
            "identifier": "chase_ds",
            "status": "INITIATED",
            "successfully_aggregated_at": "2018-06-25T19:45:01Z",
            "guid": "MBR-7c6f361b-e582-15b6-60c0-358f12466b4b",
            "institution_code": "6930ee63-16b3-fc5e-ab48-18bbc39379d0",
            "is_being_aggregated": true,
            "metadata": null,
            "name": "chase ds",
            "user_guid": "USR-fa7537f3-48aa-a683-a02a-b18940482f54"
        }
    }
    
    class MemberResponseBody {
      Member:
        class Member {
          AggregatedAt: 2016-10-13T18:07:57+00:00
          ConnectionStatus: CONNECTED
          Guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          Identifier: unique_id
          InstitutionCode: chase
          IsBeingAggregated: false
          Metadata: {"credentials_last_refreshed_at": "2015-10-15"}
          Name: Chase Bank
          Status: COMPLETED
          SuccessfullyAggregatedAt: 2016-10-13T17:57:38+00:00
          UserGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    {
      Member:
        {
          AggregatedAt: 2016-10-13T18:07:57+00:00
          ConnectionStatus: CONNECTED
          Guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          Identifier: unique_id
          InstitutionCode: chase
          IsBeingAggregated: false
          Metadata: {"credentials_last_refreshed_at": "2015-10-15"}
          Name: Chase Bank
          Status: COMPLETED
          SuccessfullyAggregatedAt: 2016-10-13T17:57:38+00:00
          UserGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    class MemberResponseBody {
      member:
        class Member {
          aggregatedAt: 2016-10-13T18:07:57+00:00
          connectionStatus: CONNECTED
          guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          identifier: unique_id
          institutionCode: chase
          isBeingAggregated: false
          metadata: {"credentials_last_refreshed_at": "2015-10-15"}
          name: Chase Bank
          status: COMPLETED
          successfullyAggregatedAt: 2016-10-13T17:57:38+00:00
          userGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    MemberResponseBody {
      member:
        Member {
          aggregatedAt: 2016-10-13T18:07:57+00:00
          connectionStatus: CONNECTED
          guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          identifier: unique_id
          institutionCode: chase
          isBeingAggregated: false
          metadata: {"credentials_last_refreshed_at": "2015-10-15"}
          name: Chase Bank
          status: COMPLETED
          successfullyAggregatedAt: 2016-10-13T17:57:38+00:00
          userGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    atrium/model/MemberResponseBody Object (
      [member] =>
        atrium/model/Member Object (
          [aggregated_at] => 2016-10-13T18:07:57+00:00
          [connection_status] => CONNECTED
          [guid] => MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          [identifier] => unique_id
          [institution_code] => chase
          [is_being_aggregated] => false
          [metadata] => {"credentials_last_refreshed_at": "2015-10-15"}
          [name] => Chase Bank
          [status] => COMPLETED
          [successfully_aggregated_at] => 2016-10-13T17:57:38+00:00
          [user_guid] => USR-fa7537f3-48aa-a683-a02a-b18940482f54
        )
    )
    
    {
      'member':
        {
          'aggregated_at': 2016-10-13T18:07:57+00:00
          'connection_status': CONNECTED
          'guid': MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          'identifier': unique_id
          'institution_code': chase
          'is_being_aggregated': false
          'metadata': {"credentials_last_refreshed_at": "2015-10-15"}
          'name': Chase Bank
          'status': COMPLETED
          'successfully_aggregated_at': 2016-10-13T17:57:38+00:00
          'user_guid': USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    #<MX::MemberResponseBody
      @member=
        #<MX::Member
          @aggregated_at= 2016-10-13T18:07:57+00:00
          @connection_status= CONNECTED
          @guid= MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          @identifier= unique_id
          @institution_code= chase
          @is_being_aggregated= false
          @metadata= {"credentials_last_refreshed_at": "2015-10-15"}
          @name= Chase Bank
          @status= COMPLETED
          @successfully_aggregated_at= 2016-10-13T17:57:38+00:00
          @user_guid= USR-fa7537f3-48aa-a683-a02a-b18940482f54
        >
    >
    

    The verify endpoint begins a verification process for a member. It gathers information about account and routing numbers. Partners may optionally choose to include transaction data in this request, potentially avoiding a separate aggregate member request.

    The verification workflow is similar to standard aggregation: Start the verification, poll the connection status, answer MFA if necessary by using the list member MFA challenges endpoint and the resume from MFA endpoint, poll the status again, then read the member's account numbers.

    If a verification is already running, a 202 Accepted status will be returned. If another aggregation-type process is already running — like standard aggregation or extended transaction history — a 409 Conflict will be returned.

    For more information on this and other aggregation-type processes, please see our developer guide

    Parameters

    Field name Definition Required?
    include_transactions When set to true, the identification will gather transaction data along with account number data. Defaults to false. No

    4. Poll the member status endpoint

    GET /users/{user_guid}/members/{member_guid}/status
    

    Example request

    $ curl -i -X GET 'https://vestibule.mx.com/users/{user_guid}/members/{member_guid}/status' \
      -H 'Accept: application/vnd.mx.atrium.v1+json' \
      -H 'MX-API-Key: {mx_api_key}' \
      -H 'MX-Client-ID: {mx_client_id}'
    
    using System;
    using Atrium.Api;
    using Atrium.Model;
    
    namespace Example
    {
        public class ReadMemberStatusExample
        {
            public void main()
            {
                var client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
                var memberGuid = "MBR-123";  // string | The unique identifier for a `member`.
                var userGuid = "USR-123";  // string | The unique identifier for a `user`.
    
                try
                {
                    // Read member connection status
                    MemberConnectionStatusResponseBody response = client.members.ReadMemberStatus(memberGuid, userGuid);
                    Console.WriteLine(response);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception when calling MembersApi.ReadMemberStatus: " + e.Message );
                }
            }
        }
    }
    
    package main
    
    import (
      "context"
      "fmt"
      "github.com/mxenabled/atrium-go"
    )
    
    func main() {
      client := atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
      ctx := context.Background()
    
      memberGUID := "MBR-123" // string | The unique identifier for a `member`.
      userGUID := "USR-123" // string | The unique identifier for a `user`.
    
      response, _, err := client.Members.ReadMemberStatus(ctx, memberGUID, userGUID)
      if err != nil {
        fmt.Printf("Error: %v\n", err)
      } else {
        fmt.Printf("Response: %s\n", response)
      }
    }
    
    import com.mx.atrium.*;
    import com.mx.model.*;
    
    public class MembersApiExample {
        public static void main(String[] args) {
            AtriumClient client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
            String memberGuid = "MBR-123"; // String | The unique identifier for a `member`.
            String userGuid = "USR-123"; // String | The unique identifier for a `user`.
    
            try {
                MemberConnectionStatusResponseBody response = client.members.readMemberStatus(memberGuid, userGuid);
                System.out.println(response);
            } catch (ApiException e) {
                System.err.println("Exception when calling MembersApi#readMemberStatus");
                e.printStackTrace();
            }
        }
    }
    
    var atrium = require('./atrium.js');
    
    var client = new atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
    var memberGuid = "MBR-123"; // string | The unique identifier for a `member`.
    var userGuid = "USR-123"; // string | The unique identifier for a `user`.
    
    var response = client.members.readMemberStatus(memberGuid, userGuid);
    
    response.then(function(value) {
      console.log(value);
    });
    
    <?php
    require_once(__DIR__ . '/vendor/autoload.php');
    
    $client = new atrium\Api\AtriumClient(
        "YOUR_API_KEY",
        "YOUR_CLIENT_ID",
        new GuzzleHttp\Client()
    );
    
    $member_guid = "MBR-123"; // string | The unique identifier for a `member`.
    $user_guid = "USR-123"; // string | The unique identifier for a `user`.
    
    try {
        $result = $client->members->readMemberStatus($member_guid, $user_guid);
        print_r($result);
    } catch (Exception $e) {
        echo 'Exception when calling MembersApi->readMemberStatus: ', $e->getMessage(), PHP_EOL;
    }
    ?>
    
    from __future__ import print_function
    import time
    import atrium
    from atrium.rest import ApiException
    from pprint import pprint
    
    # create an instance of the AtriumClient
    client = atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    member_guid = "MBR-123" # str | The unique identifier for a `member`.
    user_guid = "USR-123" # str | The unique identifier for a `user`.
    
    try:
        # Read member connection status
        response = client.members.read_member_status(member_guid, user_guid)
        pprint(response)
    except ApiException as e:
        print("Exception when calling MembersApi->read_member_status: %s\n" % e)
    
    # load the gem
    require 'atrium-ruby'
    
    client = Atrium::AtriumClient.new("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    member_guid = "MBR-123" # String | The unique identifier for a `member`.
    user_guid = "USR-123" # String | The unique identifier for a `user`.
    
    begin
      #Read member connection status
      response = client.members.read_member_status(member_guid, user_guid)
      p response
    rescue Atrium::ApiError => e
      puts "Exception when calling MembersApi->read_member_status: #{e}"
    end
    

    Example response

    Status: 200 OK
    
    {
      "member": {
        "aggregated_at": "2019-06-08T17:21:05Z",
        "connection_status": "CONNECTED",
        "guid": "MBR-a4652b66-3ee5-cb9f-295a-72eddef61db5",
        "has_processed_accounts": true,
        "has_processed_transactions": true,
        "is_authenticated": true,
        "is_being_aggregated": false,
        "status": "COMPLETED",
        "successfully_aggregated_at": "2019-06-07T21:16:03Z"
      }
    }
    
    class MemberConnectionStatusResponseBody {
      Member:
        class MemberConnectionStatus {
          AggregatedAt: 2016-10-13T18:07:57+00:00
          ConnectionStatus: CONNECTED
          Guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          HasProcessedAccounts: true
          HasProcessedTransactions: false
          IsAuthenticated: true
          IsBeingAggregated: false
          Status: COMPLETED
          SuccessfullyAggregatedAt: 2016-10-13T17:57:38+00:00
        }
    }
    
    {
      Member:
        {
          AggregatedAt: 2016-10-13T18:07:57+00:00
          ConnectionStatus: CONNECTED
          Guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          HasProcessedAccounts: true
          HasProcessedTransactions: false
          IsAuthenticated: true
          IsBeingAggregated: false
          Status: COMPLETED
          SuccessfullyAggregatedAt: 2016-10-13T17:57:38+00:00
        }
    }
    
    class MemberConnectionStatusResponseBody {
      member:
        class MemberConnectionStatus {
          aggregatedAt: 2016-10-13T18:07:57+00:00
          connectionStatus: CONNECTED
          guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          hasProcessedAccounts: true
          hasProcessedTransactions: false
          isAuthenticated: true
          isBeingAggregated: false
          status: COMPLETED
          successfullyAggregatedAt: 2016-10-13T17:57:38+00:00
        }
    }
    
    MemberConnectionStatusResponseBody {
      member:
        MemberConnectionStatus {
          aggregatedAt: 2016-10-13T18:07:57+00:00
          connectionStatus: CONNECTED
          guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          hasProcessedAccounts: true
          hasProcessedTransactions: false
          isAuthenticated: true
          isBeingAggregated: false
          status: COMPLETED
          successfullyAggregatedAt: 2016-10-13T17:57:38+00:00
        }
    }
    
    atrium/model/MemberConnectionStatusResponseBody Object (
      [member] =>
        atrium/model/MemberConnectionStatus Object (
          [aggregated_at] => 2016-10-13T18:07:57+00:00
          [connection_status] => CONNECTED
          [guid] => MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          [has_processed_accounts] => true
          [has_processed_transactions] => false
          [is_authenticated] => true
          [is_being_aggregated] => false
          [status] => COMPLETED
          [successfully_aggregated_at] => 2016-10-13T17:57:38+00:00
        )
    )
    
    {
      'member':
        {
          'aggregated_at': 2016-10-13T18:07:57+00:00
          'connection_status': CONNECTED
          'guid': MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          'has_processed_accounts': true
          'has_processed_transactions': false
          'is_authenticated': true
          'is_being_aggregated': false
          'status': COMPLETED
          'successfully_aggregated_at': 2016-10-13T17:57:38+00:00
        }
    }
    
    #<MX::MemberConnectionStatusResponseBody
      @member=
        #<MX::MemberConnectionStatus
          @aggregated_at= 2016-10-13T18:07:57+00:00
          @connection_status= CONNECTED
          @guid= MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          @has_processed_accounts= true
          @has_processed_transactions= false
          @is_authenticated= true
          @is_being_aggregated= false
          @status= COMPLETED
          @successfully_aggregated_at= 2016-10-13T17:57:38+00:00
        >
    >
    

    Example response for status CHALLENGED

    Status: 200 OK
    
    {
      "member": {
        "aggregated_at": "2016-10-13T18:24:37+00:00",
        "challenges": [
          {
            "field_name": null,
            "guid": "CRD-1ec152cd-e628-e81a-e852-d1e7104624da",
            "label": "What city were you born in?",
            "type": "TEXT"
          }
        ],
        "connection_status": "CHALLENGED",
        "guid": "MBR-7c6f361b-e582-15b6-60c0-358f12466b4b",
        "has_processed_accounts": false,
        "has_processed_transactions": false,
        "is_authenticated": false,
        "is_being_aggregated": true,
        "status": "CHALLENGED",
        "successfully_aggregated_at": "2016-10-13T18:08:04+00:00"
      }
    }
    
    class MemberConnectionStatusResponseBody {
      Member:
        class MemberConnectionStatus {
          AggregatedAt: 2016-10-13T18:07:57+00:00
          Challenges: [
            class Challenge {
              FieldName: Who is this guy?
              Guid: CRD-ce76d2e3-86bd-ec4a-ec52-eb53b5194bf5
              ImageData: Who is this guy?
              Label: Who is this guy?
              Options: [
                class ChallengeOption {
                  ImageData: data:image/png;base64,iVBORw0KGgoAAAANSUh ... more image data ...
                  Label: IMAGE_1
                  Value: image_data
                }
              ]
              Type: IMAGE_DATA
            }
          ]
          ConnectionStatus: CHALLENGED
          Guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          HasProcessedAccounts: false
          HasProcessedTransactions: false
          IsAuthenticated: true
          IsBeingAggregated: false
          Status: COMPLETED
          SuccessfullyAggregatedAt: 2016-10-13T17:57:38+00:00
        }
    }
    
    {
      Member:
        {
          AggregatedAt: 2016-10-13T18:07:57+00:00
          Challenges: [
            {
              FieldName: Who is this guy?
              Guid: CRD-ce76d2e3-86bd-ec4a-ec52-eb53b5194bf5
              ImageData: Who is this guy?
              Label: Who is this guy?
              Options: [
                {
                  ImageData: data:image/png;base64,iVBORw0KGgoAAAANSUh ... more image data ...
                  Label: IMAGE_1
                  Value: image_data
                }
              ]
              Type: IMAGE_DATA
            }
          ]
          ConnectionStatus: CHALLENGED
          Guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          HasProcessedAccounts: false
          HasProcessedTransactions: false
          IsAuthenticated: true
          IsBeingAggregated: false
          Status: COMPLETED
          SuccessfullyAggregatedAt: 2016-10-13T17:57:38+00:00
        }
    }
    
    class MemberConnectionStatusResponseBody {
      member:
        class MemberConnectionStatus {
          aggregatedAt: 2016-10-13T18:07:57+00:00
          challenges: [
            class Challenge {
              fieldName: Who is this guy?
              guid: CRD-ce76d2e3-86bd-ec4a-ec52-eb53b5194bf5
              imageData: Who is this guy?
              label: Who is this guy?
              options: [
                class ChallengeOption {
                  imageData: data:image/png;base64,iVBORw0KGgoAAAANSUh ... more image data ...
                  label: IMAGE_1
                  value: image_data
                }
              ]
              type: IMAGE_DATA
            }
          ]
          connectionStatus: CHALLENGED
          guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          hasProcessedAccounts: false
          hasProcessedTransactions: false
          isAuthenticated: true
          isBeingAggregated: false
          status: COMPLETED
          successfullyAggregatedAt: 2016-10-13T17:57:38+00:00
        }
    }
    
    MemberConnectionStatusResponseBody {
      member:
        MemberConnectionStatus {
          aggregatedAt: 2016-10-13T18:07:57+00:00
          challenges: [
            Challenge {
              fieldName: Who is this guy?
              guid: CRD-ce76d2e3-86bd-ec4a-ec52-eb53b5194bf5
              imageData: Who is this guy?
              label: Who is this guy?
              options: [
                ChallengeOption {
                  imageData: data:image/png;base64,iVBORw0KGgoAAAANSUh ... more image data ...
                  label: IMAGE_1
                  value: image_data
                }
              ]
              type: IMAGE_DATA
            }
          ]
          connectionStatus: CHALLENGED
          guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          hasProcessedAccounts: false
          hasProcessedTransactions: false
          isAuthenticated: true
          isBeingAggregated: false
          status: COMPLETED
          successfullyAggregatedAt: 2016-10-13T17:57:38+00:00
        }
    }
    
    atrium/model/MemberConnectionStatusResponseBody Object (
      [member] =>
        atrium/model/MemberConnectionStatus Object (
          [aggregated_at] => 2016-10-13T18:07:57+00:00
          [challenges] => Array (
            atrium/model/Challenge Object (
              [field_name] => Who is this guy?
              [guid] => CRD-ce76d2e3-86bd-ec4a-ec52-eb53b5194bf5
              [image_data] => Who is this guy?
              [label] => Who is this guy?
              [options] => Array (
                atrium/model/ChallengeOption Object (
                  [image_data] => data:image/png;base64,iVBORw0KGgoAAAANSUh ... more image data ...
                  [label] => IMAGE_1
                  [value] => image_data
                )
              )
              [type] => IMAGE_DATA
            )
          )
          [connection_status] => CHALLENGED
          [guid] => MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          [has_processed_accounts] => false
          [has_processed_transactions] => false
          [is_authenticated] => true
          [is_being_aggregated] => false
          [status] => COMPLETED
          [successfully_aggregated_at] => 2016-10-13T17:57:38+00:00
        )
    )
    
    {
      'member':
        {
          'aggregated_at': 2016-10-13T18:07:57+00:00
          'challenges': [
            {
              'field_name': Who is this guy?
              'guid': CRD-ce76d2e3-86bd-ec4a-ec52-eb53b5194bf5
              'image_data': Who is this guy?
              'label': Who is this guy?
              'options': [
                {
                  'image_data': data:image/png;base64,iVBORw0KGgoAAAANSUh ... more image data ...
                  'label': IMAGE_1
                  'value': image_data
                }
              ]
              'type': IMAGE_DATA
            }
          ]
          'connection_status': CHALLENGED
          'guid': MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          'has_processed_accounts': false
          'has_processed_transactions': false
          'is_authenticated': true
          'is_being_aggregated': false
          'status': COMPLETED
          'successfully_aggregated_at': 2016-10-13T17:57:38+00:00
        }
    }
    
    #<MX::MemberConnectionStatusResponseBody
      @member=
        #<MX::MemberConnectionStatus
          @aggregated_at= 2016-10-13T18:07:57+00:00
          @challenges= [
            #<MX::Challenge
              @field_name= Who is this guy?
              @guid= CRD-ce76d2e3-86bd-ec4a-ec52-eb53b5194bf5
              @image_data= Who is this guy?
              @label= Who is this guy?
              @options= [
                #<MX::ChallengeOption
                  @image_data= data:image/png;base64,iVBORw0KGgoAAAANSUh ... more image data ...
                  @label= IMAGE_1
                  @value= image_data
                >
              ]
              @type= IMAGE_DATA
            >
          ]
          @connection_status= CHALLENGED
          @guid= MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          @has_processed_accounts= false
          @has_processed_transactions= false
          @is_authenticated= true
          @is_being_aggregated= false
          @status= COMPLETED
          @successfully_aggregated_at= 2016-10-13T17:57:38+00:00
        >
    >
    

    This endpoint provides the status of the member's most recent aggregation-type event. This is an important step in the aggregation process (as well as identification, verification, etc.), and the results returned by this endpoint should determine what you do next in order to successfully aggregate a member.

    MX has introduced new, more detailed information on the current status of a member's connection to a financial institution and the state of its aggregation: the connection_status field. These are intended to replace and expand upon the information provided in the status field, which will soon be deprecated; support for the status field remains for the time being.

    Member connection statuses should be used in conjunction with all the fields described below. For instance, when is_being_aggregated switches from true to false and the value of connection_status is CONNECTED, you can stop polling the status and list the member's transactions or list the transactions for a specific account.

    The response for this endpoint is not the same as the read member endpoint; this endpoint returns fields which are specifically focused on the state of the member's aggregation, as well as including MFA challenges when the connection_status is CHALLENGED.

    MX recommends a minimum polling interval of 3 seconds when using this endpoint.

    Read member connection status fields

    Field Data type Description
    aggregated_at String The date and time the account was last aggregated.
    challenges Array An array containing MFA challenges that have been issued. challenges will only be present when the connection_status is CHALLENGED.
    connection_status String The status of a member's aggregation. Read more about these statuses here.
    guid String A unique identifier for the member. Defined by MX.
    has_processed_accounts Boolean true when accounts have been processed for a member, false otherwise. Resets each time /aggregate is called.
    has_processed_transactions Boolean true when transactions have been processed for a member, false otherwise. Resets each time /aggregate is called.
    is_authenticated Boolean If the member’s credentials were authenticated during the most recent aggregation, this field will be true. Otherwise, this field will be false. Resets to false each time /aggregate is called. This field does not indicate that an aggregation is completed — only that the credentials used were good; MFA or other connection problems may occur while this value is true.
    is_being_aggregated Boolean This value is true if the member is being aggregated at the time of the request and false otherwise.
    status String The status of a member's aggregation. This field will soon be deprecated. Use connection_status above as more detailed indicator of a member's status.
    successfully_aggregated_at String The date and time the member was successfully aggregated.

    Connection status definitions

    Connection status id (integer) Connection status (string) Definition Next steps End-user message
    null null The member exists but does not have credentials. None. None.
    0 CREATED The member is new and has not yet been aggregated. Aggregate the member once the end user logs in; poll for a status update. Connecting to {...} ...
    1 PREVENTED MX is preventing aggregation until the member’s credentials have been updated. Display end-user message; after end user has updated their credentials, aggregate again. The last 3 attempts to connect have failed. Please re-enter your credentials to continue importing data.
    2 DENIED The credentials provided for the member were invalid. Display end-user message; after end user has updated their credentials, aggregate again. The credentials entered do not match your credentials at this institution. Please re-enter your credentials to continue importing data.
    3 CHALLENGED The member has been challenged by multi-factor authentication. Display end-user message; follow MFA pathway; after the user answers MFA, poll for a status update. To authenticate your connection to {...}, please answer the following challenge(s).
    4 REJECTED An MFA challenge was answered incorrectly. Display end-user message; another challenge may follow or aggregation may need to be restarted. The answer or answers provided were incorrect. Please try again.
    5 LOCKED The financial institution is preventing authentication. The end user must contact the financial institution. Display end-user message. Your account is locked. Please log in to the appropriate website for {...} and follow the steps to resolve the issue.
    6 CONNECTED The member was successfully authenticated and data is now aggregating. Display the account as having been connected. Connected to [...] ...
    7 IMPEDED The end user’s attention is required at their online banking institution, e.g., there is a marketing message that must be viewed, terms and conditions that must be accepted, etc. Display end-user message. Your attention is needed at this institution's website. Please log in to the appropriate website for {...} and follow the steps to resolve the issue.
    8 RECONNECTED The member has been migrated to a new data source and aggregation is likely to trigger one-time password MFA. MX will not perform background aggregation in order to avoid unnecessarily disruptive texts, emails, etc. The member must be re-aggregated in the foreground with the end user present. Aggregate the member once the end user logs in; poll for a status update. Reconnecting to {...} ...
    9 DEGRADED Aggregation has failed at least three times within a short period of time. Display end-user message. We are upgrading this connection. Please try again later.
    10 DISCONNECTED Aggregation has failed at least three times and has not succeeded for at least two weeks. Display end-user message. It looks like your data from {...} cannot be imported. We are working to resolve the issue.
    11 DISCONTINUED The connection to this financial institution is no longer available. Display end-user message. Connections to this institution are no longer supported. You may create a manual account and use manual transactions to track data for this account.
    12 CLOSED The end user, MX, the client, or a partner has marked the member as closed. Display end-user message. This connection has been closed. You may track this account manually. If reopened, you may connect the institution again.
    13 DELAYED Aggregating the member has taken longer than expected and it has not yet been connected. Display end-user message; poll for a status update. Importing your data from {...} may take a while. Please check back later.
    14 FAILED Aggregation failed without being connected. Display end-user message; try aggregating again later. There was a problem validating your credentials with {...}. Please try again later.
    15 UPDATED The member has been updated — i.e., credentials have been updated — but it has not yet been connected. Aggregate the member once the end user logs in; poll for a status update. Connecting to {...} ...
    16 DISABLED Aggregation has been momentarily paused, but the member is still connected. Display end-user message. Importing data from this institution has been disabled. Please contact us if you believe it has been disabled in error.
    17 IMPORTED MX does not have credentials and will not try to aggregate the member until the end user provides credentials. Display end-user message; re-aggregate after the end user updates credentials. You must re-authenticate before your data can be imported. Please enter your credentials for {...}.
    18 RESUMED The answer to an MFA challenge was received, but it is not yet clear whether it was correct. Poll for a status update. Connecting to {...} ...
    19 EXPIRED The MFA answer was not provided within the time allotted by the financial institution. Display end-user message; re-aggregate the member if the end user initiates it. The answer or answers were not provided in time. Please try again.
    20 IMPAIRED The member is missing some or all credentials needed in order to connect. Display end-user message; re-aggregate after the end user updates credentials. You must re-authenticate before your data can be imported. Please enter your credentials for {...}.
    21 PENDING The member is using OAuth to authenticate credentials and still needs to go through the financial institution's OAuth process. A PENDING status will appear only on members less than one hour old with is_oauth: true. Members that stay PENDING longer than one hour will be deleted by MX. Redirect the end user to the oauth_window_uri provided in the create member response, or request one through the generate OAuth window URI endpoint. None.

    Status definitions (soon to be deprecated)

    status Description Next steps
    INITIATED Aggregation has started.
    REQUESTED Request to get the data has started.
    CHALLENGED MFA challenged returned. Resume member with updated credentials.
    RECEIVED Received response back from the request.
    TRANSFERRED Start saving the data into the MX Platform.
    PROCESSED Data has been processed into the MX Platform.
    COMPLETED Aggregation is complete. List member accounts and transactions.
    PREVENTED Aggregation was prevented due to too many login attempts. List member credentials, update member.
    DENIED Authentication failed due to invalid credentials or incorrect MFA answer. List member credentials, update member. If MFA was answered incorrectly, restart aggregation.
    HALTED An exception occurred that was unrelated to authentication. Retry aggregation tomorrow. If the member hits the HALTED status for 3 or more days, leave the member in its current state and contact support by submitting a ticket here.

    5. Answer MFA, if necessary

    PUT /users/{user_guid}/members/{member_guid}/resume
    

    Example request

    $ curl -i -X PUT 'https://vestibule.mx.com/users/{user_guid}/members/{member_guid}/resume' \
      -H 'Accept: application/vnd.mx.atrium.v1+json' \
      -H 'Content-Type: application/json' \
      -H 'MX-API-Key: {mx_api_key}' \
      -H 'MX-Client-ID: {mx_client_id}' \
      -d '{
            "member":{
              "challenges":[
                {
                   "guid": "institution-credential-guid",
                   "value": "user-entered-value"
                },
                {
                  "guid": "institution-credential-guid",
                   "value": "user-entered-value"
                }
              ]
            }
          }'
    
    using System;
    using Atrium.Api;
    using Atrium.Model;
    
    namespace Example
    {
        public class ResumeMemberExample
        {
            public void main()
            {
                var client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
                var memberGuid = "MBR-123";  // string | The unique identifier for a `member`.
                var userGuid = "USR-123";  // string | The unique identifier for a `user`.
                var body = new MemberResumeRequestBody(); // MemberResumeRequestBody | Member object with MFA challenge answers
    
                try
                {
                    // Resume aggregation from MFA
                    MemberResponseBody response = client.members.ResumeMember(memberGuid, userGuid, body);
                    Console.WriteLine(response);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception when calling MembersApi.ResumeMember: " + e.Message );
                }
            }
        }
    }
    
    package main
    
    import (
      "context"
      "fmt"
      "github.com/mxenabled/atrium-go"
    )
    
    func main() {
      client := atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
      ctx := context.Background()
    
      memberGUID := "MBR-123" // string | The unique identifier for a `member`.
      userGUID := "USR-123" // string | The unique identifier for a `user`.
      body := atrium.MemberResumeRequestBody{} // MemberResumeRequestBody | Member object with MFA challenge answers
    
      response, _, err := client.Members.ResumeMember(ctx, memberGUID, userGUID, body)
      if err != nil {
        fmt.Printf("Error: %v\n", err)
      } else {
        fmt.Printf("Response: %s\n", response)
      }
    }
    
    import com.mx.atrium.*;
    import com.mx.model.*;
    
    public class MembersApiExample {
        public static void main(String[] args) {
            AtriumClient client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
            String memberGuid = "MBR-123"; // String | The unique identifier for a `member`.
            String userGuid = "USR-123"; // String | The unique identifier for a `user`.
            MemberResumeRequestBody body = new MemberResumeRequestBody(); // MemberResumeRequestBody | Member object with MFA challenge answers
    
            try {
                MemberResponseBody response = client.members.resumeMember(memberGuid, userGuid, body);
                System.out.println(response);
            } catch (ApiException e) {
                System.err.println("Exception when calling MembersApi#resumeMember");
                e.printStackTrace();
            }
        }
    }
    
    var atrium = require('./atrium.js');
    
    var client = new atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
    var memberGuid = "MBR-123"; // string | The unique identifier for a `member`.
    var userGuid = "USR-123"; // string | The unique identifier for a `user`.
    var body = new atrium.MemberResumeRequestBody(); // MemberResumeRequestBody | Member object with MFA challenge answers
    
    var response = client.members.resumeMember(memberGuid, userGuid, body);
    
    response.then(function(value) {
      console.log(value);
    });
    
    <?php
    require_once(__DIR__ . '/vendor/autoload.php');
    
    $client = new atrium\Api\AtriumClient(
        "YOUR_API_KEY",
        "YOUR_CLIENT_ID",
        new GuzzleHttp\Client()
    );
    
    $member_guid = "MBR-123"; // string | The unique identifier for a `member`.
    $user_guid = "USR-123"; // string | The unique identifier for a `user`.
    $body = new \atrium\model\MemberResumeRequestBody(); // \atrium\model\MemberResumeRequestBody | Member object with MFA challenge answers
    
    try {
        $result = $client->members->resumeMember($member_guid, $user_guid, $body);
        print_r($result);
    } catch (Exception $e) {
        echo 'Exception when calling MembersApi->resumeMember: ', $e->getMessage(), PHP_EOL;
    }
    ?>
    
    from __future__ import print_function
    import time
    import atrium
    from atrium.rest import ApiException
    from pprint import pprint
    
    # create an instance of the AtriumClient
    client = atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    member_guid = "MBR-123" # str | The unique identifier for a `member`.
    user_guid = "USR-123" # str | The unique identifier for a `user`.
    body = atrium.MemberResumeRequestBody() # MemberResumeRequestBody | Member object with MFA challenge answers
    
    try:
        # Resume aggregation from MFA
        response = client.members.resume_member(member_guid, user_guid, body)
        pprint(response)
    except ApiException as e:
        print("Exception when calling MembersApi->resume_member: %s\n" % e)
    
    # load the gem
    require 'atrium-ruby'
    
    client = Atrium::AtriumClient.new("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    member_guid = "MBR-123" # String | The unique identifier for a `member`.
    user_guid = "USR-123" # String | The unique identifier for a `user`.
    body = Atrium::MemberResumeRequestBody.new # MemberResumeRequestBody | Member object with MFA challenge answers
    
    begin
      #Resume aggregation from MFA
      response = client.members.resume_member(member_guid, user_guidbody)
      p response
    rescue Atrium::ApiError => e
      puts "Exception when calling MembersApi->resume_member: #{e}"
    end
    

    Example response

    Status: 202 Accepted
    
    {
      "member": {
        "aggregated_at": "2016-09-30T14:31:45-06:00",
        "connection_status": "CHALLENGED",
        "guid": "MBR-7c6f361b-e582-15b6-60c0-358f12466b4b",
        "identifier":"unique_id",
        "institution_code": "chase",
        "is_being_aggregated": true,
        "is_oauth": false,
        "metadata": "{\"credentials_last_refreshed_at\": \"2015-10-15\"}",
        "name": "Bank Name",
        "status": "CHALLENGED",
        "successfully_aggregated_at": null,
        "user_guid": "USR-fa7537f3-48aa-a683-a02a-b18940482f54"
      }
    }
    
    class MemberResponseBody {
      Member:
        class Member {
          AggregatedAt: 2016-10-13T18:07:57+00:00
          ConnectionStatus: CONNECTED
          Guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          Identifier: unique_id
          InstitutionCode: chase
          IsBeingAggregated: false
          IsOauth: false
          Metadata: {"credentials_last_refreshed_at": "2015-10-15"}
          Name: Chase Bank
          OauthWindowUri: oauth_window_uri_example
          Status: COMPLETED
          SuccessfullyAggregatedAt: 2016-10-13T17:57:38+00:00
          UserGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    {
      Member:
        {
          AggregatedAt: 2016-10-13T18:07:57+00:00
          ConnectionStatus: CONNECTED
          Guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          Identifier: unique_id
          InstitutionCode: chase
          IsBeingAggregated: false
          IsOauth: false
          Metadata: {"credentials_last_refreshed_at": "2015-10-15"}
          Name: Chase Bank
          OauthWindowUri: oauth_window_uri_example
          Status: COMPLETED
          SuccessfullyAggregatedAt: 2016-10-13T17:57:38+00:00
          UserGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    class MemberResponseBody {
      member:
        class Member {
          aggregatedAt: 2016-10-13T18:07:57+00:00
          connectionStatus: CONNECTED
          guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          identifier: unique_id
          institutionCode: chase
          isBeingAggregated: false
          isOauth: false
          metadata: {"credentials_last_refreshed_at": "2015-10-15"}
          name: Chase Bank
          oauthWindowUri: oauth_window_uri_example
          status: COMPLETED
          successfullyAggregatedAt: 2016-10-13T17:57:38+00:00
          userGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    MemberResponseBody {
      member:
        Member {
          aggregatedAt: 2016-10-13T18:07:57+00:00
          connectionStatus: CONNECTED
          guid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          identifier: unique_id
          institutionCode: chase
          isBeingAggregated: false
          isOauth: false
          metadata: {"credentials_last_refreshed_at": "2015-10-15"}
          name: Chase Bank
          oauthWindowUri: oauth_window_uri_example
          status: COMPLETED
          successfullyAggregatedAt: 2016-10-13T17:57:38+00:00
          userGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    atrium/model/MemberResponseBody Object (
      [member] =>
        atrium/model/Member Object (
          [aggregated_at] => 2016-10-13T18:07:57+00:00
          [connection_status] => CONNECTED
          [guid] => MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          [identifier] => unique_id
          [institution_code] => chase
          [is_being_aggregated] => false
          [is_oauth] => false
          [metadata] => {"credentials_last_refreshed_at": "2015-10-15"}
          [name] => Chase Bank
          [oauth_window_uri] => oauth_window_uri_example
          [status] => COMPLETED
          [successfully_aggregated_at] => 2016-10-13T17:57:38+00:00
          [user_guid] => USR-fa7537f3-48aa-a683-a02a-b18940482f54
        )
    )
    
    {
      'member':
        {
          'aggregated_at': 2016-10-13T18:07:57+00:00
          'connection_status': CONNECTED
          'guid': MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          'identifier': unique_id
          'institution_code': chase
          'is_being_aggregated': false
          'is_oauth': false
          'metadata': {"credentials_last_refreshed_at": "2015-10-15"}
          'name': Chase Bank
          'oauth_window_uri': oauth_window_uri_example
          'status': COMPLETED
          'successfully_aggregated_at': 2016-10-13T17:57:38+00:00
          'user_guid': USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }
    }
    
    #<MX::MemberResponseBody
      @member=
        #<MX::Member
          @aggregated_at= 2016-10-13T18:07:57+00:00
          @connection_status= CONNECTED
          @guid= MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          @identifier= unique_id
          @institution_code= chase
          @is_being_aggregated= false
          @is_oauth= false
          @metadata= {"credentials_last_refreshed_at": "2015-10-15"}
          @name= Chase Bank
          @oauth_window_uri= oauth_window_uri_example
          @status= COMPLETED
          @successfully_aggregated_at= 2016-10-13T17:57:38+00:00
          @user_guid= USR-fa7537f3-48aa-a683-a02a-b18940482f54
        >
    >
    

    This endpoint answers the challenges needed when a member has been challenged by multi-factor authentication.

    6. Answer the special account-selection challenge

    The default flow for verification requires you or the end user to choose one account associated with the member to verify. In order to accomplish this, MX sends a special MFA challenge which lists all the accounts associated with the member. This challenge should appear on the read member status response, but you can also see it with the read member challenges endpoint.

    Answer this challenge with a value for one account using the resume aggregation endpoint just as you would normal MFA.

    If you are using the legacy flow, this step can be skipped.

    6.1 Read the member's status (or read the member's challenges)

    $ curl -i -X GET 'https://vestibule.mx.com/users/{user_guid}/members/{member_guid}/status' \
      -H 'Accept: application/vnd.mx.atrium.v1+json' \
      -H 'MX-API-Key: {mx_api_key}' \
      -H 'MX-Client-ID: {mx_client_id}'
    

    Example response:

    {
      "member": {
        "aggregated_at": "2016-10-13T18:24:37+00:00",
        "challenges": [
          {
            "field_name": null,
            "guid": "CRD-6cad1604-d341-4e37-b63d-6f6cbb79f0b7",
            "label": "Please select an account:",
            "options": [
              {
                "label": "MX Bank Checking",
                "value": "account-bb0ca38d-2193-4ba7-8116-5703105a498a"
              },
              {
                "label": "MX Bank Savings",
                "value": "account-4de4392e-64a5-489d-a237-acde82e91fa5"
              }
            ],
            "type": "OPTIONS"
          }
        ],
        "connection_status": "CHALLENGED",
        "guid": "MBR-7c6f361b-e582-15b6-60c0-358f12466b4b",
        "has_processed_accounts": false,
        "has_processed_transactions": false,
        "is_authenticated": false,
        "is_being_aggregated": true,
        "status": "CHALLENGED",
        "successfully_aggregated_at": "2016-10-13T18:08:04+00:00"
      }
    }
    

    6.2 Resume the aggregation

    Example request

    $ curl -i -X PUT 'https://vestibule.mx.com/users/{user_guid}/members/{member_guid}/resume' \
      -H 'Accept: application/vnd.mx.atrium.v1+json' \
      -H 'Content-Type: application/json' \
      -H 'MX-API-Key: {mx_api_key}' \
      -H 'MX-Client-ID: {mx_client_id}' \
      -d '{
            "member":{
              "challenges":[
                {
                   "guid": "CRD-6cad1604-d341-4e37-b63d-6f6cbb79f0b7",
                   "value": "account-bb0ca38d-2193-4ba7-8116-5703105a498a"
                }
              ]
            }
          }'
    

    Example response

    {
      "member": {
        "aggregated_at": "2016-09-30T14:31:45-06:00",
        "connection_status": "RESUMED",
        "guid": "MBR-7c6f361b-e582-15b6-60c0-358f12466b4b",
        "identifier":"unique_id",
        "institution_code": "chase",
        "is_being_aggregated": true,
        "metadata": "{\"credentials_last_refreshed_at\": \"2015-10-15\"}",
        "name": "Bank Name",
        "status": "RECEIVED",
        "successfully_aggregated_at": null,
        "user_guid": "USR-fa7537f3-48aa-a683-a02a-b18940482f54"
      }
    }
    

    7. Read the account numbers

    Read account numbers by member

    Endpoint: GET /users/{user_guid}/members/{member_guid}/account_numbers

    Example request

    $ curl -i -X GET 'https://vestibule.mx.com/users/{user_guid}/members/{member_guid}/account_numbers' \
      -H 'Accept: application/vnd.mx.atrium.v1+json' \
      -H 'MX-API-Key: {mx_api_key}' \
      -H 'MX-Client-ID: {mx_client_id}'
    
    using System;
    using Atrium.Api;
    using Atrium.Model;
    
    namespace Example
    {
        public class ListAccountNumbersExample
        {
            public void main()
            {
                var client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
                var memberGuid = "MBR-123";  // string | The unique identifier for a `member`.
                var userGuid = "USR-123";  // string | The unique identifier for a `user`.
    
                try
                {
                    // Read account numbers
                    AccountNumbersResponseBody response = client.verification.ListAccountNumbers(memberGuid, userGuid);
                    Console.WriteLine(response);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception when calling VerificationApi.ListAccountNumbers: " + e.Message );
                }
            }
        }
    }
    
    package main
    
    import (
      "context"
      "fmt"
      "github.com/mxenabled/atrium-go"
    )
    
    func main() {
      client := atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
      ctx := context.Background()
    
      memberGUID := "MBR-123" // string | The unique identifier for a `member`.
      userGUID := "USR-123" // string | The unique identifier for a `user`.
    
      response, _, err := client.Verification.ListAccountNumbers(ctx, memberGUID, userGUID)
      if err != nil {
        fmt.Printf("Error: %v\n", err)
      } else {
        fmt.Printf("Response: %s\n", response)
      }
    }
    
    import com.mx.atrium.*;
    import com.mx.model.*;
    
    public class VerificationApiExample {
        public static void main(String[] args) {
            AtriumClient client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
            String memberGuid = "MBR-123"; // String | The unique identifier for a `member`.
            String userGuid = "USR-123"; // String | The unique identifier for a `user`.
    
            try {
                AccountNumbersResponseBody response = client.verification.listAccountNumbers(memberGuid, userGuid);
                System.out.println(response);
            } catch (ApiException e) {
                System.err.println("Exception when calling VerificationApi#listAccountNumbers");
                e.printStackTrace();
            }
        }
    }
    
    var atrium = require('./atrium.js');
    
    var client = new atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
    var memberGuid = "MBR-123"; // string | The unique identifier for a `member`.
    var userGuid = "USR-123"; // string | The unique identifier for a `user`.
    
    var response = client.verification.listAccountNumbers(memberGuid, userGuid);
    
    response.then(function(value) {
      console.log(value);
    });
    
    <?php
    require_once(__DIR__ . '/vendor/autoload.php');
    
    $client = new atrium\Api\AtriumClient(
        "YOUR_API_KEY",
        "YOUR_CLIENT_ID",
        new GuzzleHttp\Client()
    );
    
    $member_guid = "MBR-123"; // string | The unique identifier for a `member`.
    $user_guid = "USR-123"; // string | The unique identifier for a `user`.
    
    try {
        $result = $client->verification->listAccountNumbers($member_guid, $user_guid);
        print_r($result);
    } catch (Exception $e) {
        echo 'Exception when calling VerificationApi->listAccountNumbers: ', $e->getMessage(), PHP_EOL;
    }
    ?>
    
    from __future__ import print_function
    import time
    import atrium
    from atrium.rest import ApiException
    from pprint import pprint
    
    # create an instance of the AtriumClient
    client = atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    member_guid = "MBR-123" # str | The unique identifier for a `member`.
    user_guid = "USR-123" # str | The unique identifier for a `user`.
    
    try:
        # Read account numbers
        response = client.verification.list_account_numbers(member_guid, user_guid)
        pprint(response)
    except ApiException as e:
        print("Exception when calling VerificationApi->list_account_numbers: %s\n" % e)
    
    # load the gem
    require 'atrium-ruby'
    
    client = Atrium::AtriumClient.new("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    member_guid = "MBR-123" # String | The unique identifier for a `member`.
    user_guid = "USR-123" # String | The unique identifier for a `user`.
    
    begin
      #Read account numbers
      response = client.verification.list_account_numbers(member_guid, user_guid)
      p response
    rescue Atrium::ApiError => e
      puts "Exception when calling VerificationApi->list_account_numbers: #{e}"
    end
    

    Example response:

    Status: 200 OK
    
    {
      "account_numbers": [
        {
          "account_guid": "ACT-123",
          "account_number": "10001",
          "institution_number": null,
          "member_guid": "MBR-7c6f361b-e582-15b6-60c0-358f12466b4b",
          "routing_number": "68899990000000",
          "transit_number": null,
          "user_guid": "USR-fa7537f3-48aa-a683-a02a-b18940482f54"
        }
      ],
      "pagination": {
        "current_page": 1,
        "per_page": 25,
        "total_entries": 1,
        "total_pages": 1
      }
    }
    
    class AccountNumbersResponseBody {
      AccountNumbers: [
        class AccountNumber {
          AccountGuid: ACT-123
          AccountNumber: 10001
          MemberGuid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          RoutingNumber: 68899990000000
          UserGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    {
      AccountNumbers: [
        {
          AccountGuid: ACT-123
          AccountNumber: 10001
          MemberGuid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          RoutingNumber: 68899990000000
          UserGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    class AccountNumbersResponseBody {
      account_numbers: [
        class AccountNumber {
          accountGuid: ACT-123
          accountNumber: 10001
          memberGuid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          routingNumber: 68899990000000
          userGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    AccountNumbersResponseBody {
      account_numbers: [
        AccountNumber {
          accountGuid: ACT-123
          accountNumber: 10001
          memberGuid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          routingNumber: 68899990000000
          userGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    atrium/model/AccountNumbersResponseBody Object (
      [account_numbers] => Array (
        atrium/model/AccountNumber Object (
          [account_guid] => ACT-123
          [account_number] => 10001
          [member_guid] => MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          [routing_number] => 68899990000000
          [user_guid] => USR-fa7537f3-48aa-a683-a02a-b18940482f54
        )  
      )
    )
    
    {
      'account_numbers': [
        {
          'account_guid': ACT-123
          'account_number': 10001
          'member_guid': MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          'routing_number': 68899990000000
          'user_guid': USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    #<MX::AccountNumbersResponseBody
      @account_numbers= [
        #<MX::AccountNumber
          @account_guid= ACT-123
          @account_number= 10001
          @member_guid= MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          @routing_number= 68899990000000
          @user_guid= USR-fa7537f3-48aa-a683-a02a-b18940482f54
        >  
      ]
    >
    

    Use this endpoint to check whether account and routing numbers are available for accounts associated with a particular member. It returns the account_numbers object, which contains account and routing number data for each account associated with the member.

    Read account numbers by account

    Endpoint: GET /users/{user_guid}/accounts/{account_guid}/account_numbers

    Example request

    $ curl -i -X GET 'https://vestibule.mx.com/users/{user_guid}/accounts/{account_guid}/account_numbers' \
      -H 'Accept: application/vnd.mx.atrium.v1+json' \
      -H 'MX-API-Key: {mx_api_key}' \
      -H 'MX-Client-ID: {mx_client_id}'
    
    using System;
    using Atrium.Api;
    using Atrium.Model;
    
    namespace Example
    {
        public class ListAccountNumbersByAccountExample
        {
            public void main()
            {
                var client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
                var accountGuid = "ACT-123";  // string | The unique identifier for an `account`.
                var userGuid = "USR-123";  // string | The unique identifier for a `user`.
    
                try
                {
                    // Read account numbers by account GUID
                    AccountNumbersResponseBody response = client.verification.ListAccountNumbersByAccount(accountGuid, userGuid);
                    Console.WriteLine(response);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception when calling VerificationApi.ListAccountNumbersByAccount: " + e.Message );
                }
            }
        }
    }
    
    package main
    
    import (
      "context"
      "fmt"
      "github.com/mxenabled/atrium-go"
    )
    
    func main() {
      client := atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
      ctx := context.Background()
    
      accountGUID := "ACT-123" // string | The unique identifier for an `account`.
      userGUID := "USR-123" // string | The unique identifier for a `user`.
    
      response, _, err := client.Verification.ListAccountNumbersByAccount(ctx, accountGUID, userGUID)
      if err != nil {
        fmt.Printf("Error: %v\n", err)
      } else {
        fmt.Printf("Response: %s\n", response)
      }
    }
    
    import com.mx.atrium.*;
    import com.mx.model.*;
    
    public class VerificationApiExample {
        public static void main(String[] args) {
            AtriumClient client = new AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
            String accountGuid = "ACT-123"; // String | The unique identifier for an `account`.
            String userGuid = "USR-123"; // String | The unique identifier for a `user`.
    
            try {
                AccountNumbersResponseBody response = client.verification.listAccountNumbersByAccount(accountGuid, userGuid);
                System.out.println(response);
            } catch (ApiException e) {
                System.err.println("Exception when calling VerificationApi#listAccountNumbersByAccount");
                e.printStackTrace();
            }
        }
    }
    
    var atrium = require('./atrium.js');
    
    var client = new atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID");
    
    var accountGuid = "ACT-123"; // string | The unique identifier for an `account`.
    var userGuid = "USR-123"; // string | The unique identifier for a `user`.
    
    var response = client.verification.listAccountNumbersByAccount(accountGuid, userGuid);
    
    response.then(function(value) {
      console.log(value);
    });
    
    <?php
    require_once(__DIR__ . '/vendor/autoload.php');
    
    $client = new atrium\Api\AtriumClient(
        "YOUR_API_KEY",
        "YOUR_CLIENT_ID",
        new GuzzleHttp\Client()
    );
    
    $account_guid = "ACT-123"; // string | The unique identifier for an `account`.
    $user_guid = "USR-123"; // string | The unique identifier for a `user`.
    
    try {
        $result = $client->verification->listAccountNumbersByAccount($account_guid, $user_guid);
        print_r($result);
    } catch (Exception $e) {
        echo 'Exception when calling VerificationApi->listAccountNumbersByAccount: ', $e->getMessage(), PHP_EOL;
    }
    ?>
    
    from __future__ import print_function
    import time
    import atrium
    from atrium.rest import ApiException
    from pprint import pprint
    
    # create an instance of the AtriumClient
    client = atrium.AtriumClient("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    account_guid = "ACT-123" # str | The unique identifier for an `account`.
    user_guid = "USR-123" # str | The unique identifier for a `user`.
    
    try:
        # Read account numbers by account GUID
        response = client.verification.list_account_numbers_by_account(account_guid, user_guid)
        pprint(response)
    except ApiException as e:
        print("Exception when calling VerificationApi->list_account_numbers_by_account: %s\n" % e)
    
    # load the gem
    require 'atrium-ruby'
    
    client = Atrium::AtriumClient.new("YOUR_API_KEY", "YOUR_CLIENT_ID")
    
    account_guid = "ACT-123" # String | The unique identifier for an `account`.
    user_guid = "USR-123" # String | The unique identifier for a `user`.
    
    begin
      #Read account numbers by account GUID
      response = client.verification.list_account_numbers_by_account(account_guid, user_guid)
      p response
    rescue Atrium::ApiError => e
      puts "Exception when calling VerificationApi->list_account_numbers_by_account: #{e}"
    end
    

    Example response:

    Status: 200 OK
    
    {
      "account_numbers": [
        {
          "account_guid": "ACT-123",
          "account_number": "10001",
          "institution_number": null,
          "member_guid": "MBR-7c6f361b-e582-15b6-60c0-358f12466b4b",
          "routing_number": "68899990000000",
          "transit_number": null,
          "user_guid": "USR-fa7537f3-48aa-a683-a02a-b18940482f54"
        }
      ],
      "pagination": {
        "current_page": 1,
        "per_page": 25,
        "total_entries": 1,
        "total_pages": 1
      }
    }
    
    class AccountNumbersResponseBody {
      AccountNumbers: [
        class AccountNumber {
          AccountGuid: ACT-123
          AccountNumber: 10001
          MemberGuid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          RoutingNumber: 68899990000000
          UserGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    {
      AccountNumbers: [
        {
          AccountGuid: ACT-123
          AccountNumber: 10001
          MemberGuid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          RoutingNumber: 68899990000000
          UserGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    class AccountNumbersResponseBody {
      account_numbers: [
        class AccountNumber {
          accountGuid: ACT-123
          accountNumber: 10001
          memberGuid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          routingNumber: 68899990000000
          userGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    AccountNumbersResponseBody {
      account_numbers: [
        AccountNumber {
          accountGuid: ACT-123
          accountNumber: 10001
          memberGuid: MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          routingNumber: 68899990000000
          userGuid: USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    atrium/model/AccountNumbersResponseBody Object (
      [account_numbers] => Array (
        atrium/model/AccountNumber Object (
          [account_guid] => ACT-123
          [account_number] => 10001
          [member_guid] => MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          [routing_number] => 68899990000000
          [user_guid] => USR-fa7537f3-48aa-a683-a02a-b18940482f54
        )  
      )
    )
    
    {
      'account_numbers': [
        {
          'account_guid': ACT-123
          'account_number': 10001
          'member_guid': MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          'routing_number': 68899990000000
          'user_guid': USR-fa7537f3-48aa-a683-a02a-b18940482f54
        }  
      ]
    }
    
    #<MX::AccountNumbersResponseBody
      @account_numbers= [
        #<MX::AccountNumber
          @account_guid= ACT-123
          @account_number= 10001
          @member_guid= MBR-7c6f361b-e582-15b6-60c0-358f12466b4b
          @routing_number= 68899990000000
          @user_guid= USR-fa7537f3-48aa-a683-a02a-b18940482f54
        >  
      ]
    >
    

    Use this endpoint to check whether account and routing numbers are available for a specific account. It returns the account_numbers object, which contains account and routing number data.

    Testing verification

    To test your setup without incurring the cost of calling the verify endpoint, Atrium has test endpoints available.

    Simply modify the URL to contain the user GUID test_atrium and the member GUID test_atrium_member.

    The endpoint URLs will then be as follows:

    /users/test_atrium/members/test_atrium_member/verify

    /users/test_atrium/members/test_atrium_member/account_numbers

    Changelog

    July 14, 2021

    July 13, 2021

    June 30, 2021

    May 26, 2021

    May 13, 2021

    March 15, 2021

    February 11, 2021

    February 5, 2021

    January 29, 2021

    December 16, 2020

    December 1, 2020

    November 24, 2020

    November 5, 2020

    October 7, 2020

    August 3. 2020

    June 25. 2020

    May 11. 2020

    May 1, 2020

    April 27, 2020

    April 24, 2020

    April 23, 2020

    April 22, 2020

    March 30, 2020

    February 28, 2020

    February 20, 2020

    February 7, 2020

    February 7, 2020

    January 14, 2019

    December 2, 2019

    November 19, 2019

    November 12, 2019

    October 31, 2019

    October 21, 2019

    October 20, 2019

    October 19, 2019

    October 18, 2019

    October 17, 2019

    August 29, 2019

    June 13, 2019

    1. A full data model was added to the read member connection status endpoint to make it clear that this response is not the same as the response to read member or list members.

    June 5, 2019

    May 21, 2019

    March 21, 2019

    February 25, 2019

    February 22, 2019

    February 7, 2019

    January 30, 2019

    January 28, 2019

    January 11, 2019

    December 18, 2018

    December 12, 2018

    November 26, 2018

    November 19, 2018

    November 16, 2018

    September 20, 2018

    August 13, 2018

    July 20, 2018

    April 25, 2018

    Updated support escalation information in the Member statuses section of the Getting Started with Atrium guide.

    April 20, 2018

    March 6, 2018

    February 14, 2018

    Added code examples for several languages.

    December 5, 2017

    November 21, 2017

    October 4, 2017

    September 13, 2017