# DummyJSON

> Free fake data and developer tools for testing and prototyping, from DummyJSON. Products with prices, discounts and reviews, shopping carts, whole user profiles, posts, comments, to-dos, recipes and quotes, all searchable, filterable and paged. Add, change and delete steps are answered as though they worked without anything being stored, and any of the fake users can log in for a real access token. The tools make placeholder images and identicons, answer with any HTTP status, serve your own JSON from a mock endpoint, record what is sent to a test webhook and generate two-factor codes for test accounts. No account or API key required.

App · Utilities · 29 actions. Web page: https://docs.lodol.com/docs/integrations/dummyjson

## Actions

### Add a cart (simulated)

Put a cart together for a user from product ids and quantities, and get it back priced by DummyJSON: each line multiplied out and discounted, and the cart totalled. Nothing is stored. Product ids DummyJSON does not have are left out of the cart and listed separately. A realistic order to test a checkout, invoice or receipt workflow with. No API key required.

**Inputs**

- User (`user_id`, number, required): The id of the user the cart is for. Users are numbered 1 to 208. At least 1.
- Products (`products`, list, required): What goes in the cart: a list of products, each with an 'id' and a 'quantity' (1 when left out). Text works too, one product per line or comma, written as an id or as id:quantity, e.g. 144:4, 98. The same product twice is added together.

**Outputs**

- `cart` (object): One shopping cart, priced line by line.
- `simulated` (true/false): Always true. DummyJSON fakes every write: nothing is stored, changed or removed, and reading the record back gives what was there before.
- `unknown_product_ids` (list): The product ids DummyJSON does not have, which it left out of the cart. Empty when every product was found.

**Example output**

```json
{
  "cart": {
    "api_url": null,
    "discounted_total": 105.41,
    "id": 209,
    "products": [
      {
        "discount_percentage": 12.13,
        "discounted_total": 105.41,
        "id": 162,
        "price": 29.99,
        "quantity": 4,
        "thumbnail_url": "https://cdn.dummyjson.com/product-images/tops/blue-frock/thumbnail.webp",
        "title": "Blue Frock",
        "total": 119.96
      }
    ],
    "total": 119.96,
    "total_products": 1,
    "total_quantity": 4,
    "user_id": 1
  },
  "simulated": true,
  "unknown_product_ids": []
}
```

### Add a product (simulated)

Send a new product to DummyJSON and get back what a real create would answer, without anything being stored: the product as sent, under the next id after the catalogue's last. DummyJSON keeps ten fields of a product (title, description, price, discount, stock, rating, brand, category, thumbnail and pictures) and drops anything else. The way to prove a workflow puts the right product together before pointing it at a real store. No API key required.

**Inputs**

- Title (`title`, text, required): The product's name.
- Description (`description`, text): Optional. A paragraph about the product.
- Price (`price`, number): Optional. The price. At least 0.
- Discount (%) (`discount_percentage`, number): Optional. The discount on it, as a percentage from 0 to 100. From 0 to 100.
- Stock (`stock`, number): Optional. How many are in stock, a whole number. At least 0.
- Rating (`rating`, number): Optional. The average rating, from 0 to 5. From 0 to 5.
- Brand (`brand`, text): Optional. The brand.
- Category (`category`, text): Optional. The category's slug. Pick one of DummyJSON's or type any; a simulated write takes a new one as readily as an existing one.
- Thumbnail URL (`thumbnail_url`, text): Optional. The address of a small picture of it, starting with https://.
- Image URLs (`image_urls`, list): Optional. The addresses of its pictures: a list, or text with one address per line.

**Outputs**

- `product` (object): One product from DummyJSON's catalogue.
- `simulated` (true/false): Always true. DummyJSON fakes every write: nothing is stored, changed or removed, and reading the record back gives what was there before.

**Example output**

```json
{
  "product": {
    "api_url": null,
    "availability_status": null,
    "barcode": null,
    "brand": null,
    "category": "stationery",
    "created_at": null,
    "description": null,
    "dimensions": {
      "depth": null,
      "height": null,
      "width": null
    },
    "discount_percentage": 10.0,
    "discounted_price": 3.15,
    "id": 195,
    "image_urls": [],
    "minimum_order_quantity": null,
    "price": 3.5,
    "qr_code_url": null,
    "rating": null,
    "return_policy": null,
    "reviews": [],
    "shipping_information": null,
    "sku": null,
    "stock": null,
    "tags": [],
    "thumbnail_url": null,
    "title": "Lodol Test Pencil",
    "updated_at": null,
    "warranty_information": null,
    "weight": null
  },
  "simulated": true
}
```

### Create a mock endpoint

Get a public address that answers with the JSON you give it: a stand-in for an API that does not exist yet. The same JSON and method always get the same address, and DummyJSON deletes one nobody has called for 90 days. Anyone with the address can call it, so keep secrets out of it. No API key required.

**Inputs**

- Response (`response_body`, object, required): The JSON the address answers with: an object, a list, or JSON text, up to 300 KB.
- Method (`method`, text): Optional. The HTTP method the address answers. GET by default. One of: `GET`, `POST`, `PUT`, `PATCH`, `DELETE`. Default: `GET`.

**Outputs**

- `endpoint_id` (text): The last part of the address, DummyJSON's id for it.
- `method` (text): The HTTP method it answers.
- `size_bytes` (number): How big the response is, in bytes.
- `url` (text): The address that answers with the JSON.

**Example output**

```json
{
  "endpoint_id": "cde2-77cc-4977-9d5d",
  "method": "GET",
  "size_bytes": 39,
  "url": "https://dummyjson.com/c/cde2-77cc-4977-9d5d"
}
```

### Create a test webhook

Make a temporary address that records every request sent to it for 24 hours. Point another service or a workflow's HTTP step at it, then read what arrived with List a test webhook's requests; opening the address in a browser shows DummyJSON's live inspector. DummyJSON allows 10 new test webhooks an hour. No API key required.

**Inputs**: None.

**Outputs**

- `expires_at` (text): When the webhook stops recording.
- `url` (text): The address to send requests to. Anyone who has it can send to it and read what arrived.
- `webhook_id` (text): The webhook's id, e.g. 0f02351d.

**Example output**

```json
{
  "expires_at": "2026-09-25T06:54:49.956Z",
  "url": "https://dummyjson.com/webhook/0f02351d",
  "webhook_id": "0f02351d"
}
```

### Delete a product (simulated)

Send a delete for a product and get back what a real delete would answer: the whole product and the moment it was deleted. Nothing is removed, so Get a product still finds it and this can run again on the same id. No API key required.

**Inputs**

- Product (`product_id`, number, required): The product's id. DummyJSON publishes 194 products, numbered 1 to 194, and the numbering stays put, so an id from an earlier run still means the same product. At least 1.

**Outputs**

- `deleted_at` (text): When DummyJSON says it deleted the product, as an ISO 8601 timestamp.
- `product` (object): One product from DummyJSON's catalogue.
- `simulated` (true/false): Always true. DummyJSON fakes every write: nothing is stored, changed or removed, and reading the record back gives what was there before.

**Example output**

```json
{
  "deleted_at": "2026-09-24T06:54:17.383Z",
  "product": {
    "api_url": "https://dummyjson.com/products/1",
    "availability_status": "In Stock",
    "barcode": "5784719087687",
    "brand": "Essence",
    "category": "beauty",
    "created_at": "2025-10-09T14:47:01.588Z",
    "description": "The Essence Mascara Lash Princess is a popular mascara known for its volumizing and lengthening effects.",
    "dimensions": {
      "depth": 22.99,
      "height": 13.08,
      "width": 15.14
    },
    "discount_percentage": 10.48,
    "discounted_price": 8.94,
    "id": 1,
    "image_urls": [
      "https://cdn.dummyjson.com/product-images/beauty/essence-mascara-lash-princess/1.webp"
    ],
    "minimum_order_quantity": 48,
    "price": 9.99,
    "qr_code_url": "https://cdn.dummyjson.com/public/qr-code.png",
    "rating": 2.56,
    "return_policy": "No return policy",
    "reviews": [
      {
        "comment": "Would not recommend!",
        "date": "2025-04-30T09:41:02.053Z",
        "rating": 3,
        "reviewer_email": "eleanor.collins@x.dummyjson.com",
        "reviewer_name": "Eleanor Collins"
      }
    ],
    "shipping_information": "Ships in 3-5 business days",
    "sku": "BEA-ESS-ESS-001",
    "stock": 99,
    "tags": [
      "beauty",
      "mascara"
    ],
    "thumbnail_url": "https://cdn.dummyjson.com/product-images/beauty/essence-mascara-lash-princess/thumbnail.webp",
    "title": "Essence Mascara Lash Princess",
    "updated_at": "2026-05-23T11:27:41.868Z",
    "warranty_information": "1 week warranty",
    "weight": 4.0
  },
  "simulated": true
}
```

### Generate a 2FA code for a test account

Get the current six-digit two-factor code for a test account: the code Google Authenticator or Authy would show for it, so a scripted sign-in can get past its 2FA step. You supply the account's own secret, the key its authenticator was set up with or the otpauth link in its QR code; this action does not make one up. That secret is sent to DummyJSON's servers to work the code out, and whoever holds it can make the account's codes for good, so use this only with a test account's secret, never a real account's. The example, JBSWY3DPEHPK3PXP, is the public test secret from DummyJSON's docs. No API key required.

**Inputs**

- Test account's secret (`secret`, text, required): The test account's own authenticator secret: the base32 key shown when its 2FA was set up (spaces are fine), or the whole otpauth://totp link from its QR code. It goes to DummyJSON as it is, so never enter a real account's secret. From a link only the secret is sent, not the account name or issuer. DummyJSON makes 6-digit, 30-second SHA-1 codes, so a link asking for any other kind is refused.

**Outputs**

- `code` (text): The six-digit code.
- `expires_at` (text): When the code stops working.
- `expires_in_seconds` (number): How many seconds it has left, at least 5: a code about to change is waited out for the next one.
- `period_seconds` (number): How often a new code comes, every 30 seconds.

**Example output**

```json
{
  "code": "944629",
  "expires_at": "2026-09-24T07:17:00Z",
  "expires_in_seconds": 22,
  "period_seconds": 30
}
```

### Get a cart

Get one cart by its id: each product in it with its quantity, price, discount and line total, and the cart's total before and after discounts. No API key required.

**Inputs**

- Cart (`cart_id`, number, required): The cart's id. DummyJSON publishes 208 carts, numbered 1 to 208, one per user. At least 1.

**Outputs**

- `cart` (object): One shopping cart, priced line by line.

**Example output**

```json
{
  "cart": {
    "api_url": "https://dummyjson.com/carts/1",
    "discounted_total": 105.41,
    "id": 1,
    "products": [
      {
        "discount_percentage": 12.13,
        "discounted_total": 105.41,
        "id": 162,
        "price": 29.99,
        "quantity": 4,
        "thumbnail_url": "https://cdn.dummyjson.com/product-images/tops/blue-frock/thumbnail.webp",
        "title": "Blue Frock",
        "total": 119.96
      }
    ],
    "total": 119.96,
    "total_products": 1,
    "total_quantity": 4,
    "user_id": 1
  }
}
```

### Get a post

Get one blog post by its id, with its text, tags, likes, dislikes, views and its author's id. No API key required.

**Inputs**

- Post (`post_id`, number, required): The post's id. DummyJSON publishes 251 posts, numbered 1 to 251. At least 1.

**Outputs**

- `post` (object): One blog post.

**Example output**

```json
{
  "post": {
    "api_url": "https://dummyjson.com/posts/1",
    "body": "His mother had always taught him not to ever think of himself as better than others.",
    "dislikes": 25,
    "id": 1,
    "likes": 192,
    "tags": [
      "history",
      "american",
      "crime"
    ],
    "title": "His mother had always taught him",
    "user_id": 121,
    "views": 305
  }
}
```

### Get a product

Get one product by its id, with everything DummyJSON holds on it: the price before and after its discount, stock, reviews, pictures, size, SKU and barcode. No API key required.

**Inputs**

- Product (`product_id`, number, required): The product's id. DummyJSON publishes 194 products, numbered 1 to 194, and the numbering stays put, so an id from an earlier run still means the same product. At least 1.

**Outputs**

- `product` (object): One product from DummyJSON's catalogue.

**Example output**

```json
{
  "product": {
    "api_url": "https://dummyjson.com/products/1",
    "availability_status": "In Stock",
    "barcode": "5784719087687",
    "brand": "Essence",
    "category": "beauty",
    "created_at": "2025-10-09T14:47:01.588Z",
    "description": "The Essence Mascara Lash Princess is a popular mascara known for its volumizing and lengthening effects.",
    "dimensions": {
      "depth": 22.99,
      "height": 13.08,
      "width": 15.14
    },
    "discount_percentage": 10.48,
    "discounted_price": 8.94,
    "id": 1,
    "image_urls": [
      "https://cdn.dummyjson.com/product-images/beauty/essence-mascara-lash-princess/1.webp"
    ],
    "minimum_order_quantity": 48,
    "price": 9.99,
    "qr_code_url": "https://cdn.dummyjson.com/public/qr-code.png",
    "rating": 2.56,
    "return_policy": "No return policy",
    "reviews": [
      {
        "comment": "Would not recommend!",
        "date": "2025-04-30T09:41:02.053Z",
        "rating": 3,
        "reviewer_email": "eleanor.collins@x.dummyjson.com",
        "reviewer_name": "Eleanor Collins"
      }
    ],
    "shipping_information": "Ships in 3-5 business days",
    "sku": "BEA-ESS-ESS-001",
    "stock": 99,
    "tags": [
      "beauty",
      "mascara"
    ],
    "thumbnail_url": "https://cdn.dummyjson.com/product-images/beauty/essence-mascara-lash-princess/thumbnail.webp",
    "title": "Essence Mascara Lash Princess",
    "updated_at": "2026-05-23T11:27:41.868Z",
    "warranty_information": "1 week warranty",
    "weight": 4.0
  }
}
```

