Page Inspect
Internal Links
42
External Links
29
Images
137
Headings
94
Page Content
Title:APIMatic - Complete OpenAPI SDK Generation Platform
Description:Automatically transform your OpenAPI specs into production-ready SDKs, developer portals, code samples, and AI tools. Trusted by PayPal, Verizon, and leading API companies.
HTML Size:2742 KB
Markdown Size:93 KB
Fetched At:November 17, 2025
Page Structure
h4The Product Philosophy
h5APIMatic Platform
h5APIMatic Platform
h5Define
h5Generate
h5Publish
h5Automate
h4Key Features
h5Idiomatic SDKs
h5Dynamic Code Samples
h5API Code Playground
h5API Recipes
h5API Merging
h5API Copilot
h4By Products
h5No Code DX
h5DX as Code
h5API Transformer
h5Score My OpenAPI
h5Fix My OpenAPI
h4By Industry
h5Fintech
h5Messaging
h4Featured Integration
h5Mulesoft
h5Redhat
h5Redocly
h5Readme
h5Documentation
h5Changelog
h5Blog
h5Events & Webinars
h5Videos
h5API Conversations
h5Podcasts
h5Fintech Playbook
h5Maxio
h5Shell
h5Boku
h5Foxit eSign
h5Logistics
h5Postman
h5Testimonials
h1Accelerate API Adoption for Developers and AI
h2Trusted by the World’s Leading API Companies
h2Docs falling behind? SDKs out of sync? Now, AI tools need support too.
h4Before APIMatic: API Chaos
h4With APIMatic: Developer Zen
h2Your Battle-Tested SDKs. Generated by APIMatic.
h5SDKs in 7+ Languages
Markdown Content
APIMatic - Complete OpenAPI SDK Generation Platform
- Product
- Solutions
- Pricing
- Resources
- Customers
- About
#### The Product Philosophy
- ##### ##### APIMatic Platform
- ##### Define
- ##### Generate
- ##### Publish
- ##### Automate
#### Key Features
- ##### Idiomatic SDKs
- ##### Dynamic Code Samples
- ##### API Code Playground
- ##### API Recipes
- ##### API Merging
- ##### API Copilot
#### By Products
- ##### No Code DX
- ##### DX as Code
- ##### API Transformer
- ##### Score My OpenAPI
- ##### Fix My OpenAPI
#### By Industry
- ##### Fintech
- ##### Messaging
#### Featured Integration
- ##### Mulesoft
- ##### Redhat
- ##### Redocly
- ##### Readme
- ##### Documentation
- ##### Changelog
- ##### Blog
- ##### Events & Webinars
- ##### Videos
- ##### API Conversations
- ##### Podcasts
- ##### Fintech Playbook
- ##### Maxio
- ##### Shell
- ##### Boku
- ##### Foxit eSign
- ##### Logistics
- ##### Postman
- ##### Testimonials
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.
Start Free Trial
Talk to an Expert
## 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
#### 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 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) }`
Generate Your First SDK
See SDK Features Docs
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.
Create Your Portal
Read Docs
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.
- **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.
Join Early Access
Try API Copilot Demo
## "Dev time for SDKs went from 1 week to 18 seconds." and other success stories with APIMatic
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 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 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
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 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 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 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 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**.”
Matthew Henkler
CTO
“With APIMatic, we **streamlined onboarding** and ensured clients received reliable, high-quality integration code built to our standards.”
Start Your Success Story
Read Case Studies
## Built With APIMatic
Check out the API Portals and SDKs powering API experiences for thousands of developers across hundreds of companies.
Maxio's API lets businesses to **automate billing** and **manage subscriptions** from their apps.
JS
Python
Java
Ruby
C#
PHP
Go
Verizon 5G Edge brings **cloud computing** closer to devices for faster, low-latency performance.
JS
Python
Java
Ruby
C#
PHP
PayPal's APIs allow businesses to accept **online payments** and provide seamless **checkout**.
JS
Python
Java
Ruby
C#
PHP
Foxit eSign's API enables businesses to embed **e-signature** flows into their applications.
JS
Python
Java
Ruby
C#
PHP
BeMyGuest's API lets travel platforms and OTAs add **real-time bookings** for tours & experiences.
Java
C#
PHP
Fortis' API offers merchants and partners an **omnichannel payment** experience.
JS
Python
Java
Ruby
C#
PHP
Maxio's API lets businesses to **automate billing** and **manage subscriptions** from their apps.
JS
Python
Java
Ruby
C#
PHP
Go
Verizon 5G Edge brings **cloud computing** closer to devices for faster, low-latency performance.
JS
Python
Java
Ruby
C#
PHP
PayPal's APIs allow businesses to accept **online payments** and provide seamless **checkout**.
JS
Python
Java
Ruby
C#
PHP
Foxit eSign's API enables businesses to embed **e-signature** flows into their applications.
JS
Python
Java
Ruby
C#
PHP
BeMyGuest's API lets travel platforms and OTAs add **real-time bookings** for tours & experiences.
Java
C#
PHP
Fortis' API offers merchants and partners an **omnichannel payment** experience.
JS
Python
Java
Ruby
C#
PHP
Build Your API Portal & SDKs
## 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.
##### 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.
Try It Now
Read Docs
## Loved by Developers.
Trusted by Enterprises.
"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
Senior Product Manager
"APIMatic **eliminates the need for a larger team**—its SDKs in multiple languages help us close deals effortlessly."
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 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 Olson
Senior Technical Product Manager
### They're using enterprise features like...
###### Concierge Onboarding
###### Priority Support
###### Roadmap Input
###### SDK Customization
###### API Portal Self-Hosting
###### 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.
Start Free Trial
Request Demo
##### COMPANY
- About Us
- Blog
- Success Stories
- Careers
##### PLATFORM
- API Transformer
- APIs
##### PRICING
- Plans
##### SUPPORT
- Contact
- Terms
- Privacy Policy
##### APIMatic Newsletter Signup
Follow us:
###### © APIMATIC 2025
- Terms
- Privacy
Follow us: