Complete API SDK Generation Platform

Accelerate API Adoption for Developers and AI

Transform your OpenAPI specs into production-ready SDKs, developer portals, code samples, and AI tools—automatically.

Speed up integrations, boost API adoption, and keep everything in sync.

Hero_Image_only_elements Banner Hero

Trusted by the World’s Leading API Companies

Docs falling behind? SDKs out of sync? Now, AI tools need support too.

Before APIMatic: API Chaos

  • Manual SDK Maintenance: Every API update requires hours of patching multiple SDKs
    across languages
  • Outdated Documentation: Docs, portals, and samples lag, causing integration delays
  • Engineering Bottlenecks: Teams fix artifacts instead of building features
  • Poor Developer Experience: Fragmented tools frustrate partners and slow adoption
  • AI Integration Gaps: GenAI agents struggle without structured, up-to-date specs
before-api-matic-api-chaos-neww

With APIMatic: Developer Zen

  • Automated Sync: SDKs, docs, and
    samples stay current—no
    manual work
  • Instant Onboarding: Developers integrate
    in minutes with ready-to-use resources
  • Engineering Freedom: API teams focus on innovation, not maintenance
  • Seamless Developer Experience: Consistent, branded tools drive API adoption
  • AI-Ready: Generate structured outputs for GenAI tools and LLMs instantly
with-api-matic-developer-zen-neww

With APIMatic, you can create idiomatic SDKs, API documentation, code samples, and AI tools—automatically, in one Complete API SDK Generation Platform.

Complete API SDK Generation Platform

Your Battle-Tested SDKs. Generated by APIMatic.

SDKs in 7+ Languages

Auto-generate idiomatic SDKs in Java, Python, TypeScript, Ruby, C#, PHP, and Go—no extra work required.

  • TypeScript
  • Java
  • Python
  • C#
  • PHP
  • Ruby
  • Go
										// Maxio's TypeScript SDK is available as a NPM package with
// support for Node.js and web environments.
import {
  Client,
  SubscriptionsController,
} from "@maxio-com/advanced-billing-sdk";

// Once configured, the SDK can be used to authenticated API calls.
const client = new Client({
  basicAuth: { username: "user", password: "pass" },
});

const subscriptions = new SubscriptionsController(client);

// SDK automatically handles serialization, API errors, validation,
// and type conversion (JSON to TypeScript interfaces)
const { result } = await subscriptions.listSubscriptions({
  page: 1,
  perPage: 20,
});

// Type-safe access to response data with full IntelliSense support
console.log(result[0].subscription?.state);

										
										// Maxio's Java SDK is available as a Maven package
import com.maxio.advancedbilling.AdvancedBillingClient;
import com.maxio.advancedbilling.authentication.BasicAuthModel;
import com.maxio.advancedbilling.controllers.SubscriptionsController;
import com.maxio.advancedbilling.models.ListSubscriptionsInput;
import com.maxio.advancedbilling.models.SubscriptionResponse;
import java.util.List;

// Once configured, the SDK can be used to authenticate API calls.
AdvancedBillingClient client = new AdvancedBillingClient.Builder()
  .basicAuthCredentials(new BasicAuthModel.Builder("user", "pass")
  .build()).build();

SubscriptionsController subscriptionsController =
  client.getSubscriptionsController();

ListSubscriptionsInput listSubscriptionsInput =
  new ListSubscriptionsInput.Builder().page(2).perPage(50).build();

// SDK automatically handles serialization, API errors, validation,
// and type conversion
List<SubscriptionResponse> result = subscriptionsController
  .listSubscriptions(listSubscriptionsInput);

System.out.println(result);

										
										# Maxio's Python SDK is available as a PYPI package with
# support for the Python environment.
from advancedbilling.advanced_billing_client import AdvancedBillingClient
from advancedbilling.http.auth.basic_auth import BasicAuthCredentials

# Once configured, the SDK can be used to authenticated API calls.
client = AdvancedBillingClient(
  basic_auth_credentials=BasicAuthCredentials(
    username="user",
    password="pass"
  )
)

# SDK automatically handles serialization, API errors, validation,
# and type conversion (JSON to Python models)
result = client.subscriptions.list_subscriptions({
  "page": 1,
  "per_page": 20
})

print(result[0].subscription.state)

										
										// Maxio's .NET SDK is available as a NuGet package
using AdvancedBilling.Standard;
using AdvancedBilling.Standard.Authentication;
using AdvancedBilling.Standard.Models;

// Once configured, the SDK can be used to authenticated API calls.
var client = new AdvancedBillingClient.Builder()
  .BasicAuthCredentials(
      new BasicAuthModel.Builder("user", "pass").Build())
  .Build();

var subscriptions = client.SubscriptionsController;

// SDK automatically handles serialization, API errors, validation,
// and type conversion (JSON to C# models)
var result = await subscriptions.ListSubscriptionsAsync(
  new ListSubscriptionsInput
  {
      Page = 1,
      PerPage = 20
  });

// Type-safe access to response data with full IntelliSense support
Console.WriteLine(result[0].Subscription.State);

										
										<?php

use AdvancedBillingLib\Authentication\BasicAuthCredentialsBuilder;
use AdvancedBillingLib\AdvancedBillingClientBuilder;

// Initialize the client using the builder
$client = AdvancedBillingClientBuilder::init()
    ->basicAuthCredentials(
        BasicAuthCredentialsBuilder::init('user', 'pass')
    )
    ->build();

// Retrieve the Subscriptions controller from the client
$subscriptions = $client->getSubscriptionsController();

// Make the API call to list subscriptions
$response = $subscriptions->listSubscriptions([
    'page' => 1,
    'perPage' => 20,
]);

// Extract and access subscription data
$subscriptions = $response->getResult();

echo $subscriptions[0]->getSubscription()?->getState();

										
										# Maxio's Ruby SDK is available as a gem and supports modern Ruby projects.
require 'advanced_billing'
include AdvancedBilling

# Once configured, the SDK can be used to make authenticated API calls.
client = Client.new(
  basic_auth_credentials: BasicAuthCredentials.new(
    username: 'user',
    password: 'pass'
  )
)

# The SDK automatically handles request serialization, response parsing,
# API errors, and data validation for you.
result = client.subscriptions.list_subscriptions(
  page: 1,
  per_page: 20
)

# Idiomatic Ruby: safe navigation & object access.
puts result.first&.subscription&.state

										
										// Maxio's Go SDK is available as a Go module with
// support for Go-based server environments.
import (
  "context"
  "fmt"
  "github.com/maxio-com/ab-golang-sdk"
  "github.com/maxio-com/ab-golang-sdk/models"
)

// Once configured, the SDK can be used to authenticated API calls.
client := advancedbilling.NewClient(
  advancedbilling.CreateConfiguration(
    advancedbilling.WithBasicAuthCredentials(
      advancedbilling.NewBasicAuthCredentials(
        "user",
        "pass",
      ),
    ),
  ),
)

subscriptionController := client.SubscriptionsController()

// The SDK automatically handles serialization, API error handling,
// validation, and type conversion (e.g., JSON to Go structs).
ctx := context.Background()
apiResponse, _ := subscriptionController.ListSubscriptions(ctx, advancedbilling.ListSubscriptionsInput{
  Page:    models.ToPointer(1),
  PerPage: models.ToPointer(20),
})

// Type-safe access to response data with full IntelliSense support
fmt.Println(apiResponse.Data[0].Subscription.State)

										
End-to-End Type Safety

Catch bugs early and prevent runtime failures with type-safe SDKs across languages.

  • TypeScript
  • Java
  • Python
  • C#
  • PHP
  • Ruby
  • Go
										// Type-safe model with nested objects and enums
const request: CreateSubscriptionRequest = {
  subscription: {
    // Enum ensures only valid states are used
    productHandle: ProductHandle.BasicPlan,
    // Nested customer object with validation
    customerAttributes: {
      name: "John Doe",
      email: "john@example.com",
    },
    // Typed values like Date prevent format errors
    initialBillingAt: new Date(),
  },
};

// SDK validates all types at compile-time and runtime
const { result } = await subscriptions.createSubscription(request);

// Response is fully typed with IntelliSense support
if (result.subscription?.state === SubscriptionState.Active) {
  console.log("Subscription activated successfully");
}

										
										// Type-safe model with nested objects and enums
CreateSubscriptionRequest request = new CreateSubscriptionRequest.Builder(
  new CreateSubscription.Builder()
    // Enum ensures only valid states are used
    .productHandle(ProductHandle.BasicPlan)
    // Nested customer object with validation
    .customerAttributes(new CustomerAttributes.Builder()
      .name("John Doe")
      .email("john@example.com")
      .build())
    // Typed values like Date prevents format errors
    .initialBillingAt(new Date())
    .build()
).build();


// SDK validates all types at compile-time and runtime
SubscriptionResponse result = subscriptionsController.createSubscription(request);

// Response is fully typed with IntelliSense support
if (result.getSubscription().getState() == SubscriptionState.Active) {
  System.out.println("Subscription activated successfully");
}

										
										# Construct request with enum and nested objects for strong 
# typing and validation
request = CreateSubscriptionRequest(
  subscription=CreateSubscription(
    # Enum ensures only valid plans
    product_handle=ProductHandle.BASIC_PLAN,
    # Combined first and last name
    customer_attributes=CustomerAttributes(
      name="John Doe",
      email="john@example.com",
    ),
    # Typed datetime prevents format issues
    initial_billing_at=datetime.now(),
  )
)

# Submit request—assume async or sync execution as per SDK
result = subscriptions_controller.create_subscription(
  body=request
)

# Response type-safe check for subscription state using Enum
if getattr(
  getattr(result, 'subscription', None), 'state', None
) == SubscriptionState.ACTIVE.value:
  print("Subscription activated successfully")

										
										// Type-safe model with nested objects and enums
using AdvancedBilling.Standard.Models;

CreateSubscriptionRequest body = new CreateSubscriptionRequest
{
  Subscription = new CreateSubscription
  {
    // String literal mapped validated field on server
    ProductHandle = "basic",

    // Nested customer object with validation
    CustomerAttributes = new CustomerAttributes
    {
      FirstName = "Joe",
      LastName = "Blow",
      Email = "joe@example.com"
     },

    // Typed values like DateTime prevent format errors
    InitialBillingAt = DateTime.Now,
  },
};

// SDK validates all types at compile-time and runtime
var result = await subscriptions.CreateSubscriptionAsync(body);

// Response is fully typed with IntelliSense support
if (result.Subscription.State == SubscriptionState.Active)
{
  Console.WriteLine("Subscription activated successfully");
}

										
										// Type-safe model with nested objects and enums
$request = SubscriptionRequestBuilder::init(
  SubscriptionBuilder::init()
    // Enum ensures only valid states are used
    ->productHandle(ProductHandle::BasicPlan)

    // Nested customer object with validation
    ->customerAttributes(
      CustomerAttributesBuilder::init()
        ->name('John Doe')
        ->email('john@example.com')
        ->build()
    )

    // Typed values like Date prevent format errors
    ->initialBillingAt(new DateTime())
    ->build()
)->build();

// SDK validates all types at runtime (PHP lacks compile-time checks)
$response = $subscriptions->createSubscription($request);

// Response is fully typed with IDE autocompletion support
$subscription = $response->getResult()->getSubscription();

if ($subscription?->getState() === SubscriptionState::ACTIVE) {
   echo "Subscription activated successfully" . PHP_EOL;
}

										
										# Type-safe model with nested objects and enums