### Get a recipe

Get one recipe by its id: ingredients, step by step instructions, preparation and cooking time, servings, calories and a photo. No API key required.

**Inputs**

- Recipe (`recipe_id`, number, required): The recipe's id. DummyJSON publishes 50 recipes, numbered 1 to 50. At least 1.

**Outputs**

- `recipe` (object): One recipe.

**Example output**

```json
{
  "recipe": {
    "api_url": "https://dummyjson.com/recipes/1",
    "calories_per_serving": 300,
    "cook_time_minutes": 15,
    "cuisine": "Italian",
    "difficulty": "Easy",
    "id": 1,
    "image_url": "https://cdn.dummyjson.com/recipe-images/1.webp",
    "ingredients": [
      "Pizza dough",
      "Tomato sauce",
      "Fresh mozzarella cheese"
    ],
    "instructions": [
      "Preheat the oven to 475\u00b0F (245\u00b0C).",
      "Roll out the pizza dough and spread tomato sauce evenly."
    ],
    "meal_types": [
      "Dinner"
    ],
    "name": "Classic Margherita Pizza",
    "prep_time_minutes": 20,
    "rating": 4.6,
    "review_count": 98,
    "servings": 4,
    "tags": [
      "Pizza",
      "Italian"
    ],
    "total_time_minutes": 35,
    "user_id": 166
  }
}
```

### Get a user

Get one of DummyJSON's fake people by their id: the whole profile, from home address and employer to the username and password Log in as a test user takes. No API key required.

**Inputs**

- User (`user_id`, number, required): The user's id. DummyJSON publishes 208 users, numbered 1 to 208. At least 1.

**Outputs**

- `user` (object): One of DummyJSON's fake people: a whole profile, every detail of it made up.

**Example output**

```json
{
  "user": {
    "address": {
      "city": "Phoenix",
      "country": "United States",
      "latitude": -77.16213,
      "longitude": -92.084824,
      "postal_code": "29112",
      "state": "Mississippi",
      "state_code": "MS",
      "street": "626 Main Street"
    },
    "age": 29,
    "api_url": "https://dummyjson.com/users/1",
    "bank": {
      "card_expire": "05/28",
      "card_number": "3693233511855044",
      "card_type": "Diners Club International",
      "currency": "GBP",
      "iban": "GB74MH2UZLR9TRPHYNU8F8"
    },
    "birth_date": "1996-05-30",
    "blood_group": "O-",
    "company": {
      "address": {
        "city": "San Francisco",
        "country": "United States",
        "latitude": 71.814525,
        "longitude": -161.150263,
        "postal_code": "37657",
        "state": "Wisconsin",
        "state_code": "WI",
        "street": "263 Tenth Street"
      },
      "department": "Engineering",
      "name": "Dooley, Kozey and Cronin",
      "title": "Sales Manager"
    },
    "crypto": {
      "coin": "Bitcoin",
      "network": "Ethereum (ERC20)",
      "wallet": "0xb9fc2fe63b2a6c003f1c324c3bfa53259162181a"
    },
    "ein": "977-175",
    "email": "emily.johnson@x.dummyjson.com",
    "eye_color": "Green",
    "first_name": "Emily",
    "full_name": "Emily Johnson",
    "gender": "female",
    "hair": {
      "color": "Brown",
      "type": "Curly"
    },
    "height": 193.24,
    "id": 1,
    "image_url": "https://dummyjson.com/icon/emilys/128",
    "ip_address": "42.48.100.32",
    "last_name": "Johnson",
    "mac_address": "47:fa:41:18:ec:eb",
    "maiden_name": "Smith",
    "password": "emilyspass",
    "phone": "+81 965-431-3024",
    "role": "admin",
    "ssn": "900-590-289",
    "university": "University of Wisconsin--Madison",
    "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36",
    "username": "emilys",
    "weight": 63.16
  }
}
```

### Get random quotes

Get one to ten random quotes from DummyJSON's 1,454, each with its author, different every time. The quote of the day for a newsletter, a chat post or a screen. No API key required.

**Inputs**

- How many (`count`, number): Optional. How many quotes, from 1 to 10. 1 by default. From 1 to 10. Default: `1`.

**Outputs**

- `author` (text): Who said the first quote.
- `count` (number): How many came back.
- `quote` (text): The first quote's text, for the step that wanted one.
- `quotes` (list): The quotes, in no particular order.

**Example output**

```json
{
  "author": "Rumi",
  "count": 1,
  "quote": "Your heart is the size of an ocean. Go find yourself in its hidden depths.",
  "quotes": [
    {
      "api_url": "https://dummyjson.com/quotes/1",
      "author": "Rumi",
      "id": 1,
      "quote": "Your heart is the size of an ocean. Go find yourself in its hidden depths."
    }
  ]
}
```

### Get the logged-in user

Get the user an access token from Log in as a test user belongs to: the whole profile. It proves the token works, and says why when it does not. No API key required.

**Inputs**

- Access token (`access_token`, text, required): The access token Log in as a test user or Refresh a login session returned. A leading 'Bearer ' is fine.

**Outputs**

- `user` (object): One of DummyJSON's fake people: a whole profile, every detail of it made up.

**Example output**

