API · Marketplace & Import

Marketplace & Import API

Connect to selling platforms, import existing inventory, and manage cross-channel listings from a single API.

Supported platforms

Instica supports the following selling platforms for inventory sync and cross-channel listing:

PlatformConnectionImportList / DelistOrder sync
eBayOAuthYesYesYes
DiscogsOAuthYesYesYes
EtsyOAuthYesYesYes
ShopifyOAuthYesYesYes
RedbubbleExtensionScrapeManualNo
TeePublicExtensionScrapeManualNo
Society6ExtensionScrapeManualNo

OAuth-connected platforms support full two-way sync — listings, orders, and inventory levels stay in sync automatically.

Extension-based platforms (Redbubble, TeePublic, Society6) use the Instica browser extension to scrape listing data from the marketplace website.

List available platforms
curl https://app.instica.com/api/v1/platforms/ \
  -H "Authorization: Bearer YOUR_TOKEN"
Response
[
  {
    "uid": "plt_abc",
    "name": "eBay",
    "slug": "ebay",
    "url": "https://ebay.com",
    "is_selling_active": true,
    "connection_url": "/accounts/ebay/login/"
  },
  {
    "uid": "plt_def",
    "name": "Discogs",
    "slug": "discogs",
    "url": "https://discogs.com",
    "is_selling_active": true,
    "connection_url": "/accounts/discogs/login/"
  }
]

Connection flow (OAuth)

Marketplace connections use OAuth 2.0. The flow works as follows:

  1. Initiate — Open a browser/webview to the provider's OAuth login URL.
  2. Authorize — The user grants access on the marketplace's site.
  3. Callback — The marketplace redirects back to Instica, which stores the connection tokens.
  4. Verify — Confirm in the UI that the provider shows as connected.

iOS OAuth notes

On iOS, use ASWebAuthenticationSession for provider authorization and handle the app callback via your configured URL scheme.

OAuth flow (high-level)
1) Open provider OAuth page
2) User authorizes access
3) Provider redirects back to app
4) Confirm connection status in UI

Create import job

POST Create import job

/api/v1/marketplace/import/jobs/create/

Create an import job to pull inventory from a connected marketplace. Jobs run asynchronously.

Request body

FieldTypeRequiredDescription
seller_account_uidstringYesUID of the connected marketplace account
marketplacestringYesdiscogs, ebay, or shopify

POST Quick import

/api/v1/marketplace/{platform}/import/

Shorthand to trigger import for a specific platform. Automatically resolves the seller account.

Create import job
curl -X POST \
  https://app.instica.com/api/v1/marketplace/\
import/jobs/create/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "seller_account_uid": "sa_abc123",
    "marketplace": "ebay"
  }'
Quick import (shorthand)
curl -X POST \
  https://app.instica.com/api/v1/marketplace/\
ebay/import/ \
  -H "Authorization: Bearer YOUR_TOKEN"

Import lifecycle

After creating an import job, use these endpoints to manage its lifecycle:

GET List import jobs

/api/v1/marketplace/import/jobs/

Returns the last 50 import jobs. Filter by marketplace or status.

GET Job detail

/api/v1/marketplace/import/jobs/{uid}/

Poll this endpoint to track import progress via progress_percentage.

POST Preview import

/api/v1/marketplace/import/preview/

Preview what the import will produce before starting. Returns 202 (async).

Preview / start request body

FieldTypeRequiredDescription
job_uidstringYesImport job UID
status_filterstringNoOnly process items with this status
limitintegerNoMax items to process

POST Start import

/api/v1/marketplace/import/start/

Begin processing the import. Returns 202 (async).

Start request additional field

FieldTypeDefaultDescription
skip_conflictsbooleanfalseAuto-skip conflicting items
Check job progress
curl https://app.instica.com/api/v1/marketplace/\
import/jobs/job_p6q7r8/ \
  -H "Authorization: Bearer YOUR_TOKEN"
Job response
{
  "id": "job_p6q7r8",
  "marketplace": "ebay",
  "status": "in_progress",
  "total_listings_found": 150,
  "items_imported": 82,
  "items_skipped": 0,
  "items_failed": 3,
  "items_conflicted": 2,
  "has_issues": true,
  "issue_summary": "3 failed, 2 conflicts",
  "progress_percentage": 58.0,
  "error_message": null,
  "created_at": "2026-02-15T09:00:00Z",
  "started_at": "2026-02-15T09:00:05Z",
  "completed_at": null
}
Start import
curl -X POST \
  https://app.instica.com/api/v1/marketplace/\
import/start/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "job_uid": "job_p6q7r8",
    "skip_conflicts": false
  }'

# 202 Accepted

Import issues & conflicts

GET List job issues

/api/v1/marketplace/import/jobs/{uid}/issues/

Paginated list of failed or conflicting items. Filter by status (failed or conflict). Default page size: 20, max: 100.

