Products
Use this reference for exact request attributes, response envelopes, object shape, and examples. For catalog modeling, product-price relationships, media, lifecycle behavior, and selling patterns, start with Manage your product catalog.
Product and price IDs from another application are treated as unavailable. Use the response error code rather than the HTTP status alone when choosing a recovery path.
Operations
The product object
A product object contains everything needed to list, sell, and fulfill an item: core identification fields (name, description, reference), pricing information, prices attached to the product, categorization for reporting and filtering, media assets for customer-facing displays, physical dimensions for shipping calculations, and extensible custom data for application-specific needs. Products live in your catalog and can be referenced in order line items.
Properties
- Name
archived_at- Type
- timestamp
- Description
When this product was archived. Omitted for unarchived products. There is no public unarchive endpoint; use Lookup a product when you need the canonical state of an archived record.
dimensionsobjectStored dimension payload. The object shape depends on whether the product uses physical, digital, or custom sizing.Click or tap to expandView custom detailsClick or tap to expand
Custom sizing payload with optionaldetails,size, andsize_unit.View digital detailsClick or tap to expand
Digital sizing payload with optionalbytes,size, andsize_unit.View physical detailsClick or tap to expand
Physical sizing payload with optionalheight,length,volume,volume_unit,weight,weight_unit, andwidth.
Product media fields can store either Inttegro file references or plain remote URLs. Prefer File API IDs when you want ownership and file-purpose validation. Keep web_page_url for the product's canonical landing page only; it is not validated as a file reference.
Create a product
Create a product record with a required name and type. Product creation does not accept inline price data: create the product first, then use Add a price to a product or Create a price.
New products are unpublished unless publish is true. type is permanent after creation. The API accepts one dimensions branch (custom, digital, or physical) and one shipment type (delivery, download, render, or stream); negative dimension values are rejected and zero-valued dimensions are omitted from storage.
AI clients can use create_product for this operation. Confirmed MCP actions still require explicit form confirmation before Inttegro changes state.
Request attributes
custom_dataobjectClick or tap to expandArbitrary string key-value pairs for application-specific needs. Attach internal catalog IDs, supplier references, merchandising metadata, or any data your system requires. Maximum size when serialized: 25 KB. See the Custom Data guide for best practices.
dimensionsobjectOptional dimensions payload. Provide only one ofcustom,digital, orphysical; numeric values cannot be negative.Click or tap to expandView custom detailsClick or tap to expand
Custom sizing payload with optionaldetails,size, andsize_unit.View digital detailsClick or tap to expand
Digital sizing payload with optionalbytes,size, andsize_unit.View physical detailsClick or tap to expand
Physical sizing payload with optionalheight,length,volume,volume_unit,weight,weight_unit, andwidth.
Request
- cURL
- TypeScript
- Go
- Python
- PHP
- Ruby
- Java
- C#
curl https://api.inttegro.com/products/create \
-H "Authorization: Bearer $INTTEGRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Premium Cotton T-Shirt",
"type": "physical",
"description": "Comfortable everyday wear",
"about": "Our premium cotton t-shirt is made from 100% organic cotton...",
"category": "clothing",
"attributes": [
{ "name": "Size", "value": "Medium" },
{ "name": "Color", "value": "Blue" }
],
"media": {
"hero_image": "file_abc123",
"gallery": ["file_def456", "file_ghi789"]
},
"custom_data": {
"season": "summer",
"material": "organic_cotton"
}
}'
import * as Inttegro from '@inttegro/inttegro-sdk'
const inttegro = new Inttegro.InttegroClient({
apiKey: process.env.INTTEGRO_API_KEY!,
})
const result = await inttegro.products.create({
name: "Premium Cotton T-Shirt",
type: Inttegro.ProductTypes.Physical,
description: "Comfortable everyday wear",
about: "Our premium cotton t-shirt is made from 100% organic cotton...",
category: "clothing",
attributes: [
{
name: "Size",
value: "Medium",
},
{
name: "Color",
value: "Blue",
},
],
media: {
heroImage: "file_abc123",
gallery: [
"file_def456",
"file_ghi789",
],
},
customData: {
season: "summer",
material: "organic_cotton",
},
})
package main
import (
"context"
"log"
"os"
inttegro "github.com/zebodotdev/inttegro-sdk-go/v4"
)
func main() {
ctx := context.Background()
client := inttegro.NewClient(os.Getenv("INTTEGRO_API_KEY"))
params := inttegro.CreateProductParams{
Name: "Premium Cotton T-Shirt",
Type: inttegro.ProductTypePhysical,
Description: "Comfortable everyday wear",
About: "Our premium cotton t-shirt is made from 100% organic cotton...",
Category: &inttegro.ProductCategory{},
Attributes: map[string]string{},
Media: []inttegro.ProductMediaItem{},
CustomData: map[string]string{
"season": "summer",
"material": "organic_cotton",
},
}
result, err := client.Products.Create(ctx, params)
if err != nil {
log.Fatal(err)
}
_ = result
}
import os
import inttegro
client = inttegro.InttegroClient(api_key=os.environ["INTTEGRO_API_KEY"])
result = client.products.create(inttegro.products.CreateRequest(
name="Premium Cotton T-Shirt",
type=inttegro.ProductType.PHYSICAL,
description="Comfortable everyday wear",
about="Our premium cotton t-shirt is made from 100% organic cotton...",
category="clothing",
attributes=[
inttegro.products.Attribute(
name="Size",
value="Medium",
),
inttegro.products.Attribute(
name="Color",
value="Blue",
),
],
media=inttegro.products.Media(
hero_image="file_abc123",
gallery=[
"file_def456",
"file_ghi789",
],
),
custom_data={
"season": "summer",
"material": "organic_cotton",
},
))
<?php
use Inttegro\Client;
$client = new Client($_ENV['INTTEGRO_API_KEY']);
$result = $client->products->create([
'name' => 'Premium Cotton T-Shirt',
'type' => \Inttegro\ProductType::Physical,
'description' => 'Comfortable everyday wear',
'about' => 'Our premium cotton t-shirt is made from 100% organic cotton...',
'category' => 'clothing',
'attributes' => [
[
'name' => 'Size',
'value' => 'Medium',
],
[
'name' => 'Color',
'value' => 'Blue',
],
],
'media' => [
'hero_image' => 'file_abc123',
'gallery' => [
'file_def456',
'file_ghi789',
],
],
'custom_data' => [
'season' => 'summer',
'material' => 'organic_cotton',
],
]);
require "inttegro"
client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.products.create(
name: "Premium Cotton T-Shirt",
type: Inttegro::ProductType::PHYSICAL,
description: "Comfortable everyday wear",
about: "Our premium cotton t-shirt is made from 100% organic cotton...",
category: "clothing",
attributes: [
{
name: "Size",
value: "Medium",
},
{
name: "Color",
value: "Blue",
},
],
media: {
hero_image: "file_abc123",
gallery: [
"file_def456",
"file_ghi789",
],
},
custom_data: {
season: "summer",
material: "organic_cotton",
}
)
import com.inttegro.Client;
import com.inttegro.products.CreateProductParams;
import com.inttegro.products.ProductType;
import com.inttegro.products.ProductCategory;
import java.util.Map;
import com.inttegro.products.ProductMediaItem;
public class Example {
public static void main(String[] args) throws Exception {
var client = new Client(System.getenv("INTTEGRO_API_KEY"));
var params = CreateProductParams.builder()
.name("Premium Cotton T-Shirt")
.type(ProductType.PHYSICAL)
.description("Comfortable everyday wear")
.about("Our premium cotton t-shirt is made from 100% organic cotton...")
.category(ProductCategory.builder().build())
.attributes(Map.<String, String>of())
.media(new ProductMediaItem[] {})
.customData(Map.<String, String>ofEntries(
Map.entry("season", "summer"),
Map.entry("material", "organic_cotton")
))
.build();
var result = client.products().create(params);
}
}
using Inttegro;
using var inttegro = new InttegroClient(
Environment.GetEnvironmentVariable("INTTEGRO_API_KEY")!
);
var result = await inttegro.Products.CreateAsync(new {
name = "Premium Cotton T-Shirt",
type = Inttegro.ProductType.Physical,
description = "Comfortable everyday wear",
about = "Our premium cotton t-shirt is made from 100% organic cotton...",
category = "clothing",
attributes = new[] {
new {
name = "Size",
value = "Medium",
},
new {
name = "Color",
value = "Blue",
},
},
media = new {
hero_image = "file_abc123",
gallery = new[] {
"file_def456",
"file_ghi789",
},
},
custom_data = new {
season = "summer",
material = "organic_cotton",
},
});
Response
- Object
- JSON
ProductResponse {
product: { … },
}
{
"product": {
"id": "prod_abc123xyz789",
"name": "Premium Cotton T-Shirt",
"type": "physical",
"active": false,
"description": "Comfortable everyday wear",
"category": "clothing",
"reference": "SKU-SHIRT-BLUE-M-2024",
"created_at": "2026-02-08T23:45:00Z"
}
}
Lookup a product
Retrieve a product by ID, including its catalog fields and non-archived attached prices. Use lookup when you need the current product record before selecting a price or replacing list-shaped fields such as attributes and media.
Archived products remain available through this endpoint for historical and administrative reads; inspect archived_at rather than treating a successful lookup as proof that the product is currently offered.
AI clients can use get_product for this operation. MCP read tools return minimized business data and do not change Inttegro state.
Request attributes
Request
- cURL
- TypeScript
- Go
- Python
- PHP
- Ruby
- Java
- C#
curl https://api.inttegro.com/products/lookup \
-H "Authorization: Bearer $INTTEGRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"product_id": "prod_abc123xyz789"
}'
import * as Inttegro from '@inttegro/inttegro-sdk'
const inttegro = new Inttegro.InttegroClient({
apiKey: process.env.INTTEGRO_API_KEY!,
})
const result = await inttegro.products.lookup({
productId: "prod_abc123xyz789",
})
package main
import (
"context"
"log"
"os"
inttegro "github.com/zebodotdev/inttegro-sdk-go/v4"
)
func main() {
ctx := context.Background()
client := inttegro.NewClient(os.Getenv("INTTEGRO_API_KEY"))
result, err := client.Products.Lookup(ctx, "prod_abc123xyz789")
if err != nil {
log.Fatal(err)
}
_ = result
}
import os
import inttegro
client = inttegro.InttegroClient(api_key=os.environ["INTTEGRO_API_KEY"])
result = client.products.lookup("prod_abc123xyz789")
<?php
use Inttegro\Client;
$client = new Client($_ENV['INTTEGRO_API_KEY']);
$result = $client->products->lookup("prod_abc123xyz789");
require "inttegro"
client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.products.lookup(product_id: "prod_abc123xyz789")
import com.inttegro.Client;
public class Example {
public static void main(String[] args) throws Exception {
var client = new Client(System.getenv("INTTEGRO_API_KEY"));
var result = client.products().lookup("prod_abc123xyz789");
}
}
using Inttegro;
using var inttegro = new InttegroClient(
Environment.GetEnvironmentVariable("INTTEGRO_API_KEY")!
);
var result = await inttegro.Products.LookupAsync("prod_abc123xyz789");
Response
- Object
- JSON
ProductResponse {
product: { … },
}
{
"product": {
"id": "prod_abc123xyz789",
"name": "Premium Cotton T-Shirt",
"type": "physical",
"active": false,
"description": "Comfortable everyday wear",
"category": "clothing",
"reference": "SKU-SHIRT-BLUE-M-2024",
"attributes": [ … ],
"prices": [ … ],
"created_at": "2026-02-08T23:45:00Z",
"updated_at": "2026-02-08T23:50:15Z"
}
}
Add a price to a product
Create an active price attached to an existing, unarchived product in your catalog. The operation returns the created price; the product object has no default-price field or default-price mutation.
The response's product_id currently uses the product ID value without the prod_ type prefix; both forms are accepted when you send a product ID back to the API.
AI clients can use create_product_price for this operation. Confirmed MCP actions still require explicit form confirmation before Inttegro changes state.
Request attributes
Request
- cURL
- TypeScript
- Go
- Python
- PHP
- Ruby
- Java
- C#
curl https://api.inttegro.com/products/add_price \
-H "Authorization: Bearer $INTTEGRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"product_id": "prod_abc123xyz789",
"label": "Wholesale",
"about": "Preferred rate for repeat buyers",
"amount": {
"currency": "ghs",
"value": 85000
}
}'
import * as Inttegro from '@inttegro/inttegro-sdk'
const inttegro = new Inttegro.InttegroClient({
apiKey: process.env.INTTEGRO_API_KEY!,
})
const result = await inttegro.products.addPrice({
productId: "prod_abc123xyz789",
label: "Wholesale",
about: "Preferred rate for repeat buyers",
amount: {
currency: "ghs",
value: 85000,
},
})
package main
import (
"context"
"log"
"os"
inttegro "github.com/zebodotdev/inttegro-sdk-go/v4"
"github.com/zebodotdev/inttegro-sdk-go/v4/money"
)
func main() {
ctx := context.Background()
client := inttegro.NewClient(os.Getenv("INTTEGRO_API_KEY"))
params := inttegro.AddProductPriceParams{
ProductID: "prod_abc123xyz789",
Label: "Wholesale",
About: "Preferred rate for repeat buyers",
Amount: money.AmountParams{
Currency: money.GHS,
Value: 85000,
},
}
result, err := client.Products.AddPrice(ctx, params)
if err != nil {
log.Fatal(err)
}
_ = result
}
import os
import inttegro
client = inttegro.InttegroClient(api_key=os.environ["INTTEGRO_API_KEY"])
result = client.products.add_price(inttegro.products.AddPriceRequest(
product_id="prod_abc123xyz789",
label="Wholesale",
about="Preferred rate for repeat buyers",
amount=inttegro.products.AmountParams(
currency=inttegro.Currency.GHS,
value=85000,
),
))
<?php
use Inttegro\Client;
$client = new Client($_ENV['INTTEGRO_API_KEY']);
$result = $client->products->addPrice([
'product_id' => 'prod_abc123xyz789',
'label' => 'Wholesale',
'about' => 'Preferred rate for repeat buyers',
'amount' => [
'currency' => 'ghs',
'value' => 85000,
],
]);
require "inttegro"
client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.products.add_price(
product_id: "prod_abc123xyz789",
label: "Wholesale",
about: "Preferred rate for repeat buyers",
amount: {
currency: "ghs",
value: 85000,
}
)
import com.inttegro.Client;
import com.inttegro.products.AddProductPriceParams;
import com.inttegro.money.AmountParams;
import com.inttegro.money.Currency;
public class Example {
public static void main(String[] args) throws Exception {
var client = new Client(System.getenv("INTTEGRO_API_KEY"));
var params = AddProductPriceParams.builder()
.productId("prod_abc123xyz789")
.label("Wholesale")
.about("Preferred rate for repeat buyers")
.amount(AmountParams.of(Currency.GHS, 85000))
.build();
var result = client.products().addPrice(params);
}
}
using Inttegro;
using var inttegro = new InttegroClient(
Environment.GetEnvironmentVariable("INTTEGRO_API_KEY")!
);
var result = await inttegro.Products.AddPriceAsync(new {
product_id = "prod_abc123xyz789",
label = "Wholesale",
about = "Preferred rate for repeat buyers",
amount = new {
currency = "ghs",
value = 85000,
},
});
Update a product
Modify an existing product's details by providing only the fields you want to change. Any field you omit remains unchanged. Update or create prices through the Prices API; this endpoint rejects inline price data.
Only product_id is required. A request with no changed fields succeeds without advancing updated_at. type may be sent only when it matches the existing type. name, about, category, and tax_code cannot be cleared once populated; description can be replaced with an empty string.
For media changes, send the full media object you want stored. The legacy images array is still accepted and maps to media.gallery; do not send images and media together. The update response is a reduced product projection and omits fields such as active, archived_at, attributes, media, and shipment. Its id currently omits the prod_ type prefix. Call Lookup a product when you need the canonical complete representation.
Archived products are currently accepted by this endpoint. Treat archival as catalog state and enforce any stricter selling policy in the flow that selects products for checkout.
Request attributes
dimensionsobjectOptional dimensions payload. Replaces the stored dimensions when provided. Send only one ofcustom,digital, orphysical.Click or tap to expandView custom detailsClick or tap to expand
Custom sizing payload with optionaldetails,size, andsize_unit.View digital detailsClick or tap to expand
Digital sizing payload with optionalbytes,size, andsize_unit.View physical detailsClick or tap to expand
Physical sizing payload with optionalheight,length,volume,volume_unit,weight,weight_unit, andwidth.
Request
- cURL
- TypeScript
- Go
- Python
- PHP
- Ruby
- Java
- C#
curl https://api.inttegro.com/products/update \
-H "Authorization: Bearer $INTTEGRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"product_id": "prod_abc123xyz789",
"description": "Premium everyday comfort",
"category": "apparel"
}'
import * as Inttegro from '@inttegro/inttegro-sdk'
const inttegro = new Inttegro.InttegroClient({
apiKey: process.env.INTTEGRO_API_KEY!,
})
const result = await inttegro.products.update({
productId: "prod_abc123xyz789",
description: "Premium everyday comfort",
category: "apparel",
})
package main
import (
"context"
"log"
"os"
inttegro "github.com/zebodotdev/inttegro-sdk-go/v4"
)
func main() {
ctx := context.Background()
client := inttegro.NewClient(os.Getenv("INTTEGRO_API_KEY"))
params := inttegro.UpdateProductParams{
ProductID: "prod_abc123xyz789",
Description: "Premium everyday comfort",
Category: &inttegro.ProductCategory{},
}
result, err := client.Products.Update(ctx, params)
if err != nil {
log.Fatal(err)
}
_ = result
}
import os
import inttegro
client = inttegro.InttegroClient(api_key=os.environ["INTTEGRO_API_KEY"])
result = client.products.update(inttegro.products.UpdateRequest(
product_id="prod_abc123xyz789",
description="Premium everyday comfort",
category="apparel",
))
<?php
use Inttegro\Client;
$client = new Client($_ENV['INTTEGRO_API_KEY']);
$result = $client->products->update([
'product_id' => 'prod_abc123xyz789',
'description' => 'Premium everyday comfort',
'category' => 'apparel',
]);
require "inttegro"
client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.products.update(
product_id: "prod_abc123xyz789",
description: "Premium everyday comfort",
category: "apparel"
)
import com.inttegro.Client;
import com.inttegro.products.UpdateProductParams;
import com.inttegro.products.ProductCategory;
public class Example {
public static void main(String[] args) throws Exception {
var client = new Client(System.getenv("INTTEGRO_API_KEY"));
var params = UpdateProductParams.builder()
.productId("prod_abc123xyz789")
.description("Premium everyday comfort")
.category(ProductCategory.builder().build())
.build();
var result = client.products().update(params);
}
}
using Inttegro;
using var inttegro = new InttegroClient(
Environment.GetEnvironmentVariable("INTTEGRO_API_KEY")!
);
var result = await inttegro.Products.UpdateAsync(new {
product_id = "prod_abc123xyz789",
description = "Premium everyday comfort",
category = "apparel",
});
Response
- Object
- JSON
ProductResponse {
product: { … },
}
{
"product": {
"id": "abc123xyz789",
"name": "Premium Cotton T-Shirt",
"type": "physical",
"description": "Premium everyday comfort",
"category": "apparel",
"reference": "SKU-SHIRT-BLUE-M-2024",
"created_at": "2026-02-08T23:45:00Z",
"updated_at": "2026-02-09T15:30:00Z"
}
}
Publish a product
Set the product's catalog state to active: true. Publishing does not create a checkout URL, choose a price, or authorize payment; create a purchase intent when you need a hosted Buy link.
published_at is set only on the first publish and remains unchanged after later unpublish and republish cycles. The endpoint returns a conflict when active is already true. The current operation does not reject an archived product, so check archived_at before publishing.
Request attributes
Request
- cURL
- TypeScript
- Go
- Python
- PHP
- Ruby
- Java
- C#
curl https://api.inttegro.com/products/publish \
-H "Authorization: Bearer $INTTEGRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"product_id": "prod_abc123xyz789"
}'
import * as Inttegro from '@inttegro/inttegro-sdk'
const inttegro = new Inttegro.InttegroClient({
apiKey: process.env.INTTEGRO_API_KEY!,
})
const result = await inttegro.products.publish({
productId: "prod_abc123xyz789",
})
package main
import (
"context"
"log"
"os"
inttegro "github.com/zebodotdev/inttegro-sdk-go/v4"
)
func main() {
ctx := context.Background()
client := inttegro.NewClient(os.Getenv("INTTEGRO_API_KEY"))
result, err := client.Products.Publish(ctx, "prod_abc123xyz789")
if err != nil {
log.Fatal(err)
}
_ = result
}
import os
import inttegro
client = inttegro.InttegroClient(api_key=os.environ["INTTEGRO_API_KEY"])
result = client.products.publish("prod_abc123xyz789")
<?php
use Inttegro\Client;
$client = new Client($_ENV['INTTEGRO_API_KEY']);
$result = $client->products->publish("prod_abc123xyz789");
require "inttegro"
client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.products.publish(product_id: "prod_abc123xyz789")
import com.inttegro.Client;
public class Example {
public static void main(String[] args) throws Exception {
var client = new Client(System.getenv("INTTEGRO_API_KEY"));
var result = client.products().publish("prod_abc123xyz789");
}
}
using Inttegro;
using var inttegro = new InttegroClient(
Environment.GetEnvironmentVariable("INTTEGRO_API_KEY")!
);
var result = await inttegro.Products.PublishAsync("prod_abc123xyz789");
Response
- Object
- JSON
ProductResponse {
product: { … },
}
{
"product": {
"id": "prod_abc123xyz789",
"name": "Premium Cotton T-Shirt",
"type": "physical",
"active": true,
"category": "apparel",
"created_at": "2026-02-08T23:45:00Z",
"published_at": "2026-02-09T16:30:00Z",
"updated_at": "2026-02-09T16:30:00Z"
}
}
Unpublish a product
Set the product's catalog state to active: false while preserving published_at. This is reversible: publish the same product again when you are ready to mark it active.
The endpoint returns a conflict when the product is already inactive. Unpublishing does not change attached prices or existing purchase intents, and current ID-based order creation does not use product publication as its price-eligibility check. Deactivate or archive prices and withdraw checkout entry points when you need to stop future sales.
Request attributes
Request
- cURL
- TypeScript
- Go
- Python
- PHP
- Ruby
- Java
- C#
curl https://api.inttegro.com/products/unpublish \
-H "Authorization: Bearer $INTTEGRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"product_id": "prod_abc123xyz789"
}'
import * as Inttegro from '@inttegro/inttegro-sdk'
const inttegro = new Inttegro.InttegroClient({
apiKey: process.env.INTTEGRO_API_KEY!,
})
const result = await inttegro.products.unpublish({
productId: "prod_abc123xyz789",
})
package main
import (
"context"
"log"
"os"
inttegro "github.com/zebodotdev/inttegro-sdk-go/v4"
)
func main() {
ctx := context.Background()
client := inttegro.NewClient(os.Getenv("INTTEGRO_API_KEY"))
result, err := client.Products.Unpublish(ctx, "prod_abc123xyz789")
if err != nil {
log.Fatal(err)
}
_ = result
}
import os
import inttegro
client = inttegro.InttegroClient(api_key=os.environ["INTTEGRO_API_KEY"])
result = client.products.unpublish("prod_abc123xyz789")
<?php
use Inttegro\Client;
$client = new Client($_ENV['INTTEGRO_API_KEY']);
$result = $client->products->unpublish("prod_abc123xyz789");
require "inttegro"
client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.products.unpublish(product_id: "prod_abc123xyz789")
import com.inttegro.Client;
public class Example {
public static void main(String[] args) throws Exception {
var client = new Client(System.getenv("INTTEGRO_API_KEY"));
var result = client.products().unpublish("prod_abc123xyz789");
}
}
using Inttegro;
using var inttegro = new InttegroClient(
Environment.GetEnvironmentVariable("INTTEGRO_API_KEY")!
);
var result = await inttegro.Products.UnpublishAsync("prod_abc123xyz789");
Response
- Object
- JSON
ProductResponse {
product: { … },
}
{
"product": {
"id": "prod_abc123xyz789",
"name": "Premium Cotton T-Shirt",
"type": "physical",
"active": false,
"category": "apparel",
"created_at": "2026-02-08T23:45:00Z",
"published_at": "2026-02-09T16:30:00Z",
"updated_at": "2026-02-09T17:15:00Z"
}
}
Archive a product
Mark a product as retired. Archiving sets active to false, sets archived_at, and advances updated_at. There is no public unarchive endpoint, and Add a price to a product rejects archived products.
The endpoint returns a conflict when the product is already archived. It does not archive or deactivate prices that already belong to the product. Current lookup, update, publish, pagination, purchase-intent creation, and ID-based order paths can still resolve the product, so retire its prices and checkout entry points separately. Existing orders keep their recorded product snapshot.
Request attributes
Request
- cURL
- TypeScript
- Go
- Python
- PHP
- Ruby
- Java
- C#
curl https://api.inttegro.com/products/archive \
-H "Authorization: Bearer $INTTEGRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"product_id": "prod_abc123xyz789"
}'
import * as Inttegro from '@inttegro/inttegro-sdk'
const inttegro = new Inttegro.InttegroClient({
apiKey: process.env.INTTEGRO_API_KEY!,
})
const result = await inttegro.products.archive({
productId: "prod_abc123xyz789",
})
package main
import (
"context"
"log"
"os"
inttegro "github.com/zebodotdev/inttegro-sdk-go/v4"
)
func main() {
ctx := context.Background()
client := inttegro.NewClient(os.Getenv("INTTEGRO_API_KEY"))
result, err := client.Products.Archive(ctx, "prod_abc123xyz789")
if err != nil {
log.Fatal(err)
}
_ = result
}
import os
import inttegro
client = inttegro.InttegroClient(api_key=os.environ["INTTEGRO_API_KEY"])
result = client.products.archive("prod_abc123xyz789")
<?php
use Inttegro\Client;
$client = new Client($_ENV['INTTEGRO_API_KEY']);
$result = $client->products->archive("prod_abc123xyz789");
require "inttegro"
client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.products.archive(product_id: "prod_abc123xyz789")
import com.inttegro.Client;
public class Example {
public static void main(String[] args) throws Exception {
var client = new Client(System.getenv("INTTEGRO_API_KEY"));
var result = client.products().archive("prod_abc123xyz789");
}
}
using Inttegro;
using var inttegro = new InttegroClient(
Environment.GetEnvironmentVariable("INTTEGRO_API_KEY")!
);
var result = await inttegro.Products.ArchiveAsync("prod_abc123xyz789");
Response
- Object
- JSON
ProductResponse {
product: { … },
}
{
"product": {
"id": "prod_abc123xyz789",
"name": "Premium Cotton T-Shirt",
"type": "physical",
"active": false,
"category": "apparel",
"created_at": "2026-02-08T23:45:00Z",
"archived_at": "2026-02-09T18:00:00Z",
"updated_at": "2026-02-09T18:00:00Z"
}
}
Page through products
Browse every product in your catalog, including published, unpublished, and archived records. Products are sorted by created_at in descending order—page 1 contains the newest entries and subsequent pages step back in time.
Each response returns the full product object, including all fields: media assets, attributes, dimensions, shipment details, and custom data. page_number is required; page_size defaults to 256 if omitted.
AI clients can use list_products for this operation. MCP read tools return minimized business data and do not change Inttegro state.
Request attributes
Response shape
- Top-level
pageobject containingnumber,size, and aproductsarray. - Each entry is a full product object identical to what Lookup a product returns: all core fields, optional nested objects (
media,dimensions,attributes,shipment), and lifecycle timestamps. - Stop paginating when the response
sizeis less than thepage_sizeyou requested, or whenproductsis an empty array.
Request
- cURL
- TypeScript
- Go
- Python
- PHP
- Ruby
- Java
- C#
curl https://api.inttegro.com/products/page \
-H "Authorization: Bearer $INTTEGRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"page_number": 1,
"page_size": 50
}'
import * as Inttegro from '@inttegro/inttegro-sdk'
const inttegro = new Inttegro.InttegroClient({
apiKey: process.env.INTTEGRO_API_KEY!,
})
const result = await inttegro.products.page({
pageNumber: 1,
pageSize: 50,
})
package main
import (
"context"
"log"
"os"
inttegro "github.com/zebodotdev/inttegro-sdk-go/v4"
)
func main() {
ctx := context.Background()
client := inttegro.NewClient(os.Getenv("INTTEGRO_API_KEY"))
params := inttegro.PageProductsParams{
PageNumber: 1,
PageSize: 50,
}
result, err := client.Products.Page(ctx, params)
if err != nil {
log.Fatal(err)
}
_ = result
}
import os
import inttegro
client = inttegro.InttegroClient(api_key=os.environ["INTTEGRO_API_KEY"])
result = client.products.page(inttegro.products.PageRequest(
page_number=1,
page_size=50,
))
<?php
use Inttegro\Client;
$client = new Client($_ENV['INTTEGRO_API_KEY']);
$result = $client->products->page([
'page_number' => 1,
'page_size' => 50,
]);
require "inttegro"
client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.products.page(
page_number: 1,
page_size: 50
)
import com.inttegro.Client;
import com.inttegro.products.PageProductsParams;
public class Example {
public static void main(String[] args) throws Exception {
var client = new Client(System.getenv("INTTEGRO_API_KEY"));
var params = PageProductsParams.builder()
.pageNumber(1)
.pageSize(50)
.build();
var result = client.products().page(params);
}
}
using Inttegro;
using var inttegro = new InttegroClient(
Environment.GetEnvironmentVariable("INTTEGRO_API_KEY")!
);
var result = await inttegro.Products.PageAsync(new {
page_number = 1,
page_size = 50,
});