P4 Warehouse proporciona una API REST completa que permite una integración perfecta con sistemas externos, incluidos ERPs, plataformas de comercio electrónico y aplicaciones personalizadas. Esta guía cubre la autenticación, los endpoints de la API y los patrones de integración más comunes.
Documentación Completa: Para la documentación completa de P4 Warehouse, incluidas guías de usuario, configuración y recursos adicionales, visite https://docs.p4.software
SEGURIDAD: Nunca exponga su clave de API en código del lado del cliente o en repositorios públicos. Almacene las credenciales de forma segura utilizando variables de entorno o sistemas de gestión de claves seguras.
Setup > System > UsersTodas las solicitudes de API requieren los siguientes encabezados:
Authorization: Bearer {your-api-key}
Content-Type: application/json
Accept: application/json
https://api.p4warehouse.com/{Resource}Api/{Action}
https://api.p4warehouse.com (la misma para todos los inquilinos)Cada recurso generalmente admite estas acciones:
| Acción | Método HTTP | Descripción |
|---|---|---|
| CreateOrUpdate | POST | Crear nuevo o actualizar registro existente |
| DeleteBatch | POST | Eliminar múltiples registros |
| Get | GET | Recuperar un registro único |
| List | GET | Recuperar múltiples registros con paginación |
| Execute | POST | Ejecutar Operaciones específicas |
https://api.p4warehouse.com/ProductApi/CreateOrUpdate
https://api.p4warehouse.com/PickTicketApi/CreateOrUpdate
https://api.p4warehouse.com/PurchaseOrderApi/DeleteBatch
https://api.p4warehouse.com/FourWallReport/Execute
Nota: La identificación del inquilino se gestiona a través de la clave de API en el encabezado de Autorización, no a través de la URL.
POST https://api.p4warehouse.com/ProductApi/CreateOrUpdate
{
"sku": "WIDGET-001",
"description": "Blue Widget - Large",
"barcode": "123456789012",
"client_id": "CLIENT01",
"weight": 1.5,
"length": 10,
"width": 8,
"height": 5,
"unit_of_measure": "EACH",
"lot_tracking": false,
"serial_tracking": false,
"expiry_tracking": false,
"active": true,
"pack_sizes": [
{
"pack_size": 12,
"barcode": "123456789013",
"description": "Case of 12"
}
]
}
{
"success": true,
"product_id": "12345",
"message": "Product created successfully"
}
POST https://api.p4warehouse.com/PurchaseOrderApi/CreateOrUpdate
{
"po_number": "PO-2024-001",
"vendor_id": "VENDOR01",
"warehouse_code": "WH01",
"expected_date": "2024-12-31",
"reference": "Vendor Ref #12345",
"lines": [
{
"line_number": 1,
"sku": "WIDGET-001",
"quantity": 100,
"unit_cost": 5.50
},
{
"line_number": 2,
"sku": "WIDGET-002",
"quantity": 50,
"unit_cost": 7.25
}
]
}
POST https://api.p4warehouse.com/PickTicketApi/CreateOrUpdate
{
"order_number": "SO-2024-001",
"customer_id": "CUST01",
"warehouse_code": "WH01",
"order_date": "2024-01-15",
"required_date": "2024-01-20",
"ship_to": {
"name": "John Doe",
"company": "ABC Company",
"address1": "123 Main Street",
"address2": "Suite 100",
"city": "Anytown",
"state": "CA",
"postal_code": "12345",
"country": "US",
"phone": "555-123-4567"
},
"carrier": "FEDEX",
"service_level": "GROUND",
"lines": [
{
"line_number": 1,
"sku": "WIDGET-001",
"quantity": 5
},
{
"line_number": 2,
"sku": "WIDGET-002",
"quantity": 10
}
]
}
GET https://api.p4warehouse.com/FourWallReport/Execute?warehouse_code=WH01
{
"success": true,
"data": [
{
"sku": "WIDGET-001",
"description": "Blue Widget - Large",
"warehouse_code": "WH01",
"bin_location": "A-01-01",
"quantity_on_hand": 150,
"quantity_allocated": 25,
"quantity_available": 125,
"lot_number": "LOT123",
"expiry_date": "2025-12-31",
"last_updated": "2024-01-15T10:30:00Z"
}
],
"total_records": 1
}
POST https://api.p4warehouse.com/InventoryApi/Adjust
{
"warehouse_code": "WH01",
"adjustments": [
{
"sku": "WIDGET-001",
"bin_location": "A-01-01",
"quantity": 10,
"reason_code": "CYCLE_COUNT",
"notes": "Physical count adjustment"
}
]
}
POST https://api.p4warehouse.com/CustomerApi/CreateOrUpdate
{
"customer_number": "CUST01",
"company_name": "ABC Company",
"contact_person": "John Doe",
"Email": "john@abccompany.com",
"phone": "555-123-4567",
"addresses": [
{
"type": "Shipping",
"address1": "123 Main Street",
"city": "Anytown",
"state": "CA",
"postal_code": "12345",
"country": "US",
"is_default": true
}
]
}
POST https://api.p4warehouse.com/VendorApi/CreateOrUpdate
{
"vendor_number": "VENDOR01",
"company_name": "XYZ Suppliers",
"contact_person": "Jane Smith",
"Email": "jane@xyzsuppliers.com",
"phone": "555-987-6543"
}
curl -X POST https://api.p4warehouse.com/ProductApi/CreateOrUpdate \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sku": "TEST-001",
"description": "Test Product"
}'
import requests
import json
class P4WarehouseClient:
def __init__(self, api_key):
self.base_url = "https://api.p4warehouse.com"
self.headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
def create_product(self, product_data):
url = f"{self.base_url}/ProductApi/CreateOrUpdate"
response = requests.post(url,
headers=self.headers,
json=product_data)
return response.json()
def get_inventory(self, warehouse_code):
url = f"{self.base_url}/FourWallReport/Execute"
params = {"warehouse_code": warehouse_code}
response = requests.get(url,
headers=self.headers,
params=params)
return response.json()
# Usage
client = P4WarehouseClient("your-api-key")
Inventory = client.get_inventory("WH01")
const axios = require('axios');
class P4WarehouseClient {
constructor(apiKey) {
this.baseURL = 'https://api.p4warehouse.com';
this.headers = {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
};
}
async createOrder(orderData) {
try {
const response = await axios.post(
`${this.baseURL}/PickTicketApi/CreateOrUpdate`,
orderData,
{ headers: this.headers }
);
return response.data;
} catch (error) {
console.error('Error creating order:', error.response.data);
throw error;
}
}
}
// Usage
const client = new P4WarehouseClient('your-api-key');
const order = await client.createOrder({
order_number: 'SO-2024-001',
customer_id: 'CUST01',
// ... other order data
});
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
public class P4WarehouseClient
{
private readonly HttpClient _httpClient;
private readonly string _baseUrl = "https://api.p4warehouse.com";
public P4WarehouseClient(string apiKey)
{
_httpClient = new HttpClient();
_httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");
_httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
}
public async Task<T> PostAsync<T>(string endpoint, object data)
{
var json = JsonConvert.SerializeObject(data);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await _httpClient.PostAsync($"{_baseUrl}/{endpoint}", content);
response.EnsureSuccessStatusCode();
var responseJson = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T>(responseJson);
}
}
P4 Warehouse puede enviar notificaciones en tiempo real a sus endpoints cuando ocurren eventos específicos.
{
"event_type": "ORDER_SHIPPED",
"timestamp": "2024-01-15T14:30:00Z",
"tenant": "your-tenant-identifier",
"data": {
"order_number": "SO-2024-001",
"tracking_number": "1234567890",
"carrier": "FEDEX",
"ship_date": "2024-01-15",
"lines": [
{
"sku": "WIDGET-001",
"quantity_shipped": 5
}
]
},
"signature": "sha256=..."
}
Siempre valide las firmas de los webhooks para garantizar su autenticidad:
import hmac
import hashlib
def validate_webhook(payload, signature, secret):
expected = hmac.new(
secret.encode(),
payload.encode(),
hashlib.sha256
).hexdigest()
return hmac.compare_digest(
f"sha256={expected}",
signature
)
| Código de Estado | Significado | Acción Requerida |
|---|---|---|
| 200 | Éxito | Ninguna |
| 400 | Solicitud Incorrecta | Verifique el formato de la solicitud y los campos requeridos |
| 401 | No Autorizado | Verifique la clave de API |
| 403 | Prohibido | Verifique los permisos para el recurso |
| 404 | No Encontrado | Verifique la URL del endpoint y el ID del recurso |
| 429 | Límite de Solicitudes Alcanzado | Implemente reintentos con retroceso exponencial |
| 500 | Error del Servidor | Contacte al Soporte si persiste |
{
"success": false,
"error": {
"code": "INVALID_SKU",
"message": "Product with SKU 'WIDGET-999' not found",
"details": {
"field": "sku",
"value": "WIDGET-999"
}
},
"timestamp": "2024-01-15T10:30:00Z"
}
Implemente retroceso exponencial para errores transitorios:
import time
import random
def retry_request(func, max_retries=3):
for attempt in range(max_retries):
try:
return func()
except Exception as e:
if attempt == max_retries - 1:
raise
# Exponential backoff with jitter
wait_time = (2 ** attempt) + random.uniform(0, 1)
time.sleep(wait_time)
Para conjuntos de datos grandes, utilice parámetros de paginación:
GET https://api.p4warehouse.com/ProductApi/List?page=1&page_size=100
Utilice parámetros de consulta para filtrar resultados:
GET https://api.p4warehouse.com/InventoryApi/List?warehouse_code=WH01&sku=WIDGET*
Incluya claves de idempotencia para Operaciones críticas:
{
"idempotency_key": "unique-key-12345",
"order_number": "SO-2024-001",
// ... rest of order data
}
Siempre valide los datos antes de enviarlos:
Mantenga registros completos:
Pruebe su integración utilizando el sandbox:
https://api.p4warehouse.com (la misma que Producción)Utilice estos SKUs de prueba en el sandbox:
TEST-001 hasta TEST-100: Productos estándarLOT-001: Producto con seguimiento por lote
Was this page helpful?