Skip to content

Commit 5df24c0

Browse files
Add ecommerce catalog upload API to Preview spec
Introduces the POST /ecommerce/connectors/{id}/catalog endpoint under a new Ecommerce Connectors tag, covering single-file and multipart upload flows with all error responses and two new schema components. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent a20990d commit 5df24c0

1 file changed

Lines changed: 278 additions & 0 deletions

File tree

descriptions/0/api.intercom.io.yaml

Lines changed: 278 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16321,6 +16321,246 @@ paths:
1632116321
message: Execution result not found
1632216322
schema:
1632316323
"$ref": "#/components/schemas/error"
16324+
"/ecommerce/connectors/{id}/catalog":
16325+
post:
16326+
summary: Upload a product catalog
16327+
parameters:
16328+
- name: Intercom-Version
16329+
in: header
16330+
schema:
16331+
"$ref": "#/components/schemas/intercom_version_preview"
16332+
- name: id
16333+
in: path
16334+
required: true
16335+
description: The unique identifier of the ecommerce connector.
16336+
schema:
16337+
type: string
16338+
example: '42939'
16339+
- name: import_job_id
16340+
in: query
16341+
required: false
16342+
description: |
16343+
The import job ID returned from the first multipart upload request. Required
16344+
when uploading subsequent parts (`part_number` ≥ 2) and when finalizing
16345+
a multipart session (`finalize=true`).
16346+
schema:
16347+
type: string
16348+
example: 'job_01abc123'
16349+
- name: part_number
16350+
in: query
16351+
required: false
16352+
description: |
16353+
The sequential part number for a multipart upload. Must be a positive integer.
16354+
The server returns `next_part_number` in each response to guide the next request.
16355+
Retrying the same `part_number` is safe and idempotent.
16356+
schema:
16357+
type: integer
16358+
example: 2
16359+
- name: finalize
16360+
in: query
16361+
required: false
16362+
description: |
16363+
Set to `true` to finalize a multipart upload session and start the catalog sync.
16364+
No catalog file is required when finalizing. Set to `false` to upload a part in
16365+
a multipart session. Omit entirely for a single-file upload.
16366+
schema:
16367+
type: string
16368+
enum:
16369+
- 'true'
16370+
- 'false'
16371+
example: 'false'
16372+
tags:
16373+
- Ecommerce Connectors
16374+
operationId: uploadEcommerceCatalog
16375+
description: |
16376+
Upload a product catalog to an ecommerce connector. The catalog must be a JSON
16377+
array of product objects. There are two upload modes:
16378+
16379+
**Single-file upload** — POST a single catalog file (up to 99 MB per request).
16380+
Omit `finalize` and `import_job_id`. Returns `202 Accepted` when sync has started.
16381+
16382+
**Multipart upload** — For catalogs that must be split across multiple requests:
16383+
16384+
1. POST the first part with `finalize=false` (no `import_job_id`). The response
16385+
returns an `import_job_id` and `next_part_number`.
16386+
2. POST each subsequent part with `finalize=false`, the `import_job_id` from step 1,
16387+
and the `part_number` from the previous response. Each part must be ≤ 99 MB.
16388+
3. POST with `finalize=true` and the `import_job_id` to complete the upload and
16389+
start the sync. No catalog file is required in the finalization request.
16390+
16391+
Part uploads are idempotent — retrying the same `part_number` does not create
16392+
a duplicate. If a response is lost, retry with the same `part_number`.
16393+
requestBody:
16394+
content:
16395+
multipart/form-data:
16396+
schema:
16397+
type: object
16398+
properties:
16399+
catalog:
16400+
type: string
16401+
format: binary
16402+
description: |
16403+
The catalog JSON file. Required for all requests except finalization
16404+
(`finalize=true`). Must be a valid JSON array of objects. Max 99 MB.
16405+
responses:
16406+
'200':
16407+
description: Multipart catalog part uploaded successfully.
16408+
content:
16409+
application/json:
16410+
examples:
16411+
Part uploaded:
16412+
value:
16413+
import_job_id: 'job_01abc123'
16414+
next_part_number: 2
16415+
schema:
16416+
"$ref": "#/components/schemas/ecommerce_catalog_upload_part_response"
16417+
'202':
16418+
description: Catalog accepted and sync has started.
16419+
content:
16420+
application/json:
16421+
examples:
16422+
Sync started:
16423+
value:
16424+
import_job_id: 'job_01abc123'
16425+
status: processing
16426+
message: Catalog received. Sync has started.
16427+
schema:
16428+
"$ref": "#/components/schemas/ecommerce_catalog_upload_response"
16429+
'400':
16430+
description: Bad request.
16431+
content:
16432+
application/json:
16433+
examples:
16434+
Missing catalog file:
16435+
value:
16436+
type: error.list
16437+
request_id: test-uuid-replacement
16438+
errors:
16439+
- code: parameter_not_found
16440+
message: catalog file is required
16441+
Catalog is not a file:
16442+
value:
16443+
type: error.list
16444+
request_id: test-uuid-replacement
16445+
errors:
16446+
- code: parameter_not_found
16447+
message: catalog must be an uploaded file
16448+
schema:
16449+
"$ref": "#/components/schemas/error"
16450+
'401':
16451+
"$ref": "#/components/responses/Unauthorized"
16452+
'404':
16453+
description: Not found.
16454+
content:
16455+
application/json:
16456+
examples:
16457+
Connector not found:
16458+
value:
16459+
type: error.list
16460+
request_id: test-uuid-replacement
16461+
errors:
16462+
- code: import_source_not_found
16463+
message: No connector found with the provided id.
16464+
Feature not available:
16465+
value:
16466+
type: error.list
16467+
request_id: test-uuid-replacement
16468+
errors:
16469+
- code: not_found
16470+
message: The catalog API is not available for this workspace.
16471+
Upload session not found:
16472+
value:
16473+
type: error.list
16474+
request_id: test-uuid-replacement
16475+
errors:
16476+
- code: upload_session_not_found
16477+
message: No active upload session found for the provided import_job_id.
16478+
schema:
16479+
"$ref": "#/components/schemas/error"
16480+
'409':
16481+
description: Conflict.
16482+
content:
16483+
application/json:
16484+
examples:
16485+
Sync already in progress:
16486+
value:
16487+
type: error.list
16488+
request_id: test-uuid-replacement
16489+
errors:
16490+
- code: sync_in_progress
16491+
message: A catalog upload is already in progress. Please wait for it to complete.
16492+
Multipart session already exists:
16493+
value:
16494+
type: error.list
16495+
request_id: test-uuid-replacement
16496+
errors:
16497+
- code: sync_in_progress
16498+
message: A multipart upload is already in progress. Use import_job_id to continue.
16499+
Session cannot be finalized:
16500+
value:
16501+
type: error.list
16502+
request_id: test-uuid-replacement
16503+
errors:
16504+
- code: upload_session_not_finalizable
16505+
message: Upload session cannot be finalized in its current state.
16506+
schema:
16507+
"$ref": "#/components/schemas/error"
16508+
'422':
16509+
description: Unprocessable content.
16510+
content:
16511+
application/json:
16512+
examples:
16513+
Catalog is not a JSON array:
16514+
value:
16515+
type: error.list
16516+
request_id: test-uuid-replacement
16517+
errors:
16518+
- code: invalid_catalog_format
16519+
message: catalog must be a JSON array
16520+
Catalog items are not objects:
16521+
value:
16522+
type: error.list
16523+
request_id: test-uuid-replacement
16524+
errors:
16525+
- code: invalid_catalog_format
16526+
message: each item in the catalog array must be a JSON object
16527+
Part number is not a positive integer:
16528+
value:
16529+
type: error.list
16530+
request_id: test-uuid-replacement
16531+
errors:
16532+
- code: invalid_part_number
16533+
message: part_number must be a positive integer
16534+
Out-of-sequence part number:
16535+
value:
16536+
type: error.list
16537+
request_id: test-uuid-replacement
16538+
errors:
16539+
- code: invalid_part_number
16540+
message: Expected part 2, got 3
16541+
File exceeds size limit:
16542+
value:
16543+
type: error.list
16544+
request_id: test-uuid-replacement
16545+
errors:
16546+
- code: payload_too_large
16547+
message: catalog file exceeds 99MB limit
16548+
schema:
16549+
"$ref": "#/components/schemas/error"
16550+
'503':
16551+
description: Service unavailable.
16552+
content:
16553+
application/json:
16554+
examples:
16555+
Storage error:
16556+
value:
16557+
type: error.list
16558+
request_id: test-uuid-replacement
16559+
errors:
16560+
- code: internal_error
16561+
message: Failed to store catalog
16562+
schema:
16563+
"$ref": "#/components/schemas/error"
1632416564
"/events":
1632516565
post:
1632616566
summary: Submit a data event
@@ -32894,6 +33134,40 @@ components:
3289433134
example: '5017690'
3289533135
required:
3289633136
- admin_id
33137+
ecommerce_catalog_upload_part_response:
33138+
title: Ecommerce Catalog Upload Part Response
33139+
type: object
33140+
description: Returned after a multipart catalog part is successfully uploaded.
33141+
properties:
33142+
import_job_id:
33143+
type: string
33144+
description: |
33145+
The unique identifier for the active upload session. Pass this as `import_job_id`
33146+
in subsequent part uploads and in the finalization request.
33147+
example: 'job_01abc123'
33148+
next_part_number:
33149+
type: integer
33150+
description: The part number to use in the next upload request.
33151+
example: 2
33152+
ecommerce_catalog_upload_response:
33153+
title: Ecommerce Catalog Upload Response
33154+
type: object
33155+
description: Returned when a catalog upload is accepted and sync has started.
33156+
properties:
33157+
import_job_id:
33158+
type: string
33159+
description: The unique identifier for the import job.
33160+
example: 'job_01abc123'
33161+
status:
33162+
type: string
33163+
description: The current status of the catalog sync.
33164+
enum:
33165+
- processing
33166+
example: processing
33167+
message:
33168+
type: string
33169+
description: A human-readable description of the sync status.
33170+
example: Catalog received. Sync has started.
3289733171
email_address_header:
3289833172
title: Email Address Header
3289933173
type: object
@@ -38118,6 +38392,10 @@ tags:
3811838392
description: Everything about your Data Events
3811938393
- name: Data Export
3812038394
description: Export message delivery and engagement statistics (opens, clicks, replies, completions, dismissals, unsubscribes, bounces) for outbound content such as Emails, Posts, Custom Bots, Surveys, Tours, and Series.
38395+
- name: Ecommerce Connectors
38396+
description: |
38397+
Upload and manage product catalogs via ecommerce connectors. Supports single-file
38398+
uploads (up to 99 MB) and multipart uploads for larger catalogs.
3812138399
- name: Emails
3812238400
description: Everything about your Emails
3812338401
- name: Fin Agent

0 commit comments

Comments
 (0)