StateSet provides official SDKs for popular languages to accelerate your integration development.
Official SDKs
Node.js / TypeScript
Full-featured SDK with TypeScript support
Python
Pythonic interface with async support
Go
High-performance SDK for Go applications
Ruby
Idiomatic Ruby SDK with Rails integration
PHP
Modern PHP SDK with PSR compliance
.NET / C#
.NET SDK with async/await support
Java
Enterprise-ready Java SDK
Swift
Native iOS/macOS SDK
Node.js / TypeScript
Installation
Copy
Ask AI
npm install @stateset/stateset-node
Quick Start
Copy
Ask AI
import { StateSet } from '@stateset/stateset-node';
// Initialize client
const stateset = new StateSet({
apiKey: process.env.STATESET_API_KEY,
// Optional configuration
environment: 'production', // or 'sandbox'
timeout: 30000, // 30 seconds
maxRetries: 3,
apiVersion: '2024-01-01'
});
// TypeScript types are included
const order: StateSet.Order = await stateset.orders.create({
customer: {
email: 'customer@example.com',
first_name: 'John',
last_name: 'Doe'
},
items: [{
sku: 'WIDGET-001',
quantity: 2,
price: 2999
}],
shipping_address: {
line1: '123 Main St',
city: 'San Francisco',
state: 'CA',
postal_code: '94105',
country: 'US'
}
});
Advanced Features
Async Iteration
Copy
Ask AI
// Iterate through all orders
for await (const order of stateset.orders.list()) {
console.log(order.id);
}
// With filters
for await (const order of stateset.orders.list({
status: 'pending'
})) {
await processOrder(order);
}
Request Interceptors
Copy
Ask AI
// Add request interceptor
stateset.interceptors.request.use((config) => {
config.headers['X-Custom-Header'] = 'value';
console.log(`Making request to ${config.url}`);
return config;
});
// Add response interceptor
stateset.interceptors.response.use(
(response) => {
console.log(`Request completed in ${response.duration}ms`);
return response;
},
(error) => {
console.error('Request failed:', error);
throw error;
}
);
Event Emitters
Copy
Ask AI
// Listen for events
stateset.on('request', (event) => {
console.log('Request:', event);
});
stateset.on('response', (event) => {
console.log('Response:', event);
});
stateset.on('error', (error) => {
console.error('Error:', error);
});
stateset.on('rateLimit', (info) => {
console.warn('Rate limited:', info);
});
Custom HTTP Client
Copy
Ask AI
import axios from 'axios';
const stateset = new StateSet({
apiKey: process.env.STATESET_API_KEY,
httpClient: axios.create({
timeout: 60000,
proxy: {
host: 'proxy.example.com',
port: 8080
}
})
});
TypeScript Support
Copy
Ask AI
import { StateSet } from '@stateset/stateset-node';
import type {
Order,
Customer,
Return,
OrderCreateParams,
PaginatedResponse
} from '@stateset/stateset-node';
// Full type safety
async function createOrder(
params: OrderCreateParams
): Promise<Order> {
return await stateset.orders.create(params);
}
// Generic pagination
async function getAllOrders(): Promise<Order[]> {
const response: PaginatedResponse<Order> =
await stateset.orders.list();
return response.data;
}
// Type guards
function isOrder(obj: any): obj is Order {
return obj && obj.object === 'order';
}
Python
Installation
Copy
Ask AI
pip install stateset-python
Quick Start
Copy
Ask AI
from stateset import StateSet
import os
# Initialize client
stateset = StateSet(
api_key=os.getenv('STATESET_API_KEY'),
# Optional configuration
environment='production', # or 'sandbox'
timeout=30, # seconds
max_retries=3,
api_version='2024-01-01'
)
# Create an order
order = stateset.orders.create(
customer={
'email': 'customer@example.com',
'first_name': 'John',
'last_name': 'Doe'
},
items=[{
'sku': 'WIDGET-001',
'quantity': 2,
'price': 2999
}],
shipping_address={
'line1': '123 Main St',
'city': 'San Francisco',
'state': 'CA',
'postal_code': '94105',
'country': 'US'
}
)
Async Support
Copy
Ask AI
import asyncio
from stateset import AsyncStateSet
async def main():
# Async client
async with AsyncStateSet(api_key=api_key) as stateset:
# Concurrent requests
orders = await asyncio.gather(
stateset.orders.get('ord_123'),
stateset.orders.get('ord_456'),
stateset.orders.get('ord_789')
)
# Async iteration
async for order in stateset.orders.list_async():
print(order.id)
asyncio.run(main())
Context Managers
Copy
Ask AI
from stateset import StateSet
# Automatic resource cleanup
with StateSet(api_key=api_key) as stateset:
orders = stateset.orders.list()
for order in orders:
print(order.id)
Type Hints
Copy
Ask AI
from typing import List, Optional
from stateset import StateSet
from stateset.types import Order, Customer, OrderCreateParams
def create_order(
stateset: StateSet,
params: OrderCreateParams
) -> Order:
"""Create a new order with type safety."""
return stateset.orders.create(**params)
def get_customer_orders(
stateset: StateSet,
customer_id: str,
status: Optional[str] = None
) -> List[Order]:
"""Get all orders for a customer."""
filters = {'customer_id': customer_id}
if status:
filters['status'] = status
return list(stateset.orders.list(**filters))
Go
Installation
Copy
Ask AI
go get github.com/stateset/stateset-go
Quick Start
Copy
Ask AI
package main
import (
"context"
"fmt"
"os"
"github.com/stateset/stateset-go"
"github.com/stateset/stateset-go/order"
)
func main() {
// Initialize client
client := stateset.NewClient(
os.Getenv("STATESET_API_KEY"),
&stateset.Config{
Environment: stateset.Production,
Timeout: 30 * time.Second,
MaxRetries: 3,
},
)
// Create an order
params := &order.CreateParams{
Customer: &order.CustomerParams{
Email: stateset.String("customer@example.com"),
FirstName: stateset.String("John"),
LastName: stateset.String("Doe"),
},
Items: []*order.ItemParams{{
SKU: stateset.String("WIDGET-001"),
Quantity: stateset.Int64(2),
Price: stateset.Int64(2999),
}},
ShippingAddress: &order.AddressParams{
Line1: stateset.String("123 Main St"),
City: stateset.String("San Francisco"),
State: stateset.String("CA"),
PostalCode: stateset.String("94105"),
Country: stateset.String("US"),
},
}
order, err := client.Orders.Create(context.Background(), params)
if err != nil {
panic(err)
}
fmt.Printf("Order created: %s\n", order.ID)
}
Error Handling
Copy
Ask AI
import (
"errors"
"github.com/stateset/stateset-go"
)
func handleOrder(client *stateset.Client, orderID string) error {
order, err := client.Orders.Get(context.Background(), orderID)
if err != nil {
var statesetErr *stateset.Error
if errors.As(err, &statesetErr) {
switch statesetErr.Code {
case stateset.ErrorCodeRateLimit:
// Handle rate limiting
time.Sleep(time.Duration(statesetErr.RetryAfter) * time.Second)
return handleOrder(client, orderID) // Retry
case stateset.ErrorCodeNotFound:
// Handle not found
return fmt.Errorf("order %s not found", orderID)
default:
return fmt.Errorf("API error: %v", statesetErr)
}
}
return err
}
// Process order
return nil
}
Concurrent Operations
Copy
Ask AI
func fetchOrdersConcurrently(client *stateset.Client, orderIDs []string) ([]*order.Order, error) {
var wg sync.WaitGroup
orders := make([]*order.Order, len(orderIDs))
errors := make([]error, len(orderIDs))
for i, id := range orderIDs {
wg.Add(1)
go func(index int, orderID string) {
defer wg.Done()
ord, err := client.Orders.Get(context.Background(), orderID)
orders[index] = ord
errors[index] = err
}(i, id)
}
wg.Wait()
// Check for errors
for _, err := range errors {
if err != nil {
return nil, err
}
}
return orders, nil
}
Ruby
Installation
Copy
Ask AI
# Gemfile
gem 'stateset-ruby'
Copy
Ask AI
bundle install
# or
gem install stateset-ruby
Quick Start
Copy
Ask AI
require 'stateset'
# Initialize client
Stateset.api_key = ENV['STATESET_API_KEY']
# Or configure globally
Stateset.configure do |config|
config.api_key = ENV['STATESET_API_KEY']
config.environment = :production # or :sandbox
config.timeout = 30
config.max_retries = 3
end
# Create an order
order = Stateset::Order.create(
customer: {
email: 'customer@example.com',
first_name: 'John',
last_name: 'Doe'
},
items: [{
sku: 'WIDGET-001',
quantity: 2,
price: 2999
}],
shipping_address: {
line1: '123 Main St',
city: 'San Francisco',
state: 'CA',
postal_code: '94105',
country: 'US'
}
)
puts "Order created: #{order.id}"
Rails Integration
Copy
Ask AI
# config/initializers/stateset.rb
Stateset.configure do |config|
config.api_key = Rails.application.credentials.stateset[:api_key]
config.environment = Rails.env.production? ? :production : :sandbox
config.logger = Rails.logger
end
# app/models/concerns/stateset_syncable.rb
module StatesetSyncable
extend ActiveSupport::Concern
included do
after_create :sync_to_stateset
after_update :update_in_stateset
end
def sync_to_stateset
StatesetSyncJob.perform_later(self)
end
def update_in_stateset
StatesetUpdateJob.perform_later(self)
end
end
# app/models/order.rb
class Order < ApplicationRecord
include StatesetSyncable
def to_stateset_params
{
external_id: id,
customer: {
email: customer.email,
first_name: customer.first_name,
last_name: customer.last_name
},
items: items.map(&:to_stateset_params)
}
end
end
Error Handling
Copy
Ask AI
begin
order = Stateset::Order.create(params)
rescue Stateset::RateLimitError => e
# Handle rate limiting
sleep(e.retry_after)
retry
rescue Stateset::ValidationError => e
# Handle validation errors
e.errors.each do |error|
puts "#{error.field}: #{error.message}"
end
rescue Stateset::APIError => e
# Handle other API errors
puts "API Error: #{e.message}"
end
PHP
Installation
Copy
Ask AI
composer require stateset/stateset-php
Quick Start
Copy
Ask AI
<?php
require_once 'vendor/autoload.php';
use Stateset\StatesetClient;
use Stateset\Exception\ApiException;
// Initialize client
$stateset = new StatesetClient([
'apiKey' => $_ENV['STATESET_API_KEY'],
'environment' => 'production', // or 'sandbox'
'timeout' => 30,
'maxRetries' => 3
]);
// Create an order
try {
$order = $stateset->orders->create([
'customer' => [
'email' => 'customer@example.com',
'first_name' => 'John',
'last_name' => 'Doe'
],
'items' => [[
'sku' => 'WIDGET-001',
'quantity' => 2,
'price' => 2999
]],
'shipping_address' => [
'line1' => '123 Main St',
'city' => 'San Francisco',
'state' => 'CA',
'postal_code' => '94105',
'country' => 'US'
]
]);
echo "Order created: {$order->id}\n";
} catch (ApiException $e) {
echo "Error: {$e->getMessage()}\n";
}
Laravel Integration
Copy
Ask AI
// config/stateset.php
return [
'api_key' => env('STATESET_API_KEY'),
'environment' => env('STATESET_ENVIRONMENT', 'production'),
'timeout' => 30,
'max_retries' => 3,
];
// app/Providers/StatesetServiceProvider.php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Stateset\StatesetClient;
class StatesetServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->singleton(StatesetClient::class, function ($app) {
return new StatesetClient(config('stateset'));
});
}
}
// app/Services/OrderService.php
namespace App\Services;
use Stateset\StatesetClient;
class OrderService
{
protected $stateset;
public function __construct(StatesetClient $stateset)
{
$this->stateset = $stateset;
}
public function createOrder(array $data)
{
return $this->stateset->orders->create($data);
}
}
.NET / C#
Installation
Copy
Ask AI
dotnet add package StateSet.Net
Quick Start
Copy
Ask AI
using StateSet;
using StateSet.Models;
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
// Initialize client
var client = new StateSetClient(
Environment.GetEnvironmentVariable("STATESET_API_KEY"),
new StateSetOptions
{
Environment = StateSetEnvironment.Production,
Timeout = TimeSpan.FromSeconds(30),
MaxRetries = 3
}
);
// Create an order
var order = await client.Orders.CreateAsync(new OrderCreateParams
{
Customer = new CustomerParams
{
Email = "customer@example.com",
FirstName = "John",
LastName = "Doe"
},
Items = new List<OrderItemParams>
{
new OrderItemParams
{
Sku = "WIDGET-001",
Quantity = 2,
Price = 2999
}
},
ShippingAddress = new AddressParams
{
Line1 = "123 Main St",
City = "San Francisco",
State = "CA",
PostalCode = "94105",
Country = "US"
}
});
Console.WriteLine($"Order created: {order.Id}");
}
}
Dependency Injection (ASP.NET Core)
Copy
Ask AI
// Startup.cs or Program.cs
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddStateSet(options =>
{
options.ApiKey = Configuration["StateSet:ApiKey"];
options.Environment = StateSetEnvironment.Production;
});
services.AddScoped<IOrderService, OrderService>();
}
}
// Services/OrderService.cs
public interface IOrderService
{
Task<Order> CreateOrderAsync(OrderDto orderDto);
}
public class OrderService : IOrderService
{
private readonly IStateSetClient _stateset;
public OrderService(IStateSetClient stateset)
{
_stateset = stateset;
}
public async Task<Order> CreateOrderAsync(OrderDto orderDto)
{
return await _stateset.Orders.CreateAsync(orderDto.ToStateSetParams());
}
}
Java
Installation
Maven
Copy
Ask AI
<dependency>
<groupId>com.stateset</groupId>
<artifactId>stateset-java</artifactId>
<version>3.0.0</version>
</dependency>
Gradle
Copy
Ask AI
implementation 'com.stateset:stateset-java:3.0.0'
Quick Start
Copy
Ask AI
import com.stateset.StateSet;
import com.stateset.model.Order;
import com.stateset.param.OrderCreateParams;
import com.stateset.exception.StateSetException;
public class Main {
public static void main(String[] args) {
// Initialize client
StateSet.apiKey = System.getenv("STATESET_API_KEY");
// Or use builder
StateSet stateset = StateSet.builder()
.setApiKey(System.getenv("STATESET_API_KEY"))
.setEnvironment(StateSet.Environment.PRODUCTION)
.setTimeout(30000)
.setMaxRetries(3)
.build();
try {
// Create an order
OrderCreateParams params = OrderCreateParams.builder()
.setCustomer(
OrderCreateParams.Customer.builder()
.setEmail("customer@example.com")
.setFirstName("John")
.setLastName("Doe")
.build()
)
.addItem(
OrderCreateParams.Item.builder()
.setSku("WIDGET-001")
.setQuantity(2)
.setPrice(2999L)
.build()
)
.setShippingAddress(
OrderCreateParams.Address.builder()
.setLine1("123 Main St")
.setCity("San Francisco")
.setState("CA")
.setPostalCode("94105")
.setCountry("US")
.build()
)
.build();
Order order = Order.create(params);
System.out.println("Order created: " + order.getId());
} catch (StateSetException e) {
System.err.println("Error: " + e.getMessage());
}
}
}
Spring Boot Integration
Copy
Ask AI
// Configuration
@Configuration
public class StateSetConfig {
@Value("${stateset.api-key}")
private String apiKey;
@Bean
public StateSet statesetClient() {
return StateSet.builder()
.setApiKey(apiKey)
.setEnvironment(StateSet.Environment.PRODUCTION)
.build();
}
}
// Service
@Service
public class OrderService {
private final StateSet stateset;
@Autowired
public OrderService(StateSet stateset) {
this.stateset = stateset;
}
public Order createOrder(OrderRequest request) throws StateSetException {
OrderCreateParams params = convertToParams(request);
return Order.create(params);
}
}
Swift
Installation
Swift Package Manager
Copy
Ask AI
dependencies: [
.package(url: "https://github.com/stateset/stateset-swift.git", from: "2.0.0")
]
CocoaPods
Copy
Ask AI
pod 'StateSet', '~> 2.0'
Quick Start
Copy
Ask AI
import StateSet
// Initialize client
let client = StateSetClient(
apiKey: ProcessInfo.processInfo.environment["STATESET_API_KEY"]!,
environment: .production,
timeout: 30,
maxRetries: 3
)
// Create an order
let customer = CustomerParams(
email: "customer@example.com",
firstName: "John",
lastName: "Doe"
)
let item = OrderItemParams(
sku: "WIDGET-001",
quantity: 2,
price: 2999
)
let address = AddressParams(
line1: "123 Main St",
city: "San Francisco",
state: "CA",
postalCode: "94105",
country: "US"
)
let params = OrderCreateParams(
customer: customer,
items: [item],
shippingAddress: address
)
client.orders.create(params) { result in
switch result {
case .success(let order):
print("Order created: \(order.id)")
case .failure(let error):
print("Error: \(error.localizedDescription)")
}
}
Async/Await Support
Copy
Ask AI
// iOS 13+, macOS 10.15+
@available(iOS 13.0, *)
func createOrder() async throws {
let order = try await client.orders.create(params)
print("Order created: \(order.id)")
}
// SwiftUI Integration
struct OrderView: View {
@StateObject private var viewModel = OrderViewModel()
var body: some View {
Button("Create Order") {
Task {
await viewModel.createOrder()
}
}
}
}
@MainActor
class OrderViewModel: ObservableObject {
@Published var order: Order?
@Published var isLoading = false
@Published var error: Error?
private let client = StateSetClient()
func createOrder() async {
isLoading = true
do {
order = try await client.orders.create(params)
} catch {
self.error = error
}
isLoading = false
}
}
SDK Features Comparison
Feature | Node.js | Python | Go | Ruby | PHP | .NET | Java | Swift |
---|---|---|---|---|---|---|---|---|
Type Safety | ✅ TypeScript | ✅ Type Hints | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ |
Async/Await | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ CompletableFuture | ✅ |
Auto-Retry | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Webhooks | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Pagination | ✅ Auto | ✅ Auto | ✅ Manual | ✅ Auto | ✅ Manual | ✅ Auto | ✅ Manual | ✅ Auto |
Streaming | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ |
Interceptors | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ |
File Upload | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
GraphQL | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Common Patterns
Error Handling Across SDKs
All SDKs follow similar error handling patterns:Copy
Ask AI
// JavaScript/TypeScript
try {
const order = await stateset.orders.create(params);
} catch (error) {
if (error.code === 'rate_limited') {
// Handle rate limiting
} else if (error.code === 'validation_error') {
// Handle validation errors
} else {
// Handle other errors
}
}
Copy
Ask AI
# Python
try:
order = stateset.orders.create(**params)
except RateLimitError as e:
# Handle rate limiting
pass
except ValidationError as e:
# Handle validation errors
pass
except StateSetError as e:
# Handle other errors
pass
Idempotency Across SDKs
All SDKs support idempotency keys:Copy
Ask AI
// JavaScript
const order = await stateset.orders.create(params, {
idempotencyKey: 'unique-key-123'
});
Copy
Ask AI
# Python
order = stateset.orders.create(
**params,
idempotency_key='unique-key-123'
)
Copy
Ask AI
// Go
params.IdempotencyKey = stateset.String("unique-key-123")
order, err := client.Orders.Create(ctx, params)
Community SDKs
Community SDKs are not officially maintained by StateSet. Use at your own discretion.
- Rust: stateset-rust
- Kotlin: stateset-kotlin
- Dart/Flutter: stateset-dart
- Elixir: stateset-elixir
- Clojure: stateset-clj
SDK Development
Contributing
We welcome contributions to our SDKs! See our SDK Development Guide for:- Code style guidelines
- Testing requirements
- Release process
- API coverage requirements
Reporting Issues
- Bug Reports: GitHub Issues
- Feature Requests: Discord Community
- Security Issues: security@stateset.com
Related Resources
- API Reference - Complete API documentation
- Quickstart Guide - Get started quickly
- Authentication - Auth methods
- Error Handling - Error codes and handling
- Code Examples - Sample implementations
Need SDK support? Contact sdk-support@stateset.com or visit our Discord community.