PrintNowPrintNowDocs

Webhooks

Subscribe to real-time event notifications for orders and customers via the Enterprise API.

Webhooks let you receive real-time HTTP POST notifications when events occur in your PrintNow platform. Subscribe a target URL to specific events, and PrintNow will POST to that URL each time the event fires. Webhooks are scoped to the API token used to create them.

Endpoints

MethodEndpointDescription
GET/api/v2/hooksList active webhook subscriptions
POST/api/v2/hooksSubscribe a new webhook
DELETE/api/v2/hooks/{id}Unsubscribe a webhook

Event Types

Event NameTrigger
order_createdA new order is placed through the storefront checkout.
order_updatedAn order's status is changed, it is marked as shipped, or its status is updated via the API.
order_deletedAn order is deleted.
customer_createdA new customer account is created, or a temporary user is converted to a permanent account via the API.
customer_updatedA customer's profile is updated via the API.
customer_deletedA customer account is soft-deleted via the API.

List Webhooks

Retrieve all active (non-deleted) webhook subscriptions for the current API token.

GET /api/v2/hooks

Example Response

[
  {
    "id": 101,
    "target_url": "https://example.com/webhooks/printnow",
    "event": "order_created"
  },
  {
    "id": 102,
    "target_url": "https://example.com/webhooks/printnow",
    "event": "customer_created"
  }
]

Hook Entry Fields

FieldTypeDescription
idintegerUnique webhook ID. Use this to unsubscribe.
target_urlstringURL that receives the POST notifications.
eventstringEvent name this webhook is subscribed to.

Subscribe Webhook

Create a new webhook subscription. Each target URL can only be registered once per API token -- attempting to register the same URL again returns 409 Conflict.

POST /api/v2/hooks

Request Body

FieldTypeRequiredDescription
target_urlstringYesThe URL to receive webhook POST notifications.
eventstringYesEvent name to subscribe to. Must be one of the valid event types.

Example Request

curl -X POST https://api.printnow.com/api/v2/hooks \
  -u "YOUR_TOKEN:YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "target_url": "https://example.com/webhooks/printnow",
    "event": "order_created"
  }'

Example Response

{
  "id": 101,
  "target_url": "https://example.com/webhooks/printnow",
  "event": "order_created"
}

Returns 201 Created with the new hook entry on success.

Unsubscribe Webhook

Delete a webhook subscription. The webhook is soft-deleted and deactivated.

DELETE /api/v2/hooks/{id}

Parameters

NameTypeLocationDescription
idintegerpathWebhook ID from the List Webhooks response.

Returns 204 No Content on success. Returns 404 Not Found if the webhook does not exist or belongs to a different API token.

Webhook Lifecycle

  1. Subscribe -- Register a target URL and event using the Subscribe endpoint.
  2. Receive -- Each time the event fires, PrintNow sends an HTTP POST to your target URL with event data in the request body.
  3. Respond -- Your endpoint should return a 2xx status code to acknowledge receipt.
  4. Auto-deactivation -- If your endpoint responds with 410 Gone, the webhook is automatically deactivated. This is the standard mechanism for Zapier to clean up triggers when a user disconnects a Zap.
  5. Unsubscribe -- When you no longer need notifications, call the Unsubscribe endpoint to remove the webhook.

Webhook Payload

When an event fires, PrintNow sends an HTTP POST to your target URL with Content-Type: application/json. The payload is a JSON array containing the full object associated with the event.

Order events (order_created, order_updated, order_deleted) send a single Order object wrapped in an array:

[
  {
    "storefront": "My Store",
    "id": 1234,
    "status": "New",
    "customer": { ... },
    "shipping_address": { ... },
    "billing_address": { ... },
    "items": [ ... ],
    "sub_total": 49.99,
    "tax_total": 4.25,
    "shipping_total": 5.00,
    "created_on": "2026-01-15T10:30:00"
  }
]

Customer events (customer_created, customer_updated, customer_deleted) send a single Customer object wrapped in an array:

[
  {
    "storefront": "My Store",
    "id": 5678,
    "first_name": "Jane",
    "last_name": "Smith",
    "email": "jane@example.com",
    "username": "janesmith",
    "organization": "Acme Corp"
  }
]

The payload structure matches the response format of the corresponding GET endpoints, so you can use the same deserialization logic for both API responses and webhook payloads.

Token Scope

Webhooks are tied to the specific API token used to create them. Each token maintains its own set of webhook subscriptions. Deleting an API token in Settings > API Keys also disables all webhooks associated with that token.

Error Responses

CodeMessageCause
400Event name is invalid.The event field does not match any valid event type.
409Target url already exists.This URL is already registered for the current API token.
404Hook not found.No webhook with this ID exists or it belongs to a different API token.
  • Zapier — subscribes to webhooks automatically when users create Zaps
  • API Keys — webhooks are scoped to the API token used to create them
  • Orders — order payloads sent by order_created and order_updated events
  • Customers — customer payloads sent by customer_created and customer_updated events

On this page