The Giftpack API enables you to program relationship-driven gifting workflows across gifts, swag, and rewards at global scale.
Instead of building a separate rewards portal or manually coordinating vendors, you can orchestrate gifting events directly from your existing enterprise systems such as CRM, HRIS, or internal operations platforms. The API allows your application to trigger, manage, and monitor engagement moments programmatically while Giftpack handles fulfillment, availability, logistics, and compliance.
Giftpack is not structured like a traditional e-commerce API. Rather than centering on product catalogs and checkout transactions, the system models gifting as relationship events. Recipient identity, timing, and business context are treated as first-class inputs alongside the item being sent. This allows integrations to map naturally to real-world triggers such as onboarding, anniversaries, deal closures, retention campaigns, or customer engagement milestones.
The API provides lifecycle visibility across each stage of the gifting process, including redemption status, fulfillment progress, and delivery tracking. These endpoints allow your systems to measure outcomes, automate follow-up actions, and incorporate gifting into reporting and operational workflows.
At a system level, gifting in Giftpack follows a lifecycle model:
Intent → Campaign → Recipient → Redemption → Fulfillment → Tracking
Each stage represents a state transition in the engagement lifecycle:
Intent defines the business trigger or purpose.Campaign acts as the engagement container.Recipient represents the identity participating in the campaign.Redemption captures the recipient’s action.Fulfillment handles the operational delivery process.Tracking provides post-action visibility and analytics.BUSINESS EVENT
│
▼
[ Intent ]
│
│ (Synchronous API)
▼
[ Campaign Created ]
│
│ (Synchronous API)
▼
[ Recipient Attached ]
│
│ (Synchronous API)
▼
[ Redemption Link Issued ]
│
│ ────── User Action (Asynchronous) ──────
▼
[ Redemption Claimed ]
│
│ (Webhook: giftee.preparing)
▼
[ Shipment Processing ]
│
│ (Webhook: giftee.shipped)
▼
[ Tracking / Delivered ]
│
│ (Webhook: giftee.delivered / giftee.failed / giftee.returned)
▼
[ Final Tracking State ]
│
│ (Webhook: giftee.reviewed)
●
The first half of the lifecycle is initiated synchronously through API calls. The latter half progresses asynchronously through recipient actions and operational fulfillment events. Integrations should rely on status fields and webhook events rather than assuming immediate completion.
This lifecycle model applies consistently across smart gifting (AutoMatch™) campaigns, marketplace orders, swag workflows, and enterprise automation use cases. Understanding this model is essential for building reliable integrations, especially in asynchronous and event-driven environments.

These definitions describe the core domain objects used across Giftpack API integrations. Understanding how these objects relate to each other is essential before building workflows. Giftpack operates on three primary layers:
Engagement Layer (Campaign-driven lifecycle)Commerce Layer (Marketplace and Swag transactions)Supply & Operations Layer (Vendors and fulfillment infrastructure)This layer models the relationship lifecycle between sender and recipient. It is event-driven and often asynchronous.
A real individual (employee, customer, or partner) who may receive gifts or rewards. In API terms, a Recipient is a persistent identity within a Giftpack workspace. Recipients can exist independently of campaigns and may participate in multiple campaigns over time.
A logical collection of recipients used for targeting and bulk assignment. Groups are organizational constructs. They do not represent transactions.
A campaign represents a single engagement intent.
It defines:
A campaign is not an order. A campaign acts as a lifecycle container within which redemption and fulfillment events occur.
A recipient becomes a giftee when attached to a campaign. Giftee represents the campaign-specific participation state of a recipient. This distinction is important:
Recipient = identityGiftee = campaign-bound stateDefines the presentation layer of a campaign, including:
Templates affect communication, not fulfillment logic.
Redemption captures the recipient’s action to claim a gift. Redemption may occur via:
Redemption transitions the engagement from “invited” to “claimed”.
A unique URL that allows a giftee to claim their gift.
An email that delivers the redemption link using the campaign template.
This layer handles transactional and fulfillment-related operations. It may operate independently of campaign workflows.
A curated, fixed item selected directly by the sender. Typically fulfilled immediately after order placement.
A direct purchase transaction for one or more recipients. Marketplace orders may bypass campaign-style redemption and go straight to fulfillment. Marketplace Order ≠ Campaign.
A recipient assigned as the fulfillment target for a marketplace order.
A customizable product managed through Giftpack’s inventory and warehouse system. Swag products may require:
A sellable container object within marketplace or swag catalogs.
A specific purchasable configuration of a product, such as:
Transactions always occur at the product variant level.
This layer powers fulfillment and vendor management. It is typically abstracted away from most integrations but remains important for understanding status transitions.
The operational layer responsible for:
A vendor that supplies products into the Giftpack ecosystem.
A provider supervised by a procurement office for catalog quality, onboarding, and operational control.
A unique identifier used to reference a provider in API operations.
The following structure illustrates how these entities relate to each other:
Recipient
└─ may belong to Recipient Group
└─ becomes Giftee when attached to Campaign
Campaign (Engagement Container)
├─ defines Redemption rules
├─ manages Giftee states
└─ may generate Fulfillment Orders
Commerce Layer
├─ Marketplace Order (direct transaction)
└─ Swag Order (inventory-based transaction)
Redemption
├─ Link-based
├─ Email-based
└─ Transitions state before fulfillment

