Get started
Follow these steps to go from zero to decision-ready insights. Each step links out to a detailed guide.
-
Get an API key. Contact us to request your API key and discuss your use case. See Authentication for how keys, scopes, and environments work.
-
Create a customer. Create your customer with their 11-digit ABN to obtain a
customerId, which most API operations require. → Create a customer -
Submit transactions. Submit transactions by classifying structured data you already have, or by extracting them from a PDF bank statement. Submitting is asynchronous - you get a
jobIdand processing continues in the background (see Jobs). Both paths return enriched, categorised transactions. -
Retrieve enriched transactions. Once the job completes, pull back the enriched, categorised transactions for the customer.
-
Refresh reports. Reports aren't computed automatically when transactions arrive. Once the submission job has finished, start a report refresh to compute them over all of the customer's enriched transactions. The refresh is asynchronous too: it returns a
jobIdto poll. -
Get reports. When the refresh job finishes, retrieve the customer's decision-ready signals - Completeness, Risk Score, and Aggregate - together in a single call from the reports endpoint.
The flow end to end
The whole integration is five calls, plus polling for the two jobs. The base URL below is the production host; swap in the sandbox host from Authentication while you build and test.
- cURL
- Node.js
- Python
- C#
# 1. Create the customer (returns customerId)
curl -X POST "https://api.walkerstdata.com.au/v1/customer" \
-H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"abn": "12345678901"}'
# 2. Submit their transactions (returns jobId)
curl -X POST "https://api.walkerstdata.com.au/v1/customer/{customerId}/transactions" \
-H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{ "transactions": [ /* ... */ ], "accountName": "ACME Pty Ltd", "bsb": "062001", "accountNumber": "12345678", "bankName": "Commonwealth Bank of Australia", "accountType": "Business Transaction Account" }'
# 3. Wait for the job to finish - poll its status, or subscribe to a webhook
curl -X GET "https://api.walkerstdata.com.au/v1/jobs/{jobId}/status" \
-H "x-api-key: YOUR_API_KEY"
# 4. Retrieve enriched transactions
curl -X GET "https://api.walkerstdata.com.au/v1/customer/{customerId}/transactions?jobId={jobId}" \
-H "x-api-key: YOUR_API_KEY"
# 5. Refresh the customer's reports (returns a new jobId)
curl -X POST "https://api.walkerstdata.com.au/v1/customer/{customerId}/reports/refresh" \
-H "x-api-key: YOUR_API_KEY"
# 6. Wait for the refresh job to finish - poll its status (refresh jobs don't send webhooks)
curl -X GET "https://api.walkerstdata.com.au/v1/jobs/{refreshJobId}/status" \
-H "x-api-key: YOUR_API_KEY"
# 7. Retrieve the customer's reports (completeness, risk, aggregate)
curl -X GET "https://api.walkerstdata.com.au/v1/customer/{customerId}/reports" \
-H "x-api-key: YOUR_API_KEY"
const BASE_URL = 'https://api.walkerstdata.com.au';
const HEADERS = {
'x-api-key': process.env.WSD_API_KEY,
'Content-Type': 'application/json',
};
async function call(method, path, body) {
const resp = await fetch(`${BASE_URL}${path}`, {
method,
headers: HEADERS,
body: body && JSON.stringify(body),
});
if (!resp.ok) throw new Error(`${method} ${path} failed: ${resp.status}`);
return (await resp.json()).data;
}
async function waitForJob(jobId) {
const terminal = ['Completed', 'CompletedWithErrors', 'Failed'];
while (true) {
const job = await call('GET', `/v1/jobs/${jobId}/status`);
if (terminal.includes(job.status)) return job;
await new Promise((resolve) => setTimeout(resolve, 5000));
}
}
// 1. Create the customer
const { customerId } = await call('POST', '/v1/customer', {
abn: '12345678901',
});
// 2. Submit their transactions
const { jobId } = await call(
'POST',
`/v1/customer/${customerId}/transactions`,
{
transactions: [/* ... */],
accountName: 'ACME Pty Ltd',
bsb: '062001',
accountNumber: '12345678',
bankName: 'Commonwealth Bank of Australia',
accountType: 'Business Transaction Account',
}
);
// 3. Wait for the job to finish (or subscribe to a webhook)
await waitForJob(jobId);
// 4. Retrieve enriched transactions
const txns = await call(
'GET',
`/v1/customer/${customerId}/transactions?jobId=${jobId}`
);
// 5. Refresh the customer's reports
const refresh = await call(
'POST',
`/v1/customer/${customerId}/reports/refresh`
);
// 6. Wait for the refresh job to finish (refresh jobs don't send webhooks)
await waitForJob(refresh.jobId);
// 7. Retrieve the customer's reports
const reports = await call('GET', `/v1/customer/${customerId}/reports`);
import os
import time
import requests
BASE_URL = "https://api.walkerstdata.com.au"
HEADERS = {"x-api-key": os.environ["WSD_API_KEY"]}
def call(method, path, body=None):
resp = requests.request(method, f"{BASE_URL}{path}", headers=HEADERS, json=body)
resp.raise_for_status()
return resp.json()["data"]
def wait_for_job(job_id):
while True:
job = call("GET", f"/v1/jobs/{job_id}/status")
if job["status"] in {"Completed", "CompletedWithErrors", "Failed"}:
return job
time.sleep(5)
# 1. Create the customer
customer_id = call("POST", "/v1/customer", {"abn": "12345678901"})["customerId"]
# 2. Submit their transactions
job_id = call("POST", f"/v1/customer/{customer_id}/transactions", {
"transactions": [], # ...
"accountName": "ACME Pty Ltd",
"bsb": "062001",
"accountNumber": "12345678",
"bankName": "Commonwealth Bank of Australia",
"accountType": "Business Transaction Account",
})["jobId"]
# 3. Wait for the job to finish (or subscribe to a webhook)
wait_for_job(job_id)
# 4. Retrieve enriched transactions
txns = call("GET", f"/v1/customer/{customer_id}/transactions?jobId={job_id}")
# 5. Refresh the customer's reports
refresh_job_id = call("POST", f"/v1/customer/{customer_id}/reports/refresh")["jobId"]
# 6. Wait for the refresh job to finish (refresh jobs don't send webhooks)
wait_for_job(refresh_job_id)
# 7. Retrieve the customer's reports
reports = call("GET", f"/v1/customer/{customer_id}/reports")
using System.Net.Http.Json;
using System.Text.Json.Nodes;
var http = new HttpClient { BaseAddress = new Uri("https://api.walkerstdata.com.au") };
http.DefaultRequestHeaders.Add("x-api-key", Environment.GetEnvironmentVariable("WSD_API_KEY"));
async Task<JsonNode> Call(HttpMethod method, string path, object? body = null)
{
using var request = new HttpRequestMessage(method, path)
{
Content = body is null ? null : JsonContent.Create(body),
};
var resp = await http.SendAsync(request);
resp.EnsureSuccessStatusCode();
return (await resp.Content.ReadFromJsonAsync<JsonNode>())!["data"]!;
}
async Task<JsonNode> WaitForJob(string jobId)
{
string[] terminal = ["Completed", "CompletedWithErrors", "Failed"];
while (true)
{
var job = await Call(HttpMethod.Get, $"/v1/jobs/{jobId}/status");
if (terminal.Contains((string?)job["status"])) return job;
await Task.Delay(TimeSpan.FromSeconds(5));
}
}
// 1. Create the customer
var customer = await Call(HttpMethod.Post, "/v1/customer", new { abn = "12345678901" });
var customerId = (string)customer["customerId"]!;
// 2. Submit their transactions
var submission = await Call(HttpMethod.Post, $"/v1/customer/{customerId}/transactions", new
{
transactions = Array.Empty<object>(), // ...
accountName = "ACME Pty Ltd",
bsb = "062001",
accountNumber = "12345678",
bankName = "Commonwealth Bank of Australia",
accountType = "Business Transaction Account",
});
var jobId = (string)submission["jobId"]!;
// 3. Wait for the job to finish (or subscribe to a webhook)
await WaitForJob(jobId);
// 4. Retrieve enriched transactions
var txns = await Call(HttpMethod.Get, $"/v1/customer/{customerId}/transactions?jobId={jobId}");
// 5. Refresh the customer's reports
var refresh = await Call(HttpMethod.Post, $"/v1/customer/{customerId}/reports/refresh");
// 6. Wait for the refresh job to finish (refresh jobs don't send webhooks)
await WaitForJob((string)refresh["jobId"]!);
// 7. Retrieve the customer's reports
var reports = await Call(HttpMethod.Get, $"/v1/customer/{customerId}/reports");
Step 3 can be push instead of pull - register a webhook and we'll notify your endpoint when the submission job completes. Report refresh jobs (step 6) don't send webhooks, so poll those.
Need a hand? Reach out to contact@walkerstdata.com.au and we'll help you get set up.