OpenWrks | OpenWrks API

Search results for "{{ search.query }}"

No results found for "{{search.query}}". 
View All Results
Suggest Edits

Introduction

OpenWrks allows your customers to seamlessly and securely share their real-time bank account information with your business.

Through OpenWrks single, simple and secure API you can create faster, more sustainable and personalised products, services and experiences for every single customer. Take a look at how you can get access to our sandbox and start using Open Banking data in minutes.

 
Suggest Edits

OpenWrks API

 

The OpenWrks API eliminates needless complexity and removes the bloat of working with multiple banks and account providers through a single API. We shield developers from the noise, variance, availability and movement of Open Banking, PSD2 and individual bank API endpoints.

OpenWrks take care of dual running and the support of major versions mandated by the Open Banking Implementation Entity (OBIE). It removes any need to update your technology by giving you a clean, stable, backwards compatible single API for integration.

 


To help you get started we provide a sandbox so you can explore the API. The sandbox allows you to make requests, receive responses and understand the type of data OpenWrks can provide. To get started, simply request a token and we'll get you up-and-running in minutes.

The sandbox allows you to make requests to the User, Account and Transaction endpoints.

Request a token

Once you have your token take a look at our environments so you know which URL to hit.

Rate Limits

Our sandbox rate limit is set to 1000 requests per hour. If you need to temporarily increase this, please get in touch.

Suggest Edits

Authentication

 

Authentication to the OpenWrks API is performed via the Bearer HTTP Authentication scheme. Every endpoint is authenticated on the API so you'll need to add the following header to your requests:

Authorization: Bearer 59fc47463I4Am6The1One5Who8Knocksc02a4226beea88c9dfb17366

Here's a complete example request that gets all users:

$ curl https://api.openwrks.com/surface/Users \
   -H "Authorization: Bearer 59fc47463I4Am6The1One5Who8Knocksc02a4226beea88c9dfb17366"

Note: the tokens in these examples are illustrative, simply ask for your own token to make sample requests to our sandbox.

Request a token

All requests must be sent over HTTPS

Troubleshooting

If the token is incorrect you'll receive a 401 or a 403 response. Having problems? Check that you’ve done the following:

  • Include an "Authorization" header in your request
  • Use the Bearer scheme in the Authorization header
  • Double check the token you are using matches the one we've given you
  • Check the body of the response, there may be additional details to help you fix the problem depending on the error

Errors in the OpenWrks API are expressed as a combination of HTTP status codes and an accompanying JSON body providing detail where appropriate. In most cases, you will be able to rely on the HTTP status code alone to determine the cause of the problem.

Error responses will always contain the following fields:

Field
Type

message

string

A human-readable message as to the specifics of the problem. For example, it may contain the value in your request that caused the problem.

status

number

The HTTP status code used in the response

errorCode

number

The specific OpenWrks error code for the problem. You should provide this value if you have to contact support regarding the problem.

Example Response Body:

{
    "message": "The specified user does not exist",
    "status": 400,
    "errorCode": 3000001
}

For endpoints that provide several items, the response will be paged. This means that to retrieve the full set of items for a given resource you may be required to make several requests.

Requests

Paging can be controlled via two query string parameters:

Parameter Name
Description

page

The page number you wish to retrieve

limit

The number of items to return in a page

For example, you could retrieve a list of your users, two at a time using the following request:

curl https://api.openwrks.com/surface/Users?page=2&limit=2 \
   -H "Authorization: Bearer 59fc47463I4Am6The1One5Who8Knocksc02a4226beea88c9dfb17366"
   

Response

OpenWrks always returns paged data in the following format:

Field
Type
Description

data

array

The actual data items you have requested

_meta

object

Additional information that is not essential to understand the resources returned, but offers additional detail

_links

array

A collection of links that you can use to navigate the paged data

So a response to the above request would look like:

{
  "data": [
    {
      "userId": "03b64e3b-c453-4f26-9f5f-64a707713932",
      "reference": "USER-4414"
    },
    {
      "userId": "49a5edae-d305-4d8f-96bc-d3b0ac669eec",
      "reference": "USER-55"
    }
  ],
  "_meta": {
    "totalNumberOfRecords": 7,
    "totalNumberOfPages": 4,
    "pageNumber": 2,
    "pageSize": 2
  },
  "_links": [
    {
      "rel": "prev",
      "href": "https://api.openwrks.com/v1/users?page=1&limit=2"
    },
    {
      "rel": "next",
      "href": "https://api.openwrks.com/v1/users?page=3&limit=2"
    }
  ]
}