body = CreateSubscriptionRequest.new(
  subscription: CreateSubscription.new(
    # Enum ensures only valid states are used
    product_handle: ProductHandle::BASIC_PLAN,

    # Nested customer object with validation
    customer_attributes: CustomerAttributes.new(
      first_name: 'John',
      last_name: 'Doe',
      email: 'john@example.com'
    ),

    # Typed values like Time prevent format errors
    initial_billing_at: Time.now
  )
)

# SDK validates all types when constructing request models and on API call
result = client.subscriptions.create_subscription(body: body)

# Response is fully typed and accessible with method calls
if result.subscription && result.subscription.state == SubscriptionState::ACTIVE
  puts "Subscription activated successfully"
end

										
										// Type-safe model with nested objects and enums
request := models.CreateSubscriptionRequest{
  Subscription: models.CreateSubscription{
    // Enum ensures only valid states are used
    ProductHandle: models.ToPointer("Basic_Plan"),
    // Nested customer object with validation
    CustomerAttributes: &models.CustomerAttributes{
      Name: models.ToPointer("John Doe"),
      Email: models.ToPointer("john@example.com"),
    },
    // Typed values like Date prevents format errors
    InitialBillingAt: &time.Time{},
  },
}

// SDK validates all types at compile-time and runtime
apiResponse, _ := subscriptions.CreateSubscription(ctx, &request)

// Response is fully typed with IntelliSense support
subscriptionState := apiResponse.Data.Subscription.State
if *subscriptionState == models.SubscriptionState_ACTIVE {
  fmt.Println("Subscription activated successfully")
}

										
Advanced OpenAPI Schemas

Accurately generate types for schemas like allOf, oneOf and anyOf as well as discriminated unions and inheritance.

  • TypeScript
  • Java
  • Python
  • C#
  • PHP
  • Ruby
  • Go
										// Maxio SDK demonstrates polymorphic payment methods. On API call,
// the SDK automatically deserializes based on discriminator field.
const { result } = await paymentProfiles.readPaymentProfile(id);
const profile = result.paymentProfile;

// The developer can write type-safe code, thanks to SDK's support
// for polymorphic types and type-narrowing in TypeScript.
if (PaymentProfile.isBankAccountPaymentProfile(profile)) {
  // TypeScript knows this has bank account fields
  console.log(profile.maskedBankAccountNumber);
} else if (PaymentProfile.isCreditCardPaymentProfile(profile)) {
  // TypeScript knows this has credit card fields
  console.log(profile.maskedCardNumber);
} else if (PaymentProfile.isPaypalPaymentProfile(profile)) {
  // TypeScript knows this has PayPal fields
  console.log(profile.paypalEmail);
} else if (PaymentProfile.isApplePayPaymentProfile(profile)) {
  // TypeScript knows this has Apple account fields
  console.log(profile.firstName);
} else {
  // profile is narrowed down to the type 'never'.
}

										
										// Maxio SDK demonstrates polymorphic payment methods. On API call,
// the SDK automatically deserializes based on discriminator field.
PaymentProfileResponse result =
  paymentProfilesController.readPaymentProfile(id);
PaymentProfile profile = result.getPaymentProfile();

// The 'match' method handle each specific payment profile subtype
// without requiring explicit type checks or casting.
profile.match(new PaymentProfile.Cases<Void>() {
  @Override
  public Void bankAccountPaymentProfile(BankAccountPaymentProfile bankAccountProfile) {
    System.out.println(bankAccountProfile.getMaskedBankAccountNumber());
    return null;
  }
  @Override
  public Void creditCardPaymentProfile(CreditCardPaymentProfile creditCardPaymentProfile) {
    System.out.println(creditCardPaymentProfile.getMaskedCardNumber());
    return null;
  }
  @Override
  public Void paypalPaymentProfile(PaypalPaymentProfile paypalPaymentProfile) {
    System.out.println(paypalPaymentProfile.getPaypalEmail());
    return null;
  }
  @Override
  public Void applePayPaymentProfile(ApplePayPaymentProfile applePayPaymentProfile) {
    System.out.println(applePayPaymentProfile.getFirstName());
    return null;
  }
});

										
										# The Maxio SDK demonstrates polymorphic payment methods. On API call,
# the SDK automatically deserializes based on the discriminator field.
result = client.payment_profiles.read_payment_profile(id)
profile = result.payment_profile

# The developer can write type-safe logic using isinstance checks,
# thanks to the SDK's support for polymorphic models and discriminator-based deserialization.
if isinstance(profile, BankAccountPaymentProfile):
  # Python knows this object has bank account-specific fields
  print(profile.masked_bank_account_number)
elif isinstance(profile, CreditCardPaymentProfile):
  # Python knows this object has credit card-specific fields
  print(profile.masked_card_number)
elif isinstance(profile, PaypalPaymentProfile):
  # Python knows this object has PayPal-specific fields
  print(profile.paypal_email)
elif isinstance(profile, ApplePayPaymentProfile):
  # Python knows this object has Apple Pay-specific fields
  print(profile.first_name)
else:
  # If none of the known subclasses match, the type is unknown or unsupported
  print("Unknown payment profile type")

										
										// Maxio SDK demonstrates polymorphic payment methods. On API call,
// the SDK automatically deserializes based on discriminator field.
var paymentProfile = await paymentProfiles.ReadPaymentProfileAsync(id);


// The 'match' method handle each specific payment profile subtype
// without requiring explicit type checks or casting.
paymentProfile.Match<VoidType>(
    bankAccountPaymentProfile: bankAccountPaymentProfile =>
    {
        Console.WriteLine(bankAccountPaymentProfile.MaskedAccountNumber);
        return null;
    },
    creditCardPaymentProfile: creditCardPaymentProfile =>
    {
        Console.WriteLine(creditCardPaymentProfile.MaskedCardNumber);
        return null;
    },
    paypalPaymentProfile: paypalPaymentProfile =>
    {
        Console.WriteLine(paypalPaymentProfile.PaypalEmail);
        return null;
    },
    applePayPaymentProfile: applePayPaymentProfile =>
    {
        Console.WriteLine(applePayPaymentProfile.FirstName);
        return null;
    }
);

										
										// Maxio SDK demonstrates polymorphic payment methods. On API call,
// the SDK automatically deserializes based on discriminator field.
$response = $paymentProfiles->readPaymentProfile($id);
$profile = $response->getResult()->getPaymentProfile();

// The developer can write type-safe code, thanks to SDK's support
// for polymorphic types and runtime type-checking in PHP.
if ($profile instanceof BankAccountAttributes) {
  // PHP knows this has bank account fields
  echo $profile->getMaskedBankAccountNumber() . PHP_EOL;
} elseif ($profile instanceof CreditCardAttributes) {
  // PHP knows this has credit card fields
  echo $profile->getMaskedCardNumber() . PHP_EOL;
} elseif ($profile instanceof PaypalAccountAttributes) {
  // PHP knows this has PayPal fields
  echo $profile->getPaypalEmail() . PHP_EOL;
} elseif ($profile instanceof ApplePayAttributes) {
  // PHP knows this has Apple account fields
  echo $profile->getFirstName() . PHP_EOL;
} else {
  // $profile is of an unknown or unsupported type
}

										
										# The Maxio Python SDK demonstrates polymorphic payment methods. On API call,
# the SDK automatically deserializes based on the discriminator field.
result = client.payment_profiles.read_payment_profile(id)
profile = result.payment_profile

# The developer can write type-safe logic using isinstance checks,
# thanks to the SDK's support for polymorphic models and discriminator-based deserialization.
case profile
when AdvancedBilling::BankAccountPaymentProfile
  puts profile.masked_bank_account_number
when AdvancedBilling::CreditCardPaymentProfile
  puts profile.masked_card_number
when AdvancedBilling::PaypalPaymentProfile
  puts profile.paypal_email
when AdvancedBilling::ApplePayPaymentProfile
  puts profile.first_name
else
  # Unknown or unsupported payment profile type
  puts 'Unknown payment profile type'
end

										
										// Maxio SDK demonstrates polymorphic payment methods. On API call,
// the SDK automatically deserializes based on discriminator field.
apiResponse, _ := paymentProfiles.ReadPaymentProfile(ctx, id)
profile := apiResponse.Data.PaymentProfile

// The developer can write type-safe code, thanks to SDK's support
// for polymorphic types and type-narrowing in Go.
if value, ok := profile.AsBankAccountPaymentProfile(); ok {
  // Go knows this has Bank Account Fields
  fmt.Println(value.MaskedBankAccountNumber)
} else if value, ok := profile.AsCreditCardPaymentProfile(); ok {
  // Go knows this has Credit Card Fields
  fmt.Println(value.MaskedCardNumber)
} else if value, ok := profile.AsPaypalPaymentProfile(); ok {
  // Go knows this has PayPal Payment Fields
  fmt.Println(value.PaypalEmail)
} else if value, ok := profile.AsApplePayPaymentProfile(); ok {
  // Go knows this has Apple Account Fields
  fmt.Println(value.FirstName)
} else {
  // profile is narrowed down to the type 'never'.
}

										
Authentication Built In

Add OAuth, API keys, and other auth flows directly into your SDKs with zero manual config.

  • TypeScript
  • Java
  • Python
  • C#
  • PHP
  • Ruby
  • Go
										// Authentication configured once - SDK handles token refresh automatically
const client = new Client({
  clientCredentials: {
    oAuthClientId: "your_client_id",
    oAuthClientSecret: "your_client_secret",
    oAuthTokenProvider: (lastOAuthToken, authManager) => {
      // Restore token from your DB or fetch for the first time.
      return loadTokenFromDatabase() ?? authManager.fetchToken();
    },
    oAuthOnTokenUpdate: (token: OAuthToken) => {
      // Persist the token on refresh.
      saveTokenToDatabase(token);
    },
  },
});

// SDK automatically applies authentication to all requests
// No need to manually handle tokens or headers
const { result } = await orders.createOrder(orderRequest);

console.log("Order created:", result.id);

										
										// Authentication configured once - SDK handles token refresh automatically
AdvancedBillingClient client = new AdvancedBillingClient.Builder()
  .clientCredentialsAuth(new ClientCredentialsAuthModel.Builder(
    "your_client_id",
    "your_client_secret"
  )
  .oAuthTokenProvider((lastOAuthToken, credentialsManager) -> {
    // Restore token from your DB or fetch for the first time.
    OAuthToken oAuthToken = loadTokenFromDatabase();
    return oAuthToken != null ? oAuthToken : credentialsManager.fetchToken();
  })
  .oAuthOnTokenUpdate(oAuthToken -> {
    // Persist the token on refresh.
    saveTokenToDatabase(oAuthToken);
  })
  .build())
.build();

// SDK automatically applies authentication to all requests
// No need to manually handle tokens or headers
Order result = orders.createOrder(orderRequest);
    
System.out.println("Order created: " + result.getId());

										
										# Authentication configured once - SDK handles token refresh automatically
client = Client(
  client_credentials_auth_credentials=ClientCredentialsAuthCredentials(
    o_auth_client_id='your_client_id',
    o_auth_client_secret='your_client_secret',
    o_auth_on_token_update=lambda token: save_token_to_database(token),
    o_auth_token_provider=lambda last_oauth_token, auth_manager: (
      load_token_from_database() or auth_manager.fetch_token()
    ),
  )
)

# SDK automatically applies authentication to all requests
# No need to manually handle tokens or headers
result = client.orders.createOrder(order_request)

print(f"Order created: {result.id}")

										
										// Authentication configured once – SDK handles token refresh automatically
var client = new AdvancedBillingClient.Builder()
  .OAuthCredentials(
    new OAuthCredentialsAuthModel.Builder("your_client_id", "your_client_secret")
      .OAuthTokenProvider(async (credentialsManager, token) =>
      {
        // Restore token from your DB or fetch for the first time
        return LoadTokenFromDatabase() ?? authManager.FetchToken();
      })
      .OAuthOnTokenUpdate(token =>
      {
        // Persist the token on refresh
        SaveTokenToDatabase(token);
      })
      .Build())
  .Build();

