# WooCommerce REST API v3 Documentation ## Table of Contents 1. [Introduction](#introduction) 2. [Authentication](#authentication) 3. [Products API](#products-api) 4. [Orders API](#orders-api) 5. [Customers API](#customers-api) 6. [Pagination](#pagination) 7. [Error Handling](#error-handling) 8. [Common Parameters](#common-parameters) --- ## Introduction The WooCommerce REST API v3 provides programmatic access to WooCommerce store data. This documentation focuses on the three main resources used in ShopCall.ai integration: **Products**, **Orders**, and **Customers**. ### Base URL All API requests use the following base URL pattern: ``` https://your-store.com/wp-json/wc/v3/ ``` ### Requirements - **WooCommerce**: Version 3.5 or higher - **WordPress**: Version 4.4 or higher - **Pretty Permalinks**: Must be enabled in WordPress settings - **HTTPS**: Recommended (HTTP requires OAuth 1.0a) ### API Version This documentation covers **WooCommerce REST API v3**, which is the latest stable version. **Important**: This is NOT the legacy WooCommerce API (v1, v2, v3 at `/wc-api/v*`). The modern REST API uses `/wp-json/wc/v3/`. --- ## Authentication WooCommerce REST API supports two authentication methods depending on your connection type. ### HTTP Basic Authentication (HTTPS - Recommended) For secure HTTPS connections, use HTTP Basic Auth with your API credentials: **Headers:** ``` Authorization: Basic ``` Where `` is the Base64 encoding of `consumer_key:consumer_secret`. **Example:** ```bash curl https://example.com/wp-json/wc/v3/products \ -u consumer_key:consumer_secret ``` ### OAuth 1.0a (HTTP) For non-HTTPS connections, WooCommerce uses OAuth 1.0a "one-legged" authentication to prevent credential interception. **Required Parameters:** - `oauth_consumer_key` - Your API consumer key - `oauth_timestamp` - Unix timestamp (must be within 15 minutes) - `oauth_nonce` - 32-character random string, unique per consumer key - `oauth_signature` - HMAC-SHA1 or HMAC-SHA256 signature - `oauth_signature_method` - Either `HMAC-SHA1` or `HMAC-SHA256` **Signature Generation:** 1. Create signature base string from HTTP method, URL, and sorted parameters 2. Generate HMAC hash using consumer secret as key 3. Base64 encode the hash **Example OAuth 1.0a Request:** ``` GET /wp-json/wc/v3/products?oauth_consumer_key=ck_xxx&oauth_timestamp=1234567890&oauth_nonce=abc123...&oauth_signature=xyz789...&oauth_signature_method=HMAC-SHA256 ``` ### Generating API Keys 1. Go to **WooCommerce > Settings > Advanced > REST API** 2. Click **Add Key** 3. Select user and permissions (Read/Write/Read-Write) 4. Generate and save your Consumer Key and Consumer Secret --- ## Products API The Products API allows you to create, view, update, and delete products. ### Endpoints | Method | Endpoint | Description | |--------|----------|-------------| | GET | `/wp-json/wc/v3/products` | List all products | | GET | `/wp-json/wc/v3/products/{id}` | Retrieve a single product | | POST | `/wp-json/wc/v3/products` | Create a product | | PUT/PATCH | `/wp-json/wc/v3/products/{id}` | Update a product | | DELETE | `/wp-json/wc/v3/products/{id}` | Delete a product | | POST | `/wp-json/wc/v3/products/batch` | Batch update products | ### Product Properties #### Core Fields | Property | Type | Description | |----------|------|-------------| | `id` | integer | Unique product identifier (read-only) | | `name` | string | Product name/title | | `slug` | string | URL-friendly product name | | `permalink` | string | Product URL (read-only) | | `date_created` | string | ISO8601 date when created (read-only) | | `date_modified` | string | ISO8601 date when last modified (read-only) | | `type` | string | Product type: `simple`, `grouped`, `external`, `variable` | | `status` | string | Status: `draft`, `pending`, `private`, `publish` | | `featured` | boolean | Featured product flag | | `catalog_visibility` | string | Visibility: `visible`, `catalog`, `search`, `hidden` | | `description` | string | Full product description (HTML) | | `short_description` | string | Short product description (HTML) | | `sku` | string | Stock Keeping Unit | | `price` | string | Current price (read-only) | | `regular_price` | string | Regular price | | `sale_price` | string | Sale price | | `on_sale` | boolean | Sale status (read-only) | | `purchasable` | boolean | Can be purchased (read-only) | | `total_sales` | integer | Total units sold (read-only) | | `virtual` | boolean | Is virtual product | | `downloadable` | boolean | Is downloadable product | | `external_url` | string | External product URL (for external products) | | `button_text` | string | External product button text | #### Inventory Management | Property | Type | Description | |----------|------|-------------| | `manage_stock` | boolean | Enable stock management | | `stock_quantity` | integer | Current stock quantity | | `stock_status` | string | Stock status: `instock`, `outofstock`, `onbackorder` | | `backorders` | string | Backorder policy: `no`, `notify`, `yes` | | `backorders_allowed` | boolean | Backorders allowed (read-only) | | `backordered` | boolean | Is on backorder (read-only) | | `low_stock_amount` | integer | Low stock threshold | | `sold_individually` | boolean | Limit purchases to 1 per order | #### Pricing & Tax | Property | Type | Description | |----------|------|-------------| | `tax_status` | string | Tax status: `taxable`, `shipping`, `none` | | `tax_class` | string | Tax class | | `price_html` | string | Formatted price HTML (read-only) | #### Shipping | Property | Type | Description | |----------|------|-------------| | `shipping_required` | boolean | Requires shipping | | `shipping_taxable` | boolean | Is shipping taxable | | `shipping_class` | string | Shipping class slug | | `shipping_class_id` | integer | Shipping class ID | | `weight` | string | Product weight | | `dimensions` | object | Product dimensions: `length`, `width`, `height` | #### Organization | Property | Type | Description | |----------|------|-------------| | `categories` | array | List of category objects with `id` and `name` | | `tags` | array | List of tag objects with `id` and `name` | | `images` | array | List of product images (see Images section) | | `attributes` | array | List of product attributes (see Attributes section) | #### Images Structure ```json { "id": 123, "src": "https://example.com/image.jpg", "name": "Product image", "alt": "Alt text" } ``` #### Attributes Structure ```json { "id": 1, "name": "Color", "position": 0, "visible": true, "variation": false, "options": ["Red", "Blue", "Green"] } ``` ### List All Products **Request:** ```http GET /wp-json/wc/v3/products ``` **Query Parameters:** | Parameter | Type | Description | |-----------|------|-------------| | `context` | string | Scope: `view` or `edit`. Default: `view` | | `page` | integer | Current page. Default: `1` | | `per_page` | integer | Results per page. Default: `10`, Max: `100` | | `search` | string | Search by product name or SKU | | `after` | string | ISO8601 date - products created after | | `before` | string | ISO8601 date - products created before | | `exclude` | array | Product IDs to exclude | | `include` | array | Product IDs to include | | `offset` | integer | Offset results | | `order` | string | Sort order: `asc` or `desc`. Default: `desc` | | `orderby` | string | Sort by: `date`, `id`, `include`, `title`, `slug`. Default: `date` | | `parent` | array | Parent product IDs | | `parent_exclude` | array | Parent product IDs to exclude | | `slug` | string | Product slug | | `status` | string | Product status: `any`, `draft`, `pending`, `private`, `publish` | | `type` | string | Product type: `simple`, `grouped`, `external`, `variable` | | `sku` | string | Filter by SKU | | `featured` | boolean | Featured products only | | `category` | string | Category slug | | `tag` | string | Tag slug | | `on_sale` | boolean | On sale products only | | `min_price` | string | Minimum price | | `max_price` | string | Maximum price | | `stock_status` | string | Stock status: `instock`, `outofstock`, `onbackorder` | **Example Request:** ```bash curl https://example.com/wp-json/wc/v3/products?per_page=20&status=publish \ -u consumer_key:consumer_secret ``` **Response:** ```json [ { "id": 123, "name": "Premium T-Shirt", "slug": "premium-t-shirt", "permalink": "https://example.com/product/premium-t-shirt/", "date_created": "2025-01-15T10:30:00", "date_modified": "2025-01-20T14:25:00", "type": "simple", "status": "publish", "featured": false, "catalog_visibility": "visible", "description": "

