Catalog API
Read catalog products, product plans, and related product metadata from the protected Plandalf API.
The Catalog API exposes the product records Plandalf uses around offers, pricing, invoices, and checkout context.
Current write status
Product create, update, and delete routes exist in the Laravel resource registration, but the current controller methods and form requests do not implement public write behavior. Treat catalog product writes as dashboard-managed or integration-managed until the API exposes validated write requests.
Endpoints
Authentication
Use a bearer API key or OAuth token. The API resolves the current organization from the authenticated user context.
Authorization: Bearer <api_key_or_oauth_token>
Accept: application/json
Content-Type: application/json
List products
Endpoint
List products
Returns paginated catalog products for the authenticated user's current organization.
/api/catalog/products Query parameters
per_pageintegerdefault: 250Maximum number of products per page. The controller reads this as per_page and defaults to 250.
List catalog products
curl "https://api.plandalf.com/api/catalog/products?per_page=100" \
-H "Authorization: Bearer $PLANDALF_API_KEY" \
-H "Accept: application/json" Response fields
dataarrayProduct resources for the current page.
linksobjectLaravel pagination links for the product collection.
Product list response
{
"data": [
{
"id": "prod_01h...",
"name": "Pro plan",
"display_name": "Pro plan",
"description": "Annual access",
"family": {
"id": "family_01h...",
"name": "Membership",
"lookup_key": "membership"
},
"version_number": 1,
"status": "active",
"published_at": 1718846400,
"archived_at": null
}
],
"links": {
"first": "https://api.plandalf.com/api/catalog/products?page=1",
"last": null,
"prev": null,
"next": null
}
} Retrieve a product
Endpoint
Retrieve a product
Returns one catalog product. Product features are loaded when the controller resolves the product.
/api/catalog/products/{product} Path parameters
productstringrequiredProduct route key. Use the id returned by the product list.
Retrieve one product
curl "https://api.plandalf.com/api/catalog/products/prod_01h..." \
-H "Authorization: Bearer $PLANDALF_API_KEY" \
-H "Accept: application/json" Product response
{
"id": "prod_01h...",
"name": "pro-plan",
"display_name": "Pro plan",
"description": "Annual access",
"family": {
"id": "family_01h...",
"name": "Membership",
"lookup_key": "membership"
},
"version_number": 1,
"features": [],
"twins": [],
"status": "active",
"published_at": 1718846400,
"archived_at": null
} Response fields
idstringPublic product route key.
namestring | nullInternal or source-system product name.
display_namestring | nullCustomer-facing display name when one is set.
descriptionstring | nullProduct description copied from the source system or edited in Plandalf.
created_atinteger | nullUnix timestamp for product creation.
updated_atinteger | nullUnix timestamp for the last product update.
familyobject | nullProduct family metadata when the productFamily relation is loaded.
version_numberinteger | nullVersion marker from the catalog product model.
featuresarrayProduct feature records when productFeatures.feature is loaded by the show controller.
twinsarrayLinked provider records when external twins are loaded.
statusstring | nullProduct status, such as active or archived.
published_atinteger | nullUnix timestamp for publication when the product is published.
archived_atinteger | nullUnix timestamp for archival when the product is archived.
List product plans
Endpoint
List product plans
Returns the pricing plans attached to a catalog product.
/api/catalog/products/{product}/plans Path parameters
productstringrequiredProduct route key.
List product plans
curl "https://api.plandalf.com/api/catalog/products/prod_01h.../plans" \
-H "Authorization: Bearer $PLANDALF_API_KEY" \
-H "Accept: application/json" Response fields
dataarrayPlan resources attached to the product.
idstringPublic plan route key.
objectstringResource type. Product plan resources return plan.
statusstring | nullCurrent plan status.
typestring | nullPlan type, such as recurring.
renew_intervalstring | nullISO 8601 interval string when the plan renews.
chargesarrayLoaded charge resources for the plan.
Product plan shape
{
"id": "plan_01h...",
"object": "plan",
"status": "active",
"type": "recurring",
"display_name": "Annual",
"description": "Annual access",
"name": "annual",
"renew_interval": "P1Y",
"billing_anchor": "anniversary",
"invoice_interval": "P1Y",
"currency_code": "USD",
"currency_symbol": "$"
} Write behavior
Use the dashboard for writes
The current ProductsController has resource methods for store, update, and destroy, but those methods are empty and their form requests currently return authorize(): false. Do not build production automation against product write routes yet.
Read-only catalog flow
const response = await fetch("https://api.plandalf.com/api/catalog/products", {
headers: {
Authorization: `Bearer ${process.env.PLANDALF_API_KEY}`,
Accept: "application/json"
}
});
const products = await response.json();curl "https://api.plandalf.com/api/catalog/products" \
-H "Authorization: Bearer $PLANDALF_API_KEY" \
-H "Accept: application/json"