// SDK automatically applies authentication to all requests
// No need to manually handle tokens or headers
var order = await orders.CreateOrderAsync(orderRequest);

Console.WriteLine("Order created: " + order.Id);

										
										// Authentication configured once - SDK handles token refresh automatically
$client = AdvancedBillingClientBuilder::init()
  ->oAuthClientCredentials(
    OAuthClientCredentialsBuilder::init(
      'your_client_id',
      'your_client_secret'
    )
      ->oAuthTokenProvider(
        function (?OAuthToken $lastOAuthToken, ClientCredentialsAuthManager $authManager): OAuthToken {
        // Restore a token from your DB or fetch for the first time.
        return $this->loadTokenFromDatabase() ?? $authManager->fetchToken();
        }
      )
   )
   ->build();

// SDK automatically applies authentication to all requests
// No need to manually handle tokens or headers
$response = $orders->createOrder($orderRequest);

echo "Order created: " . $response->getResult()->getId() . PHP_EOL;

										
										# Authentication configured once - SDK handles token refresh automatically
client = Client.new(
  client_credentials_auth_credentials: ClientCredentialsAuthCredentials.new(
    o_auth_client_id: 'your_client_id',
    o_auth_client_secret: 'your_client_secret',
    o_auth_token_provider: proc do |last_oauth_token, auth_manager|
      # Restore a token from your DB or fetch for the first time.
      token = load_token_from_database
      token.nil? ? auth_manager.fetch_token : token
    end,
    o_auth_on_token_update: proc do |token|
      # Persist the token on refresh.
      save_token_to_database(token)
    end
  )
)

# SDK automatically applies authentication to all requests
# No need to manually handle tokens or headers
result = client.orders.createOrder(order_request)

puts "Order created: #{result.id}"

										
										ctx := context.Background()
  client := mdnotesccg.NewClient(
    mdnotesccg.CreateConfigurationFromEnvironment(
      mdnotesccg.WithClientCredentialsAuthCredentials(
        mdnotesccg.NewClientCredentialsAuthCredentials(
          "your_client_id",
          "your_client_secret",
        ).
        WithOAuthTokenProvider(func(
          lastOAuthToken models.OAuthToken,
          authManager mdnotesccg.ClientCredentialsAuthManager,
        ) models.OAuthToken {
          // Restore token from your DB or fetch for the first time.
          token := LoadTokenFromDatabase()
          if token != nil {
            return token
          }
          token, _ = authManager.FetchToken(ctx)
          return token
        }).
        WithOAuthOnTokenUpdate(func(token models.OAuthToken) {
          // Persist the token on refresh.
          SaveTokenToDatabase(token)
        }),
    ),
  ),
)

// SDK automatically applies authentication to all requests
// No need to manually handle tokens or headers
apiResponse, _ := orders.CreateOrder(ctx, orderRequest)
fmt.Println(apiResponse.Data.Id)

										
Flexible Payload Handling

Support JSON, XML, multipart/form, and binary data—automatically mapped to each SDK.

  • TypeScript
  • Java
  • Python
  • C#
  • PHP
  • Ruby
  • Go
										// Request prepared using plain-old JavaScript object and types
const request: CreateInvoiceRequest = {
  invoice: {
    lineItems: [{ title: "Consulting", quantity: 10, unitPrice: "150.00" }],
  },
};

// SDK handles JSON serialization transparently for JSON APIs
const { result: invoice } = await invoices.createInvoice(request);

// Next, we upload a file loaded as a Node.js stream
const readStream = createReadStream("./resources/invoice.pdf");
const invoiceFile = new FileWrapper(readStream);

// SDK handles multipart form data automatically for file upload APIs
const uploadResult = await invoices.uploadInvoiceDocument(
  invoice.uid,
  invoiceFile
);

console.log("File uploaded:", uploadResult.success);

										
										// Request prepared using plain-old JavaScript object and types
CreateInvoiceRequest request = new CreateInvoiceRequest.Builder(
 new CreateInvoice.Builder()
   .lineItems(Arrays.asList(
     new CreateInvoiceItem.Builder()
       .title("Consulting")
       .quantity(10)
       .unitPrice("150.00")
       .build()
   ))
   .build()
)
.build();

// SDK handles JSON serialization transparently for JSON APIs
InvoiceResponse result = invoices.createInvoice(request);
Invoice invoice = result.getInvoice();

// Next, we upload a file loaded as a Java file
FileWrapper invoiceFile = new FileWrapper(new File("./resources/invoice.pdf"));

// SDK handles multipart form data automatically for file upload APIs
FileUpload uploadResult = invoices.uploadInvoiceDocument(invoice.getUid(), invoiceFile);

System.out.println("File uploaded: " + uploadResult.getSuccess());

										
										# Prepare request using plain Python object
request = CreateInvoiceRequest(
  invoice=CreateInvoice(
    line_items=[
      CreateInvoiceItem(
        title='A Product',
        quantity=12,
        unit_price='150.00'
      )
    ]
  )
)

# SDK handles JSON serialization transparently for JSON APIs
invoice = client.invoices.create_invoice(request)

# Load file as binary stream (for multipart upload)
with open("./resources/invoice.pdf", "rb") as file:
  invoice_file = FileWrapper(file, content_type='application/pdf')
  # SDK handles multipart form data automatically for file upload APIs
  upload_result = client.invoices.upload_invoice_document(invoice.uid, invoice_file)

  print(f"File uploaded: {upload_result.success}")

										
										// Request prepared using plain-old C# object and types
var request = new CreateInvoiceRequest
{
  Invoice = new CreateInvoice
  {
    LineItems = new[]
    {
      new CreateInvoiceItem
      {
        Title = "Consulting",
        Quantity = 10,
        UnitPrice = "150.00"
      }
    }
  }
};

// SDK handles JSON serialization transparently for JSON APIs
var invoice = await invoices.CreateInvoiceAsync(request);

// Next, we upload a file loaded as a stream
var file = new FileStreamInfo(
    new FileStream("./resources/invoice.pdf", FileMode.Open)
);

// SDK handles multipart form data automatically for file upload APIs
var uploadResult = await invoices.SendFileAsync(invoice.Uid, file);

Console.WriteLine("File uploaded:", uploadResult.Status);

										
										// Request prepared using plain-old PHP model builders and types
$createInvoiceRequest = InvoiceRequestBuilder::init(
  InvoiceBuilder::init()
    ->lineItems([
      InvoiceLineItemBuilder::init()
        ->title("Consulting")
        ->quantity(10)
        ->unitPrice("150.00")
        ->build()
    ])
    ->build()
)->build();

// SDK handles JSON serialization transparently for JSON APIs
$invoiceResponse = $invoices->createInvoice($createInvoiceRequest);
$invoice = $invoiceResponse->getResult();

// Next, we upload a file loaded from disk
$invoiceFile = FileWrapper::createFromPath('./resources/invoice.pdf');

// SDK handles multipart form data automatically for file upload APIs
$uploadResult = $invoices->uploadInvoiceDocument(
  $invoice->getUid(),
  $invoiceFile
);

echo "File uploaded: " . $uploadResult->isSuccess() . PHP_EOL;

										
										# Prepare request using plain Ruby object
request = CreateInvoiceRequest.new(
  invoice: CreateInvoice.new(
    line_items: [
      CreateInvoiceItem.new(
        title: 'A Product',
        quantity: 12,
        unit_price: '150.00'
      )
    ]
  )
)

# SDK handles JSON serialization transparently for JSON APIs
invoice = client.invoices.create_invoice(request)

# Load file as an IO stream (used for multipart uploads)
File.open('./resources/invoice.pdf', 'rb') do |file|
  invoice_file = FileWrapper.new(file, content_type: 'application/pdf')
  # SDK handles multipart form data automatically for file upload APIs
  upload_result = invoices.upload_invoice_document(invoice.uid, invoice_file)

  puts "File uploaded: #{upload_result.success}"
end

										
										// Request preparing
request := models.CreateInvoiceRequest{
  Invoice: models.CreateInvoice{
    LineItems: []models.CreateInvoiceItem{
      models.CreateInvoiceItem{
        Title:     models.ToPointer("Consulting"),
        Quantity:  models.ToPointer(
          models.CreateInvoiceItemQuantityContainer.FromPrecision(10)),
        UnitPrice: models.ToPointer(models.
          CreateInvoiceItemUnitPriceContainer.FromString("150.00")),
      },
    },
  },
}

invoices := client.InvoicesController()
// SDK handles JSON serialization transparently for JSON APIs
apiResponse, _ := invoices.CreateInvoice(ctx, 0, &request)

// Next, we upload a file loaded as a Node.js stream
invoiceFile, errFile := models.GetFile("./resources/invoice.pdf")
if errFile != nil { fmt.Println(errFile) }