All requests to the Giftpack Integration API must be authenticated using a valid API key.
Authentication is mandatory for every endpoint and enforced at the workspace boundary. Unauthorized or improperly authenticated requests are rejected before business logic is executed.
Each Giftpack workspace may generate one or more API keys through the Giftpack dashboard.
API keys are used to:
API keys are workspace-scoped.
They cannot access resources outside their originating workspace.
Giftpack does not share API keys across workspaces under any circumstances.
Security Notice: API keys provide access to workspace-level resources. Treat them as confidential credentials.
To generate an API key:
API keys are immediately active upon creation. Key generation events are logged internally for audit and traceability purposes.
Important: Keep your API key secure. Do not expose it in client-side code or public repositories.
Include your API key in the X-API-KEY header for every request.
GET /v1/recipients HTTP/1.1
Host: developer.giftpack.ai
X-API-KEY: YOUR_API_KEY
Requests without a valid API key will return an authentication error. Authentication occurs before request processing and resource evaluation.
Authorization is enforced at the workspace level. An API key can only access:
Cross-workspace access is strictly prohibited. Authorization decisions are enforced server-side and cannot be overridden by client parameters.
Enterprise integrations should implement proper key lifecycle controls.
Recommended practices:
If an API key is revoked, all subsequent requests using that key will be rejected.
Giftpack does not automatically rotate API keys. Key management is the responsibility of the integrating organization.
All API requests must be made over HTTPS.
TLS 1.2All data in transit is encrypted using industry-standard TLS encryption.
This includes:
Giftpack does not support unsecured transport connections.
API requests are subject to rate limiting to ensure platform stability and fair usage. If a rate limit is exceeded, the API will return:
429RATE_LIMIT_EXCEEDED error codeIntegrations should:
For high-volume or burst-based enterprise workloads, contact Giftpack to discuss rate configuration.
Giftpack APIs may process personally identifiable information (PII), including:
Developers are responsible for:
Giftpack processes data solely for the purpose of executing gifting and reward workflows. Giftpack does not use recipient data for advertising or unrelated profiling.
For enterprise environments, integrations should:
Giftpack maintains internal logging for:
Authentication and authorization errors follow a consistent structure.
{
"error_code": "UNAUTHORIZED",
"message": "Invalid or missing API key",
"action": "Verify your API key and include it in the X-API-KEY header"
}
Common authentication-related error codes include:
UNAUTHORIZEDFORBIDDENRATE_LIMIT_EXCEEDEDFor production deployments:
If an API key is suspected to be compromised:

The Giftpack API uses conventional HTTP status codes and returns structured error payloads.
All error responses include a machine-readable error code and a request_id.
Always log the request_id when contacting support.
All errors follow this structure:
{
"error": {
"code": "invalid_request",
"message": "Recipient email is required.",
"request_id": "req_123"
}
}
code – Machine-readable error identifiermessage – Human-readable explanationrequest_id – Unique request trace identifier for debuggingThe request_id should be retained in your logs for operational troubleshooting.
Giftpack uses standard HTTP status semantics:
200 / 201 – Request succeeded400 – Validation or malformed request401 – Missing or invalid API key403 – Insufficient permissions404 – Resource not found409 – Conflict (e.g., duplicate resource or state violation)429 – Rate limit exceeded5xx – Internal server errorNot all errors should be retried.
Safe to Retry
429 (Rate limit exceeded)5xx (Server errors)Use exponential backoff when retrying. Avoid aggressive immediate retries.
Do Not Retry
400 (Validation errors)401 / 403 (Authentication or permission failures)404 (Invalid resource reference)409 (Business logic conflicts)These indicate client-side issues that require correction before resubmission.
A successful HTTP response does not guarantee fulfillment completion.
For example:
201 Created confirms a campaign was createdGiftpack operations often progress asynchronously.
To determine lifecycle state:
GET endpointsAlways treat HTTP success as request acceptance, not business completion.
If your integration performs retries, ensure that duplicate requests do not create unintended side effects.
Where applicable:
Giftpack may reject duplicate resource creation depending on endpoint logic.
When rate limits are exceeded:
429 is returnedIntegrations should:
If you encounter unexpected errors:
request_idrequest_id when contacting Giftpack supportThis allows rapid traceability in server logs.