Navigating the pages

  • If you are at the first page, the "prev" link will not be present in the response.
  • If you are at the final page, the "next" link will not be present in the response
  • If there are no pages and all data is returned neither "prev" or "next" links will be present in the response

It is advised to follow the links we provide in the response. There should be no need to create the links to navigate forward and backward yourself.

Suggest Edits

Environments

 

We provide multiple environments that allow you to explore, develop, integrate and run production systems against. Make a note of the below base URLs, as you’ll need to switch them in.
Note: all the reference examples provided in the users, accounts and transactions below are for the live environment.

Environment
Base URL
What's it for?

1 Sandbox

Get started here!
Request a token to explore our API, make requests and receive responses with sample data.

2 Lab

Once you’ve been on-boarded, you get your own branded version of Flow coupled with access to the Lab environment. This will allow you to perform full end to end authentication and authorisation to individual banks. You can test low volumes against real banks, real customers and ensure your integration is ready ahead of a full live roll out.

3 Live

Once you’ve got it all working in the Lab, we’ll promote you to Live. Congratulations, your business is using Open Banking!

gethttps://api.openwrks.com/surface/v1/Users
curl --request GET \
  --url https://api.openwrks.com/surface/v1/Users
var client = new RestClient("https://api.openwrks.com/surface/v1/Users");
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.openwrks.com/surface/v1/Users");

xhr.send(data);
import requests

url = "https://api.openwrks.com/surface/v1/Users"

response = requests.request("GET", url)

print(response.text)
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://api.openwrks.com/surface/v1/Users",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://api.openwrks.com/surface/v1/Users")
  .get()
  .build();

Response response = client.newCall(request).execute();
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.openwrks.com/surface/v1/Users' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.openwrks.com/surface/v1/Users")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
#import <Foundation/Foundation.h>

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://api.openwrks.com/surface/v1/Users"]
                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                   timeoutInterval:10.0];
[request setHTTPMethod:@"GET"];

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                                if (error) {
                                                    NSLog(@"%@", error);
                                                } else {
                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
                                                    NSLog(@"%@", httpResponse);
                                                }
                                            }];
[dataTask resume];
import Foundation

let request = NSMutableURLRequest(url: NSURL(string: "https://api.openwrks.com/surface/v1/Users")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.openwrks.com/surface/v1/Users"

	req, _ := http.NewRequest("GET", url, nil)

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
A binary file was returned

You couldn't be authenticated

No response examples available

Query Params

Page
int32
Limit
int32

Response

Success

dataarray
_metaobject
_linksarray

Bad Request

messagestring
statusinteger
errorCodeinteger
Suggest Edits

/Users/{userId}

 
gethttps://api.openwrks.com/surface/v1/Users/userId
curl --request GET \
  --url https://api.openwrks.com/surface/v1/Users/userId
var client = new RestClient("https://api.openwrks.com/surface/v1/Users/userId");
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.openwrks.com/surface/v1/Users/userId");

xhr.send(data);
import requests

url = "https://api.openwrks.com/surface/v1/Users/userId"

response = requests.request("GET", url)

print(response.text)
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://api.openwrks.com/surface/v1/Users/userId",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://api.openwrks.com/surface/v1/Users/userId")
  .get()
  .build();

Response response = client.newCall(request).execute();
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.openwrks.com/surface/v1/Users/userId' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.openwrks.com/surface/v1/Users/userId")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
#import <Foundation/Foundation.h>

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://api.openwrks.com/surface/v1/Users/userId"]
                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                   timeoutInterval:10.0];
[request setHTTPMethod:@"GET"];

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                                if (error) {
                                                    NSLog(@"%@", error);
                                                } else {
                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
                                                    NSLog(@"%@", httpResponse);
                                                }
                                            }];
[dataTask resume];
import Foundation

