Developer API
Build on the Soto & Segovia Gifting Platform
A RESTful API for ordering, tracking, and managing curated Spanish gourmet gifts at any scale. Integrate gifting into your CRM, sales tools, or AI agents.
REST
Architecture
JSON
Format
TLS 1.3
Transport
v1
Current Version
Authentication
API Keys
All requests require a Bearer token in the Authorization header. API keys are scoped to your client portal account and can be generated from Settings › API Keys.
Keep your key secret. Rotate it immediately if it is ever exposed. Keys do not expire but can be revoked from your portal at any time.
Sandbox vs Production
Keys prefixed with sk_test_ hit the sandbox environment. Production keys use sk_live_. No real orders are placed in sandbox.
# Include in every request
curl https://api.sotosegoviaimports.com/v1/orders \
-H "Authorization: Bearer sk_live_••••••••••••••••" \
-H "Content-Type: application/json"Base URL
Endpoint Root
All API endpoints are rooted at the base URL below. The current stable version is v1. Version is part of the path, not a header.
Sandbox requests use the same base URL. The environment is determined by your API key prefix.
Production:
https://api.sotosegoviaimports.com/v1
Sandbox:
https://api.sotosegoviaimports.com/v1
(use sk_test_ key)Endpoints
Full Endpoint Reference
Orders
/v1/orders/v1/orders/v1/orders/{id}/v1/orders/{id}/v1/orders/{id}Products
/v1/products/v1/products/{slug}Recipients
/v1/recipients/v1/recipients/v1/recipients/{id}/v1/recipients/{id}/v1/recipients/{id}Gift Sends
/v1/gifts/send/v1/gifts/bulk/v1/gifts/recommendTracking
/v1/tracking/{order_id}Webhooks
/v1/webhooks/v1/webhooks/v1/webhooks/{id}Orders
Create & Manage Orders
Create an Order
Places a new gift order. Returns the order object with status pending until payment is confirmed.
POST /v1/orders
Authorization: Bearer sk_live_••••
{
"product_slug": "iberian-olive-oil-collection",
"quantity": 1,
"recipient": {
"name": "Sarah Johnson",
"email": "sarah@acme.com",
"address": {
"line1": "123 Park Ave",
"city": "New York",
"state": "NY",
"postal_code": "10001",
"country": "US"
}
},
"gift_message": "Congratulations on the promotion!",
"notify_recipient": true
}{
"id": "ord_1a2b3c4d",
"status": "pending",
"product_slug": "iberian-olive-oil-collection",
"quantity": 1,
"amount": 8500,
"currency": "usd",
"recipient": {
"name": "Sarah Johnson",
"email": "sarah@acme.com"
},
"tracking_number": null,
"created_at": "2026-08-19T21:00:00Z",
"updated_at": "2026-08-19T21:00:00Z"
}List Orders
Returns a paginated list of orders. Supports filtering by status, date range, and recipient email.
GET /v1/orders?status=shipped&limit=20&page=1
Authorization: Bearer sk_live_••••{
"data": [
{
"id": "ord_1a2b3c4d",
"status": "shipped",
"recipient": {
"name": "Sarah Johnson"
},
"amount": 8500,
"created_at": "2026-08-19T21:00:00Z"
}
],
"meta": {
"total": 84,
"page": 1,
"limit": 20,
"has_more": true
}
}Update an Order
Update address, gift message, or recipient details. Only possible while status is pending.
PATCH /v1/orders/ord_1a2b3c4d
Authorization: Bearer sk_live_••••
{
"gift_message": "Updated: Congrats on the new role!",
"recipient": {
"address": {
"line1": "456 5th Ave",
"city": "New York",
"state": "NY",
"postal_code": "10018",
"country": "US"
}
}
}{
"id": "ord_1a2b3c4d",
"status": "pending",
"gift_message": "Updated: Congrats on the new role!",
"updated_at": "2026-08-19T21:05:00Z"
}Gift Sends
Bulk Gifting
Send the same gift to multiple recipients in a single API call. Each recipient gets an independent order record. Useful for ABM campaigns and event follow-up sends.
POST /v1/gifts/bulk
Authorization: Bearer sk_live_••••
{
"product_slug": "spanish-salt-gift-box",
"gift_message": "Thank you for meeting with us.",
"recipients": [
{
"name": "Marcus Lee",
"email": "marcus@company.com",
"address": { "line1": "...", "city": "Austin", "state": "TX", "postal_code": "73301", "country": "US" }
},
{
"name": "Priya Patel",
"email": "priya@startup.io",
"address": { "line1": "...", "city": "SF", "state": "CA", "postal_code": "94105", "country": "US" }
}
]
}{
"batch_id": "bat_x9y8z7",
"status": "processing",
"total": 2,
"orders": [
{ "id": "ord_aaa111", "recipient_email": "marcus@company.com", "status": "pending" },
{ "id": "ord_bbb222", "recipient_email": "priya@startup.io", "status": "pending" }
],
"created_at": "2026-08-19T21:00:00Z"
}AI Recommendations
Gift Recommendations
Pass context about a recipient and receive a ranked list of product recommendations with reasoning. Powers the Claude MCP get_gift_recommendation tool.
POST /v1/gifts/recommend
Authorization: Bearer sk_live_••••
{
"recipient_context": {
"role": "CFO",
"industry": "Technology",
"location": "New York, NY",
"occasion": "Deal close",
"budget_cents": 15000
}
}{
"recommendations": [
{
"rank": 1,
"product_slug": "iberian-olive-oil-collection",
"name": "Iberian Olive Oil Collection",
"price_cents": 8500,
"reasoning": "Premium presentation suited to executive gifting. Ships well to NY."
},
{
"rank": 2,
"product_slug": "premium-salt-vinegar-set",
"name": "Premium Salt & Vinegar Set",
"price_cents": 7200,
"reasoning": "Culinary focus appeals broadly to executives."
}
]
}Tracking
Shipment Tracking
Poll the tracking endpoint after an order moves to shipped status, or listen for order.shipped and order.delivered webhook events.
GET /v1/tracking/ord_1a2b3c4d
Authorization: Bearer sk_live_••••{
"order_id": "ord_1a2b3c4d",
"carrier": "UPS",
"tracking_number": "1Z999AA10123456784",
"tracking_url": "https://ups.com/track?num=...",
"status": "in_transit",
"estimated_delivery": "2026-08-22",
"events": [
{
"timestamp": "2026-08-20T08:00:00Z",
"description": "Package picked up",
"location": "Miami, FL"
},
{
"timestamp": "2026-08-20T18:30:00Z",
"description": "In transit",
"location": "Charlotte, NC"
}
]
}Webhooks
Event Webhooks
Register an HTTPS endpoint to receive real-time event notifications. Each delivery includes an X-SS-Signature header you should verify using your webhook secret.
Available Events
order.createdA new order was successfully placed.
order.shippedAn order has been picked up by the carrier.
order.deliveredCarrier confirmed delivery to the recipient.
order.cancelledAn order was cancelled before fulfillment.
gift.openedRecipient scanned the gift QR code (if enabled).
{
"id": "evt_abc123",
"type": "order.shipped",
"created_at": "2026-08-20T08:00:00Z",
"data": {
"order_id": "ord_1a2b3c4d",
"tracking_number": "1Z999AA10123456784",
"carrier": "UPS",
"recipient_email": "sarah@acme.com"
}
}
# Verify signature
X-SS-Signature: sha256=a1b2c3d4...Rate Limits
Rate Limits & Pagination
Rate Limits
Rate limit status is returned in every response via X-RateLimit-Remaining and X-RateLimit-Reset headers. Use exponential backoff on 429 responses.
Pagination
List endpoints use offset pagination via page and limit query parameters. Default limit is 20, max is 100.
GET /v1/orders?page=2&limit=50
# Response includes:
{
"meta": {
"total": 240,
"page": 2,
"limit": 50,
"has_more": true
}
}Errors
Error Codes
All errors return a JSON body with error (machine-readable code) and message (human-readable). HTTP status codes follow standard conventions.
bad_requestMissing or invalid request parameters.unauthorizedInvalid or missing API key.forbiddenValid key but insufficient permissions.not_foundThe requested resource does not exist.conflictDuplicate order or recipient detected.unprocessableRequest body is valid JSON but fails validation.rate_limit_exceededToo many requests. Back off and retry.server_errorInternal error on our side. Retry with exponential backoff.{
"error": "rate_limit_exceeded",
"message": "You have exceeded the rate limit of 120 requests per minute.",
"retry_after": 38
}SDKs & Tools
Libraries & Integrations
Node.js / TypeScript
Coming Soonnpm install @soto-segovia/apiPython
Coming Soonpip install soto-segoviaClaude MCP Server
AvailableJSON config, no code requiredUntil native SDKs ship, any HTTP client works. The API is fully OpenAPI 3.1 compliant — import the spec into Postman, Insomnia, or any compatible tool. Request API access to receive the OpenAPI spec.
Get Access
Request Your API Key
We issue API keys manually to ensure quality integrations. Tell us what you are building and we will send sandbox credentials within 24 hours.