High quality cotton t-shirt

", "short_description": "

Comfortable premium tee

", "sku": "TSHIRT-001", "price": "29.99", "regular_price": "29.99", "sale_price": "", "on_sale": false, "purchasable": true, "total_sales": 45, "virtual": false, "downloadable": false, "manage_stock": true, "stock_quantity": 100, "stock_status": "instock", "backorders": "no", "backorders_allowed": false, "backordered": false, "sold_individually": false, "weight": "0.2", "dimensions": { "length": "", "width": "", "height": "" }, "shipping_required": true, "shipping_taxable": true, "shipping_class": "", "shipping_class_id": 0, "tax_status": "taxable", "tax_class": "", "categories": [ { "id": 9, "name": "Clothing", "slug": "clothing" } ], "tags": [ { "id": 15, "name": "Cotton", "slug": "cotton" } ], "images": [ { "id": 456, "src": "https://example.com/wp-content/uploads/tshirt.jpg", "name": "tshirt.jpg", "alt": "Premium T-Shirt" } ], "attributes": [], "_links": { "self": [{"href": "https://example.com/wp-json/wc/v3/products/123"}] } } ] ``` ### Retrieve a Product **Request:** ```http GET /wp-json/wc/v3/products/{id} ``` **Example:** ```bash curl https://example.com/wp-json/wc/v3/products/123 \ -u consumer_key:consumer_secret ``` **Response:** Single product object (same structure as list response) ### Create a Product **Request:** ```http POST /wp-json/wc/v3/products ``` **Example:** ```bash curl -X POST https://example.com/wp-json/wc/v3/products \ -u consumer_key:consumer_secret \ -H "Content-Type: application/json" \ -d '{ "name": "New Product", "type": "simple", "regular_price": "19.99", "description": "Product description", "short_description": "Short description", "categories": [{"id": 9}], "images": [{"src": "https://example.com/image.jpg"}] }' ``` ### Update a Product **Request:** ```http PUT /wp-json/wc/v3/products/{id} PATCH /wp-json/wc/v3/products/{id} ``` **Example:** ```bash curl -X PATCH https://example.com/wp-json/wc/v3/products/123 \ -u consumer_key:consumer_secret \ -H "Content-Type: application/json" \ -d '{ "regular_price": "24.99", "stock_quantity": 75 }' ``` ### Delete a Product **Request:** ```http DELETE /wp-json/wc/v3/products/{id} ``` **Query Parameters:** - `force` (boolean): Set to `true` to permanently delete (default moves to trash) **Example:** ```bash curl -X DELETE https://example.com/wp-json/wc/v3/products/123?force=true \ -u consumer_key:consumer_secret ``` --- ## Orders API The Orders API allows you to create, view, update, and delete orders. ### Endpoints | Method | Endpoint | Description | |--------|----------|-------------| | GET | `/wp-json/wc/v3/orders` | List all orders | | GET | `/wp-json/wc/v3/orders/{id}` | Retrieve a single order | | POST | `/wp-json/wc/v3/orders` | Create an order | | PUT/PATCH | `/wp-json/wc/v3/orders/{id}` | Update an order | | DELETE | `/wp-json/wc/v3/orders/{id}` | Delete an order | | POST | `/wp-json/wc/v3/orders/batch` | Batch update orders | | GET | `/wp-json/wc/v3/orders/{id}/notes` | List order notes | | POST | `/wp-json/wc/v3/orders/{id}/notes` | Create an order note | | GET | `/wp-json/wc/v3/orders/{id}/refunds` | List order refunds | | POST | `/wp-json/wc/v3/orders/{id}/refunds` | Create a refund | ### Order Properties #### Core Fields | Property | Type | Description | |----------|------|-------------| | `id` | integer | Unique order identifier (read-only) | | `parent_id` | integer | Parent order ID | | `number` | string | Order number (read-only) | | `order_key` | string | Order key (read-only) | | `created_via` | string | Source of order creation (read-only) | | `version` | string | WooCommerce version (read-only) | | `status` | string | Order status (see Order Statuses) | | `currency` | string | Currency code (ISO 4217) | | `date_created` | string | ISO8601 date when created (read-only) | | `date_modified` | string | ISO8601 date when modified (read-only) | | `discount_total` | string | Total discount amount | | `discount_tax` | string | Total discount tax | | `shipping_total` | string | Total shipping amount | | `shipping_tax` | string | Total shipping tax | | `cart_tax` | string | Cart tax amount | | `total` | string | Order total | | `total_tax` | string | Total tax amount | | `prices_include_tax` | boolean | Prices include tax | | `customer_id` | integer | Customer/user ID | | `customer_ip_address` | string | Customer IP address (read-only) | | `customer_user_agent` | string | Customer user agent (read-only) | | `customer_note` | string | Customer-provided note | | `payment_method` | string | Payment method ID | | `payment_method_title` | string | Payment method title | | `transaction_id` | string | Transaction ID | | `date_paid` | string | ISO8601 date when paid | | `date_completed` | string | ISO8601 date when completed | | `cart_hash` | string | Cart hash (read-only) | #### Customer Details | Property | Type | Description | |----------|------|-------------| | `billing` | object | Billing address (see Address Structure) | | `shipping` | object | Shipping address (see Address Structure) | #### Order Items | Property | Type | Description | |----------|------|-------------| | `line_items` | array | Line items data (see Line Items Structure) | | `tax_lines` | array | Tax line items | | `shipping_lines` | array | Shipping line items | | `fee_lines` | array | Fee line items | | `coupon_lines` | array | Coupon line items | ### Order Statuses | Status | Description | |--------|-------------| | `pending` | Payment pending | | `processing` | Payment received, processing order | | `on-hold` | Awaiting payment or stock | | `completed` | Order fulfilled and complete | | `cancelled` | Cancelled by admin or customer | | `refunded` | Fully refunded | | `failed` | Payment failed or declined | | `trash` | Moved to trash | ### Address Structure ```json { "first_name": "John", "last_name": "Doe", "company": "Acme Inc", "address_1": "123 Main St", "address_2": "Apt 4B", "city": "New York", "state": "NY", "postcode": "10001", "country": "US", "email": "john@example.com", "phone": "+1-555-1234" } ``` ### Line Items Structure ```json { "id": 789, "name": "Premium T-Shirt", "product_id": 123, "variation_id": 0, "quantity": 2, "tax_class": "", "subtotal": "59.98", "subtotal_tax": "0.00", "total": "59.98", "total_tax": "0.00", "taxes": [], "meta_data": [], "sku": "TSHIRT-001", "price": 29.99 } ``` ### List All Orders **Request:** ```http GET /wp-json/wc/v3/orders ``` **Query Parameters:** | Parameter | Type | Description | |-----------|------|-------------| | `context` | string | Scope: `view` or `edit`. Default: `view` | | `page` | integer | Current page. Default: `1` | | `per_page` | integer | Results per page. Default: `10`, Max: `100` | | `search` | string | Search orders | | `after` | string | ISO8601 date - orders created after | | `before` | string | ISO8601 date - orders created before | | `exclude` | array | Order IDs to exclude | | `include` | array | Order IDs to include | | `offset` | integer | Offset results | | `order` | string | Sort order: `asc` or `desc`. Default: `desc` | | `orderby` | string | Sort by: `date`, `id`, `include`, `title`, `slug`. Default: `date` | | `parent` | array | Parent order IDs | | `parent_exclude` | array | Parent order IDs to exclude | | `status` | array | Order statuses (see Order Statuses) | | `customer` | integer | Customer user ID | | `product` | integer | Product ID in order | | `dp` | integer | Decimal points for amounts. Default: `2` | **Example Request:** ```bash curl https://example.com/wp-json/wc/v3/orders?status=processing&per_page=20 \ -u consumer_key:consumer_secret ``` **Response:** ```json [ { "id": 456, "parent_id": 0, "number": "456", "order_key": "wc_order_abc123", "created_via": "checkout", "version": "8.5.0", "status": "processing", "currency": "USD", "date_created": "2025-01-20T15:30:00", "date_modified": "2025-01-20T15:31:00", "discount_total": "0.00", "discount_tax": "0.00", "shipping_total": "10.00", "shipping_tax": "0.00", "cart_tax": "0.00", "total": "69.98", "total_tax": "0.00", "prices_include_tax": false, "customer_id": 789, "customer_ip_address": "192.168.1.1", "customer_user_agent": "Mozilla/5.0...", "customer_note": "", "billing": { "first_name": "John", "last_name": "Doe", "company": "", "address_1": "123 Main St", "address_2": "", "city": "New York", "state": "NY", "postcode": "10001", "country": "US", "email": "john@example.com", "phone": "+1-555-1234" }, "shipping": { "first_name": "John", "last_name": "Doe", "company": "", "address_1": "123 Main St", "address_2": "", "city": "New York", "state": "NY", "postcode": "10001", "country": "US" }, "payment_method": "stripe", "payment_method_title": "Credit Card", "transaction_id": "ch_abc123", "date_paid": "2025-01-20T15:30:15", "date_completed": null, "cart_hash": "abc123def456", "line_items": [ { "id": 789, "name": "Premium T-Shirt", "product_id": 123, "variation_id": 0, "quantity": 2, "tax_class": "", "subtotal": "59.98", "subtotal_tax": "0.00", "total": "59.98", "total_tax": "0.00", "taxes": [], "meta_data": [], "sku": "TSHIRT-001", "price": 29.99 } ], "tax_lines": [], "shipping_lines": [ { "id": 790, "method_title": "Flat Rate", "method_id": "flat_rate", "total": "10.00", "total_tax": "0.00", "taxes": [] } ], "fee_lines": [], "coupon_lines": [], "_links": { "self": [{"href": "https://example.com/wp-json/wc/v3/orders/456"}] } } ] ``` ### Retrieve an Order **Request:** ```http GET /wp-json/wc/v3/orders/{id} ``` **Example:** ```bash curl https://example.com/wp-json/wc/v3/orders/456 \ -u consumer_key:consumer_secret ``` ### Create an Order **Request:** ```http POST /wp-json/wc/v3/orders ``` **Example:** ```bash curl -X POST https://example.com/wp-json/wc/v3/orders \ -u consumer_key:consumer_secret \ -H "Content-Type: application/json" \ -d '{ "payment_method": "bacs", "payment_method_title": "Direct Bank Transfer", "set_paid": true, "billing": { "first_name": "John", "last_name": "Doe", "address_1": "123 Main St", "city": "New York", "state": "NY", "postcode": "10001", "country": "US", "email": "john@example.com", "phone": "+1-555-1234" }, "shipping": { "first_name": "John", "last_name": "Doe", "address_1": "123 Main St", "city": "New York", "state": "NY", "postcode": "10001", "country": "US" }, "line_items": [ { "product_id": 123, "quantity": 2 } ], "shipping_lines": [ { "method_id": "flat_rate", "method_title": "Flat Rate", "total": "10.00" } ] }' ``` ### Update an Order **Request:** ```http PUT /wp-json/wc/v3/orders/{id} PATCH /wp-json/wc/v3/orders/{id} ``` **Example:** ```bash curl -X PATCH https://example.com/wp-json/wc/v3/orders/456 \ -u consumer_key:consumer_secret \ -H "Content-Type: application/json" \ -d '{ "status": "completed" }' ``` ### Order Notes Order notes are internal or customer-facing messages attached to orders. **List Order Notes:** ```http GET /wp-json/wc/v3/orders/{order_id}/notes ``` **Create Order Note:** ```http POST /wp-json/wc/v3/orders/{order_id}/notes ``` **Example:** ```bash curl -X POST https://example.com/wp-json/wc/v3/orders/456/notes \ -u consumer_key:consumer_secret \ -H "Content-Type: application/json" \ -d '{ "note": "Order packed and ready for shipment", "customer_note": true }' ``` --- ## Customers API The Customers API allows you to create, view, update, and delete customers. ### Endpoints | Method | Endpoint | Description | |--------|----------|-------------| | GET | `/wp-json/wc/v3/customers` | List all customers | | GET | `/wp-json/wc/v3/customers/{id}` | Retrieve a single customer | | POST | `/wp-json/wc/v3/customers` | Create a customer | | PUT/PATCH | `/wp-json/wc/v3/customers/{id}` | Update a customer | | DELETE | `/wp-json/wc/v3/customers/{id}` | Delete a customer | | POST | `/wp-json/wc/v3/customers/batch` | Batch update customers | | GET | `/wp-json/wc/v3/customers/{id}/downloads` | List customer downloads | ### Customer Properties | Property | Type | Description | |----------|------|-------------| | `id` | integer | Unique customer identifier (read-only) | | `date_created` | string | ISO8601 date when created (read-only) | | `date_modified` | string | ISO8601 date when modified (read-only) | | `email` | string | Customer email address (required) | | `first_name` | string | Customer first name | | `last_name` | string | Customer last name | | `role` | string | User role (read-only) | | `username` | string | Customer login username | | `password` | string | Customer password (write-only) | | `billing` | object | Billing address (see Address Structure) | | `shipping` | object | Shipping address (see Address Structure) | | `is_paying_customer` | boolean | Has purchased before (read-only) | | `avatar_url` | string | Avatar/Gravatar URL (read-only) | | `meta_data` | array | Customer metadata (custom fields) | ### List All Customers **Request:** ```http GET /wp-json/wc/v3/customers ``` **Query Parameters:** | Parameter | Type | Description | |-----------|------|-------------| | `context` | string | Scope: `view` or `edit`. Default: `view` | | `page` | integer | Current page. Default: `1` | | `per_page` | integer | Results per page. Default: `10`, Max: `100` | | `search` | string | Search customers by name or email | | `exclude` | array | Customer IDs to exclude | | `include` | array | Customer IDs to include | | `offset` | integer | Offset results | | `order` | string | Sort order: `asc` or `desc`. Default: `asc` | | `orderby` | string | Sort by: `id`, `include`, `name`, `registered_date`. Default: `name` | | `email` | string | Filter by email address | | `role` | string | Filter by user role: `all`, `administrator`, `customer`, etc. | **Example Request:** ```bash curl https://example.com/wp-json/wc/v3/customers?per_page=20&orderby=registered_date \ -u consumer_key:consumer_secret ``` **Response:** ```json [ { "id": 789, "date_created": "2025-01-10T09:15:00", "date_modified": "2025-01-20T14:30:00", "email": "john@example.com", "first_name": "John", "last_name": "Doe", "role": "customer", "username": "johndoe", "billing": { "first_name": "John", "last_name": "Doe", "company": "", "address_1": "123 Main St", "address_2": "", "city": "New York", "state": "NY", "postcode": "10001", "country": "US", "email": "john@example.com", "phone": "+1-555-1234" }, "shipping": { "first_name": "John", "last_name": "Doe", "company": "", "address_1": "123 Main St", "address_2": "", "city": "New York", "state": "NY", "postcode": "10001", "country": "US" }, "is_paying_customer": true, "avatar_url": "https://secure.gravatar.com/avatar/...", "meta_data": [], "_links": { "self": [{"href": "https://example.com/wp-json/wc/v3/customers/789"}] } } ] ``` ### Retrieve a Customer **Request:** ```http GET /wp-json/wc/v3/customers/{id} ``` **Example:** ```bash curl https://example.com/wp-json/wc/v3/customers/789 \ -u consumer_key:consumer_secret ``` ### Create a Customer **Request:** ```http POST /wp-json/wc/v3/customers ``` **Example:** ```bash curl -X POST https://example.com/wp-json/wc/v3/customers \ -u consumer_key:consumer_secret \ -H "Content-Type: application/json" \ -d '{ "email": "jane@example.com", "first_name": "Jane", "last_name": "Smith", "username": "janesmith", "password": "SecurePass123!", "billing": { "first_name": "Jane", "last_name": "Smith", "address_1": "456 Oak Ave", "city": "Los Angeles", "state": "CA", "postcode": "90001", "country": "US", "email": "jane@example.com", "phone": "+1-555-5678" } }' ``` ### Update a Customer **Request:** ```http PUT /wp-json/wc/v3/customers/{id} PATCH /wp-json/wc/v3/customers/{id} ``` **Example:** ```bash curl -X PATCH https://example.com/wp-json/wc/v3/customers/789 \ -u consumer_key:consumer_secret \ -H "Content-Type: application/json" \ -d '{ "first_name": "Jonathan", "billing": { "phone": "+1-555-9999" } }' ``` ### Delete a Customer **Request:** ```http DELETE /wp-json/wc/v3/customers/{id} ``` **Query Parameters:** - `force` (boolean): Required and must be `true` to delete - `reassign` (integer): User ID to reassign posts to **Example:** ```bash curl -X DELETE "https://example.com/wp-json/wc/v3/customers/789?force=true" \ -u consumer_key:consumer_secret ``` --- ## Pagination The WooCommerce REST API uses page-based pagination for list endpoints. ### Default Behavior - Default page size: **10 items** - Maximum page size: **100 items** - Configurable via WordPress `posts_per_page` option ### Query Parameters | Parameter | Description | Example | |-----------|-------------|---------| | `per_page` | Items per page (1-100) | `?per_page=20` | | `page` | Page number (1-based) | `?page=2` | | `offset` | Offset from first item | `?offset=10` | ### Response Headers The API includes pagination information in response headers: | Header | Description | |--------|-------------| | `X-WP-Total` | Total number of resources | | `X-WP-TotalPages` | Total number of pages | | `Link` | Navigation links (next, prev, first, last) | **Example Response Headers:** ```http X-WP-Total: 157 X-WP-TotalPages: 16 Link: ; rel="first", ; rel="next", ; rel="last" ``` ### Example Pagination ```bash # Get first page (20 items) curl "https://example.com/wp-json/wc/v3/products?per_page=20&page=1" \ -u consumer_key:consumer_secret # Get second page curl "https://example.com/wp-json/wc/v3/products?per_page=20&page=2" \ -u consumer_key:consumer_secret # Use offset instead curl "https://example.com/wp-json/wc/v3/products?per_page=20&offset=20" \ -u consumer_key:consumer_secret ``` --- ## Error Handling The WooCommerce REST API uses standard HTTP status codes to indicate success or failure. ### HTTP Status Codes | Code | Type | Description | |------|------|-------------| | `200` | Success | Request successful | | `201` | Created | Resource created successfully | | `400` | Bad Request | Invalid request parameters or data | | `401` | Unauthorized | Invalid or missing authentication | | `403` | Forbidden | Insufficient permissions | | `404` | Not Found | Resource does not exist | | `500` | Server Error | Internal server error | ### Error Response Format All errors return JSON with the following structure: ```json { "code": "error_identifier", "message": "Human-readable error description", "data": { "status": 404 } } ``` ### Common Error Codes | Code | HTTP Status | Description | |------|-------------|-------------| | `woocommerce_rest_authentication_error` | 401 | Authentication failed | | `woocommerce_rest_cannot_view` | 403 | Insufficient permissions to view | | `woocommerce_rest_cannot_create` | 403 | Insufficient permissions to create | | `woocommerce_rest_cannot_edit` | 403 | Insufficient permissions to edit | | `woocommerce_rest_cannot_delete` | 403 | Insufficient permissions to delete | | `woocommerce_rest_invalid_id` | 404 | Resource ID not found | | `woocommerce_rest_shop_order_invalid_id` | 404 | Order not found | | `woocommerce_rest_product_invalid_id` | 404 | Product not found | | `woocommerce_rest_customer_invalid_id` | 404 | Customer not found | | `rest_invalid_param` | 400 | Invalid parameter value | | `rest_missing_callback_param` | 400 | Missing required parameter | ### Error Examples **Authentication Error:** ```json { "code": "woocommerce_rest_authentication_error", "message": "Invalid signature - provided signature does not match", "data": { "status": 401 } } ``` **Not Found Error:** ```json { "code": "woocommerce_rest_product_invalid_id", "message": "Invalid ID", "data": { "status": 404 } } ``` **Invalid Parameter Error:** ```json { "code": "rest_invalid_param", "message": "Invalid parameter(s): status", "data": { "status": 400, "params": { "status": "status is not one of draft, pending, private, publish" } } } ``` ### Handling Errors in Code **JavaScript/TypeScript Example:** ```typescript try { const response = await fetch('https://example.com/wp-json/wc/v3/products/123', { headers: { 'Authorization': 'Basic ' + btoa(consumerKey + ':' + consumerSecret) } }); if (!response.ok) { const error = await response.json(); console.error(`Error ${error.data.status}: ${error.message}`); throw new Error(error.message); } const product = await response.json(); return product; } catch (error) { console.error('API request failed:', error); } ``` --- ## Common Parameters These parameters are available across most list endpoints. ### Universal Parameters | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `context` | string | `view` | Scope of response: `view` (public) or `edit` (all fields) | | `page` | integer | `1` | Current page number | | `per_page` | integer | `10` | Results per page (max 100) | | `search` | string | - | Search term for full-text search | | `after` | string | - | ISO8601 date - resources created after | | `before` | string | - | ISO8601 date - resources created before | | `exclude` | array | - | Resource IDs to exclude | | `include` | array | - | Resource IDs to include | | `offset` | integer | - | Offset results by number | | `order` | string | `desc` | Sort order: `asc` (ascending) or `desc` (descending) | | `orderby` | string | `date` | Sort field (varies by resource) | | `parent` | array | - | Parent resource IDs | | `parent_exclude` | array | - | Parent resource IDs to exclude | | `slug` | string | - | Filter by slug | ### Product-Specific Parameters | Parameter | Type | Description | |-----------|------|-------------| | `status` | string | Product status: `any`, `draft`, `pending`, `private`, `publish` | | `type` | string | Product type: `simple`, `grouped`, `external`, `variable` | | `category` | string | Category slug | | `tag` | string | Tag slug | | `sku` | string | Stock Keeping Unit | | `featured` | boolean | Featured products only | | `on_sale` | boolean | On sale products only | | `min_price` | string | Minimum price filter | | `max_price` | string | Maximum price filter | | `stock_status` | string | Stock status: `instock`, `outofstock`, `onbackorder` | ### Order-Specific Parameters | Parameter | Type | Description | |-----------|------|-------------| | `status` | array | Order statuses (see Order Statuses section) | | `customer` | integer | Customer user ID | | `product` | integer | Product ID in order | | `dp` | integer | Decimal places for amounts (default: 2) | ### Customer-Specific Parameters | Parameter | Type | Description | |-----------|------|-------------| | `email` | string | Filter by email address | | `role` | string | Filter by user role | ### Date Filtering Use ISO8601 format for date parameters: ```bash # Products created after January 1, 2025 curl "https://example.com/wp-json/wc/v3/products?after=2025-01-01T00:00:00" \ -u consumer_key:consumer_secret # Orders created in January 2025 curl "https://example.com/wp-json/wc/v3/orders?after=2025-01-01T00:00:00&before=2025-02-01T00:00:00" \ -u consumer_key:consumer_secret ``` ### Sorting Examples ```bash # Products by price (ascending) curl "https://example.com/wp-json/wc/v3/products?orderby=price&order=asc" \ -u consumer_key:consumer_secret # Orders by date (newest first) curl "https://example.com/wp-json/wc/v3/orders?orderby=date&order=desc" \ -u consumer_key:consumer_secret # Customers by name (alphabetical) curl "https://example.com/wp-json/wc/v3/customers?orderby=name&order=asc" \ -u consumer_key:consumer_secret ``` --- ## Rate Limiting WooCommerce itself does not implement rate limiting, but: - WordPress hosting providers may implement rate limits - It's recommended to implement **client-side rate limiting** (5 req/sec recommended) - Use **exponential backoff** for retry logic - Batch operations reduce API calls **Recommended Rate Limiting:** ```typescript // ShopCall.ai implementation uses 5 requests per second const RATE_LIMIT = 5; // requests per second const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)); async function rateLimitedRequest(url: string, options: RequestInit) { await delay(1000 / RATE_LIMIT); return fetch(url, options); } ``` --- ## Best Practices ### Security 1. **Always use HTTPS** in production to protect API credentials 2. **Generate API keys with minimum required permissions** (read-only when possible) 3. **Store credentials securely** using environment variables or secure vaults 4. **Rotate API keys regularly** 5. **Never commit API keys** to version control ### Performance 1. **Use pagination** for large datasets (default 10 items may be too small) 2. **Request only needed fields** using `_fields` parameter 3. **Implement caching** for frequently accessed data 4. **Use batch operations** when updating multiple resources 5. **Implement exponential backoff** for retries ### Error Handling 1. **Check HTTP status codes** before parsing response 2. **Log API errors** for debugging 3. **Handle authentication failures** gracefully 4. **Implement retry logic** for transient failures 5. **Display user-friendly error messages** ### Data Synchronization 1. **Track last sync timestamp** for incremental updates 2. **Use `modified_after` parameter** to fetch only updated resources 3. **Implement conflict resolution** for concurrent updates 4. **Store platform-specific IDs** for mapping 5. **Handle deleted resources** appropriately --- ## Resources - **Official Documentation**: https://woocommerce.github.io/woocommerce-rest-api-docs/ - **WooCommerce GitHub**: https://github.com/woocommerce/woocommerce - **Support Forum**: https://wordpress.org/support/plugin/woocommerce/ - **Developer Blog**: https://developer.woocommerce.com/ --- ## Changelog - **v3** - Current stable version (WooCommerce 3.5+) - Legacy API versions (v1, v2, v3 at `/wc-api/v*`) are deprecated --- **Document Version**: 1.0 **Last Updated**: 2025-01-29 **API Version**: WooCommerce REST API v3 **Created for**: ShopCall.ai Integration