// SDK handles multipart form data automatically for file upload APIs
uploadApiResponse, _ := invoices.UploadInvoiceDocument((ctx,
  apiResponse.Data.Invoice.Uid, invoiceFile)
fmt.Println("File uploaded:%v", uploadApiResponse.Data.Success)

										
Resilience by Default

Retries, timeouts, and error handling are built into every SDK for a smooth developer experience.

  • TypeScript
  • Java
  • Python
  • C#
  • PHP
  • Ruby
  • Go
										const client = new Client({
  // Configure automatic retries for failed requests
  retryConfiguration: {
    retryOnTimeout: true,
    maxNumberOfRetries: 3,
    retryInterval: 1,
    backoffFactor: 2,
  },
});

try {
  // SDK automatically retries failed requests when there is network
  // failure, server error (5XX), rate limiting (429) or timeout (408).
  const { result } = await orders.getOrder("ORDER_ID");
  console.log("Order retrieved:", result.status);
} catch (error) {
  // SDK supports structured error handling for API errors
  if (error instanceof ApiError) {
    console.error("API Error:", error.statusCode);
  }
}

										
										Client client = new Client.Builder()
 // Configure automatic retries for failed requests
 .httpClientConfig(configBuilder -> configBuilder
   .numberOfRetries(3) // sets number of retries
   .retryInterval(1)
   .backOffFactor(2)
).build();

try {
 // SDK automatically retries failed requests when there is network
 // failure, server error (5XX), rate limiting (429) or timeout (408).
 Order result = orders.getOrder("ORDER_ID");
 System.out.println("Order retrieved: "+ result.getStatus());
}
catch (ApiException e){
 System.out.println("API Error: " + e.getMessage());
}

										
										client = Client(
  # Configure automatic retries for failed requests
  timeout=30,
  max_retries=3,
  backoff_factor=2,
)

try:
  # SDK automatically retries failed requests when there is network
  # failure, server error (5XX), rate limiting (429) or timeout (408).
  order = client.orders.get_order("ORDER_ID")
  print(f"Order retrieved: {order.status}")
except APIException as e:
  # SDK supports structured error handling for API errors
  print(f"API Error: {e.response_code}")

										
										var client = new AdvancedBillingClient.Builder()
  // Configure automatic retries for failed requests
  .HttpClientConfig(clientConfig => clientConfig
    .BackoffFactor(2)
    .RetryInterval(1)
    .NumberOfRetries(3)
    .Build())
  .Build();

try
{
  // SDK automatically retries failed requests when there is network
  // failure, server error (5XX), rate limiting (429) or timeout (408).
  var result = await orders.GetOrderAsync("ORDER_ID");
  Console.WriteLine("Order retrieved: ", result.Status);
}
catch (ApiException error)
{
  // SDK supports structured error handling for API errors
  Console.Error.WriteLine("API Error: ", error.ResponseCode);
}

										
										// Configure the client with retry behavior
$client = AdvancedBillingClientBuilder::init()
  // Configure automatic retries for failed requests
  ->enableRetries(true)
  ->retryOnTimeout(true)
  ->numberOfRetries(3)
  ->retryInterval(1)
  ->backOffFactor(2)
  ->build();

try {
  // SDK automatically retries failed requests when there is network
  // failure, server error (5XX), rate limiting (429) or timeout (408).
  $response = $orders->getOrder("ORDER_ID");
  echo "Order retrieved: " . $response->getResult()->getStatus() . PHP_EOL;
} catch (ApiException $error) {
  // SDK supports structured error handling for API errors
  echo "API Error: " . $error->getStatusCode() . PHP_EOL;
}

										
										client = Client.new(
  # Configure automatic retries for failed requests
  timeout: 30,
  max_retries: 3,
  retry_interval: 1,
  backoff_factor: 2,
)

begin
  # SDK automatically retries failed requests when there is network
  # failure, server error (5XX), rate limiting (429) or timeout (408).
  order = client.orders.get_order("ORDER_ID")
  puts "Order retrieved: #{order.status}"
rescue APIException => e
  # SDK supports structured error handling for API errors
  puts "API Error: #{e.response_code}"
end

										
										client := advancedbilling.NewClient(
  advancedbilling.CreateConfiguration(
    advancedbilling.WithHttpConfiguration(
      	advancedbilling.CreateHttpConfiguration(
        // Configure automatic retries for failed requests
        advancedbilling.WithRetryConfiguration(
          advancedbilling.CreateRetryConfiguration(
            advancedbilling.WithRetryOnTimeout(true),
            advancedbilling.WithRetryInterval(1),
            advancedbilling.WithBackoffFactor(2),
          ),
        ),
      ),
    ),
  ),
)
// SDK automatically retries failed requests when there is network
// failure, server error (5XX), rate limiting (429) or timeout (408).
apiResponse, err := orders.GetOrder("ORDER_ID")
if err != nil {
  // SDK supports structured error handling for API errors
  if apiErr, ok := err.(https.ApiError); ok {
    log.Fatalf("API Error:%v", apiErr.StatusCode)
  }
} else {
  // Printing the result and response
  fmt.Printf("Order retrieved:%v", apiResponse.Response.StatusCode)
}

										
Pagination

Iterate over a long list of data fetched from the API with Pagination in SDKs. Works with native language iterators and the async-await syntax.

  • TypeScript
  • Java
  • Python
  • C#
  • PHP
  • Ruby
  • Go
										// SDK makes pagination effortless with built-in iteration.
const paginatedUserList = users.listAll({
  page: 1,
  perPage: 50,
});

// Simple pagination - iterate through all items
for await (const user of paginatedUserList) {
  console.log("Process user:", user.name);
}

// Alternative: Process page-by-page
for await (const page of paginatedUserList.pages) {
  for (const user of page.items) {
    console.log("Process user:", item.name);
  }

  // Access pagination metadata
  console.log("Current page:" + page.pageNumber);
  console.log("Response headers", page.headers);
}

										
										// SDK makes pagination effortless with built-in iteration.
PagedFlux<User, PagedResponse<User, Users>> paginatedUserList =
  usersController.listAllAsync(1, 50);

// Simple pagination - iterate through all items
paginatedUserList.subscribe(
  user -> System.out.println("Process user: " + user.getName()),
  error -> error.printStackTrace()
);

// Alternative: Process page-by-page
paginatedUserList.pages().subscribe(
  page -> {
    pagedResponse.getItems().forEach(user ->
      System.out.println("Process user: " + user.getName());

      // Access pagination metadata
      System.out.println("Current page: " + page.getPageNumber());
      System.out.println("Response headers: " + page.getHeaders());
  },
  error -> error.printStackTrace()
);

										
										# SDK makes pagination effortless with built-in iteration.
paginated_user_list = client.users.list_all(page=1, per_page=50)

# Simple pagination - iterate through all items across pages
for user in paginated_user_list:
  print(f"Process user: {user.name}")

# Alternative: iterate page-by-page
for page in paginated_user_list.pages():
  for user in page.items():
    print(f"Process user: {user.name}")
  
  # Access pagination metadata
  print(f"Current page: {page.page_number}")
  print(f"Response headers: {page.headers}")

										
										// SDK makes pagination effortless with built-in iteration.
var paginatedUserList = await users.ListUsersAsync(
  new ListUsersInput
  {
    Page = 1,
    PerPage = 20
  });

// Simple pagination - iterate through all items
await foreach (var user in paginatedUserList)
{
  Console.WriteLine("Process user:", user.Name);
}

// Alternative: Process page-by-page
await foreach (var page in result.GetPagesAsync())
{
  foreach (var user in page.Items)
  {
    Console.WriteLine("Process user:", item.Name);
  }

  // Access pagination metadata
  Console.WriteLine("Current page:" + page.PageNumber);
  Console.WriteLine("Response headers", page.Headers);
}

										
										$paginatedUserList = $users->listUsers([
  'page' => 1,
  'per_page' => 50,
]);

// Simple pagination - iterate through all items
foreach ($paginatedUserList->items() as $user) {
  echo "Process user: " . $user->getName() . PHP_EOL;
}

// Alternative: Process page-by-page
foreach ($paginatedUserList->pages() as $page) {
  foreach ($page->getItems() as $user) {
    echo "Process user: " . $user->getName() . PHP_EOL;
  }

  // Access pagination metadata
  echo "Current page: " . $page->getPageNumber() . PHP_EOL;
  echo "Response headers: ";
  print_r($page->getHeaders());
}

										
										# SDK makes pagination effortless with built-in iteration.
paginated_user_list = client.users.list_all(page: 1, per_page: 50)

# Simple pagination - iterate through all items
paginated_user_list.each do |user|
  puts "Process user: #{user.name}"
end

# Alternative: Process page-by-page
paginated_user_list.pages.each do |page|
  page.items.each do |user|
    puts "Process user: #{user.name}"
  end

  # Access pagination metadata
  puts "Current page: #{page.page_number}"
  puts "Response headers: #{page.headers.inspect}"
end

										
										// SDK makes pagination effortless with built-in iteration.
paginatedUserList, _ := users.ListUsers(1, 50)

// Simple pagination - iterate through all items
for _, user := range paginatedUserList.Items {
  fmt.Printf("Process user:%v\n", user.Name)
}

// Alternative: Process page-by-page
for _, page := range paginatedUserList.Pages {
  for _, user := range page.Items {
    fmt.Printf("Process user:%v\n", user.Name)
  }

  // Access pagination metadata
  fmt.Println("Current page:", page.PageNumber)
  fmt.Println("Response headers:", page.Headers)
}

										
  • TypeScript
  • Java
  • Python
  • C#
  • PHP
  • Ruby
  • Go
										// Maxio's TypeScript SDK is available as a NPM package with
// support for Node.js and web environments.
import {
  Client,
  SubscriptionsController,
} from "@maxio-com/advanced-billing-sdk";

// Once configured, the SDK can be used to authenticated API calls.
const client = new Client({
  basicAuth: { username: "user", password: "pass" },
});

const subscriptions = new SubscriptionsController(client);

// SDK automatically handles serialization, API errors, validation,
// and type conversion (JSON to TypeScript interfaces)
const { result } = await subscriptions.listSubscriptions({
  page: 1,
  perPage: 20,
});

// Type-safe access to response data with full IntelliSense support
console.log(result[0].subscription?.state);

										
										// Maxio's Java SDK is available as a Maven package
import com.maxio.advancedbilling.AdvancedBillingClient;
import com.maxio.advancedbilling.authentication.BasicAuthModel;
import com.maxio.advancedbilling.controllers.SubscriptionsController;
import com.maxio.advancedbilling.models.ListSubscriptionsInput;
import com.maxio.advancedbilling.models.SubscriptionResponse;
import java.util.List;

// Once configured, the SDK can be used to authenticate API calls.
AdvancedBillingClient client = new AdvancedBillingClient.Builder()
  .basicAuthCredentials(new BasicAuthModel.Builder("user", "pass")
  .build()).build();

SubscriptionsController subscriptionsController =
  client.getSubscriptionsController();

ListSubscriptionsInput listSubscriptionsInput =
  new ListSubscriptionsInput.Builder().page(2).perPage(50).build();

// SDK automatically handles serialization, API errors, validation,
// and type conversion
List<SubscriptionResponse> result = subscriptionsController
  .listSubscriptions(listSubscriptionsInput);

System.out.println(result);

										
										# Maxio's Python SDK is available as a PYPI package with
# support for the Python environment.
from advancedbilling.advanced_billing_client import AdvancedBillingClient
from advancedbilling.http.auth.basic_auth import BasicAuthCredentials

# Once configured, the SDK can be used to authenticated API calls.
client = AdvancedBillingClient(
  basic_auth_credentials=BasicAuthCredentials(
    username="user",
    password="pass"
  )
)

# SDK automatically handles serialization, API errors, validation,
# and type conversion (JSON to Python models)
result = client.subscriptions.list_subscriptions({
  "page": 1,
  "per_page": 20
})

print(result[0].subscription.state)

										
										// Maxio's .NET SDK is available as a NuGet package
using AdvancedBilling.Standard;
using AdvancedBilling.Standard.Authentication;
using AdvancedBilling.Standard.Models;

// Once configured, the SDK can be used to authenticated API calls.
var client = new AdvancedBillingClient.Builder()
  .BasicAuthCredentials(
      new BasicAuthModel.Builder("user", "pass").Build())
  .Build();

var subscriptions = client.SubscriptionsController;

// SDK automatically handles serialization, API errors, validation,
// and type conversion (JSON to C# models)
var result = await subscriptions.ListSubscriptionsAsync(
  new ListSubscriptionsInput
  {
      Page = 1,
      PerPage = 20
  });

// Type-safe access to response data with full IntelliSense support
Console.WriteLine(result[0].Subscription.State);

										
										<?php

use AdvancedBillingLib\Authentication\BasicAuthCredentialsBuilder;
use AdvancedBillingLib\AdvancedBillingClientBuilder;

// Initialize the client using the builder
$client = AdvancedBillingClientBuilder::init()
    ->basicAuthCredentials(
        BasicAuthCredentialsBuilder::init('user', 'pass')
    )
    ->build();

// Retrieve the Subscriptions controller from the client
$subscriptions = $client->getSubscriptionsController();

// Make the API call to list subscriptions
$response = $subscriptions->listSubscriptions([
    'page' => 1,
    'perPage' => 20,
]);

// Extract and access subscription data
$subscriptions = $response->getResult();

echo $subscriptions[0]->getSubscription()?->getState();

										
										# Maxio's Ruby SDK is available as a gem and supports modern Ruby projects.
require 'advanced_billing'
include AdvancedBilling

# Once configured, the SDK can be used to make authenticated API calls.
client = Client.new(
  basic_auth_credentials: BasicAuthCredentials.new(
    username: 'user',
    password: 'pass'
  )
)

# The SDK automatically handles request serialization, response parsing,
# API errors, and data validation for you.
result = client.subscriptions.list_subscriptions(
  page: 1,
  per_page: 20
)

# Idiomatic Ruby: safe navigation & object access.
puts result.first&.subscription&.state

										
										// Maxio's Go SDK is available as a Go module with
// support for Go-based server environments.
import (
  "context"
  "fmt"
  "github.com/maxio-com/ab-golang-sdk"
  "github.com/maxio-com/ab-golang-sdk/models"
)

// Once configured, the SDK can be used to authenticated API calls.
client := advancedbilling.NewClient(
  advancedbilling.CreateConfiguration(
    advancedbilling.WithBasicAuthCredentials(
      advancedbilling.NewBasicAuthCredentials(
        "user",
        "pass",
      ),
    ),
  ),
)

subscriptionController := client.SubscriptionsController()

// The SDK automatically handles serialization, API error handling,
// validation, and type conversion (e.g., JSON to Go structs).
ctx := context.Background()
apiResponse, _ := subscriptionController.ListSubscriptions(ctx, advancedbilling.ListSubscriptionsInput{
  Page:    models.ToPointer(1),
  PerPage: models.ToPointer(20),
})

// Type-safe access to response data with full IntelliSense support
fmt.Println(apiResponse.Data[0].Subscription.State)

										
  • TypeScript
  • Java
  • Python
  • C#
  • PHP
  • Ruby
  • Go
										// Type-safe model with nested objects and enums
const request: CreateSubscriptionRequest = {
  subscription: {
    // Enum ensures only valid states are used
    productHandle: ProductHandle.BasicPlan,
    // Nested customer object with validation
    customerAttributes: {
      name: "John Doe",
      email: "john@example.com",
    },
    // Typed values like Date prevent format errors
    initialBillingAt: new Date(),
  },
};

// SDK validates all types at compile-time and runtime
const { result } = await subscriptions.createSubscription(request);

// Response is fully typed with IntelliSense support
if (result.subscription?.state === SubscriptionState.Active) {
  console.log("Subscription activated successfully");
}

										
										// Type-safe model with nested objects and enums
CreateSubscriptionRequest request = new CreateSubscriptionRequest.Builder(
  new CreateSubscription.Builder()
    // Enum ensures only valid states are used
    .productHandle(ProductHandle.BasicPlan)
    // Nested customer object with validation
    .customerAttributes(new CustomerAttributes.Builder()
      .name("John Doe")
      .email("john@example.com")
      .build())
    // Typed values like Date prevents format errors
    .initialBillingAt(new Date())
    .build()
).build();


// SDK validates all types at compile-time and runtime
SubscriptionResponse result = subscriptionsController.createSubscription(request);

// Response is fully typed with IntelliSense support
if (result.getSubscription().getState() == SubscriptionState.Active) {
  System.out.println("Subscription activated successfully");
}

										
										# Construct request with enum and nested objects for strong 
# typing and validation
request = CreateSubscriptionRequest(
  subscription=CreateSubscription(
    # Enum ensures only valid plans
    product_handle=ProductHandle.BASIC_PLAN,
    # Combined first and last name
    customer_attributes=CustomerAttributes(
      name="John Doe",
      email="john@example.com",
    ),
    # Typed datetime prevents format issues
    initial_billing_at=datetime.now(),
  )
)

# Submit request—assume async or sync execution as per SDK
result = subscriptions_controller.create_subscription(
  body=request
)

# Response type-safe check for subscription state using Enum
if getattr(
  getattr(result, 'subscription', None), 'state', None
) == SubscriptionState.ACTIVE.value:
  print("Subscription activated successfully")

										
										// Type-safe model with nested objects and enums
using AdvancedBilling.Standard.Models;

CreateSubscriptionRequest body = new CreateSubscriptionRequest
{
  Subscription = new CreateSubscription
  {
    // String literal mapped validated field on server
    ProductHandle = "basic",

    // Nested customer object with validation
    CustomerAttributes = new CustomerAttributes
    {
      FirstName = "Joe",
      LastName = "Blow",
      Email = "joe@example.com"
     },

    // Typed values like DateTime prevent format errors
    InitialBillingAt = DateTime.Now,
  },
};

// SDK validates all types at compile-time and runtime
var result = await subscriptions.CreateSubscriptionAsync(body);

// Response is fully typed with IntelliSense support
if (result.Subscription.State == SubscriptionState.Active)
{
  Console.WriteLine("Subscription activated successfully");
}

										
										// Type-safe model with nested objects and enums
$request = SubscriptionRequestBuilder::init(
  SubscriptionBuilder::init()
    // Enum ensures only valid states are used
    ->productHandle(ProductHandle::BasicPlan)

    // Nested customer object with validation
    ->customerAttributes(
      CustomerAttributesBuilder::init()
        ->name('John Doe')
        ->email('john@example.com')
        ->build()
    )

    // Typed values like Date prevent format errors
    ->initialBillingAt(new DateTime())
    ->build()
)->build();

// SDK validates all types at runtime (PHP lacks compile-time checks)
$response = $subscriptions->createSubscription($request);

// Response is fully typed with IDE autocompletion support
$subscription = $response->getResult()->getSubscription();

if ($subscription?->getState() === SubscriptionState::ACTIVE) {
   echo "Subscription activated successfully" . PHP_EOL;
}

										
										# Type-safe model with nested objects and enums
body = CreateSubscriptionRequest.new(
  subscription: CreateSubscription.new(
    # Enum ensures only valid states are used
    product_handle: ProductHandle::BASIC_PLAN,

    # Nested customer object with validation
    customer_attributes: CustomerAttributes.new(
      first_name: 'John',
      last_name: 'Doe',
      email: 'john@example.com'
    ),

    # Typed values like Time prevent format errors
    initial_billing_at: Time.now
  )
)

# SDK validates all types when constructing request models and on API call
result = client.subscriptions.create_subscription(body: body)

# Response is fully typed and accessible with method calls
if result.subscription && result.subscription.state == SubscriptionState::ACTIVE
  puts "Subscription activated successfully"
end

										
										// Type-safe model with nested objects and enums
request := models.CreateSubscriptionRequest{
  Subscription: models.CreateSubscription{
    // Enum ensures only valid states are used
    ProductHandle: models.ToPointer("Basic_Plan"),
    // Nested customer object with validation
    CustomerAttributes: &models.CustomerAttributes{
      Name: models.ToPointer("John Doe"),
      Email: models.ToPointer("john@example.com"),
    },
    // Typed values like Date prevents format errors
    InitialBillingAt: &time.Time{},
  },
}

// SDK validates all types at compile-time and runtime
apiResponse, _ := subscriptions.CreateSubscription(ctx, &request)

// Response is fully typed with IntelliSense support
subscriptionState := apiResponse.Data.Subscription.State
if *subscriptionState == models.SubscriptionState_ACTIVE {
  fmt.Println("Subscription activated successfully")
}

										
  • TypeScript
  • Java
  • Python
  • C#
  • PHP
  • Ruby
  • Go
										// Maxio SDK demonstrates polymorphic payment methods. On API call,
// the SDK automatically deserializes based on discriminator field.
const { result } = await paymentProfiles.readPaymentProfile(id);
const profile = result.paymentProfile;

// The developer can write type-safe code, thanks to SDK's support
// for polymorphic types and type-narrowing in TypeScript.
if (PaymentProfile.isBankAccountPaymentProfile(profile)) {
  // TypeScript knows this has bank account fields
  console.log(profile.maskedBankAccountNumber);
} else if (PaymentProfile.isCreditCardPaymentProfile(profile)) {
  // TypeScript knows this has credit card fields
  console.log(profile.maskedCardNumber);
} else if (PaymentProfile.isPaypalPaymentProfile(profile)) {
  // TypeScript knows this has PayPal fields
  console.log(profile.paypalEmail);
} else if (PaymentProfile.isApplePayPaymentProfile(profile)) {
  // TypeScript knows this has Apple account fields
  console.log(profile.firstName);
} else {
  // profile is narrowed down to the type 'never'.
}

										
										// Maxio SDK demonstrates polymorphic payment methods. On API call,
// the SDK automatically deserializes based on discriminator field.
PaymentProfileResponse result =
  paymentProfilesController.readPaymentProfile(id);
PaymentProfile profile = result.getPaymentProfile();

// The 'match' method handle each specific payment profile subtype
// without requiring explicit type checks or casting.
profile.match(new PaymentProfile.Cases<Void>() {
  @Override
  public Void bankAccountPaymentProfile(BankAccountPaymentProfile bankAccountProfile) {
    System.out.println(bankAccountProfile.getMaskedBankAccountNumber());
    return null;
  }
  @Override
  public Void creditCardPaymentProfile(CreditCardPaymentProfile creditCardPaymentProfile) {
    System.out.println(creditCardPaymentProfile.getMaskedCardNumber());
    return null;
  }
  @Override
  public Void paypalPaymentProfile(PaypalPaymentProfile paypalPaymentProfile) {
    System.out.println(paypalPaymentProfile.getPaypalEmail());
    return null;
  }
  @Override
  public Void applePayPaymentProfile(ApplePayPaymentProfile applePayPaymentProfile) {
    System.out.println(applePayPaymentProfile.getFirstName());
    return null;
  }
});

										
										# The Maxio SDK demonstrates polymorphic payment methods. On API call,
# the SDK automatically deserializes based on the discriminator field.
result = client.payment_profiles.read_payment_profile(id)
profile = result.payment_profile

# The developer can write type-safe logic using isinstance checks,
# thanks to the SDK's support for polymorphic models and discriminator-based deserialization.
if isinstance(profile, BankAccountPaymentProfile):
  # Python knows this object has bank account-specific fields
  print(profile.masked_bank_account_number)
elif isinstance(profile, CreditCardPaymentProfile):
  # Python knows this object has credit card-specific fields
  print(profile.masked_card_number)
elif isinstance(profile, PaypalPaymentProfile):
  # Python knows this object has PayPal-specific fields
  print(profile.paypal_email)
elif isinstance(profile, ApplePayPaymentProfile):
  # Python knows this object has Apple Pay-specific fields
  print(profile.first_name)
else:
  # If none of the known subclasses match, the type is unknown or unsupported
  print("Unknown payment profile type")

										
										// Maxio SDK demonstrates polymorphic payment methods. On API call,
// the SDK automatically deserializes based on discriminator field.
var paymentProfile = await paymentProfiles.ReadPaymentProfileAsync(id);


// The 'match' method handle each specific payment profile subtype
// without requiring explicit type checks or casting.
paymentProfile.Match<VoidType>(
    bankAccountPaymentProfile: bankAccountPaymentProfile =>
    {
        Console.WriteLine(bankAccountPaymentProfile.MaskedAccountNumber);
        return null;
    },
    creditCardPaymentProfile: creditCardPaymentProfile =>
    {
        Console.WriteLine(creditCardPaymentProfile.MaskedCardNumber);
        return null;
    },
    paypalPaymentProfile: paypalPaymentProfile =>
    {
        Console.WriteLine(paypalPaymentProfile.PaypalEmail);
        return null;
    },
    applePayPaymentProfile: applePayPaymentProfile =>
    {
        Console.WriteLine(applePayPaymentProfile.FirstName);
        return null;
    }
);

										
										// Maxio SDK demonstrates polymorphic payment methods. On API call,
// the SDK automatically deserializes based on discriminator field.
$response = $paymentProfiles->readPaymentProfile($id);
$profile = $response->getResult()->getPaymentProfile();

// The developer can write type-safe code, thanks to SDK's support
// for polymorphic types and runtime type-checking in PHP.
if ($profile instanceof BankAccountAttributes) {
  // PHP knows this has bank account fields
  echo $profile->getMaskedBankAccountNumber() . PHP_EOL;
} elseif ($profile instanceof CreditCardAttributes) {
  // PHP knows this has credit card fields
  echo $profile->getMaskedCardNumber() . PHP_EOL;
} elseif ($profile instanceof PaypalAccountAttributes) {
  // PHP knows this has PayPal fields
  echo $profile->getPaypalEmail() . PHP_EOL;
} elseif ($profile instanceof ApplePayAttributes) {
  // PHP knows this has Apple account fields
  echo $profile->getFirstName() . PHP_EOL;
} else {
  // $profile is of an unknown or unsupported type
}

										
										# The Maxio Python SDK demonstrates polymorphic payment methods. On API call,
# the SDK automatically deserializes based on the discriminator field.
result = client.payment_profiles.read_payment_profile(id)
profile = result.payment_profile

# The developer can write type-safe logic using isinstance checks,
# thanks to the SDK's support for polymorphic models and discriminator-based deserialization.
case profile
when AdvancedBilling::BankAccountPaymentProfile
  puts profile.masked_bank_account_number
when AdvancedBilling::CreditCardPaymentProfile
  puts profile.masked_card_number
when AdvancedBilling::PaypalPaymentProfile
  puts profile.paypal_email
when AdvancedBilling::ApplePayPaymentProfile
  puts profile.first_name
else
  # Unknown or unsupported payment profile type
  puts 'Unknown payment profile type'
end

										
										// Maxio SDK demonstrates polymorphic payment methods. On API call,
// the SDK automatically deserializes based on discriminator field.
apiResponse, _ := paymentProfiles.ReadPaymentProfile(ctx, id)
profile := apiResponse.Data.PaymentProfile

// The developer can write type-safe code, thanks to SDK's support
// for polymorphic types and type-narrowing in Go.
if value, ok := profile.AsBankAccountPaymentProfile(); ok {
  // Go knows this has Bank Account Fields
  fmt.Println(value.MaskedBankAccountNumber)
} else if value, ok := profile.AsCreditCardPaymentProfile(); ok {
  // Go knows this has Credit Card Fields
  fmt.Println(value.MaskedCardNumber)
} else if value, ok := profile.AsPaypalPaymentProfile(); ok {
  // Go knows this has PayPal Payment Fields
  fmt.Println(value.PaypalEmail)
} else if value, ok := profile.AsApplePayPaymentProfile(); ok {
  // Go knows this has Apple Account Fields
  fmt.Println(value.FirstName)
} else {
  // profile is narrowed down to the type 'never'.
}

										
  • TypeScript
  • Java
  • Python
  • C#
  • PHP
  • Ruby
  • Go
										// Authentication configured once - SDK handles token refresh automatically
const client = new Client({
  clientCredentials: {
    oAuthClientId: "your_client_id",
    oAuthClientSecret: "your_client_secret",
    oAuthTokenProvider: (lastOAuthToken, authManager) => {
      // Restore token from your DB or fetch for the first time.
      return loadTokenFromDatabase() ?? authManager.fetchToken();
    },
    oAuthOnTokenUpdate: (token: OAuthToken) => {
      // Persist the token on refresh.
      saveTokenToDatabase(token);
    },
  },
});

// SDK automatically applies authentication to all requests
// No need to manually handle tokens or headers
const { result } = await orders.createOrder(orderRequest);

console.log("Order created:", result.id);

										
										// Authentication configured once - SDK handles token refresh automatically
AdvancedBillingClient client = new AdvancedBillingClient.Builder()
  .clientCredentialsAuth(new ClientCredentialsAuthModel.Builder(
    "your_client_id",
    "your_client_secret"
  )
  .oAuthTokenProvider((lastOAuthToken, credentialsManager) -> {
    // Restore token from your DB or fetch for the first time.
    OAuthToken oAuthToken = loadTokenFromDatabase();
    return oAuthToken != null ? oAuthToken : credentialsManager.fetchToken();
  })
  .oAuthOnTokenUpdate(oAuthToken -> {
    // Persist the token on refresh.
    saveTokenToDatabase(oAuthToken);
  })
  .build())
.build();

// SDK automatically applies authentication to all requests
// No need to manually handle tokens or headers
Order result = orders.createOrder(orderRequest);
    
System.out.println("Order created: " + result.getId());

										
										# Authentication configured once - SDK handles token refresh automatically
client = Client(
  client_credentials_auth_credentials=ClientCredentialsAuthCredentials(
    o_auth_client_id='your_client_id',
    o_auth_client_secret='your_client_secret',
    o_auth_on_token_update=lambda token: save_token_to_database(token),
    o_auth_token_provider=lambda last_oauth_token, auth_manager: (
      load_token_from_database() or auth_manager.fetch_token()
    ),
  )
)

# SDK automatically applies authentication to all requests
# No need to manually handle tokens or headers
result = client.orders.createOrder(order_request)

print(f"Order created: {result.id}")

										
										// Authentication configured once – SDK handles token refresh automatically
var client = new AdvancedBillingClient.Builder()
  .OAuthCredentials(
    new OAuthCredentialsAuthModel.Builder("your_client_id", "your_client_secret")
      .OAuthTokenProvider(async (credentialsManager, token) =>
      {
        // Restore token from your DB or fetch for the first time
        return LoadTokenFromDatabase() ?? authManager.FetchToken();
      })
      .OAuthOnTokenUpdate(token =>
      {
        // Persist the token on refresh
        SaveTokenToDatabase(token);
      })
      .Build())
  .Build();

// SDK automatically applies authentication to all requests
// No need to manually handle tokens or headers
var order = await orders.CreateOrderAsync(orderRequest);

Console.WriteLine("Order created: " + order.Id);

										
										// Authentication configured once - SDK handles token refresh automatically
$client = AdvancedBillingClientBuilder::init()
  ->oAuthClientCredentials(
    OAuthClientCredentialsBuilder::init(
      'your_client_id',
      'your_client_secret'
    )
      ->oAuthTokenProvider(
        function (?OAuthToken $lastOAuthToken, ClientCredentialsAuthManager $authManager): OAuthToken {
        // Restore a token from your DB or fetch for the first time.
        return $this->loadTokenFromDatabase() ?? $authManager->fetchToken();
        }
      )
   )
   ->build();

// SDK automatically applies authentication to all requests
// No need to manually handle tokens or headers
$response = $orders->createOrder($orderRequest);

echo "Order created: " . $response->getResult()->getId() . PHP_EOL;

										
										# Authentication configured once - SDK handles token refresh automatically
client = Client.new(
  client_credentials_auth_credentials: ClientCredentialsAuthCredentials.new(
    o_auth_client_id: 'your_client_id',
    o_auth_client_secret: 'your_client_secret',
    o_auth_token_provider: proc do |last_oauth_token, auth_manager|
      # Restore a token from your DB or fetch for the first time.
      token = load_token_from_database
      token.nil? ? auth_manager.fetch_token : token
    end,
    o_auth_on_token_update: proc do |token|
      # Persist the token on refresh.
      save_token_to_database(token)
    end
  )
)

# SDK automatically applies authentication to all requests
# No need to manually handle tokens or headers
result = client.orders.createOrder(order_request)

puts "Order created: #{result.id}"

										
										ctx := context.Background()
  client := mdnotesccg.NewClient(
    mdnotesccg.CreateConfigurationFromEnvironment(
      mdnotesccg.WithClientCredentialsAuthCredentials(
        mdnotesccg.NewClientCredentialsAuthCredentials(
          "your_client_id",
          "your_client_secret",
        ).
        WithOAuthTokenProvider(func(
          lastOAuthToken models.OAuthToken,
          authManager mdnotesccg.ClientCredentialsAuthManager,
        ) models.OAuthToken {
          // Restore token from your DB or fetch for the first time.
          token := LoadTokenFromDatabase()
          if token != nil {
            return token
          }
          token, _ = authManager.FetchToken(ctx)
          return token
        }).
        WithOAuthOnTokenUpdate(func(token models.OAuthToken) {
          // Persist the token on refresh.
          SaveTokenToDatabase(token)
        }),
    ),
  ),
)

// SDK automatically applies authentication to all requests
// No need to manually handle tokens or headers
apiResponse, _ := orders.CreateOrder(ctx, orderRequest)
fmt.Println(apiResponse.Data.Id)

										
  • TypeScript
  • Java
  • Python
  • C#
  • PHP
  • Ruby
  • Go
										// Request prepared using plain-old JavaScript object and types
const request: CreateInvoiceRequest = {
  invoice: {
    lineItems: [{ title: "Consulting", quantity: 10, unitPrice: "150.00" }],
  },
};

// SDK handles JSON serialization transparently for JSON APIs
const { result: invoice } = await invoices.createInvoice(request);

// Next, we upload a file loaded as a Node.js stream
const readStream = createReadStream("./resources/invoice.pdf");
const invoiceFile = new FileWrapper(readStream);

// SDK handles multipart form data automatically for file upload APIs
const uploadResult = await invoices.uploadInvoiceDocument(
  invoice.uid,
  invoiceFile
);

console.log("File uploaded:", uploadResult.success);

										
										// Request prepared using plain-old JavaScript object and types
CreateInvoiceRequest request = new CreateInvoiceRequest.Builder(
 new CreateInvoice.Builder()
   .lineItems(Arrays.asList(
     new CreateInvoiceItem.Builder()
       .title("Consulting")
       .quantity(10)
       .unitPrice("150.00")
       .build()
   ))
   .build()
)
.build();

// SDK handles JSON serialization transparently for JSON APIs
InvoiceResponse result = invoices.createInvoice(request);
Invoice invoice = result.getInvoice();

// Next, we upload a file loaded as a Java file
FileWrapper invoiceFile = new FileWrapper(new File("./resources/invoice.pdf"));

// SDK handles multipart form data automatically for file upload APIs
FileUpload uploadResult = invoices.uploadInvoiceDocument(invoice.getUid(), invoiceFile);

System.out.println("File uploaded: " + uploadResult.getSuccess());

										
										# Prepare request using plain Python object
request = CreateInvoiceRequest(
  invoice=CreateInvoice(
    line_items=[
      CreateInvoiceItem(
        title='A Product',
        quantity=12,
        unit_price='150.00'
      )
    ]
  )
)

# SDK handles JSON serialization transparently for JSON APIs
invoice = client.invoices.create_invoice(request)

# Load file as binary stream (for multipart upload)
with open("./resources/invoice.pdf", "rb") as file:
  invoice_file = FileWrapper(file, content_type='application/pdf')
  # SDK handles multipart form data automatically for file upload APIs
  upload_result = client.invoices.upload_invoice_document(invoice.uid, invoice_file)

  print(f"File uploaded: {upload_result.success}")

										
										// Request prepared using plain-old C# object and types
var request = new CreateInvoiceRequest
{
  Invoice = new CreateInvoice
  {
    LineItems = new[]
    {
      new CreateInvoiceItem
      {
        Title = "Consulting",
        Quantity = 10,
        UnitPrice = "150.00"
      }
    }
  }
};

// SDK handles JSON serialization transparently for JSON APIs
var invoice = await invoices.CreateInvoiceAsync(request);

// Next, we upload a file loaded as a stream
var file = new FileStreamInfo(
    new FileStream("./resources/invoice.pdf", FileMode.Open)
);

// SDK handles multipart form data automatically for file upload APIs
var uploadResult = await invoices.SendFileAsync(invoice.Uid, file);

Console.WriteLine("File uploaded:", uploadResult.Status);

										
										// Request prepared using plain-old PHP model builders and types
$createInvoiceRequest = InvoiceRequestBuilder::init(
  InvoiceBuilder::init()
    ->lineItems([
      InvoiceLineItemBuilder::init()
        ->title("Consulting")
        ->quantity(10)
        ->unitPrice("150.00")
        ->build()
    ])
    ->build()
)->build();

// SDK handles JSON serialization transparently for JSON APIs
$invoiceResponse = $invoices->createInvoice($createInvoiceRequest);
$invoice = $invoiceResponse->getResult();

// Next, we upload a file loaded from disk
$invoiceFile = FileWrapper::createFromPath('./resources/invoice.pdf');

// SDK handles multipart form data automatically for file upload APIs
$uploadResult = $invoices->uploadInvoiceDocument(
  $invoice->getUid(),
  $invoiceFile
);

echo "File uploaded: " . $uploadResult->isSuccess() . PHP_EOL;

										
										# Prepare request using plain Ruby object
request = CreateInvoiceRequest.new(
  invoice: CreateInvoice.new(
    line_items: [
      CreateInvoiceItem.new(
        title: 'A Product',
        quantity: 12,
        unit_price: '150.00'
      )
    ]
  )
)

# SDK handles JSON serialization transparently for JSON APIs
invoice = client.invoices.create_invoice(request)

# Load file as an IO stream (used for multipart uploads)
File.open('./resources/invoice.pdf', 'rb') do |file|
  invoice_file = FileWrapper.new(file, content_type: 'application/pdf')
  # SDK handles multipart form data automatically for file upload APIs
  upload_result = invoices.upload_invoice_document(invoice.uid, invoice_file)

  puts "File uploaded: #{upload_result.success}"
end

										
										// Request preparing
request := models.CreateInvoiceRequest{
  Invoice: models.CreateInvoice{
    LineItems: []models.CreateInvoiceItem{
      models.CreateInvoiceItem{
        Title:     models.ToPointer("Consulting"),
        Quantity:  models.ToPointer(
          models.CreateInvoiceItemQuantityContainer.FromPrecision(10)),
        UnitPrice: models.ToPointer(models.
          CreateInvoiceItemUnitPriceContainer.FromString("150.00")),
      },
    },
  },
}

invoices := client.InvoicesController()
// SDK handles JSON serialization transparently for JSON APIs
apiResponse, _ := invoices.CreateInvoice(ctx, 0, &request)

// Next, we upload a file loaded as a Node.js stream
invoiceFile, errFile := models.GetFile("./resources/invoice.pdf")
if errFile != nil { fmt.Println(errFile) }

// SDK handles multipart form data automatically for file upload APIs
uploadApiResponse, _ := invoices.UploadInvoiceDocument((ctx,
  apiResponse.Data.Invoice.Uid, invoiceFile)
fmt.Println("File uploaded:%v", uploadApiResponse.Data.Success)

										
  • TypeScript
  • Java
  • Python
  • C#
  • PHP
  • Ruby
  • Go
										const client = new Client({
  // Configure automatic retries for failed requests
  retryConfiguration: {
    retryOnTimeout: true,
    maxNumberOfRetries: 3,
    retryInterval: 1,
    backoffFactor: 2,
  },
});

try {
  // SDK automatically retries failed requests when there is network
  // failure, server error (5XX), rate limiting (429) or timeout (408).
  const { result } = await orders.getOrder("ORDER_ID");
  console.log("Order retrieved:", result.status);
} catch (error) {
  // SDK supports structured error handling for API errors
  if (error instanceof ApiError) {
    console.error("API Error:", error.statusCode);
  }
}

										
										Client client = new Client.Builder()
 // Configure automatic retries for failed requests
 .httpClientConfig(configBuilder -> configBuilder
   .numberOfRetries(3) // sets number of retries
   .retryInterval(1)
   .backOffFactor(2)
).build();

try {
 // SDK automatically retries failed requests when there is network
 // failure, server error (5XX), rate limiting (429) or timeout (408).
 Order result = orders.getOrder("ORDER_ID");
 System.out.println("Order retrieved: "+ result.getStatus());
}
catch (ApiException e){
 System.out.println("API Error: " + e.getMessage());
}

										
										client = Client(
  # Configure automatic retries for failed requests
  timeout=30,
  max_retries=3,
  backoff_factor=2,
)

try:
  # SDK automatically retries failed requests when there is network
  # failure, server error (5XX), rate limiting (429) or timeout (408).
  order = client.orders.get_order("ORDER_ID")
  print(f"Order retrieved: {order.status}")
except APIException as e:
  # SDK supports structured error handling for API errors
  print(f"API Error: {e.response_code}")

										
										var client = new AdvancedBillingClient.Builder()
  // Configure automatic retries for failed requests
  .HttpClientConfig(clientConfig => clientConfig
    .BackoffFactor(2)
    .RetryInterval(1)
    .NumberOfRetries(3)
    .Build())
  .Build();

try
{
  // SDK automatically retries failed requests when there is network
  // failure, server error (5XX), rate limiting (429) or timeout (408).
  var result = await orders.GetOrderAsync("ORDER_ID");
  Console.WriteLine("Order retrieved: ", result.Status);
}
catch (ApiException error)
{
  // SDK supports structured error handling for API errors
  Console.Error.WriteLine("API Error: ", error.ResponseCode);
}

										
										// Configure the client with retry behavior
$client = AdvancedBillingClientBuilder::init()
  // Configure automatic retries for failed requests
  ->enableRetries(true)
  ->retryOnTimeout(true)
  ->numberOfRetries(3)
  ->retryInterval(1)
  ->backOffFactor(2)
  ->build();

try {
  // SDK automatically retries failed requests when there is network
  // failure, server error (5XX), rate limiting (429) or timeout (408).
  $response = $orders->getOrder("ORDER_ID");
  echo "Order retrieved: " . $response->getResult()->getStatus() . PHP_EOL;
} catch (ApiException $error) {
  // SDK supports structured error handling for API errors
  echo "API Error: " . $error->getStatusCode() . PHP_EOL;
}

										
										client = Client.new(
  # Configure automatic retries for failed requests
  timeout: 30,
  max_retries: 3,
  retry_interval: 1,
  backoff_factor: 2,
)

begin
  # SDK automatically retries failed requests when there is network
  # failure, server error (5XX), rate limiting (429) or timeout (408).
  order = client.orders.get_order("ORDER_ID")
  puts "Order retrieved: #{order.status}"
rescue APIException => e
  # SDK supports structured error handling for API errors
  puts "API Error: #{e.response_code}"
end

										
										client := advancedbilling.NewClient(
  advancedbilling.CreateConfiguration(
    advancedbilling.WithHttpConfiguration(
      	advancedbilling.CreateHttpConfiguration(
        // Configure automatic retries for failed requests
        advancedbilling.WithRetryConfiguration(
          advancedbilling.CreateRetryConfiguration(
            advancedbilling.WithRetryOnTimeout(true),
            advancedbilling.WithRetryInterval(1),
            advancedbilling.WithBackoffFactor(2),
          ),
        ),
      ),
    ),
  ),
)
// SDK automatically retries failed requests when there is network
// failure, server error (5XX), rate limiting (429) or timeout (408).
apiResponse, err := orders.GetOrder("ORDER_ID")
if err != nil {
  // SDK supports structured error handling for API errors
  if apiErr, ok := err.(https.ApiError); ok {
    log.Fatalf("API Error:%v", apiErr.StatusCode)
  }
} else {
  // Printing the result and response
  fmt.Printf("Order retrieved:%v", apiResponse.Response.StatusCode)
}

										
  • TypeScript
  • Java
  • Python
  • C#
  • PHP
  • Ruby
  • Go
										// SDK makes pagination effortless with built-in iteration.
const paginatedUserList = users.listAll({
  page: 1,
  perPage: 50,
});

// Simple pagination - iterate through all items
for await (const user of paginatedUserList) {
  console.log("Process user:", user.name);
}

// Alternative: Process page-by-page
for await (const page of paginatedUserList.pages) {
  for (const user of page.items) {
    console.log("Process user:", item.name);
  }

  // Access pagination metadata
  console.log("Current page:" + page.pageNumber);
  console.log("Response headers", page.headers);
}

										
										// SDK makes pagination effortless with built-in iteration.
PagedFlux<User, PagedResponse<User, Users>> paginatedUserList =
  usersController.listAllAsync(1, 50);

// Simple pagination - iterate through all items
paginatedUserList.subscribe(
  user -> System.out.println("Process user: " + user.getName()),
  error -> error.printStackTrace()
);

// Alternative: Process page-by-page
paginatedUserList.pages().subscribe(
  page -> {
    pagedResponse.getItems().forEach(user ->
      System.out.println("Process user: " + user.getName());

      // Access pagination metadata
      System.out.println("Current page: " + page.getPageNumber());
      System.out.println("Response headers: " + page.getHeaders());
  },
  error -> error.printStackTrace()
);

										
										# SDK makes pagination effortless with built-in iteration.
paginated_user_list = client.users.list_all(page=1, per_page=50)

# Simple pagination - iterate through all items across pages
for user in paginated_user_list:
  print(f"Process user: {user.name}")

# Alternative: iterate page-by-page
for page in paginated_user_list.pages():
  for user in page.items():
    print(f"Process user: {user.name}")
  
  # Access pagination metadata
  print(f"Current page: {page.page_number}")
  print(f"Response headers: {page.headers}")

										
										// SDK makes pagination effortless with built-in iteration.
var paginatedUserList = await users.ListUsersAsync(
  new ListUsersInput
  {
    Page = 1,
    PerPage = 20
  });

// Simple pagination - iterate through all items
await foreach (var user in paginatedUserList)
{
  Console.WriteLine("Process user:", user.Name);
}

// Alternative: Process page-by-page
await foreach (var page in result.GetPagesAsync())
{
  foreach (var user in page.Items)
  {
    Console.WriteLine("Process user:", item.Name);
  }

  // Access pagination metadata
  Console.WriteLine("Current page:" + page.PageNumber);
  Console.WriteLine("Response headers", page.Headers);
}

										
										$paginatedUserList = $users->listUsers([
  'page' => 1,
  'per_page' => 50,
]);

// Simple pagination - iterate through all items
foreach ($paginatedUserList->items() as $user) {
  echo "Process user: " . $user->getName() . PHP_EOL;
}

// Alternative: Process page-by-page
foreach ($paginatedUserList->pages() as $page) {
  foreach ($page->getItems() as $user) {
    echo "Process user: " . $user->getName() . PHP_EOL;
  }

  // Access pagination metadata
  echo "Current page: " . $page->getPageNumber() . PHP_EOL;
  echo "Response headers: ";
  print_r($page->getHeaders());
}

										
										# SDK makes pagination effortless with built-in iteration.
paginated_user_list = client.users.list_all(page: 1, per_page: 50)

# Simple pagination - iterate through all items
paginated_user_list.each do |user|
  puts "Process user: #{user.name}"
end

# Alternative: Process page-by-page
paginated_user_list.pages.each do |page|
  page.items.each do |user|
    puts "Process user: #{user.name}"
  end

  # Access pagination metadata
  puts "Current page: #{page.page_number}"
  puts "Response headers: #{page.headers.inspect}"
end

										
										// SDK makes pagination effortless with built-in iteration.
paginatedUserList, _ := users.ListUsers(1, 50)

// Simple pagination - iterate through all items
for _, user := range paginatedUserList.Items {
  fmt.Printf("Process user:%v\n", user.Name)
}

// Alternative: Process page-by-page
for _, page := range paginatedUserList.Pages {
  for _, user := range page.Items {
    fmt.Printf("Process user:%v\n", user.Name)
  }

  // Access pagination metadata
  fmt.Println("Current page:", page.PageNumber)
  fmt.Println("Response headers:", page.Headers)
}

										

Complete API SDK Generation Platform

Go Beyond SDKs. Generate a Complete API Developer Portal.

SDK & API Documentation

Generate a comprehensive API Portal with language‑specific docs, SDK guides, auth setup, and a REST API reference—directly from your OpenAPI spec.

Advance Billing Developer PortalSearchCtrl+KAPI Code PlaygroundAPI ReferenceInvoicesGETCreate InvoiceGETList InvoicesGETFetch InvoicePUTUpdate InvoiceDELETEDelete Invoice
Advance Billing Developer Portal Search Ctrl+K API Code Playground API Reference Invoices GET Create Invoice GET List Invoices GET Fetch Invoice PUT Update Invoice DELETE Delete Invoice
Runnable code samples

Let developers integrate your API in seconds with language‑specific code snippets.

HTTPJava.NETPythonPHPRequestResponseCopy CodeCopied
HTTP Java .NET Python PHP Request Response Copy Code Copied
Interactive API playgrounds

Let developers explore endpoints, make real API calls, and test behavior—without leaving your API Developer Portal.

Refund Invoice HTTP API Code Playground invoice_id REQUIRED String | Template Invoice ID for invoice to refund. 123 Request Response Configure Try It Out curl -X POST \ --url 'api.chargify.com/invoices/123' \ --json '{ "refund": { "amount": "100.00", "memo": "Refund for Basic Plan renewal", "payment_id": 4567 } }' Refund Invoice HTTP API Code Playground invoice_id REQUIRED String | Template Invoice ID for invoice to refund. 123 Request Response Configure Try It Out curl -X POST \ --url 'api.chargify.com/invoices/123' \ --json '{ "refund": { "amount": "100.00", "memo": "Refund for Basic Plan renewal", "payment_id": 4567 } }'
Refund Invoice HTTP API Code Playground invoice_id REQUIRED String | Template Invoice ID for invoice to refund. 123 Request Response Configure Try It Out curl -X POST \ --url 'api.chargify.com/invoices/123' \ --json '{ "refund": { "amount": "100.00", "memo": "Refund for Basic Plan renewal", "payment_id": 4567 } }' Refund Invoice HTTP API Code Playground invoice_id REQUIRED String | Template Invoice ID for invoice to refund. 123 Request Response Configure Try It Out curl -X POST \ --url 'api.chargify.com/invoices/123' \ --json '{ "refund": { "amount": "100.00", "memo": "Refund for Basic Plan renewal", "payment_id": 4567 } }'
API Copilot in Docs

Add an AI assistant that answers questions and generates contextual examples inside your docs.

API CopilotHow to create a new playlist and add the 10 most popular Taylor Swift songs?To get started with the Spotify Web API SDK, follow these steps:1. Install the package using the command:dotnet add package SpotifyApiSDK --version 1.0.02. Initialize the API client by configuring parameters such asEnvironment,Timeout, andAuthorizationCodeAuth.3. Set up OAuth 2.0 credentials withAuthorizationCodeAuthModelincludingOAuthClientId,OAuthClientSecretandOAuthRedirectUrl.API Copilot1. Install the package using the command:dotnet add package SpotifyApiSDK --version 1.0.0, and,2. Initialize the API client by configuring parameters such asEnvironmentTimeoutAuthorizationCodeAuth.and.OAuthClientSecretOAuthRedirectUrl,including3. Set up OAuth 2.0 credentials withAuthorizationCodeAuthModelOAuthClientIdTo get started with the Spotify Web API SDK, follow these steps:How to create a new playlist and add the 10 most popular Taylor Swift songs?
API Copilot How to create a new playlist and add the 10 most popular Taylor Swift songs? To get started with the Spotify Web API SDK, follow these steps: 1. Install the package using the command: dotnet add package SpotifyApiSDK --version 1.0.0 2. Initialize the API client by configuring parameters such as Environment , Timeout , and AuthorizationCodeAuth . 3. Set up OAuth 2.0 credentials with AuthorizationCodeAuthModel including OAuthClientId , OAuthClientSecret and OAuthRedirectUrl . API Copilot 1. Install the package using the command: dotnet add package SpotifyApiSDK --version 1.0.0 , and , 2. Initialize the API client by configuring parameters such as Environment Timeout AuthorizationCodeAuth . and . OAuthClientSecret OAuthRedirectUrl , including 3. Set up OAuth 2.0 credentials with AuthorizationCodeAuthModel OAuthClientId To get started with the Spotify Web API SDK, follow these steps: How to create a new playlist and add the 10 most popular Taylor Swift songs?
API Recipes

Create step-by-step onboarding flows to help developers implement key use cases faster.

Back To MenuStep 1Step 2Step 3How to Fetch a SuperheroHTTPCode SamplesResponseConfigureTry It Out
Back To Menu Step 1 Step 2 Step 3 How to Fetch a Superhero HTTP Code Samples Response Configure Try It Out
Pro Tools for Your Team

Run your entire Developer Experience program with automation, analytics, API linting, SDK updates, and more.

Complete API SDK Generation Platform

One OpenAPI Spec. Now serving AI agents too.

Coming Soon: Serve both developers and AI systems—all from your existing OpenAPI spec.
APIMatic AI Factory
  • MCP Server: Auto-generate Model Context Protocol Servers to make your API usable by GenAI tools like ChatGPT and Claude.
  • AI Agent Tools Library: Publish a tools library that lets developers build AI Agents using Langchain.js, OpenAI Agent SDK, Mastra and Vercel AI SDK.
  • LLMs.txt: Generate LLMs.txt files for VS Code and Cursor to help AI-native developers integrate your API faster and more accurately.
  • API Copilot: Embed into your docs API Copilot, a chatbot to help developers query your docs and build code samples with natural language.

"Dev time for SDKs went from 1 week to 18 seconds." and other success stories with APIMatic

Joshua - profile picture

Joshua Markham

Developer Relations

A modern developer experience site needs several essentials: clear business value within the API, a usable code sandbox/playground, and SDKs in different languages to support developers in their preferred environment. APIMatic checked a lot of those boxes for us.”

Rajeev - profile picture

Rajeev Ramani

API Product Manager

“The real value we get from APIMatic is that the time to build things from scratch has shrunk significantly, or rather, been removed completely!”

Keanu - profile picture

Keanu Ashwell

Developer Operations

"APIMatic has been a game-changer, allowing us to support API users even with limited resources. The testing feature was a key reason we moved from Swagger."

Nestor Salinas

Nestor Salinas

Senior Product Manager

“The market demanded innovation. By outsourcing SDKs to APIMatic, we freed up our developers to scale billing automation without unnecessary distractions.”

Rune - profile picture

Rune Synnevåg

CTO

“Now, we can deploy SDKs in 8 languages in the same time as it took to deploy SDKs in 1 language before. That would never be possible before we used APIMatic.”

Brian - product manager

Brian Hyder

Engineering Manager

“SDK development time dropped from 1 week to just 18 seconds. In just 3 months, generating 7 SDKs saved us $20,000 in development costs.”

Jorge - profile picture

Jorge Euceda

Senior Software Engineer

"Our role lies in providing clients with the appropriate guidance to streamline their development and integration timeline. With APIMatic, this time has been reduced from six months to two months."

Marko - profile picture

Marko Ovuka

Lead Product Manager

“Since adopting APIMatic, we've seen a noticeable reduction in the number of support inquiries and integration-related questions from our partners. The new portal allows our partners to explore, test, and understand our API more easily, leading to faster and smoother integrations.”

Mathew - profile picture

Matthew Henkler

CTO

“With APIMatic, we streamlined onboarding and ensured clients received reliable, high-quality integration code built to our standards.”

Built With APIMatic

Check out the API Portals and SDKs powering API experiences for thousands of developers across hundreds of companies.

Maxio API Portal

Maxio's API lets businesses to automate billing and manage subscriptions from their apps.

JS

Python

Java

Ruby

C#

PHP

Go

Verizon API Portal

Verizon 5G Edge brings cloud computing closer to devices for faster, low-latency performance.

JS

Python

Java

Ruby

C#

PHP

PayPal API Portal

PayPal's APIs allow businesses to accept online payments and provide seamless checkout.

JS

Python

Java

Ruby

C#

PHP

Foxit API Portal

Foxit eSign's API enables businesses to embed e-signature flows into their applications.

JS

Python

Java

Ruby

C#

PHP

ByMyGuest API Portal

BeMyGuest's API lets travel platforms and OTAs add real-time bookings for tours & experiences.

Java

C#

PHP

Fortis API Portal

Fortis' API offers merchants and partners an omnichannel payment experience. 

JS

Python

Java

Ruby

C#

PHP

Maxio API Portal

Maxio's API lets businesses to automate billing and manage subscriptions from their apps.

JS

Python

Java

Ruby

C#

PHP

Go

Verizon API Portal

Verizon 5G Edge brings cloud computing closer to devices for faster, low-latency performance.

JS

Python

Java

Ruby

C#

PHP

PayPal API Portal

PayPal's APIs allow businesses to accept online payments and provide seamless checkout.

JS

Python

Java

Ruby

C#

PHP

Foxit API Portal

Foxit eSign's API enables businesses to embed e-signature flows into their applications.

JS

Python

Java

Ruby

C#

PHP

ByMyGuest API Portal

BeMyGuest's API lets travel platforms and OTAs add real-time bookings for tours & experiences.

Java

C#

PHP

Fortis API Portal

Fortis' API offers merchants and partners an omnichannel payment experience. 

JS

Python

Java

Ruby

C#

PHP

How It Works

Upload Your OpenAPI Spec

Start with your OpenAPI spec. We validate and lint it for you.

Configure Your SDKs

Pick SDK languages, naming rules, auth settings, and error behaviors.

Customize Your API Developer Portal

Add guides, API recipes, and branding. Make your API documentation portal dev-ready.

Generate & Preview

Click once to generate client libraries, documentation, and API Portal instantly.

Publish Instantly

Push SDKs to npm, PyPI, etc., and publish your API Portal live.

Stay Synced with CI/CD

Use webhooks or CI pipelines to keep everything up to date after every change.

Upload Your OpenAPI Spec

Start with your OpenAPI spec. We validate and lint it for you.

Configure Your SDKs

Pick SDK languages, naming rules, auth settings, and error behaviors.

0
Customize Your API Developer Portal

Add guides, API recipes, and branding. Make your API documentation portal dev-ready.

Generate & Preview

Click once to generate client libraries, documentation, and API Portal instantly.

Generate SDKs and Documentation
Publish Instantly

Push SDKs to npm, PyPI, etc., and publish your API Portal live.

Stay Synced with CI/CD

Use webhooks or CI pipelines to keep everything up to date after every change.

Loved by Developers.
Trusted by Enterprises.

Maxio logo
Foxit logo
Verizon logo
PayPal logo

"Thanks to APIMatic, Maxio’s APIs sell themselves. A CTO, guided by our Sales team, saw how effortlessly our sandbox, SDKs, and recipes streamline integration."

Nestor Salinas

Nestor Salinas

Senior Product Manager

"APIMatic eliminates the need for a larger team—its SDKs in multiple languages help us close deals effortlessly."

Jorge - profile picture

Jorge Euceda

Senior Product Manager

"Verizon’s Developer Portal is a strategic catalyst for our 5G Edge vision—empowering developers with the tools, SDKs, and API recipes they need to accelerate innovation. By streamlining access to low-latency capabilities, it plays a pivotal role in unlocking the full business potential of 5G Network APIs."

Alicia - profile picture

Alicia Miller

Network API Product Manager

"PayPal’s new Server Side SDKs not only make it simple for developers to integrate with our APIs, they also power our Web SDK, and prepare our platform for the future of Agentic AI."

Nathaniel - profile picture

Nathaniel Olson

Senior Technical Product Manager

They're using enterprise features like...

Security-Certifications-img
Concierge Onboarding
security_section_logo
Priority Support
sign-merge-left
Roadmap Input
customization
SDK Customization
deployment
API Portal Self-Hosting
security-updates
Security Updates

Get Started with APIMatic

Grow API adoption through Client Libraries, API Portal and AI with APIMatic’s Complete SDK Generation Platform. Automate developer experience now.