API · Products

Products API

Products represent catalog items in your account (e.g., an album title). Each product can own multiple inventory items and marketplace presences.

List products

GET List products

/api/v1/products/

Returns a paginated list of the authenticated user's products with nested inventory summaries and marketplace presences.

Query parameters

ParameterTypeDescription
searchstringFull-text search across title, catalog number, tags, marketplace description, license type, license notes, artist name, label name, and digital asset filenames
has_inventorybooleanFilter to products that have (or lack) any inventory items
has_available_inventorybooleanFilter to products with available (received/ready) inventory
statusstringFilter by inventory item status (comma-separated or repeated)
typestringProduct type: physical, digital, digital-report, nft
tagsstringComma-separated, OR logic, case-insensitive partial match
uploadable_to_redbubblebooleanDigital products with Redbubble eligibility
orderingstringSort field — see ordering options below
pageintegerPage number (default: 1)
page_sizeintegerResults per page (default: 15, max: 100)

Ordering options

ValueDescription
title / -titleAlphabetical by title
created / -createdDate created (default: -created)
updated / -updatedDate last modified
artist__nameAlphabetical by artist name
listed_firstProducts with active listings first
unlisted_firstProducts without listings first
price_high_lowSort by price descending
price_low_highSort by price ascending
most_inventoryMost inventory items first
least_inventoryFewest inventory items first
Request
curl "https://app.instica.com/api/v1/products/\
?search=beatles\
&has_inventory=true\
&ordering=-updated\
&page_size=10" \
  -H "Authorization: Bearer YOUR_TOKEN"
Response — 200 OK
{
  "count": 12,
  "next": ".../api/v1/products/?page=2",
  "previous": null,
  "results": [
    {
      "uid": "prod_a1b2c3",
      "title": "Abbey Road",
      "type": "physical",
      "type_display": "Physical",
      "artist": {
        "uid": "art_x1y2",
        "name": "The Beatles"
      },
      "music_label": {
        "uid": "lbl_m1n2",
        "name": "Apple Records"
      },
      "catalog_number": "PCS 7088",
      "sku": null,
      "upc": "0077774644020",
      "formats": ["Vinyl"],
      "year": "1969",
      "tags": ["classic-rock", "uk-pressing"],
      "product_image": "https://cdn...",
      "total_inventory_count": 3,
      "listed_inventory_count": 1,
      "available_inventory_count": 2,
      "price_computed_usd": "29.99",
      "price_override_usd": null,
      "has_primary_asset": false,
      "inventory_items": [ ... ],
      "available_platforms": [ ... ],
      "marketplace_presences": [],
      "redbubble_presence": {
        "exists": false,
        "external_url": null,
        "external_listing_id": null,
        "status": null
      },
      "created": "2025-01-15T10:30:00Z",
      "updated": "2025-02-10T14:22:00Z"
    }
  ]
}

Create a product

POST Create product

/api/v1/products/

Create a new product. Only title is required — all other fields are optional.

Request body

FieldTypeRequiredDescription
titlestringYesProduct title (validated non-empty)
typestringNoDefault: digital. Options: physical, digital, digital-report, nft
marketplace_descriptionstringNoDescription for marketplace listings
tagsstring[]NoArray of tags (max 100 chars each). Default: []
license_typestringNoLicense type (from product license choices)
license_notesstringNoLicense details text
price_override_usddecimalNoManual price override
media_typestringNoMedia type classification
is_mature_contentbooleanNoFlag for mature content
default_visibilitystringNoDefault listing visibility
default_shop_productbooleanNoShow in shop by default
background_colorstringNoProduct display background color
enabled_product_typesobjectNoEnabled product type configuration (JSON)
collectionsobjectNoCollection assignments (JSON)
Request
curl -X POST https://app.instica.com/api/v1/products/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Abbey Road",
    "type": "physical",
    "marketplace_description": "Original 1969 UK pressing.",
    "tags": ["classic-rock", "uk-pressing"],
    "price_override_usd": "29.99"
  }'