```json
{
  "user": {
    "address": {
      "city": "Phoenix",
      "country": "United States",
      "latitude": -77.16213,
      "longitude": -92.084824,
      "postal_code": "29112",
      "state": "Mississippi",
      "state_code": "MS",
      "street": "626 Main Street"
    },
    "age": 29,
    "api_url": "https://dummyjson.com/users/1",
    "bank": {
      "card_expire": "05/28",
      "card_number": "3693233511855044",
      "card_type": "Diners Club International",
      "currency": "GBP",
      "iban": "GB74MH2UZLR9TRPHYNU8F8"
    },
    "birth_date": "1996-05-30",
    "blood_group": "O-",
    "company": {
      "address": {
        "city": "San Francisco",
        "country": "United States",
        "latitude": 71.814525,
        "longitude": -161.150263,
        "postal_code": "37657",
        "state": "Wisconsin",
        "state_code": "WI",
        "street": "263 Tenth Street"
      },
      "department": "Engineering",
      "name": "Dooley, Kozey and Cronin",
      "title": "Sales Manager"
    },
    "crypto": {
      "coin": "Bitcoin",
      "network": "Ethereum (ERC20)",
      "wallet": "0xb9fc2fe63b2a6c003f1c324c3bfa53259162181a"
    },
    "ein": "977-175",
    "email": "emily.johnson@x.dummyjson.com",
    "eye_color": "Green",
    "first_name": "Emily",
    "full_name": "Emily Johnson",
    "gender": "female",
    "hair": {
      "color": "Brown",
      "type": "Curly"
    },
    "height": 193.24,
    "id": 1,
    "image_url": "https://dummyjson.com/icon/emilys/128",
    "ip_address": "42.48.100.32",
    "last_name": "Johnson",
    "mac_address": "47:fa:41:18:ec:eb",
    "maiden_name": "Smith",
    "password": "emilyspass",
    "phone": "+81 965-431-3024",
    "role": "admin",
    "ssn": "900-590-289",
    "university": "University of Wisconsin--Madison",
    "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36",
    "username": "emilys",
    "weight": 63.16
  }
}
```

### List a test webhook's requests

List what a test webhook has received, newest first: each request's method, headers, query parameters, body and time. It can wait up to two minutes for something to arrive, and keep only what came in after a given moment. DummyJSON keeps a webhook's latest 100 requests, and keeps JSON and form bodies only. No API key required.

**Inputs**

- Test webhook (`webhook`, text, required): The test webhook's address or its id, as Create a test webhook returned them, e.g. https://dummyjson.com/webhook/0f02351d. A webhook lasts 24 hours.
- Received after (`received_after`, date and time): Optional. Keep only the requests that arrived after this moment, to the millisecond. Pass the latest received at of an earlier listing to see only what is new.
- Wait up to (seconds) (`wait_seconds`, number): Optional. When nothing (new) has arrived yet, keep asking every few seconds for up to this long, 120 at most. 0 by default. Nothing arriving is an empty list, not an error. From 0 to 120. Default: `0`.

**Outputs**

- `count` (number): How many there are.
- `expires_at` (text): When the webhook stops recording.
- `latest_received_at` (text): When the newest of them arrived, to hand to the next listing's received after. Null when there are none.
- `requests` (list): The requests, newest first.
- `webhook_id` (text): The webhook's id.

**Example output**

```json
{
  "count": 1,
  "expires_at": "2026-09-25T06:54:49.956Z",
  "latest_received_at": "2026-09-24T07:17:08.662Z",
  "requests": [
    {
      "body": {
        "event": "order.created",
        "order_id": 1001
      },
      "content_type": "application/json",
      "headers": {
        "content-type": "application/json",
        "host": "dummyjson.com",
        "user-agent": "Stripe/1.0 (+https://stripe.com/docs/webhooks)"
      },
      "method": "POST",
      "query": {
        "source": "checkout"
      },
      "received_at": "2026-09-24T07:17:08.662Z",
      "request_id": "098a1aeb-63e6-40d9-80ac-ee6c2b9750e5",
      "truncated": false
    }
  ],
  "webhook_id": "0f02351d"
}
```

### List carts

List DummyJSON's 208 fake shopping carts, or one user's, each priced line by line with quantities, discounts and totals. Sort by total or by how much is in them, and page through. No API key required.

**Inputs**

- User (`user_id`, number): Optional. Return only this user's records. Users are numbered 1 to 208; leave blank for everyone's. At least 1.
- Sort by (`sort_by`, text): Optional. The field to sort on. Leave blank for id order. One of: `total`, `discounted_total` (Total after discounts), `total_products` (Number of products), `total_quantity` (Number of items).
- Sort order (`sort_order`, text): Optional. Which way to sort, when a field to sort by is chosen. Ascending by default. One of: `asc` (Ascending (A to Z, lowest first)), `desc` (Descending (Z to A, highest first)). Default: `asc`.
- Number of records (`limit`, number): Optional. How many records to return in this page, from 1 to 100. 30 by default, which is DummyJSON's own page size. From 1 to 100. Default: `30`.
- Skip (`offset`, number): Optional. How many matching records to skip before this page. Use the next offset from the previous result to page through. 0 by default. At least 0. Default: `0`.

**Outputs**

- `carts` (list): The carts in this page.
- `count` (number): How many records are in this page.
- `has_more` (true/false): True when more records matched than this page holds.
- `next_offset` (number): The offset that fetches the next page. Null when this is the last one.
- `total_count` (number): How many records matched in total, across every page.

**Example output**

```json
{
  "carts": [
    {
      "api_url": "https://dummyjson.com/carts/1",
      "discounted_total": 105.41,
      "id": 1,
      "products": [
        {
          "discount_percentage": 12.13,
          "discounted_total": 105.41,
          "id": 162,
          "price": 29.99,
          "quantity": 4,
          "thumbnail_url": "https://cdn.dummyjson.com/product-images/tops/blue-frock/thumbnail.webp",
          "title": "Blue Frock",
          "total": 119.96
        }
      ],
      "total": 119.96,
      "total_products": 1,
      "total_quantity": 4,
      "user_id": 1
    }
  ],
  "count": 1,
  "has_more": true,
  "next_offset": 30,
  "total_count": 208
}
```

### List comments

List DummyJSON's 340 fake comments, or the ones on one post, each with its likes and the commenter's name and username. No API key required.

**Inputs**

- Post (`post_id`, number): Optional. Return only the comments on this post. Posts are numbered 1 to 251; leave blank for every comment. At least 1.
- Sort by (`sort_by`, text): Optional. The field to sort on. Leave blank for id order. One of: `likes`, `post_id` (Post).
- Sort order (`sort_order`, text): Optional. Which way to sort, when a field to sort by is chosen. Ascending by default. One of: `asc` (Ascending (A to Z, lowest first)), `desc` (Descending (Z to A, highest first)). Default: `asc`.
- Number of records (`limit`, number): Optional. How many records to return in this page, from 1 to 100. 30 by default, which is DummyJSON's own page size. From 1 to 100. Default: `30`.
- Skip (`offset`, number): Optional. How many matching records to skip before this page. Use the next offset from the previous result to page through. 0 by default. At least 0. Default: `0`.

**Outputs**

- `comments` (list): The comments in this page.
- `count` (number): How many records are in this page.
- `has_more` (true/false): True when more records matched than this page holds.
- `next_offset` (number): The offset that fetches the next page. Null when this is the last one.
- `total_count` (number): How many records matched in total, across every page.

**Example output**

