Customers
Create, retrieve, update, delete, and transfer customer accounts via the Enterprise API.
The Customers endpoints let you manage customer accounts across your storefronts. You can create permanent or temporary user accounts, retrieve customer details including organization and tax exemption status, update profile information, transfer temporary user data to permanent accounts, and soft-delete customers.
Endpoints
| Method | Endpoint | Description |
|---|---|---|
GET | /api/v2/customer/{customerId} | Retrieve a customer by ID |
POST | /api/v2/customer | Create a new customer (permanent or temporary) |
PATCH | /api/v2/customer/{customerId} | Update a customer's profile |
PATCH | /api/v2/customer/{customerId}/transfer | Transfer temp user data to a permanent account |
DELETE | /api/v2/customer/{customerId} | Soft-delete a customer |
Get Customer
Retrieve a customer's profile by their ID. Returns the full customer object including organization membership, user groups, and tax exemption status.
GET /api/v2/customer/{customerId}Parameters
| Name | Type | Location | Description |
|---|---|---|---|
customerId | integer | path | The customer's unique ID. |
Example Request
curl -X GET https://api.printnow.com/api/v2/customer/12345 \
-u "YOUR_TOKEN:YOUR_KEY"Example Response
{
"storefront": "My Print Store",
"storefront_id": 1,
"id": 12345,
"first_name": "Jane",
"last_name": "Smith",
"email": "jane@example.com",
"username": "janesmith",
"receive_marketing_emails": true,
"last_logged_in_on": "2026-01-15T10:30:00Z",
"created_on": "2025-06-01T14:00:00Z",
"last_updated_on": "2026-01-15T10:30:00Z",
"company": "Acme Corp",
"organization": "Acme Organization",
"user_groups": ["Wholesale", "VIP"],
"tax_exempt": true,
"is_temporary": false
}Response Fields
| Field | Type | Description |
|---|---|---|
storefront | string | Name of the storefront the customer belongs to. |
storefront_id | integer | ID of the storefront. Only included in create requests. |
id | integer | Unique customer ID. |
first_name | string | Customer's first name. |
last_name | string | Customer's last name. |
email | string | Customer's email address. Must be unique within the storefront. |
username | string | Login username. Must be unique within the storefront (3-50 characters). |
password | string | Write-only. Used when creating or updating accounts. Minimum 6 characters. Never returned in responses. |
receive_marketing_emails | boolean | Whether the customer has opted in to marketing emails. |
last_logged_in_on | datetime | UTC timestamp of the customer's most recent login. |
created_on | datetime | UTC timestamp when the account was created. |
last_updated_on | datetime | UTC timestamp of the most recent profile update. |
company | string | Company name from the customer's profile (user-entered, distinct from organization). |
organization | string | Name of the organization the customer belongs to, if any. Organizations are admin-managed groupings that can enforce pricing and access rules. |
user_groups | string[] | Array of user group names the customer belongs to (excludes the default "RETAIL" group). User groups control pricing tiers and access. |
tax_exempt | boolean | Whether the customer is tax-exempt. This cascades: if the customer is not individually exempt, the API checks whether any of their user groups are marked tax-exempt. |
is_temporary | boolean | Whether this is a temporary (anonymous) account. Temp accounts are created for guest workflows and can be transferred to permanent accounts. |
Create Customer
Create a new customer account on a specific storefront. Set is_temporary to true to create a temporary (anonymous) user instead of a full account.
POST /api/v2/customerRequest Body (Permanent User)
| Field | Type | Required | Description |
|---|---|---|---|
storefront_id | integer | Yes | ID of the storefront to create the customer on. |
username | string | Yes | Login username (3-50 characters, must be unique on the storefront). |
password | string | Yes | Account password (minimum 6 characters). |
email | string | Yes | Email address (must be unique on the storefront). |
first_name | string | Yes | Customer's first name. |
last_name | string | Yes | Customer's last name. |
company | string | No | Company name. |
receive_marketing_emails | boolean | No | Marketing email opt-in (defaults to false). |
Request Body (Temporary User)
| Field | Type | Required | Description |
|---|---|---|---|
storefront_id | integer | Yes | ID of the storefront to create the temp user on. |
is_temporary | boolean | Yes | Must be true. All other fields are ignored; the system generates random credentials. |
Example Request
curl -X POST https://api.printnow.com/api/v2/customer \
-u "YOUR_TOKEN:YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"storefront_id": 1,
"username": "janesmith",
"password": "securepass123",
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Smith",
"company": "Acme Corp"
}'Returns the created customer object (same format as Get Customer). Creating a permanent customer triggers the customer_created webhook.
Update Customer
Update a customer's profile fields. Only the fields you include in the request body are updated; omitted fields remain unchanged.
PATCH /api/v2/customer/{customerId}Updatable Fields (Permanent User)
| Field | Type | Description |
|---|---|---|
password | string | New password (minimum 6 characters). Only updated if provided. |
first_name | string | Updated first name. Only updated if different from current value. |
last_name | string | Updated last name. Only updated if different from current value. |
company | string | Updated company name. Only updated if different from current value. |
receive_marketing_emails | boolean | Marketing email opt-in preference. |
tax_exempt | boolean | Whether the customer is tax-exempt. Cascades from user groups if not set individually. |
Updating a permanent customer triggers the customer_updated webhook.
Converting a Temporary User
When you PATCH a temporary user with is_temporary set to false (or omitted), the API converts the temp account into a permanent one. This requires all the same fields as creating a new user (username, password, email, first_name, last_name). This triggers the customer_created webhook.
You cannot update a temporary user's information while keeping it temporary. Temp users can only be converted to permanent accounts or transferred.
Transfer Temporary User
Transfer all data (image albums, saved projects, and punchout sessions) from a temporary user to an existing permanent user. Both users must belong to the same storefront.
PATCH /api/v2/customer/{customerId}/transferParameters
| Name | Type | Location | Description |
|---|---|---|---|
customerId | integer | path | ID of the temporary user (source). |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | ID of the permanent user (destination). Must be on the same storefront as the source. |
Example Request
curl -X PATCH https://api.printnow.com/api/v2/customer/99999/transfer \
-u "YOUR_TOKEN:YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"id": 12345}'Returns the destination customer object on success. The source temp user's albums, projects, and punchout sessions are reassigned to the destination user.
Workflow: Temporary User Lifecycle
- Create temp user --
POST /api/v2/customerwithis_temporary: true. The system generates random credentials and returns a customer object. - Use temp user -- The temp user can browse, design, and save projects in the storefront.
- Convert or transfer -- When the user is ready to check out:
- New account:
PATCH /api/v2/customer/{tempId}with full user details to convert the temp account into a permanent one. - Existing account:
PATCH /api/v2/customer/{tempId}/transferwith the destination user's ID to move all work to an existing account.
- New account:
Delete Customer
Soft-delete a customer account. The customer record is marked as deleted but not removed from the database. Temporary users cannot be deleted through this endpoint.
DELETE /api/v2/customer/{customerId}Returns 204 No Content on success. Triggers the customer_deleted webhook.
Error Responses
| Code | Message | Cause |
|---|---|---|
400 | Username is already in use. | The username is taken on this storefront (create or convert). |
400 | Email address is already in use. | The email is taken on this storefront (create or convert). |
404 | Customer not found. | No active customer with this ID exists. |
Related Pages
- Authentication — API credentials required for all customer endpoints
- Webhooks — receive customer_created, customer_updated, and customer_deleted events
- Users — manage customer accounts and user groups in the admin UI