Response — 201 Created
{
  "uid": "prod_new123",
  "title": "Abbey Road",
  "type": "physical",
  "type_display": "Physical",
  "artist": null,
  "music_label": null,
  "catalog_number": null,
  "tags": ["classic-rock", "uk-pressing"],
  "price_override_usd": "29.99",
  "total_inventory_count": 0,
  "listed_inventory_count": 0,
  "available_inventory_count": 0,
  "inventory_items": [],
  "marketplace_presences": [],
  "created": "2025-03-01T09:00:00Z",
  "updated": "2025-03-01T09:00:00Z"
}

Get a single product

GET Product detail

/api/v1/products/{uid}/

Returns the full product object including all inventory items, marketplace presences, metadata, and computed fields. Same schema as the list response.

Scope: Products are user-scoped. You can only access products that belong to your organization. Requesting another user's product returns 404 Not Found, not 403.

Request
curl https://app.instica.com/api/v1/products/prod_a1b2c3/ \
  -H "Authorization: Bearer YOUR_TOKEN"

Update a product

PATCH Update product

/api/v1/products/{uid}/

Partially update a product. Only include the fields you want to change.

Writable fields

FieldTypeNotes
titlestringAllow blank/null
catalog_numberstringAllow blank/null
yeardateAccepts YYYY or YYYY-MM-DD. Nullable.
music_label_namestringWrite-only. Get-or-create a music label by name.
price_override_usddecimalMust be positive or null
marketplace_descriptionstringDescription for listings
tagsstring[]Array of tags (max 100 chars each). Allow empty.
license_typestringAllow blank/null
license_notesstringAllow blank/null
media_typestringMedia type classification
is_mature_contentbooleanMature content flag
default_visibilitystringDefault listing visibility
default_shop_productbooleanShow in shop
background_colorstringDisplay background color
enabled_product_typesobjectJSON configuration
collectionsobjectJSON collection assignments

Note: The music_label_name field is write-only. It performs a get-or-create — if a label with that name already exists, the product is linked to it. Otherwise, a new label is created.

Request
curl -X PATCH \
  https://app.instica.com/api/v1/products/prod_a1b2c3/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Abbey Road (Remastered)",
    "year": "1969",
    "music_label_name": "Apple Records",
    "catalog_number": "PCS 7088",
    "marketplace_description": "Original UK pressing.",
    "tags": ["classic-rock", "remastered"],
    "price_override_usd": "34.99"
  }'
Response — 200 OK
{
  "uid": "prod_a1b2c3",
  "title": "Abbey Road (Remastered)",
  "music_label": {
    "uid": "lbl_m1n2",
    "name": "Apple Records"
  },
  "catalog_number": "PCS 7088",
  "year": "1969",
  "tags": ["classic-rock", "remastered"],
  "price_override_usd": "34.99",
  "updated": "2025-03-01T10:15:00Z"
}

Delete a product

DELETE Delete product

/api/v1/products/{uid}/

Permanently delete a product. Associated inventory items and marketplace presences are also removed.

Returns 204 No Content on success.

Request
curl -X DELETE \
  https://app.instica.com/api/v1/products/prod_a1b2c3/ \
  -H "Authorization: Bearer YOUR_TOKEN"

Upload product image

POST Upload image

/api/v1/products/{uid}/image/

Upload or replace the primary product image. Send as multipart/form-data.

The product_image field in the response is resolved with priority: uploaded image → first inventory asset → marketplace presence image.

Request
curl -X POST \
  https://app.instica.com/api/v1/products/prod_a1b2c3/image/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -F "image=@/path/to/album-cover.jpg"

Marketplace presences

Marketplace presences track where a product is represented on connected selling platforms (eBay, Discogs, etc.).

EndpointMethodDescription
.../marketplace-presences/GETList all presences for a product
.../marketplace-presences/POSTCreate a presence record
.../marketplace-presences/{id}/PATCHUpdate a presence record
.../marketplace-presences/{id}/DELETERemove a presence record

Base path: /api/v1/products/{uid}/marketplace-presences/

Create/update fields

