Requests & Conventions
This guide covers the conventions, standards, and best practices for making requests to the Marketiger API.
Base URL
All API requests should be made to:
https://devapi.marketiger3d.com/v2
HTTP Methods
The API uses standard HTTP methods:
| Method | Usage | Example |
|---|---|---|
GET | Retrieve resources | Get projects, models, folders |
POST | Create resources or perform actions | Create orders, upload models |
PUT | Update resources | Update order status |
DELETE | Delete resources | Remove folders, cancel orders |
Request Headers
Required Headers
All requests should include:
Content-Type: application/json
Authenticated requests must include:
Authorization: Bearer <your_access_token>
Example Headers
curl -X GET "https://devapi.marketiger3d.com/v2/Project/GetProjects" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
Request Body Format
JSON Format
All request bodies must be valid JSON:
{
"projectId": "123e4567-e89b-12d3-a456-426614174000",
"orderReference": "ORDER-12345",
"orderContent": {
"ConfigIds": ["config-id-1", "config-id-2"],
"ExternalConfigIds": [],
"StockIds": []
}
}
Content-Type
Always set the Content-Type header to application/json when sending JSON data.
Response Format
All API responses follow a consistent format:
Success Response
{
"success": true,
"data": {
// Response data here
}
}
Error Response
{
"success": false,
"error": {
"type": "ERROR_TYPE",
"message": "Human-readable error message"
}
}
Data Types
GUIDs / UUIDs
Many endpoints use GUIDs (UUIDs) for identifiers:
- Format:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - Example:
123e4567-e89b-12d3-a456-426614174000 - Usage: Project IDs, Model IDs, Order IDs, Folder IDs
Dates
Dates are typically returned in ISO 8601 format:
- Format:
YYYY-MM-DDTHH:mm:ssZ - Example:
2024-01-15T10:30:00Z
Country Codes
When specifying countries, use ISO 3166-1 alpha-2 or alpha-3 country codes:
- Alpha-2:
US,GB,NL - Alpha-3:
USA,GBR,NLD - Maximum length: 3 characters
Query Parameters
For GET requests, parameters are passed as query strings:
GET /Model3D/GetModelData?modelId=123e4567-e89b-12d3-a456-426614174000
URL Encoding
Always URL-encode query parameters:
const modelId = '123e4567-e89b-12d3-a456-426614174000';
const url = `https://devapi.marketiger3d.com/v2/Model3D/GetModelData?modelId=${encodeURIComponent(modelId)}`;
Common Request Patterns
Creating an Order
POST /Order/CreateOrder
{
"firstName": "John",
"lastName": "Doe",
"streetAddress": "123 Main St",
"postal": "10001",
"phoneNumber": "+1234567890",
"email": "customer@example.com",
"city": "New York",
"country": "US",
"countryState": "NY",
"models": [
{
"modelId": "123e4567-e89b-12d3-a456-426614174000",
"quantity": 1
}
],
"shippingMethod": 2503
}
Getting Resources
# Get all projects
GET /Project/GetProjects
# Get a specific model
GET /Model3D/GetModelData?modelId=guid-here
# Get folders for a project
GET /Folder/GetFolders?projectId=guid-here
Pagination
Some endpoints support pagination. Check individual endpoint documentation for pagination parameters.
Rate Limiting
The API implements rate limiting to ensure fair usage:
- Limit: Varies by endpoint and user tier
- Response:
429 Too Many Requestswhen limit exceeded - Headers: Check
X-RateLimit-*headers for limit information
Handling Rate Limits
Implement exponential backoff when receiving 429 responses:
async function makeRequestWithRetry(url, options, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
const response = await fetch(url, options);
if (response.status === 429) {
const retryAfter = parseInt(response.headers.get('Retry-After') || '1');
const delay = retryAfter * Math.pow(2, i); // Exponential backoff
await new Promise(resolve => setTimeout(resolve, delay * 1000));
continue;
}
return response;
}
throw new Error('Max retries exceeded');
}
Timeouts
- Request Timeout: 30 seconds for most endpoints
- Long-running Operations: Some endpoints may have extended timeouts
Implement appropriate timeout handling in your HTTP client:
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 30000);
fetch(url, {
...options,
signal: controller.signal
}).finally(() => clearTimeout(timeoutId));
Best Practices
Error Handling
Always check the success field in responses:
const response = await fetch(url, options);
const data = await response.json();
if (!data.success) {
console.error('Error:', data.error.message);
// Handle error
return;
}
// Use data.data for successful responses
Request Validation
Validate data before sending requests:
- Check required fields are present
- Validate GUID formats
- Ensure country codes are valid
- Verify email addresses are properly formatted
Idempotency
For order creation and other critical operations, use unique orderReference values to prevent duplicate operations.
Logging
Log requests and responses for debugging (but never log tokens or sensitive data):
console.log('Request:', {
method: 'POST',
endpoint: '/Order/CreateOrder',
// Don't log: tokens, passwords, sensitive data
});
Code Examples
JavaScript/TypeScript
class MarketigerAPI {
constructor(accessToken) {
this.baseUrl = 'https://devapi.marketiger3d.com/v2';
this.accessToken = accessToken;
}
async request(method, endpoint, body = null) {
const options = {
method,
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${this.accessToken}`
}
};
if (body) {
options.body = JSON.stringify(body);
}
const response = await fetch(`${this.baseUrl}${endpoint}`, options);
const data = await response.json();
if (!response.ok || !data.success) {
throw new Error(data.error?.message || 'Request failed');
}
return data.data;
}
async getProjects() {
return this.request('GET', '/Project/GetProjects');
}
async getModelData(modelId) {
return this.request('GET', `/Model3D/GetModelData?modelId=${modelId}`);
}
}
C#
public class MarketigerAPI
{
private readonly HttpClient _client;
private readonly string _baseUrl = "https://devapi.marketiger3d.com/v2";
public MarketigerAPI(string accessToken)
{
_client = new HttpClient();
_client.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken);
_client.DefaultRequestHeaders.Add("Content-Type", "application/json");
}
public async Task<T> RequestAsync<T>(HttpMethod method, string endpoint, object body = null)
{
var request = new HttpRequestMessage(method, $"{_baseUrl}{endpoint}");
if (body != null)
{
var json = JsonSerializer.Serialize(body);
request.Content = new StringContent(json, Encoding.UTF8, "application/json");
}
var response = await _client.SendAsync(request);
var content = await response.Content.ReadAsStringAsync();
var apiResponse = JsonSerializer.Deserialize<APIResponse<T>>(content);
if (!response.IsSuccessStatusCode || !apiResponse.Success)
{
throw new Exception(apiResponse.Error?.Message ?? "Request failed");
}
return apiResponse.Data;
}
public async Task<List<Project>> GetProjectsAsync()
{
return await RequestAsync<List<Project>>(HttpMethod.Get, "/Project/GetProjects");
}
}
Next Steps
- Review Error Handling for detailed error information
- Check Authentication for authentication details
- Explore the API Reference for endpoint documentation