Complete guide to SSU Methods Transfer Analysis API
# Get all one steps
curl -X GET "http://service.ssumethods.com/api/one-steps" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Accept: application/json"
# Get one steps with filters
curl -X GET "http://service.ssumethods.com/api/one-steps?from_account=ACC001&min_amount=100" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Accept: application/json"
# Get one steps with date range
curl -X GET "http://service.ssumethods.com/api/one-steps?date_from=2024-01-01&date_to=2024-01-31&limit=20" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Accept: application/json"
// Get one steps function
const getOneSteps = async (filters = {}) => {
try {
const token = localStorage.getItem('api_token');
if (!token) {
throw new Error('No authentication token found');
}
// Build query string from filters
const queryParams = new URLSearchParams();
Object.keys(filters).forEach(key => {
if (filters[key] !== null && filters[key] !== undefined) {
queryParams.append(key, filters[key]);
}
});
const url = `http://service.ssumethods.com/api/one-steps${queryParams.toString() ? '?' + queryParams.toString() : ''}`;
const response = await fetch(url, {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`,
'Accept': 'application/json'
}
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
console.log('One steps retrieved:', data);
return data;
} catch (error) {
console.error('Error fetching one steps:', error);
throw error;
}
};
// Usage examples
getOneSteps()
.then(result => {
console.log(`Found ${result.data.transfers.length} transfers`);
console.log(`Total amount: ${result.data.summary.total_amount}`);
});
// With account filters
getOneSteps({
from_account: 'ACC001',
min_amount: 100,
limit: 20
}).then(result => {
console.log('Filtered transfers:', result.data.transfers);
});
// With date range
getOneSteps({
date_from: '2024-01-01',
date_to: '2024-01-31',
limit: 50
}).then(result => {
console.log('Date filtered transfers:', result.data.transfers);
});
// Pagination helper
const loadTransfersPage = async (page, filters = {}) => {
try {
const result = await getOneSteps({ ...filters, page, limit: 25 });
return {
transfers: result.data.transfers,
hasNext: result.data.pagination.has_next,
totalPages: result.data.pagination.total_pages,
summary: result.data.summary
};
} catch (error) {
console.error('Failed to load page:', error);
throw error;
}
};
import requests
from typing import Dict, Any, Optional
from datetime import datetime
class OneStepsAPI:
def __init__(self, base_url: str, token: str):
self.base_url = base_url
self.session = requests.Session()
self.session.headers.update({
'Authorization': f'Bearer {token}',
'Accept': 'application/json'
})
def get_one_steps(self, **filters) -> Dict[str, Any]:
"""Get one steps with optional filters"""
try:
# Remove None values from filters
params = {k: v for k, v in filters.items() if v is not None}
response = self.session.get(
f'{self.base_url}/api/one-steps',
params=params,
timeout=30
)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"API error: {e}")
raise
def get_transfers_by_account(self,
from_account: Optional[str] = None,
to_account: Optional[str] = None,
min_amount: Optional[float] = None,
max_amount: Optional[float] = None) -> Dict[str, Any]:
"""Get transfers filtered by account and amount"""
filters = {
'from_account': from_account,
'to_account': to_account,
'min_amount': min_amount,
'max_amount': max_amount
}
return self.get_one_steps(**filters)
def get_transfers_by_date_range(self,
date_from: str,
date_to: str,
limit: int = 50) -> Dict[str, Any]:
"""Get transfers within a date range"""
filters = {
'date_from': date_from,
'date_to': date_to,
'limit': limit
}
return self.get_one_steps(**filters)
def get_paginated_transfers(self, page: int = 1, limit: int = 50, **filters) -> Dict[str, Any]:
"""Get paginated transfers"""
filters.update({'page': page, 'limit': limit})
return self.get_one_steps(**filters)
# Usage example
try:
api = OneStepsAPI('http://service.ssumethods.com', 'your_access_token_here')
# Get all one steps
all_transfers = api.get_one_steps()
print(f"Found {len(all_transfers['data']['transfers'])} transfers")
print(f"Total amount: {all_transfers['data']['summary']['total_amount']}")
# Get transfers by account
account_transfers = api.get_transfers_by_account(
from_account='ACC001',
min_amount=100.0
)
for transfer in account_transfers['data']['transfers']:
print(f"From: {transfer['from_account']} To: {transfer['to_account']}")
print(f"Amount: {transfer['amount']} Date: {transfer['date']}")
print("---")
# Get transfers by date range
date_transfers = api.get_transfers_by_date_range(
date_from='2024-01-01',
date_to='2024-01-31',
limit=20
)
print(f"Transfers in date range: {len(date_transfers['data']['transfers'])}")
# Pagination example
page = 1
while True:
result = api.get_paginated_transfers(page=page, limit=10)
transfers = result['data']['transfers']
if not transfers:
break
print(f"Page {page}: {len(transfers)} transfers")
if not result['data']['pagination']['has_next']:
break
page += 1
except Exception as e:
print(f"Error: {e}")
<?php
class OneStepsAPI {
private $baseUrl;
private $token;
public function __construct($baseUrl, $token) {
$this->baseUrl = rtrim($baseUrl, '/');
$this->token = $token;
}
public function getOneSteps($filters = []) {
$url = $this->baseUrl . '/api/one-steps';
if (!empty($filters)) {
$url .= '?' . http_build_query($filters);
}
return $this->makeRequest($url);
}
public function getTransfersByAccount($fromAccount = null, $toAccount = null,
$minAmount = null, $maxAmount = null) {
$filters = array_filter([
'from_account' => $fromAccount,
'to_account' => $toAccount,
'min_amount' => $minAmount,
'max_amount' => $maxAmount
], function($value) { return $value !== null; });
return $this->getOneSteps($filters);
}
public function getTransfersByDateRange($dateFrom, $dateTo, $limit = 50) {
$filters = [
'date_from' => $dateFrom,
'date_to' => $dateTo,
'limit' => $limit
];
return $this->getOneSteps($filters);
}
public function getPaginatedTransfers($page = 1, $limit = 50, $filters = []) {
$filters['page'] = $page;
$filters['limit'] = $limit;
return $this->getOneSteps($filters);
}
private function makeRequest($url) {
$headers = [
'Authorization: Bearer ' . $this->token,
'Accept: application/json'
];
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_TIMEOUT => 30,
CURLOPT_SSL_VERIFYPEER => false
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
if ($error) {
throw new Exception("cURL Error: " . $error);
}
$decodedResponse = json_decode($response, true);
if ($httpCode >= 400) {
$message = isset($decodedResponse['message']) ? $decodedResponse['message'] : 'Unknown error';
throw new Exception("HTTP Error $httpCode: " . $message);
}
return $decodedResponse;
}
}
// Usage example
try {
$api = new OneStepsAPI('http://service.ssumethods.com', 'your_access_token_here');
// Get all transfers
$allTransfers = $api->getOneSteps();
echo "Found " . count($allTransfers['data']['transfers']) . " transfers\n";
echo "Total amount: " . $allTransfers['data']['summary']['total_amount'] . "\n";
// Get transfers by account
$accountTransfers = $api->getTransfersByAccount(
$fromAccount = 'ACC001',
$toAccount = null,
$minAmount = 100.0,
$maxAmount = null
);
foreach ($accountTransfers['data']['transfers'] as $transfer) {
echo "From: " . $transfer['from_account'] . " To: " . $transfer['to_account'] . "\n";
echo "Amount: " . $transfer['amount'] . " Date: " . $transfer['date'] . "\n";
echo "---\n";
}
// Get transfers by date range
$dateTransfers = $api->getTransfersByDateRange('2024-01-01', '2024-01-31', 20);
echo "Transfers in date range: " . count($dateTransfers['data']['transfers']) . "\n";
// Pagination example
$page = 1;
while (true) {
$result = $api->getPaginatedTransfers($page, 10);
$transfers = $result['data']['transfers'];
if (empty($transfers)) {
break;
}
echo "Page $page: " . count($transfers) . " transfers\n";
if (!$result['data']['pagination']['has_next']) {
break;
}
$page++;
}
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . "\n";
}
?>
import java.io.IOException;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.JsonNode;
public class OneStepsAPI {
private final String baseUrl;
private final String token;
private final HttpClient httpClient;
private final ObjectMapper objectMapper;
public OneStepsAPI(String baseUrl, String token) {
this.baseUrl = baseUrl.replaceAll("/$", "");
this.token = token;
this.httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(30))
.build();
this.objectMapper = new ObjectMapper();
}
public JsonNode getOneSteps() throws IOException, InterruptedException {
return getOneSteps(new HashMap<>());
}
public JsonNode getOneSteps(Map<String, Object> filters) throws IOException, InterruptedException {
String url = this.baseUrl + "/api/one-steps";
if (!filters.isEmpty()) {
String queryString = filters.entrySet().stream()
.filter(entry -> entry.getValue() != null)
.map(entry -> URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8) + "=" +
URLEncoder.encode(entry.getValue().toString(), StandardCharsets.UTF_8))
.collect(Collectors.joining("&"));
url += "?" + queryString;
}
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Authorization", "Bearer " + this.token)
.header("Accept", "application/json")
.GET()
.timeout(Duration.ofSeconds(30))
.build();
HttpResponse<String> response = httpClient.send(
request,
HttpResponse.BodyHandlers.ofString()
);
if (response.statusCode() != 200) {
throw new RuntimeException("Request failed with HTTP " + response.statusCode() +
": " + response.body());
}
return objectMapper.readTree(response.body());
}
public JsonNode getTransfersByAccount(String fromAccount, String toAccount,
Double minAmount, Double maxAmount)
throws IOException, InterruptedException {
Map<String, Object> filters = new HashMap<>();
if (fromAccount != null) filters.put("from_account", fromAccount);
if (toAccount != null) filters.put("to_account", toAccount);
if (minAmount != null) filters.put("min_amount", minAmount);
if (maxAmount != null) filters.put("max_amount", maxAmount);
return getOneSteps(filters);
}
public JsonNode getTransfersByDateRange(String dateFrom, String dateTo, int limit)
throws IOException, InterruptedException {
Map<String, Object> filters = new HashMap<>();
filters.put("date_from", dateFrom);
filters.put("date_to", dateTo);
filters.put("limit", limit);
return getOneSteps(filters);
}
public JsonNode getPaginatedTransfers(int page, int limit) throws IOException, InterruptedException {
Map<String, Object> filters = new HashMap<>();
filters.put("page", page);
filters.put("limit", limit);
return getOneSteps(filters);
}
public static void main(String[] args) {
try {
OneStepsAPI api = new OneStepsAPI(
"http://service.ssumethods.com",
"your_access_token_here"
);
// Get all transfers
JsonNode allTransfers = api.getOneSteps();
JsonNode transfers = allTransfers.get("data").get("transfers");
JsonNode summary = allTransfers.get("data").get("summary");
System.out.println("Found " + transfers.size() + " transfers");
System.out.println("Total amount: " + summary.get("total_amount").asDouble());
// Get transfers by account
JsonNode accountTransfers = api.getTransfersByAccount("ACC001", null, 100.0, null);
JsonNode filteredTransfers = accountTransfers.get("data").get("transfers");
for (JsonNode transfer : filteredTransfers) {
System.out.println("From: " + transfer.get("from_account").asText() +
" To: " + transfer.get("to_account").asText());
System.out.println("Amount: " + transfer.get("amount").asDouble() +
" Date: " + transfer.get("date").asText());
System.out.println("---");
}
// Get transfers by date range
JsonNode dateTransfers = api.getTransfersByDateRange("2024-01-01", "2024-01-31", 20);
JsonNode dateFilteredTransfers = dateTransfers.get("data").get("transfers");
System.out.println("Transfers in date range: " + dateFilteredTransfers.size());
// Pagination example
int page = 1;
while (true) {
JsonNode result = api.getPaginatedTransfers(page, 10);
JsonNode pageTransfers = result.get("data").get("transfers");
if (pageTransfers.size() == 0) {
break;
}
System.out.println("Page " + page + ": " + pageTransfers.size() + " transfers");
if (!result.get("data").get("pagination").get("has_next").asBoolean()) {
break;
}
page++;
}
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
"strings"
"time"
)
type OneStepsAPI struct {
BaseURL string
Token string
Client *http.Client
}
type Transfer struct {
ID string `json:"id"`
FromAccount string `json:"from_account"`
ToAccount string `json:"to_account"`
Amount float64 `json:"amount"`
Date string `json:"date"`
Description string `json:"description"`
TransactionID string `json:"transaction_id"`
Timestamp string `json:"timestamp"`
}
type OneStepsResponse struct {
Success bool `json:"success"`
Message string `json:"message"`
Data struct {
Transfers []Transfer `json:"transfers"`
Pagination struct {
CurrentPage int `json:"current_page"`
PerPage int `json:"per_page"`
Total int `json:"total"`
TotalPages int `json:"total_pages"`
HasNext bool `json:"has_next"`
HasPrevious bool `json:"has_previous"`
} `json:"pagination"`
Summary struct {
TotalTransfers int `json:"total_transfers"`
TotalAmount float64 `json:"total_amount"`
UniqueSenders int `json:"unique_senders"`
UniqueReceivers int `json:"unique_receivers"`
DateRange struct {
Start string `json:"start"`
End string `json:"end"`
} `json:"date_range"`
AverageAmount float64 `json:"average_amount"`
LargestTransfer float64 `json:"largest_transfer"`
SmallestTransfer float64 `json:"smallest_transfer"`
} `json:"summary"`
} `json:"data"`
}
func NewOneStepsAPI(baseURL, token string) *OneStepsAPI {
return &OneStepsAPI{
BaseURL: strings.TrimSuffix(baseURL, "/"),
Token: token,
Client: &http.Client{
Timeout: 30 * time.Second,
},
}
}
func (api *OneStepsAPI) GetOneSteps(filters map[string]interface{}) (*OneStepsResponse, error) {
baseURL := api.BaseURL + "/api/one-steps"
// Build query parameters
if len(filters) > 0 {
params := url.Values{}
for key, value := range filters {
if value != nil {
params.Add(key, fmt.Sprintf("%v", value))
}
}
baseURL += "?" + params.Encode()
}
req, err := http.NewRequest("GET", baseURL, nil)
if err != nil {
return nil, fmt.Errorf("creating request: %w", err)
}
req.Header.Set("Authorization", "Bearer "+api.Token)
req.Header.Set("Accept", "application/json")
resp, err := api.Client.Do(req)
if err != nil {
return nil, fmt.Errorf("making request: %w", err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("reading response: %w", err)
}
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("request failed with status %d: %s", resp.StatusCode, string(body))
}
var oneStepsResp OneStepsResponse
if err := json.Unmarshal(body, &oneStepsResp); err != nil {
return nil, fmt.Errorf("parsing response: %w", err)
}
return &oneStepsResp, nil
}
func (api *OneStepsAPI) GetTransfersByAccount(fromAccount, toAccount *string, minAmount, maxAmount *float64) (*OneStepsResponse, error) {
filters := make(map[string]interface{})
if fromAccount != nil {
filters["from_account"] = *fromAccount
}
if toAccount != nil {
filters["to_account"] = *toAccount
}
if minAmount != nil {
filters["min_amount"] = *minAmount
}
if maxAmount != nil {
filters["max_amount"] = *maxAmount
}
return api.GetOneSteps(filters)
}
func (api *OneStepsAPI) GetTransfersByDateRange(dateFrom, dateTo string, limit int) (*OneStepsResponse, error) {
filters := map[string]interface{}{
"date_from": dateFrom,
"date_to": dateTo,
"limit": limit,
}
return api.GetOneSteps(filters)
}
func (api *OneStepsAPI) GetPaginatedTransfers(page, limit int, filters map[string]interface{}) (*OneStepsResponse, error) {
if filters == nil {
filters = make(map[string]interface{})
}
filters["page"] = page
filters["limit"] = limit
return api.GetOneSteps(filters)
}
func main() {
api := NewOneStepsAPI("http://service.ssumethods.com", "your_access_token_here")
// Get all transfers
allTransfers, err := api.GetOneSteps(nil)
if err != nil {
fmt.Printf("Error getting transfers: %v\n", err)
return
}
fmt.Printf("Found %d transfers\n", len(allTransfers.Data.Transfers))
fmt.Printf("Total amount: %.2f\n", allTransfers.Data.Summary.TotalAmount)
// Get transfers by account
fromAccount := "ACC001"
minAmount := 100.0
accountTransfers, err := api.GetTransfersByAccount(&fromAccount, nil, &minAmount, nil)
if err != nil {
fmt.Printf("Error getting account transfers: %v\n", err)
return
}
for _, transfer := range accountTransfers.Data.Transfers {
fmt.Printf("From: %s To: %s\n", transfer.FromAccount, transfer.ToAccount)
fmt.Printf("Amount: %.2f Date: %s\n", transfer.Amount, transfer.Date)
fmt.Println("---")
}
// Get transfers by date range
dateTransfers, err := api.GetTransfersByDateRange("2024-01-01", "2024-01-31", 20)
if err != nil {
fmt.Printf("Error getting date transfers: %v\n", err)
return
}
fmt.Printf("Transfers in date range: %d\n", len(dateTransfers.Data.Transfers))
// Pagination example
page := 1
for {
result, err := api.GetPaginatedTransfers(page, 10, nil)
if err != nil {
fmt.Printf("Error getting page %d: %v\n", page, err)
break
}
if len(result.Data.Transfers) == 0 {
break
}
fmt.Printf("Page %d: %d transfers\n", page, len(result.Data.Transfers))
if !result.Data.Pagination.HasNext {
break
}
page++
}
}