FieldTypeNotes
platform_uidstringWrite-only. Set platform by UID.
external_listing_idstringMarketplace listing identifier
external_urlURLLink to the marketplace listing
statusstringListing status on platform
listing_pricedecimalPrice in listing currency
listing_currencystringCurrency code (e.g., USD)
listing_price_usddecimalPrice in USD
is_selling_enabledbooleanWhether selling is active
Create presence
curl -X POST \
  https://app.instica.com/api/v1/products/prod_a1b2c3/\
marketplace-presences/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "platform_uid": "plat_ebay",
    "external_listing_id": "394857201",
    "external_url": "https://ebay.com/itm/394857201",
    "listing_price_usd": "34.99",
    "listing_currency": "USD",
    "status": "active",
    "is_selling_enabled": true
  }'
List presences response
[
  {
    "id": 1,
    "platform": {
      "uid": "plat_ebay",
      "name": "eBay",
      "slug": "ebay"
    },
    "external_listing_id": "394857201",
    "external_url": "https://ebay.com/itm/...",
    "status": "active",
    "listing_price": "34.99",
    "listing_currency": "USD",
    "listing_price_usd": "34.99",
    "is_selling_enabled": true,
    "price_last_updated": "2025-02-10T14:22:00Z",
    "created_at": "2025-01-20T08:00:00Z",
    "updated_at": "2025-02-10T14:22:00Z"
  }
]

Digital assets

Digital products can have downloadable assets (files) attached. These are used for digital fulfillment — when a customer purchases, they receive a download link.

EndpointMethodDescription
/api/v1/products/{uid}/digital-assets/GETList digital assets for a product
/api/v1/products/{uid}/digital-assets/POSTUpload a digital asset
/api/v1/digital/assets/{uid}/GETGet asset details
/api/v1/digital/assets/{uid}/PATCHUpdate asset metadata
/api/v1/digital/assets/{uid}/DELETEDelete a digital asset

Digital fulfillment

EndpointMethodDescription
/api/v1/digital/fulfill/POSTFulfill a digital purchase (send download email)
/api/v1/digital/purchases/GETList digital purchases
/api/v1/digital/purchases/{uid}/GETPurchase detail
/api/v1/digital/purchases/{uid}/resend-email/POSTResend download email
/api/v1/digital/purchases/{uid}/download-logs/GETView download history

Public download (no auth required)

EndpointMethodDescription
/api/v1/digital/download/{token}/GETPublic download page
/api/v1/digital/download/{token}/{asset_uid}/GETDownload a specific asset file
Upload digital asset
curl -X POST \
  https://app.instica.com/api/v1/products/\
prod_a1b2c3/digital-assets/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -F "file=@/path/to/album.zip" \
  -F "display_name=Full Album Download" \
  -F "description=FLAC files, 24-bit"
Fulfill a purchase
curl -X POST \
  https://app.instica.com/api/v1/digital/fulfill/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "product_uid": "prod_a1b2c3",
    "buyer_email": "buyer@example.com"
  }'

Product response schema

Complete field reference for the product object returned by list and detail endpoints.

FieldTypeDescription
uidstringUnique identifier (read-only)
titlestringProduct title
typestringphysical, digital, digital-report, or nft
type_displaystringHuman-readable type label (read-only)
artistobjectNested { uid, name } (read-only)
music_labelobjectNested { uid, name } (read-only)
catalog_numberstringCatalog/release number (nullable)
skustringCustom SKU (nullable)
upcstringUniversal Product Code (nullable)
formatsarrayMedia formats, e.g. ["Vinyl", "CD"] (nullable)
yeardateRelease year (nullable)
marketplace_descriptionstringDescription used for marketplace listings (nullable)
license_typestringLicense type code (nullable)
license_notesstringLicense detail text (nullable)
tagsstring[]Array of tags
media_typestringMedia type classification (nullable)
is_mature_contentbooleanMature content flag
default_visibilitystringDefault listing visibility (nullable)
default_shop_productbooleanShow in shop by default
background_colorstringDisplay background color (nullable)
enabled_product_typesobjectEnabled product types config (nullable)
collectionsobjectCollection assignments (nullable)
price_computed_usddecimalSystem-computed price (nullable)
price_override_usddecimalUser-set price override (nullable)
resolved_identifierstringBest resolved identifier value (read-only, nullable)
resolved_identifier_sourcestringSource of the resolved identifier (read-only, nullable)
product_imageURLPrimary product image URL (read-only, nullable)
total_inventory_countintegerTotal inventory items (read-only, computed)
listed_inventory_countintegerItems currently listed (read-only, computed)
available_inventory_countintegerItems available for sale (read-only, computed)
has_primary_assetbooleanWhether product has a primary digital asset (read-only)
inventory_itemsarrayNested inventory item summaries (read-only)
available_platformsarrayPlatforms this product can be listed on (read-only)
marketplace_presencesarrayActive marketplace presence records (read-only)
redbubble_presenceobject{ exists, external_url, external_listing_id, status } (read-only)
metadataobject{ external_id, external_id_title } (read-only, nullable)
createddatetimeCreation timestamp (read-only)
updateddatetimeLast update timestamp (read-only)
available_platforms entry
{
  "uid": "plat_ebay",
  "name": "eBay",
  "slug": "ebay",
  "display_name": "eBay",
  "platform_type": "marketplace",
  "supports_digital": false,
  "supports_api_connection": true,
  "connection_type": "oauth"
}