```json
{
  "comments": [
    {
      "api_url": "https://dummyjson.com/comments/93",
      "body": "These are fabulous ideas!",
      "id": 93,
      "likes": 7,
      "post_id": 1,
      "user": {
        "full_name": "Leah Gutierrez",
        "id": 190,
        "username": "leahw"
      }
    }
  ],
  "count": 1,
  "has_more": true,
  "next_offset": 30,
  "total_count": 340
}
```

### List posts

List DummyJSON's 251 fake blog posts, with their tags, likes, dislikes and views. Search their text, keep one tag or one author's posts (these combine), sort by views or likes, and page through. No API key required.

**Inputs**

- Search text (`search`, text): Optional. Keep the posts whose text contains this, ignoring capitals. DummyJSON searches the post's body, which begins with its title.
- Tag (`tag`, text): Optional. Keep the posts with this tag. Pick one or type it; a tag DummyJSON does not use is refused with the nearest it does.
- User (`user_id`, number): Optional. Return only this user's records. Users are numbered 1 to 208; leave blank for everyone's. At least 1.
- Sort by (`sort_by`, text): Optional. The field to sort on. Leave blank for id order. One of: `views`, `likes`, `dislikes`, `title`.
- Sort order (`sort_order`, text): Optional. Which way to sort, when a field to sort by is chosen. Ascending by default. One of: `asc` (Ascending (A to Z, lowest first)), `desc` (Descending (Z to A, highest first)). Default: `asc`.
- Number of records (`limit`, number): Optional. How many records to return in this page, from 1 to 100. 30 by default, which is DummyJSON's own page size. From 1 to 100. Default: `30`.
- Skip (`offset`, number): Optional. How many matching records to skip before this page. Use the next offset from the previous result to page through. 0 by default. At least 0. Default: `0`.

**Outputs**

- `count` (number): How many records are in this page.
- `has_more` (true/false): True when more records matched than this page holds.
- `next_offset` (number): The offset that fetches the next page. Null when this is the last one.
- `posts` (list): The posts in this page.
- `total_count` (number): How many records matched in total, across every page.

**Example output**

```json
{
  "count": 1,
  "has_more": true,
  "next_offset": 30,
  "posts": [
    {
      "api_url": "https://dummyjson.com/posts/1",
      "body": "His mother had always taught him not to ever think of himself as better than others.",
      "dislikes": 25,
      "id": 1,
      "likes": 192,
      "tags": [
        "history",
        "american",
        "crime"
      ],
      "title": "His mother had always taught him",
      "user_id": 121,
      "views": 305
    }
  ],
  "total_count": 251
}
```

### List product categories

List DummyJSON's 24 product categories, each with its slug, its name and how many products are in it. The slug is what List products and Add a product take. No API key required.

**Inputs**: None.

**Outputs**

- `categories` (list): Every category, in DummyJSON's order.
- `count` (number): How many categories there are.

**Example output**

```json
{
  "categories": [
    {
      "api_url": "https://dummyjson.com/products/category/beauty",
      "name": "Beauty",
      "product_count": 5,
      "slug": "beauty"
    }
  ],
  "count": 24
}
```

### List products

List DummyJSON's 194 fake products, each with a price and a discount, stock, brand, category, rating, reviews, pictures, SKU and barcode. Search their titles and descriptions, keep one category, sort by price, rating, stock or last change, and page through. The stand-in catalogue for a store workflow while the real one is being built. No API key required.

**Inputs**

- Search text (`search`, text): Optional. Keep the products whose title or description contains this text, ignoring capitals.
- Category (`category`, text): Optional. Return only the products in this category. Pick one, or type its name or slug (mens-shirts and Mens Shirts are the same). A name DummyJSON does not know is refused with the nearest it does.
- Sort by (`sort_by`, text): Optional. The field to sort on. Leave blank for id order. One of: `title`, `price`, `rating`, `stock`, `discount_percentage` (Discount), `brand`, `updated_at` (Last modified).
- Sort order (`sort_order`, text): Optional. Which way to sort, when a field to sort by is chosen. Ascending by default. One of: `asc` (Ascending (A to Z, lowest first)), `desc` (Descending (Z to A, highest first)). Default: `asc`.
- Changed after (`modified_after`, date and time): Optional. Keep the products last changed after this moment.
- Changed before (`modified_before`, date and time): Optional. Keep the products last changed before this moment.
- Number of records (`limit`, number): Optional. How many records to return in this page, from 1 to 100. 30 by default, which is DummyJSON's own page size. From 1 to 100. Default: `30`.
- Skip (`offset`, number): Optional. How many matching records to skip before this page. Use the next offset from the previous result to page through. 0 by default. At least 0. Default: `0`.

**Outputs**

- `count` (number): How many records are in this page.
- `has_more` (true/false): True when more records matched than this page holds.
- `next_offset` (number): The offset that fetches the next page. Null when this is the last one.
- `products` (list): The products in this page.
- `total_count` (number): How many records matched in total, across every page.

**Example output**

```json
{
  "count": 1,
  "has_more": true,
  "next_offset": 30,
  "products": [
    {
      "api_url": "https://dummyjson.com/products/1",
      "availability_status": "In Stock",
      "barcode": "5784719087687",
      "brand": "Essence",
      "category": "beauty",
      "created_at": "2025-10-09T14:47:01.588Z",
      "description": "The Essence Mascara Lash Princess is a popular mascara known for its volumizing and lengthening effects.",
      "dimensions": {
        "depth": 22.99,
        "height": 13.08,
        "width": 15.14
      },
      "discount_percentage": 10.48,
      "discounted_price": 8.94,
      "id": 1,
      "image_urls": [
        "https://cdn.dummyjson.com/product-images/beauty/essence-mascara-lash-princess/1.webp"
      ],
      "minimum_order_quantity": 48,
      "price": 9.99,
      "qr_code_url": "https://cdn.dummyjson.com/public/qr-code.png",
      "rating": 2.56,
      "return_policy": "No return policy",
      "reviews": [
        {
          "comment": "Would not recommend!",
          "date": "2025-04-30T09:41:02.053Z",
          "rating": 3,
          "reviewer_email": "eleanor.collins@x.dummyjson.com",
          "reviewer_name": "Eleanor Collins"
        }
      ],
      "shipping_information": "Ships in 3-5 business days",
      "sku": "BEA-ESS-ESS-001",
      "stock": 99,
      "tags": [
        "beauty",
        "mascara"
      ],
      "thumbnail_url": "https://cdn.dummyjson.com/product-images/beauty/essence-mascara-lash-princess/thumbnail.webp",
      "title": "Essence Mascara Lash Princess",
      "updated_at": "2026-05-23T11:27:41.868Z",
      "warranty_information": "1 week warranty",
      "weight": 4.0
    }
  ],
  "total_count": 194
}
```

### List recipes