Import item fields

FieldTypeDescription
idstringItem UID
external_listing_idstringMarketplace listing ID
external_skustringMarketplace SKU
statusstringimported, failed, conflict, skipped
listing_titlestringTitle from the marketplace
listing_pricedecimalListed price (nullable)
conflict_typestringType of conflict (nullable)
conflict_detailsstringConflict description (nullable)
error_messagestringError details (nullable)
error_codestringError code (nullable)
resolutionstringHow the conflict was resolved
created_inventory_item_uidstringUID of created item (nullable)
processed_atdatetimeWhen the item was processed (nullable)

POST Resolve conflict

/api/v1/marketplace/import/jobs/{uid}/items/{item_uid}/resolve/

Resolve a specific conflict item.

POST Retry failed items

/api/v1/marketplace/import/jobs/{uid}/retry-failed/

Retry all failed items in the job.

POST Skip all conflicts

/api/v1/marketplace/import/jobs/{uid}/skip-all-conflicts/

Bulk skip all remaining conflicted items.

List issues
curl "https://app.instica.com/api/v1/marketplace/\
import/jobs/job_p6q7r8/issues/\
?status=conflict" \
  -H "Authorization: Bearer YOUR_TOKEN"
Issue item response
{
  "count": 2,
  "results": [
    {
      "id": "item_xyz",
      "external_listing_id": "394857201",
      "external_sku": "PCS-7088-001",
      "status": "conflict",
      "listing_title": "Abbey Road - VG+",
      "listing_price": "34.99",
      "conflict_type": "duplicate_sku",
      "conflict_details":
        "SKU matches existing item inv_d4e5f6",
      "error_message": null,
      "error_code": null,
      "resolution": "pending",
      "created_inventory_item_uid": null,
      "processed_at": "2026-02-15T09:05:00Z"
    }
  ]
}
Resolve conflict
curl -X POST \
  https://app.instica.com/api/v1/marketplace/\
import/jobs/job_p6q7r8/items/item_xyz/resolve/ \
  -H "Authorization: Bearer YOUR_TOKEN"
Retry all failed
curl -X POST \
  https://app.instica.com/api/v1/marketplace/\
import/jobs/job_p6q7r8/retry-failed/ \
  -H "Authorization: Bearer YOUR_TOKEN"

Import job response schema

All import job endpoints return this shape:

FieldTypeDescription
idstringJob UID
marketplacestringPlatform slug
statusstringpending, in_progress, completed, failed
total_listings_foundintegerTotal listings discovered on the platform
items_importedintegerSuccessfully imported count
items_skippedintegerSkipped items count
items_failedintegerFailed items count
items_conflictedintegerConflicting items count
has_issuesbooleanWhether any items failed or conflicted
issue_summarystringHuman-readable issue summary
progress_percentagefloat0.0 – 100.0
error_messagestringJob-level error (nullable)
created_atdatetimeWhen the job was created
started_atdatetimeWhen processing began (nullable)
completed_atdatetimeWhen the job finished (nullable)
Completed job
{
  "id": "job_p6q7r8",
  "marketplace": "ebay",
  "status": "completed",
  "total_listings_found": 150,
  "items_imported": 145,
  "items_skipped": 2,
  "items_failed": 3,
  "items_conflicted": 0,
  "has_issues": true,
  "issue_summary": "3 items failed",
  "progress_percentage": 100.0,
  "error_message": null,
  "created_at": "2026-02-15T09:00:00Z",
  "started_at": "2026-02-15T09:00:05Z",
  "completed_at": "2026-02-15T09:12:30Z"
}

Listing management

Once platforms are connected, list and delist inventory items programmatically. See the Inventory API — Listings section for full per-item listing documentation.

EndpointMethodDescription
.../{uid}/platforms/{slug}/list/POSTList on a platform
.../{uid}/platforms/{slug}/delist/POSTDelist from a platform
/api/v1/inventory/bulk/list/POSTBulk list items
/api/v1/inventory/bulk/delist/POSTBulk delist items

Base path for per-item endpoints: /api/v1/inventory/

Prerequisites for listing: The user must have (1) an active subscription, (2) a primary address on file, and (3) a valid connection to the target marketplace. Missing any of these returns 402 or 400 with a descriptive error.

List an item on eBay
curl -X POST \
  https://app.instica.com/api/v1/inventory/\
inv_d4e5f6/platforms/ebay/list/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "price": "34.99"
  }'
Response
{
  "status": "success",
  "listing_url": "https://ebay.com/itm/394857201",
  "listing_id": "394857201"
}
Bulk delist
curl -X POST \
  https://app.instica.com/api/v1/inventory/\
bulk/delist/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "uids": ["inv_001", "inv_002", "inv_003"],
    "platforms": ["ebay", "discogs"]
  }'