Nested inventory item schema

Each product's inventory_items array contains summary objects with these fields:

FieldTypeDescription
uidstringInventory item identifier
titlestringComputed title
statusstringCurrent status code
status_displaystringHuman-readable status
condition_itemstringItem condition grade code
condition_item_displaystringHuman-readable condition (e.g., "VG+")
condition_containerstringContainer/sleeve condition code
condition_container_displaystringHuman-readable container condition
condition_commentsstringFree-text condition notes
price_total_usddecimalTotal price in USD
listing_current_pricedecimalCurrent listing price
price_expected_usddecimalExpected sale price
resolved_skustringBest resolved SKU value
resolved_sku_sourcestringSource of the resolved SKU
grade_tier_codestringGrade tier code
grade_tier_labelstringGrade tier display label
createddatetimeCreation timestamp
updateddatetimeLast update timestamp
inventory_items entry
{
  "uid": "inv_d4e5f6",
  "title": "Abbey Road — VG+",
  "status": "ready-to-sell",
  "status_display": "Ready to Sell",
  "condition_item": "vg_plus",
  "condition_item_display": "VG+",
  "condition_container": "vg",
  "condition_container_display": "VG",
  "condition_comments": "Light surface marks",
  "price_total_usd": "34.99",
  "listing_current_price": "34.99",
  "price_expected_usd": "39.99",
  "resolved_sku": "PCS-7088-001",
  "resolved_sku_source": "manual",
  "grade_tier_code": "good",
  "grade_tier_label": "Good",
  "created": "2025-01-15T10:30:00Z",
  "updated": "2025-02-10T14:22:00Z"
}

Nested marketplace presence schema

Each entry in marketplace_presences tracks a product's representation on a specific selling platform.

FieldTypeDescription
idintegerPresence record ID
platformobjectNested { uid, name, slug }
external_listing_idstringMarketplace listing identifier
external_urlURLLink to the marketplace listing
statusstringListing status
listing_pricedecimalPrice in listing currency
listing_currencystringCurrency code
listing_price_usddecimalPrice in USD
is_selling_enabledbooleanWhether selling is active
price_last_updateddatetimeWhen price was last synced
last_checked_atdatetimeLast platform sync check
created_atdatetimePresence creation timestamp
updated_atdatetimeLast update timestamp
marketplace_presences entry
{
  "id": 1,
  "platform": {
    "uid": "plat_discogs",
    "name": "Discogs",
    "slug": "discogs"
  },
  "external_listing_id": "28457123",
  "external_url": "https://discogs.com/sell/...",
  "status": "active",
  "listing_price": "29.99",
  "listing_currency": "USD",
  "listing_price_usd": "29.99",
  "is_selling_enabled": true,
  "price_last_updated": "2025-02-10T14:22:00Z",
  "last_checked_at": "2025-02-11T06:00:00Z",
  "created_at": "2025-01-20T08:00:00Z",
  "updated_at": "2025-02-10T14:22:00Z"
}