let request = NSMutableURLRequest(url: NSURL(string: "https://api.openwrks.com/surface/v1/Users/userId")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.openwrks.com/surface/v1/Users/userId"

	req, _ := http.NewRequest("GET", url, nil)

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
A binary file was returned

You couldn't be authenticated

No response examples available

Path Params

userId
uuid
required

Response

Success

userIdstring
referencestring

Bad Request

messagestring
statusinteger
errorCodeinteger
 
Suggest Edits

/users/{userId}/Accounts

 
gethttps://api.openwrks.com/surface/v1/users/userId/Accounts
curl --request GET \
  --url https://api.openwrks.com/surface/v1/users/userId/Accounts
var client = new RestClient("https://api.openwrks.com/surface/v1/users/userId/Accounts");
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.openwrks.com/surface/v1/users/userId/Accounts");

xhr.send(data);
import requests

url = "https://api.openwrks.com/surface/v1/users/userId/Accounts"

response = requests.request("GET", url)

print(response.text)
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://api.openwrks.com/surface/v1/users/userId/Accounts",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://api.openwrks.com/surface/v1/users/userId/Accounts")
  .get()
  .build();

Response response = client.newCall(request).execute();
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.openwrks.com/surface/v1/users/userId/Accounts' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.openwrks.com/surface/v1/users/userId/Accounts")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
#import <Foundation/Foundation.h>

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://api.openwrks.com/surface/v1/users/userId/Accounts"]
                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                   timeoutInterval:10.0];
[request setHTTPMethod:@"GET"];

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                                if (error) {
                                                    NSLog(@"%@", error);
                                                } else {
                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
                                                    NSLog(@"%@", httpResponse);
                                                }
                                            }];
[dataTask resume];
import Foundation

let request = NSMutableURLRequest(url: NSURL(string: "https://api.openwrks.com/surface/v1/users/userId/Accounts")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.openwrks.com/surface/v1/users/userId/Accounts"

	req, _ := http.NewRequest("GET", url, nil)

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
A binary file was returned

You couldn't be authenticated

No response examples available

Path Params

userId
uuid
required

Query Params

Page
int32
Limit
int32

Response

Success

dataarray
_metaobject
_linksarray

Bad Request

messagestring
statusinteger
errorCodeinteger
Suggest Edits

/users/{userId}/Accounts/{accountId}

 
gethttps://api.openwrks.com/surface/v1/users/userId/Accounts/accountId
curl --request GET \
  --url https://api.openwrks.com/surface/v1/users/userId/Accounts/accountId
var client = new RestClient("https://api.openwrks.com/surface/v1/users/userId/Accounts/accountId");
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.openwrks.com/surface/v1/users/userId/Accounts/accountId");

xhr.send(data);
import requests

url = "https://api.openwrks.com/surface/v1/users/userId/Accounts/accountId"

response = requests.request("GET", url)

print(response.text)
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://api.openwrks.com/surface/v1/users/userId/Accounts/accountId",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://api.openwrks.com/surface/v1/users/userId/Accounts/accountId")
  .get()
  .build();

Response response = client.newCall(request).execute();
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.openwrks.com/surface/v1/users/userId/Accounts/accountId' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.openwrks.com/surface/v1/users/userId/Accounts/accountId")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
#import <Foundation/Foundation.h>

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://api.openwrks.com/surface/v1/users/userId/Accounts/accountId"]
                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                   timeoutInterval:10.0];
[request setHTTPMethod:@"GET"];

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                                if (error) {
                                                    NSLog(@"%@", error);
                                                } else {
                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
                                                    NSLog(@"%@", httpResponse);
                                                }
                                            }];
[dataTask resume];
import Foundation

let request = NSMutableURLRequest(url: NSURL(string: "https://api.openwrks.com/surface/v1/users/userId/Accounts/accountId")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.openwrks.com/surface/v1/users/userId/Accounts/accountId"

	req, _ := http.NewRequest("GET", url, nil)

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
A binary file was returned

You couldn't be authenticated

No response examples available

Path Params

userId
uuid
required
accountId
uuid
required

Response

Success

accountIdstring
accountNumberstring
sortCodestring
accountNamestring
ibanstring
providerstring
balancenumber
currencystring
collectedDatestring

Bad Request

messagestring
statusinteger
errorCodeinteger

collectedDate

The collectedDate tells you when the account data was collected. Select the account data with the most recent collectedDate time stamp for the latest version of account data.

Suggest Edits

Transactions

 
Suggest Edits

/users/{userId}/accounts/{accountId}/Transactions

 
gethttps://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions
curl --request GET \
  --url https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions
var client = new RestClient("https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions");
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions");

xhr.send(data);
import requests

url = "https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions"

response = requests.request("GET", url)

print(response.text)
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions")
  .get()
  .build();

Response response = client.newCall(request).execute();
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
#import <Foundation/Foundation.h>

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions"]
                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                   timeoutInterval:10.0];
[request setHTTPMethod:@"GET"];

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                                if (error) {
                                                    NSLog(@"%@", error);
                                                } else {
                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
                                                    NSLog(@"%@", httpResponse);
                                                }
                                            }];