List DummyJSON's 50 fake recipes, each with ingredients, steps, times, servings, calories, cuisine and a rating. Search by name, keep a tag, a meal, a cuisine or a difficulty (they combine), sort by rating or time, and page through. No API key required.

**Inputs**

- Search text (`search`, text): Optional. Keep the recipes whose name contains this text, ignoring capitals.
- Tag (`tag`, text): Optional. Keep the recipes with this tag. Pick one or type it; a tag no recipe has is refused with the nearest one.
- Meal (`meal_type`, text): Optional. Keep the recipes for this meal. One of: `breakfast`, `lunch`, `dinner`, `snack`, `dessert`, `appetizer`, `side_dish` (Side Dish), `beverage`.
- Cuisine (`cuisine`, text): Optional. Keep the recipes of this cuisine. Pick one or type it; a cuisine no recipe has is refused with the nearest one.
- Difficulty (`difficulty`, text): Optional. Keep the recipes of this difficulty. One of: `easy`, `medium`.
- Sort by (`sort_by`, text): Optional. The field to sort on. Leave blank for id order. One of: `name`, `rating`, `review_count` (Number of reviews), `prep_time_minutes` (Preparation time), `cook_time_minutes` (Cooking time), `calories_per_serving` (Calories per serving), `servings`.
- Sort order (`sort_order`, text): Optional. Which way to sort, when a field to sort by is chosen. Ascending by default. One of: `asc` (Ascending (A to Z, lowest first)), `desc` (Descending (Z to A, highest first)). Default: `asc`.
- Number of records (`limit`, number): Optional. How many records to return in this page, from 1 to 100. 30 by default, which is DummyJSON's own page size. From 1 to 100. Default: `30`.
- Skip (`offset`, number): Optional. How many matching records to skip before this page. Use the next offset from the previous result to page through. 0 by default. At least 0. Default: `0`.

**Outputs**

- `count` (number): How many records are in this page.
- `has_more` (true/false): True when more records matched than this page holds.
- `next_offset` (number): The offset that fetches the next page. Null when this is the last one.
- `recipes` (list): The recipes in this page.
- `total_count` (number): How many records matched in total, across every page.

**Example output**

```json
{
  "count": 1,
  "has_more": true,
  "next_offset": 30,
  "recipes": [
    {
      "api_url": "https://dummyjson.com/recipes/1",
      "calories_per_serving": 300,
      "cook_time_minutes": 15,
      "cuisine": "Italian",
      "difficulty": "Easy",
      "id": 1,
      "image_url": "https://cdn.dummyjson.com/recipe-images/1.webp",
      "ingredients": [
        "Pizza dough",
        "Tomato sauce",
        "Fresh mozzarella cheese"
      ],
      "instructions": [
        "Preheat the oven to 475\u00b0F (245\u00b0C).",
        "Roll out the pizza dough and spread tomato sauce evenly."
      ],
      "meal_types": [
        "Dinner"
      ],
      "name": "Classic Margherita Pizza",
      "prep_time_minutes": 20,
      "rating": 4.6,
      "review_count": 98,
      "servings": 4,
      "tags": [
        "Pizza",
        "Italian"
      ],
      "total_time_minutes": 35,
      "user_id": 166
    }
  ],
  "total_count": 50
}
```

### List to-dos

List DummyJSON's 254 fake to-dos, or one user's, and keep only the done or only the open ones. Stand-in tasks for a reminder or progress workflow. No API key required.

**Inputs**

- User (`user_id`, number): Optional. Return only this user's records. Users are numbered 1 to 208; leave blank for everyone's. At least 1.
- Completed? (`completion`, text): Optional. Which to-dos to keep. Both by default. One of: `any` (Both, completed or not), `completed` (Completed only), `outstanding` (Not completed only). Default: `any`.
- Number of records (`limit`, number): Optional. How many records to return in this page, from 1 to 100. 30 by default, which is DummyJSON's own page size. From 1 to 100. Default: `30`.
- Skip (`offset`, number): Optional. How many matching records to skip before this page. Use the next offset from the previous result to page through. 0 by default. At least 0. Default: `0`.

**Outputs**

- `count` (number): How many records are in this page.
- `has_more` (true/false): True when more records matched than this page holds.
- `next_offset` (number): The offset that fetches the next page. Null when this is the last one.
- `todos` (list): The to-dos in this page.
- `total_count` (number): How many records matched in total, across every page.

**Example output**

```json
{
  "count": 1,
  "has_more": true,
  "next_offset": 30,
  "todos": [
    {
      "api_url": "https://dummyjson.com/todos/1",
      "completed": false,
      "id": 1,
      "todo": "Do something nice for someone you care about",
      "user_id": 152
    }
  ],
  "total_count": 254
}
```

### List users

List DummyJSON's 208 fake people, each a whole profile: name, age, email, phone, home address with coordinates, employer, university, bank card, and the username and password that log them in. Search by name, email or username, keep the people with a given role, city, department or the like, sort, and page through. No API key required.

**Inputs**

- Search text (`search`, text): Optional. Keep the people whose first name, last name, email or username contains this text, ignoring capitals.
- Filter on (`filter_field`, text): Optional. A field to keep people by, together with the value it must have below. One of: `role` (Role (admin, moderator or user)), `gender`, `age`, `eye_color` (Eye color), `hair_color` (Hair color), `blood_group` (Blood group), `city`, `state`, `university`, `department`, `job_title` (Job title).
- Filter value (`filter_value`, text): Optional. The value the chosen field must have, in full but ignoring capitals: admin, Brown, Phoenix, Engineering. An age is compared as a number.
- Sort by (`sort_by`, text): Optional. The field to sort on. Leave blank for id order. One of: `first_name` (First name), `last_name` (Last name), `age`, `username`, `email`, `height`, `weight`.
- Sort order (`sort_order`, text): Optional. Which way to sort, when a field to sort by is chosen. Ascending by default. One of: `asc` (Ascending (A to Z, lowest first)), `desc` (Descending (Z to A, highest first)). Default: `asc`.
- Number of records (`limit`, number): Optional. How many records to return in this page, from 1 to 100. 30 by default, which is DummyJSON's own page size. From 1 to 100. Default: `30`.
- Skip (`offset`, number): Optional. How many matching records to skip before this page. Use the next offset from the previous result to page through. 0 by default. At least 0. Default: `0`.

**Outputs**

- `count` (number): How many records are in this page.
- `has_more` (true/false): True when more records matched than this page holds.
- `next_offset` (number): The offset that fetches the next page. Null when this is the last one.
- `total_count` (number): How many records matched in total, across every page.
- `users` (list): The users in this page.

**Example output**