Giftpack workflows are asynchronous.
A successful API response confirms that a request was accepted. Lifecycle updates such as redemption, fulfillment, shipping, and delivery are communicated through webhook events.
Production integrations must treat webhooks as the primary state update mechanism. Polling status endpoints should only be used for reconciliation or recovery.
Webhook event types are managed and displayed directly in the Giftpack dashboard. To view or configure available event triggers:
https://giftpack.ai/app/developer/webhooks
The dashboard UI reflects the currently supported and production-ready event types. The UI should be considered the source of truth for available webhook events.
Example event types currently supported:
giftee.createdgiftee.launchedgiftee.preparinggiftee.shippedgiftee.deliveredgiftee.failedgiftee.returnedgiftee.reviewedEvent availability may evolve over time. Always refer to the dashboard when configuring production integrations.
Webhooks are configured per workspace via the dashboard. Each webhook configuration includes:
nameendpointevent_typesactive togglesecret keyExample configuration:
{
"name": "Giftpack Delivery Updates",
"endpoint": "https://example.com/webhooks/giftpack",
"event_types": [
"giftee.created",
"giftee.shipped",
"giftee.delivered"
]
}
Multiple webhook configurations may exist per workspace.
Webhook delivery follows an at-least-once delivery model.
This means:
A webhook delivery is considered successful when your endpoint returns any 2xx HTTP status code.
Non-2xx responses will trigger additional attempts.
Your webhook endpoint must:
POST requests with JSON payload2xx HTTP status to acknowledge successExample acknowledgment:
HTTP/1.1 200 OK
Content-Type: application/json
{"ok": true}
Webhook handlers should use the webhook event ID as a deduplication key.
Giftpack provides a full webhook event log in the dashboard. Each webhook event contains:
Delivery status codes in logs:
0 – failed1 – processing2 – successThe event detail API exposes both:
Example event detail object:
{
"webhook_event_id": "wev_01H...",
"webhook_setting_id": "whs_01H...",
"webhook_event_type": "giftee.shipped",
"webhook_event_resource_type": "giftee",
"webhook_event_resource_id": "gft_01H...",
"webhook_event_status": 2,
"webhook_event_attempts": 1,
"webhook_event_data": "{...raw payload...}",
"webhook_event_created_at": "2026-02-20T02:00:00.000Z",
"webhook_event_updated_at": "2026-02-20T02:00:01.000Z"
}
Each attempt record includes:
This log enables full delivery traceability and simplifies integration debugging.
Giftpack provides a built-in Webhook Test Console in the dashboard. The test console allows you to:
This enables:
Example test response:
{
"event_data": {
"type": "giftee.created",
"resource_type": "giftee",
"resource_id": "gft_01H..."
},
"response_http_status": "200",
"response_http_headers": {"content-type": "application/json"},
"response_http_body": "{\"ok\":true}"
}
The test console is intended for development and validation prior to production activation.
While the current UI may allow both http and https endpoints, production integrations should always use HTTPS.
Using HTTPS ensures:
For reliable webhook handling:
Webhook-based integration is the authoritative source of lifecycle updates. Do not assume that synchronous API responses represent final state.
To ensure webhook events originate from Giftpack and have not been tampered with, each webhook request is signed using a workspace-specific webhook secret.
Production integrations must verify webhook signatures.
Each webhook request includes the following header:
X-GIFTPACK-SIGNATURE: t=1708459200,v1=abcdef1234567890...
Components
t — Unix timestamp (seconds)v1 — HMAC SHA-256 signatureThe signature is generated using:
HMAC_SHA256(secret, `${timestamp}.${raw_body}`)
The raw request body must be used exactly as received.
To verify a webhook request:
X-GIFTPACK-SIGNATURE header.t) and signature (v1).expected_signature = HMAC_SHA256(secret, `${timestamp}.${raw_body}`)
v1 using a timing-safe comparison.To prevent replay attacks:
Example time window:
current_time - timestamp <= 300 seconds
Example (Node.js)
const crypto = require('crypto');
function verifySignature(rawBody, signatureHeader, secret) {
if (!signatureHeader) return false;
const elements = signatureHeader.split(',');
const timestamp = elements.find(e => e.startsWith('t='))?.split('=')[1];
const signature = elements.find(e => e.startsWith('v1='))?.split('=')[1];
if (!timestamp || !signature) return false;
const payload = `${timestamp}.${rawBody}`;
const expected = crypto
.createHmac('sha256', secret)
.update(payload, 'utf8')
.digest('hex');
const isValid = crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature)
);
const currentTime = Math.floor(Date.now() / 1000);
const tolerance = 300; // 5 minutes
if (Math.abs(currentTime - Number(timestamp)) > tolerance) {
return false;
}
return isValid;
}
Express example:
app.post('/webhooks/giftpack',
express.raw({ type: 'application/json' }),
(req, res) => {
const signature = req.headers['x-giftpack-signature'];
const isValid = verifySignature(
req.body.toString(),
signature,
process.env.GIFTPACK_WEBHOOK_SECRET
);
if (!isValid) {
return res.status(400).send('Invalid signature');
}
const event = JSON.parse(req.body.toString());
// Process event safely
res.status(200).json({ ok: true });
});
Webhook secrets:
If a secret is rotated, update your integration immediately.
If verification fails:
2xx HTTP statusRepeated signature failures may indicate:
Webhook delivery follows an at-least-once model. Duplicate events are possible.
Always:

Giftpack API is designed around real business workflows.
Instead of navigating endpoints directly, choose the business case you are implementing. Each case below outlines:
Detailed webhook verification and signature handling are documented in the Webhooks and Async Events section.
Business Scenario
You want to:
This is a Campaign-based Giftee flow.
Lifecycle Overview
Create Campaign
↓
Add Giftee
↓
Generate Redemption Link
↓
Recipient Claims
↓
Order Processing
↓
Shipped
↓
Delivered / Failed / Returned
1. Create Campaign
POST /v1/campaigns
Defines:
2. Add Giftees
POST /v1/giftees
Each giftee represents one recipient inside the campaign.
3. Generate Redemption Link
POST /v1/campaigns/{campaignId}/giftees/{gifteeId}/redeemlink
Return:
share_claim_linkYou may:
For this case, subscribe to the giftee lifecycle:
giftee.created
giftee.launched
giftee.preparing
giftee.shipped
giftee.delivered
giftee.failed
giftee.returned
giftee.reviewed
These events represent the operational state of each giftee. Refer to the Webhooks and Async Events section for:
Business Scenario
You want to:
This is a Direct Marketplace Order flow.
Lifecycle Overview
Select Product
↓
Create Marketplace Order
↓
Preparing
↓
Shipped
↓
Delivered / Failed / Returned
1. Retrieve Product
GET /v1/providers/{providerCode}/products
Use this endpoint to browse available products. Then retrieve full product detail if needed:
GET /v1/providers/{providerCode}/products/{productId}
Select:
2. Create Marketplace Order
POST /v1/marketplaceorders
Provide:
The order is accepted asynchronously and fulfillment begins.
Marketplace fulfillment resolves into giftee lifecycle events:
giftee.preparing
giftee.shipped
giftee.delivered
giftee.failed
giftee.returned
Refer to the Webhooks and Async Events section for:
Business Scenario
You want to:
This is a Points-based gifting flow.
Lifecycle Overview
Enable Points
↓
Allocate Points
↓
Recipient Redeems
↓
Giftee Created
↓
Fulfillment Lifecycle
1. Enable Point Feature for Recipient
POST /v1/pointrecipients/{memberId}/enablepointfeature
This enables the recipient to hold and redeem points.
2. Allocate Points
PATCH /v1/pointrecipients/{memberId}/points
Provide:
Recipient balance updates immediately.
3. Redemption Triggers Giftee Lifecycle When a recipient redeems points:
Points redemption ultimately resolves into giftee lifecycle events:
giftee.created
giftee.preparing
giftee.shipped
giftee.delivered
giftee.failed
giftee.returned
Refer to the Webhooks and Async Events section for: