Manage your product catalog
Products and prices are the building blocks of every order. A product describes what you're selling—name, category, tax code, and custom metadata. A price attaches a monetary amount and currency to a product. This guide walks through creating and maintaining your catalog, controlling product visibility through the publish/unpublish/archive lifecycle, and attaching catalog items to orders at checkout.
An authenticated AI agent can create products and prices after confirmation, inspect existing catalog entries, list prices, and render catalog cards for operational review.
MCP tools: create_product, create_product_price, list_products, get_product, list_prices, get_price or render_catalog_carousel
Confirmed MCP actions require explicit form confirmation before Inttegro changes state.
Prerequisites
- Basic understanding of orders and how line items work
Create a product
A product is a catalog entry. It doesn't have a price on its own—you attach one or more prices separately. This separation lets you update pricing without touching the product record and support multiple currencies or billing intervals on a single item.
Create product
- 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 Tailoring",
"about": "Bespoke suit tailoring with two fittings",
"category": "services",
"type": "service",
"tax_code": "txcd_20030000"
}'
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 Tailoring",
about: "Bespoke suit tailoring with two fittings",
category: "services",
type: Inttegro.ProductTypes.Service,
taxCode: "txcd_20030000",
})
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 Tailoring",
About: "Bespoke suit tailoring with two fittings",
Category: &inttegro.ProductCategory{},
Type: inttegro.ProductTypeService,
TaxCode: "txcd_20030000",
}
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 Tailoring",
about="Bespoke suit tailoring with two fittings",
category="services",
type=inttegro.ProductType.SERVICE,
tax_code="txcd_20030000",
))
<?php
use Inttegro\Client;
$client = new Client($_ENV['INTTEGRO_API_KEY']);
$result = $client->products->create([
'name' => 'Premium Tailoring',
'about' => 'Bespoke suit tailoring with two fittings',
'category' => 'services',
'type' => \Inttegro\ProductType::Service,
'tax_code' => 'txcd_20030000',
]);
require "inttegro"
client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.products.create(
name: "Premium Tailoring",
about: "Bespoke suit tailoring with two fittings",
category: "services",
type: Inttegro::ProductType::SERVICE,
tax_code: "txcd_20030000"
)
import com.inttegro.Client;
import com.inttegro.products.CreateProductParams;
import com.inttegro.products.ProductCategory;
import com.inttegro.products.ProductType;
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 Tailoring")
.about("Bespoke suit tailoring with two fittings")
.category(ProductCategory.builder().build())
.type(ProductType.SERVICE)
.taxCode("txcd_20030000")
.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 Tailoring",
about = "Bespoke suit tailoring with two fittings",
category = "services",
type = Inttegro.ProductType.Service,
tax_code = "txcd_20030000",
});
The response includes the product ID (pr_…). Store this—you'll need it when creating prices and referencing the product in orders.
Attach a price
A price binds a monetary amount and currency to a product. You can attach multiple prices to the same product—useful for multi-currency stores or tiered billing (monthly vs annual).
Create price
- cURL
- TypeScript
- Go
- Python
- PHP
- Ruby
- Java
- C#
curl https://api.inttegro.com/prices/create \
-H "Authorization: Bearer $INTTEGRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"product_id": "prod_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i",
"amount": {
"currency": "ghs",
"value": 85000
},
"label": "Standard"
}'
import * as Inttegro from '@inttegro/inttegro-sdk'
const inttegro = new Inttegro.InttegroClient({
apiKey: process.env.INTTEGRO_API_KEY!,
})
const result = await inttegro.prices.create({
productId: "prod_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i",
amount: {
currency: "ghs",
value: 85000,
},
label: "Standard",
})
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.CatalogPriceParams{
ProductID: "prod_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i",
Amount: money.AmountParams{
Currency: money.GHS,
Value: 85000,
},
Label: "Standard",
}
result, err := client.Prices.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.prices.create(inttegro.prices.CreateRequest(
product_id="prod_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i",
amount=inttegro.prices.Amount(
currency=inttegro.Currency.GHS,
value=85000,
),
label="Standard",
))
<?php
use Inttegro\Client;
$client = new Client($_ENV['INTTEGRO_API_KEY']);
$result = $client->prices->create([
'product_id' => 'prod_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i',
'amount' => [
'currency' => 'ghs',
'value' => 85000,
],
'label' => 'Standard',
]);
require "inttegro"
client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.prices.create(
product_id: "prod_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i",
amount: {
currency: "ghs",
value: 85000,
},
label: "Standard"
)
import com.inttegro.Client;
import com.inttegro.prices.CatalogPriceParams;
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 = CatalogPriceParams.builder()
.productId("prod_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i")
.amount(AmountParams.of(Currency.GHS, 85000))
.label("Standard")
.build();
var result = client.prices().create(params);
}
}
using Inttegro;
using var inttegro = new InttegroClient(
Environment.GetEnvironmentVariable("INTTEGRO_API_KEY")!
);
var result = await inttegro.Prices.CreateAsync(new {
product_id = "prod_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i",
amount = new {
currency = "ghs",
value = 85000,
},
label = "Standard",
});
Amounts are always in the smallest currency unit—pesewas for GHS, cents for USD, kobo for NGN. 85000 pesewas = GHS 850.00.
Publish and unpublish products
Products start in an unpublished state. Publish them when they're ready to appear in your storefront or be selected during checkout. Unpublish to hide them temporarily without losing the product record or its associated prices.
Publish product
- 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_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i"}'
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_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i",
})
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_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i")
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_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i")
<?php
use Inttegro\Client;
$client = new Client($_ENV['INTTEGRO_API_KEY']);
$result = $client->products->publish("prod_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i");
require "inttegro"
client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.products.publish(product_id: "prod_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i")
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_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i");
}
}
using Inttegro;
using var inttegro = new InttegroClient(
Environment.GetEnvironmentVariable("INTTEGRO_API_KEY")!
);
var result = await inttegro.Products.PublishAsync("prod_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i");
To hide a product without archiving it, call Unpublish a product with the same request shape. The product reverts to unpublished status and can be republished at any time.
Archive a product
Archiving is permanent removal from active catalog management. Archive products you'll never sell again—discontinued items, seasonal products that have run their course, or test entries you want to clean up. Archived products cannot be ordered and won't appear in catalog listings.
Archive product
- 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_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i"}'
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_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i",
})
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_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i")
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_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i")
<?php
use Inttegro\Client;
$client = new Client($_ENV['INTTEGRO_API_KEY']);
$result = $client->products->archive("prod_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i");
require "inttegro"
client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.products.archive(product_id: "prod_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i")
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_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i");
}
}
using Inttegro;
using var inttegro = new InttegroClient(
Environment.GetEnvironmentVariable("INTTEGRO_API_KEY")!
);
var result = await inttegro.Products.ArchiveAsync("prod_ZLxM9pQ4wRsN7jKv2cY1tD8hBgFnAo3i");
Archiving a product does not affect past orders that reference it. Historical line items remain intact for reconciliation and customer service purposes.
Related resources
- Products API — Full reference for create, lookup, update, publish, unpublish, and archive
- Prices API — Complete parameter reference for prices
- Accept a payment — How to include catalog products in order line items