```json
{
  "count": 1,
  "has_more": true,
  "next_offset": 30,
  "total_count": 208,
  "users": [
    {
      "address": {
        "city": "Phoenix",
        "country": "United States",
        "latitude": -77.16213,
        "longitude": -92.084824,
        "postal_code": "29112",
        "state": "Mississippi",
        "state_code": "MS",
        "street": "626 Main Street"
      },
      "age": 29,
      "api_url": "https://dummyjson.com/users/1",
      "bank": {
        "card_expire": "05/28",
        "card_number": "3693233511855044",
        "card_type": "Diners Club International",
        "currency": "GBP",
        "iban": "GB74MH2UZLR9TRPHYNU8F8"
      },
      "birth_date": "1996-05-30",
      "blood_group": "O-",
      "company": {
        "address": {
          "city": "San Francisco",
          "country": "United States",
          "latitude": 71.814525,
          "longitude": -161.150263,
          "postal_code": "37657",
          "state": "Wisconsin",
          "state_code": "WI",
          "street": "263 Tenth Street"
        },
        "department": "Engineering",
        "name": "Dooley, Kozey and Cronin",
        "title": "Sales Manager"
      },
      "crypto": {
        "coin": "Bitcoin",
        "network": "Ethereum (ERC20)",
        "wallet": "0xb9fc2fe63b2a6c003f1c324c3bfa53259162181a"
      },
      "ein": "977-175",
      "email": "emily.johnson@x.dummyjson.com",
      "eye_color": "Green",
      "first_name": "Emily",
      "full_name": "Emily Johnson",
      "gender": "female",
      "hair": {
        "color": "Brown",
        "type": "Curly"
      },
      "height": 193.24,
      "id": 1,
      "image_url": "https://dummyjson.com/icon/emilys/128",
      "ip_address": "42.48.100.32",
      "last_name": "Johnson",
      "mac_address": "47:fa:41:18:ec:eb",
      "maiden_name": "Smith",
      "password": "emilyspass",
      "phone": "+81 965-431-3024",
      "role": "admin",
      "ssn": "900-590-289",
      "university": "University of Wisconsin--Madison",
      "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36",
      "username": "emilys",
      "weight": 63.16
    }
  ]
}
```

### Log in as a test user

Log in as one of DummyJSON's fake users and get a real, signed access token (a JWT) and a refresh token, with the user's short profile. Every user's username and password are in their record; user 1 is emilys, password emilyspass. For testing a login flow or a step that needs a bearer token. No API key required.

**Inputs**

- Username (`username`, text, required): The user's username, from their record. Capitals do not matter.
- Password (`password`, text, required): The user's password, from their record. Capitals matter. It is fake, like every password DummyJSON holds.
- Access token lifetime (minutes) (`expires_in_minutes`, number): Optional. How long the new access token works, in minutes: 60 by default, and up to 43,200 (30 days). The refresh token always lasts 30 days. From 1 to 43200. Default: `60`.

**Outputs**

- `access_token` (text): A signed JWT. Send it as 'Authorization: Bearer <token>'; Get the logged-in user takes it as it is.
- `expires_at` (text): When the access token stops working, as an ISO 8601 timestamp read from the token itself.
- `expires_in_minutes` (number): How long the access token was asked to last.
- `refresh_expires_at` (text): When the refresh token stops working.
- `refresh_token` (text): What Refresh a login session trades for a new access token. It lasts 30 days.
- `user` (object): The short profile a login answers with. Get the logged-in user has the whole one.

**Example output**

```json
{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJlbWlseXMifQ.4f1n",
  "expires_at": "2026-09-24T08:16:36Z",
  "expires_in_minutes": 60,
  "refresh_expires_at": "2026-10-24T07:16:36Z",
  "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJlbWlseXMifQ.9kq2",
  "user": {
    "api_url": "https://dummyjson.com/users/1",
    "email": "emily.johnson@x.dummyjson.com",
    "first_name": "Emily",
    "full_name": "Emily Johnson",
    "gender": "female",
    "id": 1,
    "image_url": "https://dummyjson.com/icon/emilys/128",
    "last_name": "Johnson",
    "username": "emilys"
  }
}
```

### Make a placeholder image

Get the address of a placeholder image of any size up to 4000 pixels a side, with your own caption, colors, font and format (PNG, JPEG or WebP). The image is made and checked before the address comes back. For mockups, emails and test posts. No API key required.

**Inputs**

- Width (pixels) (`width`, number): Optional. From 1 to 4000. 150 by default. From 1 to 4000. Default: `150`.
- Height (pixels) (`height`, number): Optional. From 1 to 4000. The same as the width by default, which makes a square. From 1 to 4000.
- Caption (`text`, text): Optional. The text in the middle of the image. Its size, like 400 x 200, by default.
- Background color (`background_color`, text): Optional. A hex color like 008080 or a color name like teal. Light grey (cccccc) by default.
- Text color (`text_color`, text): Optional. A hex color or a color name. Black or white, whichever stands out on the background, by default.
- Font (`font`, text): Optional. The caption's font. Bitter by default. One of: `bitter`, `cairo`, `comfortaa`, `cookie`, `dosis`, `gotham`, `lobster`, `marhey`, `pacifico`, `poppins`, and 4 more.
- Font size (pixels) (`font_size`, number): Optional. From 1 to 500. By default the caption is sized to fit the width. From 1 to 500.
- Format (`image_format`, text): Optional. PNG by default. One of: `png`, `jpg` (JPEG), `webp`. Default: `png`.

**Outputs**

- `content_type` (text): The type DummyJSON serves it as, e.g. image/png.
- `height` (number): Height, in pixels.
- `image_format` (text): png, jpg or webp.
- `text` (text): The caption it shows.
- `url` (text): The image's address, ready for an <img>, an email or a post. It works for anyone, for good.
- `width` (number): Width, in pixels.

**Example output**

```json
{
  "content_type": "image/png",
  "height": 200,
  "image_format": "png",
  "text": "Hello from Lodol",
  "url": "https://dummyjson.com/image/400x200?background=008080&text=Hello%20from%20Lodol",
  "width": 400
}
```

### Make an identicon

Get the address of an identicon: a pattern drawn from any text, the same every time, for a default avatar. DummyJSON's users have these as their avatars, so a username's identicon matches that user's picture. No API key required.

**Inputs**

- Text (`seed`, text, required): What the pattern is drawn from: a username, an email, anything. The same text always draws the same pattern.
- Size (pixels) (`size`, number): Optional. From 1 to 1000. 100 by default. From 1 to 1000. Default: `100`.
- Format (`image_format`, text): Optional. PNG by default. DummyJSON labels an SVG image/svg rather than image/svg+xml, which some browsers and mail apps will not show. One of: `png`, `svg`. Default: `png`.

**Outputs**

- `content_type` (text): The type DummyJSON serves it as.
- `image_format` (text): png or svg.
- `seed` (text): The text it was drawn from.
- `size` (number): Its size, in pixels.
- `url` (text): The identicon's address.

