{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"d17e8b5b-c023-4e6a-81bf-cf4669d8a34c","name":"StylusOP MERCHANT API Documentation - V3","description":"The **StylusOP MERCHANT API V3** is designed to streamline the order management process for merchants using the StylusOP platform. This API enables merchants to create, manage, and track orders efficiently, ensuring seamless integration with their e-commerce operations.\n\nWith a focus on **order processing, shipping, and status updates**, this API provides merchants with the tools needed to automate order fulfillment and keep their customers informed.\n\n# Table of Contents\n\n---\n\nThe contents of this documentation will cover different topics, including:\n\n1. Getting Started\n    \n2. Authentication\n    \n    1. Using Oauth2 Auth - JWT Access Token (_recommended_)\n        \n    2. Using Basic Auth\n        \n3. Orders\n    \n    1. Pushing / posting orders for fulfillment.\n        \n    2. Listing your existing orders.\n        \n    3. Tracking the status of an order.\n        \n    4. Getting an order's activities / events.\n        \n    5. Cancelling orders.\n        \n    6. Updating orders.\n        \n    7. Receiving order status updates via webhook notifications.\n        \n4. Error Handling\n    \n    1. API Rate Limiting\n        \n    2. Error Codes / Error Handling\n        \n5. Next Steps\n    \n\n# Getting Started\n\n---\n\nOur API tries to follow the RESTful standard. If you are familiar with RESTful API's, then following along should be fairly simple. We support different request methods such as GET,POST,PATCH and PUT.\n\n## **Key Features**\n\n- 📦 **Order Creation:** Submit new orders with detailed shipping and product information.\n    \n- 🔄 **Order Status Updates:** Receive real-time updates on order processing through webhooks.\n    \n- 🚚 **Shipping Management:** Specify shipping methods, priority levels, and return addresses.\n    \n- 🛠 **Error Handling & Validation:** Get meaningful error responses for missing fields, authentication issues, or duplicate orders.\n    \n\n## **Who Should Use This API?**\n\nThis API is ideal for:\n\n- **Merchants and retailers** looking to automate and streamline their production.\n    \n- **Developers** working with customers looking to automate their e-commerce Print-On-Demand and/or Manufacturing-On-Demand production, by offering custom-built plugins, apps, or integrations.\n    \n\n## The Basics\n\n| Term | Description |\n| --- | --- |\n| Merchant | You, a merchant or retailer account. |\n| Fulfiller | Us. |\n| Token | A unique, secure, and time-sensitive string used for authentication and authorization in API requests |\n| API Secret | A permanent secret key assigned to a merchant for API authentication. |\n| Artwork | The raw image file(s) for us to print. |\n\n## **On-boarding Process**\n\nFirst, it is important to mention that the onboarding process does require some manual setup before you can start consuming our API. These manual steps involve:\n\n1. **Account** - Create and configure your **merchant account** on our end.\n    \n2. **Product setup** - Manual process when the merchant (you) and the fulfiller (us) agree on what products will be fulfilled. Any product related details such as SKU list, pattern making, pricing, shipping will be agreed upon at this stage.\n    \n3. **Print & Artwork setup** - The merchant (you) and the fulfiller (us) discuss and agree upon the technical details related to artworks and print-ready files for your on-demand products.\n    \n4. **Samples** - The fulfiller (us) produces samples and ships them to you for your approval.\n    \n\n## Usage Guidelines\n\n- All requests made to the production endpoint are done via **HTTPs**. Requests via insecure HTTP are not supported in our production environment.\n    \n- All requests submitted to the API is structured in JSON, so the content-type should be: **application/json**\n    \n- Date/time values returned by the API are in UTC unless stated otherwise.\n    \n- {variable} in URLs should be substituted with the proper variable value.\n    \n\n# API Endpoints\n\nThe endpoints will depend on the environment. There are 2 environments available to you:\n\n> **Production ->** `https://opapi-prod.stylusapparel.com/api/v3`  \nOur live environment. \n  \n> **Staging** -> `https://opapi-staging.stylusapparel.com/api/v3`  \nOur sandbox environment, to be used during development / testing. \n  \n> **Please Note:**  \nDO NOT USE OUR PRODUCTION ENVIRONMENT FOR TESTING, UNLESS INDICATED OTHERWISE. \n  \n\n# HTTP Response Codes\n\nOur API will respond to your requests with either of the following http codes:\n\n| Status | Type | Description |\n| --- | --- | --- |\n| 200 | Success | General successful response |\n| 201 | Created | The order has been created successfully in our system |\n| 204 | Success No-Content | Successful response without a response body |\n| 400 | Bad Request | Invalid payload |\n| 401 | Unauthorized | Failed to provide valid authentication |\n| 403 | Forbidden | Not allowed to consume the resource |\n| 404 | Not Found | The resource is not found |\n| 408 | Timeout | Request has taken too long to be processed |\n| 409 | Conflict | Request creates a conflict with the target resource. Used as error status code for \"OrderDuplicate\" error (The resource already exists in our system) |\n| 422 | Unprocessable Entity | Request is understood however we couldn't process it |\n| 500 | Internal Error | An error occurred on our end while processing your request |\n| 503 | Unavailable | The API is temporarily down for scheduled maintenance |\n\n# Authentication\n\n---\n\nThe **Merchant API** supports two authentication methods:\n\n1. **Bearer Authentication (Recommended)** – Uses a **JWT (JSON Web Token)** for secure authentication.\n    \n2. **Basic Authentication** – Uses a **Base64-encoded username and password**.\n    \n\nWhile both methods are supported, we **strongly recommend using Bearer Authentication**, as it is **more secure and flexible** for API integrations.\n\n---\n\n## **Authentication Credentials**\n\nRegardless of the authentication method, you will need the following credentials:\n\n| Credential | Description |\n| --- | --- |\n| **Merchant ID** | A unique random number assigned to your account. |\n| **Merchant Name** | A unique identifier for your merchant account. If using **Basic Authentication**, this serves as your **username**. |\n| **API Secret Token** | A randomly generated key used for authentication. If using **Basic Authentication**, this serves as your **password.** |\n\n> Please Note:  \nAll API requests **must be authenticated** using one of the authentication methods described below. \n  \n\n---\n\n## Bearer Authentication (OAuth2 - JWT Access Token) 🔑 (Recommended)\n\n### **Step 1: Obtain an API Token**\n\n- You will receive an **Access Token (JWT)** after successful Oauth2 Token generation request.\n    \n- This token must be included in every request as a **Bearer token**.\n    \n\n### **Step 2: Include the Token in API Requests**\n\n- Add the `Authorization` header to your API requests:\n    \n\n#### **Example: Bearer Authentication in API Request**\n\n``` http\nPOST {{CORE_API_BASEURL}}/{{version}}/merchant/{{merchant_name}}/orders\nContent-Type: application/json\nAuthorization: Bearer YOUR_ACCESS_TOKEN\n\n ```\n\n### **Step 3: Handle Token Expiry & Refresh**\n\n- The **access token expires after 60 minutes (1 hour)**.\n    \n- If your request returns a `401 Unauthorized` response, it may indicate an **expired or invalid token**.\n    \n- Implement a **refresh mechanism** to request a new token periodically.\n    \n\n#### **401 Unauthorized Response Example**\n\n``` json\n{\n  \"success\": false,\n  \"message\": \"Unauthorized\",\n  \"error\": \"Token expired or invalid.\"\n}\n\n ```\n\n---\n\n## **Basic Authentication (Alternative Method)**\n\n- Requires **Base64-encoded** credentials in the `Authorization` header.\n    \n- Not as secure as **Bearer Authentication**, but still available as an option.\n    \n\n### **Step 1: Encode Your Credentials**\n\nBasic Authentication requires encoding your **username (Merchant ID)** and **password (API Secret Token)** in **Base64 format**.\n\n#### **Example: Encoding Credentials in Base64**\n\n``` sh\necho -n \"your_merchant_name:your_api_secret_token\" | base64\n\n ```\n\nExample output:\n\n```\neW91cl9tZXJjaGFudF9uYW1lOnlvdXJfYXBpX3NlY3JldF90b2tlbg==\n\n ```\n\n### **Step 2: Include in the Authorization Header**\n\n- Add the `Authorization` header in your requests:\n    \n\n#### **Example: Basic Authentication in API Request**\n\n``` http\nPOST {{CORE_API_BASEURL}}/{{version}}/merchant/{{merchant_name}}/orders\nContent-Type: application/json\nAuthorization: Basic eW91cl9tZXJjaGFudF9uYW1lOnlvdXJfYXBpX3NlY3JldF90b2tlbg==\n\n ```\n\n### **Step 3: Handle Authentication Errors**\n\nIf the credentials are incorrect, you will receive a **401 Unauthorized** response.\n\n#### **401 Unauthorized Response Example**\n\n``` json\n{\n  \"success\": false,\n  \"message\": \"Unauthorized\",\n  \"error\": \"Invalid username or password.\"\n}\n\n ```\n\n---\n\n## **Best Practices for API Authentication**\n\n✔ **Use Bearer Authentication** whenever possible for improved security.\n\n✔ **Store API tokens securely** and **never expose them** in public repositories.\n\n✔ **Use HTTPS** to encrypt authentication headers and API requests.\n\n✔ **Rotate API keys** periodically to prevent unauthorized access.\n\n✔ **Implement automatic token refresh** to handle expiration gracefully.\n\n---\n\n# Error Handling\n\n---\n\nIn order to properly handle errors returned by the API, the Merchant API defines a set of **error codes** that are included in the response whenever an error occurs.\n\nPlease make sure your application is aware of these error codes.\n\nAn example of an error response would look like this:\n\n``` json\n{   \n    \"success\": false,\n    \"message\": \"Error creating new order: ApiError: Payload didn't include the required fields\",\n    \"errorCode\": \"InvalidPayload\"\n}\n\n ```\n\n| Error Code | Endpoint | Description |\n| --- | --- | --- |\n| `OrderDuplicate` | Create | Order or order line-item already exists. Note that we validate for order duplicates by the \"itemNumber\" rather than the \"orderId\" |\n| `WrongLineItemProperties` | Create, Update | When error is related to line-item properties, incorrect values or not properly formattted. E.g passing a \"size\" property that's not supported by the product |\n| `InvalidPayload` | Create, Update | When the payload is missing required fields, fields not properly formatted, etc |\n| `ProductNotFound` | Create, Update | When product included in the line-items array is not found in the system |\n| `StatusIssue` | Update, Cancel | when order or line-item status is too far in production for it to be updated |\n| `ItemSkuIssue` | Create, Update | When sku in line-item is incorrect or not properly formatted |\n| `WrongLineItem` | Cancel | When one or more line-items defined in the \"items\" array does not belong to the order |\n\n### **Handling Rate Limit Errors (HTTP 429 Too Many Requests) 🚦**\n\nTo ensure fair usage and prevent abuse, we enforce a **rate limit of 100 requests per minute per merchant**. If this limit is exceeded, the API responds with a **429 Too Many Requests** error.\n\n---\n\n### **Understanding the Rate Limit Error**\n\nWhen you exceed the allowed request rate, you will receive the following response:\n\n#### **🔴 429 Too Many Requests Response Example**\n\n``` json\n{\n  \"success\": false,\n  \"message\": \"Rate limit exceeded. Please wait and try again later.\"\n}\n\n ```\n\n#### **🔹 HTTP Status Code:** `429 Too Many Requests`\n\n#### **🔹 Rate Limit:** Maximum 100 **requests per minute per merchant**\n\n---\n\n### **How to Handle 429 Errors Gracefully**\n\nTo prevent disruptions, implement the following best practices:\n\n### **1 - Using a Queue Mechanism for Order Submission (Best Practice)**\n\nA **queue-based system** helps merchants manage order requests **efficiently**, especially when dealing with **bulk orders or high-traffic scenarios**. Instead of sending all orders at once, a queue **distributes requests over time** and **retries failed requests automatically**.\n\n#### **How It Works**\n\n1. **Orders are added to a queue instead of being sent immediately.**\n    \n2. **A worker process sends requests in batches** (ensuring they stay within the 100 requests per minute limit).\n    \n3. If a request fails with a `429 Too Many Requests` error, the **queue automatically retries** after a delay.\n    \n4. **The system prioritizes new orders while retrying failed ones** intelligently.\n    \n\n### **2 - Implement Exponential Backoff for Retries**\n\nInstead of retrying requests immediately after receiving a `429`, use an **exponential backoff** strategy:\n\n- **Wait longer between retries** to avoid repeated failures.\n    \n- **Dynamically adjust retry intervals** based on response headers.\n    \n\nHere is an example of a request with retry mechanism in Javascript:\n\n``` javascript\nasync function makeRequestWithRetry(url, options, retries = 5, delay = 2000) {\n    for (let i = 0; i < retries; i++) {\n        try {\n            const response = await fetch(url, options);\n            if (response.ok) return response.json();\n            if (response.status === 429) {\n                const retryAfter = response.headers.get(\"Retry-After\") || delay * (i + 1);\n                console.warn(`Rate limit exceeded. Retrying in ${retryAfter / 1000} seconds...`);\n                await new Promise(res => setTimeout(res, retryAfter));\n            } else {\n                throw new Error(`HTTP ${response.status}: ${await response.text()}`);\n            }\n        } catch (error) {\n            console.error(`Request failed: ${error.message}`);\n        }\n    }\n    throw new Error(\"Request failed after multiple retries.\");\n}\n\n ```\n\n---\n\n### **3 - Check Response Headers for Rate Limit Information**\n\nWhile the API does not currently return specific rate limit headers, best practices include checking for a `Retry-After` header if it becomes available in the future.\n\nExample:\n\n``` http\nHTTP/1.1 429 Too Many Requests\nRetry-After: 30\n\n ```\n\nThis means you should **wait 30 seconds before retrying**.\n\n---\n\n### **4 - Optimize API Calls to Reduce Unnecessary Requests**\n\nInstead of hitting the API repeatedly, consider:\n\n- **Batching requests** when possible to minimize API calls.\n    \n- **Caching responses** to avoid fetching the same data repeatedly.\n    \n- **Using webhooks** to receive order updates instead of polling the API.\n    \n\n---\n\n### **5 - Implement Logging & Alerts for Rate Limits**\n\nMonitor API responses and set up alerts when frequent `429` errors occur.\n\nExample log entry:\n\n```\n[WARNING] 429 Too Many Requests - Rate limit exceeded at 2024-02-12 14:30:00 UTC\n\n ```\n\nThis helps track **when and why** rate limits are reached.\n\n---\n\n### **Key Takeaways**\n\n✔ **Use a queue mechanism** to **schedule and retry requests** efficiently.  \n✔ **Batch orders** to reduce individual API requests.  \n✔ **Monitor rate limits and set alerts** for high usage.  \n✔ **Implement exponential backoff** when retrying failed requests.  \n✔ **Use webhooks instead of polling** for order updates.  \n✔ **Cache API responses** to minimize redundant requests.\n\nBy implementing these strategies, you can **avoid disruptions**, **improve efficiency**, and ensure compliance with the **StylusOP Merchant API rate limits**.\n\n---\n\n# Next Steps\n\n---\n\nNow that you’re familiar with the **StylusOP Merchant API**, it’s time to start building your integration. Follow these steps to get up and running quickly:\n\n### 1 - **Set Up Your API Environment**\n\n✅ **Obtain API Credentials** – Expect an email containing your **Merchant ID**, **Merchant Name**, and **API Secret Token.**\n\n✅ **Choose an Authentication Method** – Use **Bearer Authentication (Recommended)** or **Basic Authentication** to authenticate your API requests.\n\n✅ **Set Up Environment Variables** – Store your credentials securely in your development environment.\n\n---\n\n### **2 - Make Your First API Request**\n\n✅ Use **Postman**, **cURL**, or your preferred HTTP client to send a test request to the **Create Order API**.\n\n✅ Verify that your request includes **all required fields** and authentication headers.\n\n✅ Check the response to confirm successful order creation.\n\n---\n\n### **3 - Speed Up Development with Our Official NPM Module for NodeJS**\n\nTo make integration even easier, we provide an official **Node.js module** that helps you interact with the **StylusOP Merchant API** effortlessly.\n\n📦 **Install the package via NPM:**\n\n``` bash\nnpm install @stylusapparel/opv3-merchant-api-nodejs\n\n ```\n\n📚 **Explore the package:**\n\nCheck out the official package and documentation here:\n\n🔗 [@stylusapparel/opv3-merchant-api-nodejs](https://www.npmjs.com/package/@stylusapparel/opv3-merchant-api-nodejs)\n\n---\n\n### **4 - Implement Webhooks for Order Status Updates**\n\n✅ Set up a webhook listener on your server to receive **real-time order updates**.\n\n✅ Validate incoming webhooks using **HMAC verification** or IP whitelisting for security.\n\n✅ Log webhook events to track order fulfillment.\n\n---\n\n### **5 - Error Handling & Debugging**\n\n✅ Implement error handling for **401 Unauthorized**, **400 Bad Request**, **422 Unprocessable Entity,** and **404 Not Found** responses.\n\n✅ Use logging and monitoring tools to debug failed API requests.\n\n✅ Set up **retry mechanisms** for handling temporary failures.\n\n---\n\n### **6\\. Move to Production 🚀**\n\n✅ Test your integration in a **staging environment** before going live.\n\n✅ Follow **security best practices** (e.g., API key rotation, HTTPS enforcement).\n\n✅ Deploy your app and start processing real orders!\n\n---\n\n## **Need Help? Contact Us!** 📩\n\nIf you have any questions, need technical support, or require **general guidance** on integrating with our API, don’t hesitate to reach out!\n\n📧 **Email:** developer@stylusapparel.com, jose@stylusappparel.com\n\n🌐 **Swagger Docs:** [https://stylusopapiv3-staging.stylusapparel.com/api-docs](https://stylusopapiv3-staging.stylusapparel.com/api-doc)","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":false,"owner":"11378681","team":118510,"collectionId":"d17e8b5b-c023-4e6a-81bf-cf4669d8a34c","publishedId":"2sAYXBGeza","public":true,"publicUrl":"https://opv3-merchantapi-docs.stylusapparel.com","privateUrl":"https://go.postman.co/documentation/11378681-d17e8b5b-c023-4e6a-81bf-cf4669d8a34c","customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"documentationLayout":"classic-double-column","customisation":{"metaTags":[{"name":"description","value":""},{"name":"title","value":""}],"appearance":{"default":"light","themes":[{"name":"dark","logo":null,"colors":{"top-bar":"212121","right-sidebar":"303030","highlight":"FF6C37"}},{"name":"light","logo":null,"colors":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"}}]}},"version":"8.10.0","publishDate":"2025-02-12T21:00:21.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{"title":"","description":""},"logos":{"logoLight":null,"logoDark":null}},"statusCode":200},"environments":[{"name":"OPV3_STAGING","id":"160420c1-8413-46c9-a55f-df3bbf217e05","owner":"355529","values":[{"key":"CORE_API_BASEURL","value":"https://stylusopapiv3-staging.stylusapparel.com/api","enabled":true,"type":"default"},{"key":"NODE_ENV","value":"staging","enabled":true,"type":"default"}],"published":true}],"user":{"authenticated":false,"permissions":{"publish":false}},"run":{"button":{"js":"https://run.pstmn.io/button.js","css":"https://run.pstmn.io/button.css"}},"web":"https://www.getpostman.com/","team":{"logo":"https://res.cloudinary.com/postman/image/upload/t_team_logo_pubdoc/v1/team/22000fc7333fd4d507a3707a0f64605cbce4090d1576b9aaee906fbdedb4ee6c","favicon":"https://res.cloudinary.com/postman/image/upload/v1591031549/team/rmt6ldrihpzdmhkaelqv.ico"},"isEnvFetchError":false,"languages":"[{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"HttpClient\"},{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"RestSharp\"},{\"key\":\"curl\",\"label\":\"cURL\",\"variant\":\"cURL\"},{\"key\":\"dart\",\"label\":\"Dart\",\"variant\":\"http\"},{\"key\":\"go\",\"label\":\"Go\",\"variant\":\"Native\"},{\"key\":\"http\",\"label\":\"HTTP\",\"variant\":\"HTTP\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"OkHttp\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"Unirest\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"Fetch\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"jQuery\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"XHR\"},{\"key\":\"c\",\"label\":\"C\",\"variant\":\"libcurl\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Axios\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Native\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Request\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Unirest\"},{\"key\":\"objective-c\",\"label\":\"Objective-C\",\"variant\":\"NSURLSession\"},{\"key\":\"ocaml\",\"label\":\"OCaml\",\"variant\":\"Cohttp\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"cURL\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"Guzzle\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"HTTP_Request2\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"pecl_http\"},{\"key\":\"powershell\",\"label\":\"PowerShell\",\"variant\":\"RestMethod\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"http.client\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"Requests\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"httr\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"RCurl\"},{\"key\":\"ruby\",\"label\":\"Ruby\",\"variant\":\"Net::HTTP\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"Httpie\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"wget\"},{\"key\":\"swift\",\"label\":\"Swift\",\"variant\":\"URLSession\"}]","languageSettings":[{"key":"csharp","label":"C#","variant":"HttpClient"},{"key":"csharp","label":"C#","variant":"RestSharp"},{"key":"curl","label":"cURL","variant":"cURL"},{"key":"dart","label":"Dart","variant":"http"},{"key":"go","label":"Go","variant":"Native"},{"key":"http","label":"HTTP","variant":"HTTP"},{"key":"java","label":"Java","variant":"OkHttp"},{"key":"java","label":"Java","variant":"Unirest"},{"key":"javascript","label":"JavaScript","variant":"Fetch"},{"key":"javascript","label":"JavaScript","variant":"jQuery"},{"key":"javascript","label":"JavaScript","variant":"XHR"},{"key":"c","label":"C","variant":"libcurl"},{"key":"nodejs","label":"NodeJs","variant":"Axios"},{"key":"nodejs","label":"NodeJs","variant":"Native"},{"key":"nodejs","label":"NodeJs","variant":"Request"},{"key":"nodejs","label":"NodeJs","variant":"Unirest"},{"key":"objective-c","label":"Objective-C","variant":"NSURLSession"},{"key":"ocaml","label":"OCaml","variant":"Cohttp"},{"key":"php","label":"PHP","variant":"cURL"},{"key":"php","label":"PHP","variant":"Guzzle"},{"key":"php","label":"PHP","variant":"HTTP_Request2"},{"key":"php","label":"PHP","variant":"pecl_http"},{"key":"powershell","label":"PowerShell","variant":"RestMethod"},{"key":"python","label":"Python","variant":"http.client"},{"key":"python","label":"Python","variant":"Requests"},{"key":"r","label":"R","variant":"httr"},{"key":"r","label":"R","variant":"RCurl"},{"key":"ruby","label":"Ruby","variant":"Net::HTTP"},{"key":"shell","label":"Shell","variant":"Httpie"},{"key":"shell","label":"Shell","variant":"wget"},{"key":"swift","label":"Swift","variant":"URLSession"}],"languageOptions":[{"label":"C# - HttpClient","value":"csharp - HttpClient - C#"},{"label":"C# - RestSharp","value":"csharp - RestSharp - C#"},{"label":"cURL - cURL","value":"curl - cURL - cURL"},{"label":"Dart - http","value":"dart - http - Dart"},{"label":"Go - Native","value":"go - Native - Go"},{"label":"HTTP - HTTP","value":"http - HTTP - HTTP"},{"label":"Java - OkHttp","value":"java - OkHttp - Java"},{"label":"Java - Unirest","value":"java - Unirest - Java"},{"label":"JavaScript - Fetch","value":"javascript - Fetch - JavaScript"},{"label":"JavaScript - jQuery","value":"javascript - jQuery - JavaScript"},{"label":"JavaScript - XHR","value":"javascript - XHR - JavaScript"},{"label":"C - libcurl","value":"c - libcurl - C"},{"label":"NodeJs - Axios","value":"nodejs - Axios - NodeJs"},{"label":"NodeJs - Native","value":"nodejs - Native - NodeJs"},{"label":"NodeJs - Request","value":"nodejs - Request - NodeJs"},{"label":"NodeJs - Unirest","value":"nodejs - Unirest - NodeJs"},{"label":"Objective-C - NSURLSession","value":"objective-c - NSURLSession - Objective-C"},{"label":"OCaml - Cohttp","value":"ocaml - Cohttp - OCaml"},{"label":"PHP - cURL","value":"php - cURL - PHP"},{"label":"PHP - Guzzle","value":"php - Guzzle - PHP"},{"label":"PHP - HTTP_Request2","value":"php - HTTP_Request2 - PHP"},{"label":"PHP - pecl_http","value":"php - pecl_http - PHP"},{"label":"PowerShell - RestMethod","value":"powershell - RestMethod - PowerShell"},{"label":"Python - http.client","value":"python - http.client - Python"},{"label":"Python - Requests","value":"python - Requests - Python"},{"label":"R - httr","value":"r - httr - R"},{"label":"R - RCurl","value":"r - RCurl - R"},{"label":"Ruby - Net::HTTP","value":"ruby - Net::HTTP - Ruby"},{"label":"Shell - Httpie","value":"shell - Httpie - Shell"},{"label":"Shell - wget","value":"shell - wget - Shell"},{"label":"Swift - URLSession","value":"swift - URLSession - Swift"}],"layoutOptions":[{"value":"classic-single-column","label":"Single Column"},{"value":"classic-double-column","label":"Double Column"}],"versionOptions":[],"environmentOptions":[{"value":"0","label":"No Environment"},{"label":"OPV3_STAGING","value":"355529-160420c1-8413-46c9-a55f-df3bbf217e05"}],"canonicalUrl":"https://opv3-merchantapi-docs.stylusapparel.com/view/metadata/2sAYXBGeza"}