[dataTask resume];
import Foundation

let request = NSMutableURLRequest(url: NSURL(string: "https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions"

	req, _ := http.NewRequest("GET", url, nil)

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
A binary file was returned

You couldn't be authenticated

No response examples available

Path Params

userId
uuid
required
accountId
uuid
required

Query Params

from
string
to
string
Page
int32
Limit
int32

Response

Success

dataarray
_metaobject
_linksarray

Bad Request

messagestring
statusinteger
errorCodeinteger

Request

Date range parameters:

Field
Type
Description
Format
Required

from

string

Optional parameter that returns transactions posted on or after this date. The default is the earliest transaction available.

YYYY-MM-DD

No

to

string

Optional parameter that transactions up to and including this date. The default is the date of the request.

YYYY-MM-DD

No

Suggest Edits

/users/{userId}/accounts/{accountId}/Transactions/{transactionId}

 
gethttps://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions/transactionId
curl --request GET \
  --url https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions/transactionId
var client = new RestClient("https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions/transactionId");
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions/transactionId");

xhr.send(data);
import requests

url = "https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions/transactionId"

response = requests.request("GET", url)

print(response.text)
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions/transactionId",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions/transactionId")
  .get()
  .build();

Response response = client.newCall(request).execute();
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions/transactionId' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions/transactionId")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
#import <Foundation/Foundation.h>

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions/transactionId"]
                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                   timeoutInterval:10.0];
[request setHTTPMethod:@"GET"];

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                                if (error) {
                                                    NSLog(@"%@", error);
                                                } else {
                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
                                                    NSLog(@"%@", httpResponse);
                                                }
                                            }];
[dataTask resume];
import Foundation

let request = NSMutableURLRequest(url: NSURL(string: "https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions/transactionId")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.openwrks.com/surface/v1/users/userId/accounts/accountId/Transactions/transactionId"

	req, _ := http.NewRequest("GET", url, nil)

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
A binary file was returned

You couldn't be authenticated

No response examples available

Path Params

userId
uuid
required
accountId
uuid
required
transactionId
uuid
required

Response

Success

transactionIdstring
amountnumber
descriptionstring
currencystring
merchantNamestring
merchantCategoryCodestring
timestampstring
typestring

Bad Request

messagestring
statusinteger
errorCodeinteger

Flow is our Open Banking connection, authentication and authorisation journey. Quickly add our seamless, fully white labelled and GDPR compliant bank connection flow to any of your existing products or processes.

  1. First, select your bank.
  2. Next, give your consent to share the banking data requested.
  3. Flow forwards you on to your selected bank.
  4. The fourth step is to login to your bank.
  5. Then you give permission to your bank to share the data as you have requested.
  6. Finally, you return to the site you started on and see confirmation that the banking data has been sent.

The Invite endpoint returns a response object that contains a URL for your user to connect through to Flow.

 
posthttps://api.openwrks.com/surface/v1/invite
curl --request POST \
  --url https://api.openwrks.com/surface/v1/invite
var client = new RestClient("https://api.openwrks.com/surface/v1/invite");
var request = new RestRequest(Method.POST);
IRestResponse response = client.Execute(request);
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("POST", "https://api.openwrks.com/surface/v1/invite");

xhr.send(data);
import requests

url = "https://api.openwrks.com/surface/v1/invite"

response = requests.request("POST", url)

print(response.text)
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://api.openwrks.com/surface/v1/invite",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://api.openwrks.com/surface/v1/invite")
  .post(null)
  .build();

Response response = client.newCall(request).execute();
var request = require("request");

var options = { method: 'POST',
  url: 'https://api.openwrks.com/surface/v1/invite' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.openwrks.com/surface/v1/invite")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)

response = http.request(request)
puts response.read_body
#import <Foundation/Foundation.h>

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://api.openwrks.com/surface/v1/invite"]
                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                   timeoutInterval:10.0];
[request setHTTPMethod:@"POST"];

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                                if (error) {
                                                    NSLog(@"%@", error);
                                                } else {
                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
                                                    NSLog(@"%@", httpResponse);
                                                }
                                            }];
[dataTask resume];
import Foundation