**Example output**

```json
{
  "content_type": "image/png",
  "image_format": "png",
  "seed": "emilys",
  "size": 128,
  "url": "https://dummyjson.com/icon/emilys/128"
}
```

### Refresh a login session

Trade a refresh token for a new access token and a new refresh token, the way an app keeps someone logged in. No API key required.

**Inputs**

- Refresh token (`refresh_token`, text, required): The refresh token Log in as a test user, or an earlier refresh, returned.
- Access token lifetime (minutes) (`expires_in_minutes`, number): Optional. How long the new access token works, in minutes: 60 by default, and up to 43,200 (30 days). The refresh token always lasts 30 days. From 1 to 43200. Default: `60`.

**Outputs**

- `access_token` (text): A new signed JWT.
- `expires_at` (text): When the new access token stops working.
- `expires_in_minutes` (number): How long the access token was asked to last.
- `refresh_expires_at` (text): When the new refresh token stops working.
- `refresh_token` (text): A new refresh token, good for 30 days.

**Example output**

```json
{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJlbWlseXMifQ.4f1n",
  "expires_at": "2026-09-24T08:16:36Z",
  "expires_in_minutes": 60,
  "refresh_expires_at": "2026-10-24T07:16:36Z",
  "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJlbWlseXMifQ.9kq2"
}
```

### Send a request to a test webhook

Send a request into a test webhook, the way another system would call it: any method, a JSON body and query parameters. For rehearsing a callback, or checking what the webhook records. No API key required.

**Inputs**

- Test webhook (`webhook`, text, required): The test webhook's address or its id, as Create a test webhook returned them, e.g. https://dummyjson.com/webhook/0f02351d. A webhook lasts 24 hours.
- Method (`method`, text): Optional. The HTTP method to send. POST by default. One of: `POST`, `PUT`, `PATCH`, `DELETE`, `GET`. Default: `POST`.
- Body (`payload`, object): Optional. The JSON body to send: an object or a list. A GET carries none.
- Query parameters (`query`, object): Optional. Parameters to add to the address: an object of names and values, or text like source=lodol&attempt=1.

**Outputs**

- `expires_at` (text): When the webhook stops recording.
- `method` (text): The method sent.
- `received` (true/false): True when the webhook recorded the request.
- `request_id` (text): DummyJSON's id for the recorded request.
- `webhook_id` (text): The webhook's id.

**Example output**

```json
{
  "expires_at": "2026-09-25T06:54:49.956Z",
  "method": "POST",
  "received": true,
  "request_id": "098a1aeb-63e6-40d9-80ac-ee6c2b9750e5",
  "webhook_id": "0f02351d"
}
```

### Simulate an HTTP status

Have DummyJSON answer with the status code of your choosing, 404, 429 or 503 say, and a message of your own. The answer comes back as a value, or an error status can fail the step, for rehearsing what a workflow does when a service it calls fails. No API key required.

**Inputs**

- Status code (`status_code`, number, required): The HTTP status to answer with. DummyJSON knows 63 of them, from 200 to 599. From 200 to 599.
- Message (`message`, text): Optional. What the answer should say. The status's own name by default, like Not Found.
- Fail the step on an error status (`fail_on_error`, true/false): Optional. When on, a status of 400 or more fails the step the way a real failed call would. Off by default, so the status comes back as a value to branch on. Default: `false`.

**Outputs**

- `message` (text): What the answer said.
- `ok` (true/false): True for a status under 400. The field to branch on.
- `reason` (text): The status's name, e.g. Not Found.
- `response_body` (object): The body as DummyJSON sent it: an RFC 7807 problem object for an error status. Null for 204 and 304, which carry none.
- `status_code` (number): The status DummyJSON answered with.

**Example output**

```json
{
  "message": "Not Found",
  "ok": false,
  "reason": "Not Found",
  "response_body": {
    "detail": "Not Found",
    "message": "Not Found",
    "status": 404,
    "title": "Not Found",
    "type": "about:blank"
  },
  "status_code": 404
}
```

### Update a product (simulated)

Send a change to a product and get back what a real update would answer, without anything being stored: the product with the fields you set applied. DummyJSON answers with the ten fields a product write can change, so tags, reviews and the like come back empty. No API key required.

**Inputs**

- Product (`product_id`, number, required): The product's id. DummyJSON publishes 194 products, numbered 1 to 194, and the numbering stays put, so an id from an earlier run still means the same product. At least 1.
- Title (`title`, text): Optional. The product's new name. Leave blank to keep it.
- Description (`description`, text): Optional. A paragraph about the product.
- Price (`price`, number): Optional. The price. At least 0.
- Discount (%) (`discount_percentage`, number): Optional. The discount on it, as a percentage from 0 to 100. From 0 to 100.
- Stock (`stock`, number): Optional. How many are in stock, a whole number. At least 0.
- Rating (`rating`, number): Optional. The average rating, from 0 to 5. From 0 to 5.
- Brand (`brand`, text): Optional. The brand.
- Category (`category`, text): Optional. The category's slug. Pick one of DummyJSON's or type any; a simulated write takes a new one as readily as an existing one.
- Thumbnail URL (`thumbnail_url`, text): Optional. The address of a small picture of it, starting with https://.
- Image URLs (`image_urls`, list): Optional. The addresses of its pictures: a list, or text with one address per line.

**Outputs**

- `product` (object): One product from DummyJSON's catalogue.
- `simulated` (true/false): Always true. DummyJSON fakes every write: nothing is stored, changed or removed, and reading the record back gives what was there before.

**Example output**

```json
{
  "product": {
    "api_url": "https://dummyjson.com/products/1",
    "availability_status": null,
    "barcode": null,
    "brand": "Essence",
    "category": "beauty",
    "created_at": null,
    "description": "The Essence Mascara Lash Princess is a popular mascara known for its volumizing and lengthening effects.",
    "dimensions": {
      "depth": null,
      "height": null,
      "width": null
    },
    "discount_percentage": 10.48,
    "discounted_price": 11.19,
    "id": 1,
    "image_urls": [
      "https://cdn.dummyjson.com/product-images/beauty/essence-mascara-lash-princess/1.webp"
    ],
    "minimum_order_quantity": null,
    "price": 12.5,
    "qr_code_url": null,
    "rating": 2.56,
    "return_policy": null,
    "reviews": [],
    "shipping_information": null,
    "sku": null,
    "stock": 99,
    "tags": [],
    "thumbnail_url": "https://cdn.dummyjson.com/product-images/beauty/essence-mascara-lash-princess/thumbnail.webp",
    "title": "Essence Mascara Lash Princess",
    "updated_at": null,
    "warranty_information": null,
    "weight": null
  },
  "simulated": true
}
```
