Complete API Documentation - Customer & Product Integration Guide
āļāļ API Key āđāļĨāļ° API Secret āļŠāļģāļŦāļĢāļąāļ workspace āļāļāļāļāļļāļ
| Field | Type | Required | Description |
|---|---|---|---|
workspaceId |
string | â āļāļąāļāļāļąāļ | āļĢāļŦāļąāļŠ Workspace āļāļāļāļāļļāļ |
requestedBy |
string | â āļāļąāļāļāļąāļ | Email āļāļāļāļāļđāđāļāļ API Key |
purpose |
string | â āļāļąāļāļāļąāļ | āļ§āļąāļāļāļļāļāļĢāļ°āļŠāļāļāđāđāļāļāļēāļĢāđāļāđāļāļēāļ API |
environment |
string | ⊠āđāļĄāđāļāļąāļāļāļąāļ | production āļŦāļĢāļ·āļ sandbox |
{
"workspaceId": "your-workspace-id",
"requestedBy": "your-email@company.com",
"purpose": "Integration with CRM System",
"environment": "production"
}
{
"success": true,
"data": {
"apiKey": "sk_live_xxxxxxxxxxxxxxxx",
"apiSecret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"environment": "production",
"scopes": ["customer:read", "customer:write", "product:read", "product:write"],
"rateLimit": 100,
"createdAt": "2025-11-06T07:00:00.000Z"
},
"requestId": "req_xxxxxxxxxxxxx"
}
apiSecret āļāļ°āđāļŠāļāļāđāļāļĩāļĒāļāļāļĢāļąāđāļāđāļāļĩāļĒāļ§ āļāļĢāļļāļāļēāđāļāđāļāđāļ§āđāļāļĒāđāļēāļāļāļĨāļāļāļ āļąāļĒ!
āļŠāļĢāđāļēāļ JWT Token āļŠāļģāļŦāļĢāļąāļāđāļāđāđāļĢāļĩāļĒāļ API āļāļ·āđāļāđ
| Field | Type | Required | Description |
|---|---|---|---|
apiKey |
string | â āļāļąāļāļāļąāļ | API Key āļāļĩāđāđāļāđāļāļēāļāļāļąāđāļāļāļāļāļāļĩāđ 1 |
apiSecret |
string | â āļāļąāļāļāļąāļ | API Secret āļāļĩāđāđāļāđāļāļēāļāļāļąāđāļāļāļāļāļāļĩāđ 1 |
{
"success": true,
"data": {
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"tokenType": "Bearer",
"expiresIn": 3600,
"scope": "customer:read customer:write product:read product:write"
},
"requestId": "req_xxxxxxxxxxxxx"
}
āļŠāļĢāđāļēāļāļŦāļĢāļ·āļāļāļąāļāđāļāļāļāđāļāļĄāļđāļĨāļĨāļđāļāļāđāļē (āļĢāļ°āļāļāļāļ°āļāđāļāļŦāļēāļāđāļ§āļĒ customId āļŦāļĢāļ·āļ email āļāđāļēāļĄāļĩāļāļĒāļđāđāđāļĨāđāļ§āļāļ°āļāļąāļāđāļāļ āļāđāļēāđāļĄāđāļĄāļĩāļāļ°āļŠāļĢāđāļēāļāđāļŦāļĄāđ)
company object āļĄāļēāļāđāļ§āļĒ āļĢāļ°āļāļāļāļ°:
Authorization: Bearer {accessToken}
Content-Type: application/json
| Field | Type | Description |
|---|---|---|
name |
string | āļāļ·āđāļ-āļāļēāļĄāļŠāļāļļāļĨ āļĨāļđāļāļāđāļē |
| Field | Type | Description | Example |
|---|---|---|---|
customId |
string | āļĢāļŦāļąāļŠāļĨāļđāļāļāđāļēāļāļēāļāļĢāļ°āļāļāļāļāļāļāļļāļ | "CUST-001" |
email |
string | āļāļĩāđāļĄāļĨ | "john@example.com" |
phone |
string | āđāļāļāļĢāđāđāļāļĢāļĻāļąāļāļāđ | "0812345678" |
customerType |
string | āļāļĢāļ°āđāļ āļ: Customer, Lead, Prospect | "Customer" |
gender |
string | āđāļāļĻ: Male, Female, Other | "Male" |
source |
string | āđāļŦāļĨāđāļāļāļĩāđāļĄāļē | "Facebook Ads" |
tags |
string[] | āđāļāđāļ | ["vip", "wholesale"] |
address |
object | āļāļĩāđāļāļĒāļđāđāļĨāļđāļāļāđāļē (object format) | { addressLine1, subdistrict, district, province, postalCode } |
addressLine1 |
string | āļāļĩāđāļāļĒāļđāđ (flat format - legacy) | "123 āļāļāļāļŠāļļāļāļļāļĄāļ§āļīāļ" |
company |
object | âĻ Auto-create Company! āļāđāļēāļŠāđāļāļĄāļē āļāļ°āļŠāļĢāđāļēāļāļāļĢāļīāļĐāļąāļāđāļĨāļ° link āļāļąāļ | āļāļđāļāļąāļ§āļāļĒāđāļēāļāļāđāļēāļāļĨāđāļēāļ |
customFields |
object | āļāļīāļĨāļāđāđāļāļīāđāļĄāđāļāļīāļĄ | {"āļŦāļĄāļēāļĒāđāļŦāļāļļ": "VIP"} |
| Field | Type | Description | Fallback |
|---|---|---|---|
customId |
string | āļĢāļŦāļąāļŠāļāļĢāļīāļĐāļąāļāļāļēāļāļĢāļ°āļāļāļāļāļāļāļļāļ (āđāļāđāļāđāļāļŦāļē company āļāļĩāđāļĄāļĩāļāļĒāļđāđ) | - |
name |
string | â āļāļąāļāļāļąāļ āļāļ·āđāļāļāļĢāļīāļĐāļąāļ | - |
taxId |
string | āđāļĨāļāļāļĢāļ°āļāļģāļāļąāļ§āļāļđāđāđāļŠāļĩāļĒāļ āļēāļĐāļĩ (āđāļāđāļāđāļāļŦāļē company āļāļĩāđāļĄāļĩāļāļĒāļđāđ) | - |
branch |
string | āļŠāļēāļāļē | "āļŠāļģāļāļąāļāļāļēāļāđāļŦāļāđ" |
phone |
string | āđāļāļāļĢāđāļāļĢāļīāļĐāļąāļ | āđāļāđ phone āļāļāļ customer |
email |
string | āļāļĩāđāļĄāļĨāļāļĢāļīāļĐāļąāļ | āđāļāđ email āļāļāļ customer |
website |
string | āđāļ§āđāļāđāļāļāđ | āđāļāđ website āļāļāļ customer |
address |
string | āļāļĩāđāļāļĒāļđāđāļāļĢāļīāļĐāļąāļ | āđāļāđ address āļāļāļ customer |
addressLine1 |
string | āļāđāļēāļāđāļĨāļāļāļĩāđ/āļāļēāļāļēāļĢ | āđāļāđāļāļēāļ customer |
subdistrict |
string | āļāļģāļāļĨ/āđāļāļ§āļ | āđāļāđāļāļēāļ customer |
district |
string | āļāļģāđāļ āļ/āđāļāļ | āđāļāđāļāļēāļ customer |
province |
string | āļāļąāļāļŦāļ§āļąāļ | āđāļāđāļāļēāļ customer |
postalCode |
string | āļĢāļŦāļąāļŠāđāļāļĢāļĐāļāļĩāļĒāđ | āđāļāđāļāļēāļ customer |
{
"customId": "CUST-001",
"name": "āļŠāļĄāļāļēāļĒ āđāļāļāļĩ",
"email": "somchai@example.com",
"phone": "0812345678",
"customerType": "Customer",
"gender": "Male",
"source": "Facebook",
"tags": ["vip", "wholesale"],
"address": {
"addressLine1": "123 āļāļāļāļŠāļļāļāļļāļĄāļ§āļīāļ",
"subdistrict": "āļāļĨāļāļāđāļāļĒ",
"district": "āļāļĨāļāļāđāļāļĒ",
"province": "āļāļĢāļļāļāđāļāļāļĄāļŦāļēāļāļāļĢ",
"postalCode": "10110"
},
"customFields": {
"āļāļĢāļ°āđāļ āļāļāļļāļĢāļāļīāļ": "āļāđāļēāļŠāđāļ",
"āļ§āļāđāļāļīāļāđāļāļĢāļāļīāļ": "100000"
}
}
customId, taxId āļŦāļĢāļ·āļ name āļāļĢāļāļāļąāļāļāļĩāđāļĄāļĩāļāļĒāļđāđ â āļāļąāļāđāļāļdata (customer) āđāļĨāļ° company{
"customId": "CUST-001",
"name": "āļŠāļĄāļāļēāļĒ āđāļāļāļĩ",
"email": "somchai@example.com",
"phone": "0812345678",
"customerType": "Customer",
"gender": "Male",
"source": "Facebook",
"tags": ["vip", "wholesale"],
"address": {
"addressLine1": "123 āļāļāļāļŠāļļāļāļļāļĄāļ§āļīāļ",
"subdistrict": "āļāļĨāļāļāđāļāļĒ",
"district": "āļāļĨāļāļāđāļāļĒ",
"province": "āļāļĢāļļāļāđāļāļāļĄāļŦāļēāļāļāļĢ",
"postalCode": "10110"
},
"company": {
"customId": "COMP-001",
"name": "āļāļĢāļīāļĐāļąāļ āļāļ·āđāļāļĄāļēāļ āļāļģāļāļąāļ",
"taxId": "0123456789012",
"branch": "āļŠāļģāļāļąāļāļāļēāļāđāļŦāļāđ"
},
"customFields": {
"āļāļĢāļ°āđāļ āļāļāļļāļĢāļāļīāļ": "āļāđāļēāļŠāđāļ",
"āļ§āļāđāļāļīāļāđāļāļĢāļāļīāļ": "100000"
}
}
Note: āđāļāļāļąāļ§āļāļĒāđāļēāļāļāļĩāđ company āđāļĄāđāđāļāđāļŠāđāļ phone, email, address āļĄāļē āļĢāļ°āļāļāļāļ°āđāļāđāļāđāļāļĄāļđāļĨāļāļēāļ customer (somchai@example.com, 0812345678, āļāļĩāđāļāļĒāļđāđāļāļĨāļāļāđāļāļĒ) āđāļāļāļāļąāļāđāļāļĄāļąāļāļī
{
"success": true,
"data": {
"action": "created",
"data": {
"id": "abc123xyz",
"customId": "CUST-001",
"name": "āļŠāļĄāļāļēāļĒ āđāļāļāļĩ",
"email": "somchai@example.com",
"customerType": "Customer",
"companyNames": [{
"id": "company456",
"label": "āļŠāļģāļāļąāļāļāļēāļāđāļŦāļāđ",
"value": "āļāļĢāļīāļĐāļąāļ āļāļ·āđāļāļĄāļēāļ āļāļģāļāļąāļ"
}],
"workspaceId": "your-workspace-id",
"createdAt": 1699257600000,
"updatedAt": 1699257600000
},
"company": {
"id": "company456",
"name": "āļāļĢāļīāļĐāļąāļ āļāļ·āđāļāļĄāļēāļ āļāļģāļāļąāļ",
"taxId": "0123456789012",
"branch": "āļŠāļģāļāļąāļāļāļēāļāđāļŦāļāđ",
"emails": [{"value": "somchai@example.com"}],
"phones": [{"value": "0812345678"}],
"associatedCustomerIds": ["abc123xyz"],
"createdAt": 1699257600000
}
},
"requestId": "req_xxxxxxxxxxxxx"
}
{
"success": true,
"data": {
"action": "updated",
"customer": {
"id": "abc123xyz",
"customId": "CUST-001",
"name": "āļŠāļĄāļāļēāļĒ āđāļāļāļĩ (āđāļāđāđāļ)",
"email": "somchai@example.com",
"updatedAt": 1699257700000
}
},
"requestId": "req_xxxxxxxxxxxxx"
}
| Parameter | Type | Description | Default |
|---|---|---|---|
page |
number | āļŦāļāđāļēāļāļĩāđāļāđāļāļāļāļēāļĢ | 1 |
limit |
number | āļāļģāļāļ§āļāļĢāļēāļĒāļāļēāļĢāļāđāļāļŦāļāđāļē (āļŠāļđāļāļŠāļļāļ 100) | 20 |
search |
string | āļāļģāļāđāļāļŦāļē (āļāļ·āđāļ, āļāļĩāđāļĄāļĨ, āđāļāļāļĢāđāđāļāļĢ) | - |
customerType |
string | āļāļĢāļāļāļāļēāļĄāļāļĢāļ°āđāļ āļ | - |
sortBy |
string | āđāļĢāļĩāļĒāļāļĨāļģāļāļąāļāļāļēāļĄāļāļīāļĨāļāđ | updatedAt |
sortOrder |
string | asc āļŦāļĢāļ·āļ desc | desc |
| Header | Description | Example |
|---|---|---|
X-RateLimit-Limit |
āļāļģāļāļ§āļ requests āļŠāļđāļāļŠāļļāļāļāđāļāļāļēāļāļĩ | 100 |
X-RateLimit-Remaining |
āļāļģāļāļ§āļ requests āļāļĩāđāđāļŦāļĨāļ·āļ | 95 |
X-RateLimit-Reset |
āđāļ§āļĨāļēāļāļĩāđāļĢāļĩāđāļāđāļ (Unix timestamp) | 1699257660 |
āļŠāļĢāđāļēāļāļŦāļĢāļ·āļāļāļąāļāđāļāļāļāđāļāļĄāļđāļĨāļŠāļīāļāļāđāļē (āļĢāļ°āļāļāļāļ°āļāđāļāļŦāļēāļāđāļ§āļĒ customId, sku āļŦāļĢāļ·āļ barcode āļāđāļēāļĄāļĩāļāļĒāļđāđāđāļĨāđāļ§āļāļ°āļāļąāļāđāļāļ āļāđāļēāđāļĄāđāļĄāļĩāļāļ°āļŠāļĢāđāļēāļāđāļŦāļĄāđ)
customId 2) sku 3) barcode
Authorization: Bearer {accessToken}
Content-Type: application/json
| Field | Type | Description |
|---|---|---|
name |
string | āļāļ·āđāļāļŠāļīāļāļāđāļē |
price |
number | āļĢāļēāļāļēāļāļēāļĒ (āļāđāļāļ >= 0) |
| Field | Type | Description | Example |
|---|---|---|---|
customId |
string | āļĢāļŦāļąāļŠāļŠāļīāļāļāđāļēāļāļēāļāļĢāļ°āļāļāļāļāļāļāļļāļ (āđāļāđāļŠāļģāļŦāļĢāļąāļ upsert) | "PROD-001" |
sku |
string | āļĢāļŦāļąāļŠāļŠāļīāļāļāđāļē (Stock Keeping Unit) | "SKU-001" |
barcode |
string | āļāļēāļĢāđāđāļāđāļ | "8850999320014" |
description |
string | āļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļŠāļīāļāļāđāļē | "āļŠāļīāļāļāđāļēāļāļļāļāļ āļēāļāļāļĩ" |
category |
string | āļŦāļĄāļ§āļāļŦāļĄāļđāđāļŠāļīāļāļāđāļē | "āļāļīāđāļĨāđāļāļāļĢāļāļāļīāļāļŠāđ" |
costPrice |
number | āļĢāļēāļāļēāļāļļāļ | 150 |
unit |
string | āļŦāļāđāļ§āļĒāļāļąāļ | "āļāļīāđāļ", "āļāļĨāđāļāļ" |
initialStock |
number | āļŠāļāđāļāļāđāļĢāļīāđāļĄāļāđāļ (āļŠāļģāļŦāļĢāļąāļāļŠāļīāļāļāđāļēāđāļŦāļĄāđ) | 100 |
availableStock |
number | āļŠāļāđāļāļāļāļĩāđāļĄāļĩ (āļŠāļģāļŦāļĢāļąāļāļāļąāļāđāļāļ) | 50 |
reorderLevel |
number | āļāļļāļāļŠāļąāđāļāļāļ·āđāļāđāļŦāļĄāđ | 10 |
targetStockLevel |
number | āļŠāļāđāļāļāđāļāđāļēāļŦāļĄāļēāļĒ | 100 |
supplier |
string | āļāļđāđāļāļąāļāļāļģāļŦāļāđāļēāļĒ | "ABC Supply Co." |
status |
string | āļŠāļāļēāļāļ°: active, draft, discontinued | "active" |
imageUrl |
string | URL āļĢāļđāļāļ āļēāļāļŦāļĨāļąāļ | "https://..." |
imageSet |
string[] | āļĢāļđāļāļ āļēāļāđāļāļīāđāļĄāđāļāļīāļĄ | ["https://...", "https://..."] |
showInCatalog |
boolean | āđāļŠāļāļāđāļāđāļāđāļāļāļēāļĨāđāļāļ | true |
hashtags |
string[] | āđāļŪāļāđāļāđāļ | ["āļāļēāļĒāļāļĩ", "āđāļāļĢāđāļĄāļāļąāđāļ"] |
customFields |
object | āļāļīāļĨāļāđāđāļāļīāđāļĄāđāļāļīāļĄ | {"āļ§āļąāļāļŦāļĄāļāļāļēāļĒāļļ": "2025-12-31"} |
initialStock āđāļāđāļāļāđāļēāđāļĢāļīāđāļĄāļāđāļāļāļąāđāļ initialStock āđāļĨāļ° availableStock āļŦāļēāļāđāļĄāđāļĢāļ°āļāļļāļāļ°āđāļāđāļ 0
{
"sku": "SKU-001",
"barcode": "8850999320014",
"name": "āđāļŠāļ·āđāļāļĒāļ·āļāļāļāļāļĨāļĄ āļŠāļĩāļāļēāļ§",
"description": "āđāļŠāļ·āđāļāļĒāļ·āļāļāđāļēāļāļāļāļāļāļ 100% āļŠāļĩāļāļēāļ§ āđāļŠāđāļŠāļāļēāļĒ",
"price": 299,
"costPrice": 150,
"category": "āđāļŠāļ·āđāļāļāđāļē",
"unit": "āļāļąāļ§",
"initialStock": 100,
"reorderLevel": 10,
"targetStockLevel": 100,
"supplier": "ABC Textile Co.",
"status": "active",
"imageUrl": "https://example.com/shirt-white.jpg",
"imageSet": [
"https://example.com/shirt-white-front.jpg",
"https://example.com/shirt-white-back.jpg"
],
"showInCatalog": true,
"hashtags": ["āđāļŠāļ·āđāļāļāđāļē", "āļāļēāļĒāļāļĩ", "basic"],
"customFields": {
"āđāļāļĢāļāļāđ": "MyBrand",
"āļāļĢāļ°āđāļāļĻāļāļĨāļīāļ": "āđāļāļĒ"
}
}
{
"success": true,
"data": {
"action": "created",
"product": {
"id": "prod123xyz",
"sku": "SKU-001",
"sku_lower": "sku-001",
"barcode": "8850999320014",
"name": "āđāļŠāļ·āđāļāļĒāļ·āļāļāļāļāļĨāļĄ āļŠāļĩāļāļēāļ§",
"price": 299,
"initialStock": 100,
"availableStock": 100,
"workspaceId": "your-workspace-id",
"createdAt": 1699257600000,
"updatedAt": 1699257600000
}
},
"requestId": "req_xxxxxxxxxxxxx"
}
{
"success": true,
"data": {
"action": "updated",
"product": {
"id": "prod123xyz",
"sku": "SKU-001",
"name": "āđāļŠāļ·āđāļāļĒāļ·āļāļāļāļāļĨāļĄ āļŠāļĩāļāļēāļ§ (āļāļąāļāđāļāļ)",
"price": 349,
"availableStock": 75,
"updatedAt": 1699257700000
}
},
"requestId": "req_xxxxxxxxxxxxx"
}
āļāļķāļāļāđāļāļĄāļđāļĨāļŠāļīāļāļāđāļēāļāđāļ§āļĒ Firestore Document ID
āļāļķāļāļāđāļāļĄāļđāļĨāļŠāļīāļāļāđāļēāļāđāļ§āļĒāļĢāļŦāļąāļŠāļŠāļīāļāļāđāļēāļāļēāļāļĢāļ°āļāļāļāļāļāļāļļāļ
āļāļķāļāļāđāļāļĄāļđāļĨāļŠāļīāļāļāđāļēāļāđāļ§āļĒāļĢāļŦāļąāļŠ SKU (āđāļĄāđāļŠāļāđāļāļāļąāļ§āļāļīāļĄāļāđāđāļĨāđāļ-āđāļŦāļāđ)
āļāļķāļāļāđāļāļĄāļđāļĨāļŠāļīāļāļāđāļēāļāđāļ§āļĒāļāļēāļĢāđāđāļāđāļ
| Parameter | Type | Description | Default |
|---|---|---|---|
page |
number | āļŦāļāđāļēāļāļĩāđāļāđāļāļāļāļēāļĢ | 1 |
limit |
number | āļāļģāļāļ§āļāļĢāļēāļĒāļāļēāļĢāļāđāļāļŦāļāđāļē (āļŠāļđāļāļŠāļļāļ 100) | 20 |
search |
string | āļāļģāļāđāļāļŦāļē (āļāļ·āđāļ, āļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļ, SKU, āļāļēāļĢāđāđāļāđāļ) | - |
category |
string | āļāļĢāļāļāļāļēāļĄāļŦāļĄāļ§āļāļŦāļĄāļđāđ | - |
status |
string | active, draft, discontinued | - |
minPrice |
number | āļĢāļēāļāļēāļāđāļģāļŠāļļāļ | - |
maxPrice |
number | āļĢāļēāļāļēāļŠāļđāļāļŠāļļāļ | - |
inStock |
boolean | āļāļĢāļāļāđāļāļāļēāļ°āļŠāļīāļāļāđāļēāđāļāļŠāļāđāļāļ | - |
hashtags |
string | āđāļŪāļāđāļāđāļ (āļāļąāđāļāļāđāļ§āļĒ comma) | - |
sortBy |
string | āđāļĢāļĩāļĒāļāļĨāļģāļāļąāļāļāļēāļĄāļāļīāļĨāļāđ (name, price, updatedAt) | updatedAt |
sortOrder |
string | asc āļŦāļĢāļ·āļ desc | desc |
GET /api/v1/products?page=1&limit=10&category=āđāļŠāļ·āđāļāļāđāļē&inStock=true&sortBy=price&sortOrder=asc
Authorization: Bearer {accessToken}
{
"success": true,
"data": {
"products": [
{
"id": "prod123xyz",
"sku": "SKU-001",
"barcode": "8850999320014",
"name": "āđāļŠāļ·āđāļāļĒāļ·āļāļāļāļāļĨāļĄ āļŠāļĩāļāļēāļ§",
"price": 299,
"availableStock": 75,
"category": "āđāļŠāļ·āđāļāļāđāļē",
"status": "active"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 1,
"totalPages": 1,
"hasMore": false
}
},
"requestId": "req_xxxxxxxxxxxxx"
}
{
"error": "error_code",
"message": "Human readable error message",
"details": {
"additional": "error details"
},
"requestId": "req_xxxxxxxxxxxxx",
"timestamp": "2025-11-06T07:00:00.000Z"
}
| Error Code | HTTP Status | Description |
|---|---|---|
validation_error |
400 | āļāđāļāļĄāļđāļĨāļāļĩāđāļŠāđāļāļĄāļēāđāļĄāđāļāļđāļāļāđāļāļ |
invalid_credentials |
401 | API Key āļŦāļĢāļ·āļ Secret āđāļĄāđāļāļđāļāļāđāļāļ |
invalid_token |
401 | JWT Token āđāļĄāđāļāļđāļāļāđāļāļāļŦāļĢāļ·āļāļŦāļĄāļāļāļēāļĒāļļ |
forbidden |
403 | āđāļĄāđāļĄāļĩāļŠāļīāļāļāļīāđāđāļāđāļēāļāļķāļ |
bot_detected |
403 | āļāļĢāļ§āļāļāļāļāļĪāļāļīāļāļĢāļĢāļĄāļāļĩāđāļāđāļēāļŠāļāļŠāļąāļĒ |
not_found |
404 | āđāļĄāđāļāļāļāđāļāļĄāļđāļĨāļāļĩāđāļāđāļāļāļāļēāļĢ |
rate_limit_exceeded |
429 | āđāļāļīāļāļāļģāļāļ§āļ requests āļāļĩāđāļāļģāļŦāļāļ |
internal_error |
500 | āđāļāļīāļāļāđāļāļāļīāļāļāļĨāļēāļāļ āļēāļĒāđāļāđāļāļīāļĢāđāļāđāļ§āļāļĢāđ |
āļāļĒāđāļēāđāļāđāļ secret āđāļ code āļŦāļĢāļ·āļ version control āđāļāđ environment variables
āļāļĒāđāļēāļŠāđāļ API requests āļāđāļēāļ HTTP
āļāđāļ§āļĒāļāđāļāļāļāļąāļāļāļēāļĢāļŠāļĢāđāļēāļāļāđāļāļĄāļđāļĨāļāđāļģ
āļāļĢāļ§āļāļŠāļāļ response headers āđāļĨāļ° implement exponential backoff
// 1. Get JWT Token
async function getAccessToken() {
const response = await fetch('/api/v1/auth/token', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
apiKey: 'your-api-key',
apiSecret: 'your-api-secret'
})
});
const data = await response.json();
return data.data.accessToken;
}
// 2. Create Customer
async function createCustomer(token, customerData) {
const response = await fetch('/api/v1/customers/upsert', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`,
'Idempotency-Key': `create-${Date.now()}`
},
body: JSON.stringify(customerData)
});
return response.json();
}
// 3. List Customers
async function listCustomers(token, page = 1, limit = 20) {
const response = await fetch(
`/api/v1/customers?page=${page}&limit=${limit}`,
{
headers: { 'Authorization': `Bearer ${token}` }
}
);
return response.json();
}
async function callAPIWithRetry(url, options, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
const response = await fetch(url, options);
// Check rate limit headers
const remaining = parseInt(response.headers.get('X-RateLimit-Remaining'));
console.log(`API calls remaining: ${remaining}`);
if (response.status === 429) {
const retryAfter = parseInt(response.headers.get('Retry-After'));
console.log(`Rate limited. Retry after ${retryAfter} seconds`);
await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
continue;
}
return response;
}
throw new Error('Max retries exceeded');
}