let request = NSMutableURLRequest(url: NSURL(string: "https://api.openwrks.com/surface/v1/invite")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.openwrks.com/surface/v1/invite"

	req, _ := http.NewRequest("POST", url, nil)

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
A binary file was returned

You couldn't be authenticated

No response examples available

Body Params

customerReference
string
required
redirectUrl
string
required
metaData
object

Response

Success

invitationIdstring
customerReferencestring
userIdstring
flowUrlstring
expirationDatestring

Bad Request

messagestring
statusinteger
errorCodeinteger

Not Found

messagestring
statusinteger
errorCodeinteger

Request

Example Request Body:

{
    "customerReference": "LTbhI7AkSe0Nh55Mn6ENrreS22EecgC22w",
    "metaData": {
      "email": "[email protected]",
      "firstName": "Jane",
      "surname": "Doe"
    },
    "redirectUrl": "https://www.test.com/"
}

Request fields:

Field
Type
Description
Required

customerReference

string

A unique string to identify a customer.

Yes

metaData

object

metaData can be used to provide further details about your customer to help personalise their journey through Flow. This meta data is also viewable on your customer's record in the Surface Dashboard.

No

redirectUrl

string

The URL that you want to redirect the customer back to. The redirectUrl must match the redirectUrl registered for your chosen Flow configuration.

Yes

Response

The Invite response body will always contain the following fields:

Field
Type
Description

invitationId

string

The unique identifier generated for your customer's invite.

customerReference

string

Playback of the customer reference you supplied.

userId

string

The unique identifier generated for your customer.

flowUrl

string

This url allows a customer to connect to and enter a Flow.

expirationDate

datetime

The date and time of when the invite will expire (in UTC).

Example Response Body:

{
    "invitationId": "e919353a-8dd0-4ae6-b9c3-99c49c6e209b",
    "customerReference": "LTbhI7AkSe0Nh55Mn6ENrreS22EecgC22w",
    "userId": "e2301481-4517-4fe0-8273-38ec4f0c12b2",
    "flowUrl": "https://flow.openwrks.com/invite/CfDJ8LvysIUFlURBm6A1R7VXNbxiNjlEv0n_hTkBlKhzVPBjgAJS5tjTO08ZPPUEU5bBgtBYw_WCR7PbEKtzIgbaWUH9IIGipL4z38S6Wzq6LsRxWC4WYbY8GaLY01HXxKaHmB_hbWPl05-a7IvJvhThxF5YjdwpCTq85t44g81l3rPgcVPMoESBgZlbzLMN_r1q831e5LzKtufeEuBCTdezOCE",
    "expirationDate": "2018-02-11T13:11:24.1175463+00:00"
}

Redirect

At the end of a customer's Flow journey, Flow will perform a 302 redirect and the customer will be redirected to the redirectUrl with the following parameters in the query string:

invitationId=<invitationid>&customerReference=<customerreference>
Field
Type

invitationId

string

The unique identifier generated for your customer's invite.

customerReference

string

Your customer's unique string.

Example 302 Redirect:

curl -X GET \
  'https://www.yourwebsite.com/?invitationId=e919353a-8dd0-4ae6-b9c3-99c49c6e209b&customerReference=LTbhI7AkSe0Nh55Mn6ENrreS22EecgC22w'

Error codes

In the case where we have been unsuccessful in connecting your customer to their account, we will display a friendly error message to your customer with the ability for the customer to be redirected back to you in certain error conditions.

When the customer decides to redirect back to you, Flow will perform a 302 redirect and the customer will be redirected to the redirectUrl with the invitationId and customerReference parameters in the query string along with one of the following error codes:

Error Code
Error Code Description

consentDeclined

The user has declined to provide consent to connect to their bank account.

expiredInvite

The invite is no longer valid. This can occur when a user has clicked the link (FlowUrl) after completing an activation or the link has expired.

bankNotListed

The bank the user is requesting to connect to is not currently supported.

bankAuthorisationFailed

The user's bank has returned an error during the bank's authentication process.

Example 302 Redirect with an error code:

curl -X GET \
  'https://www.yourwebsite.com/?invitationId=e919353a-8dd0-4ae6-b9c3-99c49c6e209b&customerReference=LTbhI7AkSe0Nh55Mn6ENrreS22EecgC22w&errorCode=consentDeclined'
Suggest Edits

Help & Feedback

 

Once you're on-boarded to our test environment, you will have direct access to our dev team for technical help and assistance.

For queries regarding our sandbox please raise a ticket by emailing [email protected].

Suggest Edits

System Health

 

Our live status page is available at http://status.openwrks.com. This is where you can get updates on how our systems are doing. If there are interruptions to service, we will post a note here.

As always, if you are experiencing any issues with OpenWrks, don't hesitate to get in touch with us at [email protected] and we'll get back to you as soon as we can.