Channel API: reports (generate and retrieve a full product feed export)
About this article
This article explains how to use the Channel API's reports endpoints to generate, track, and retrieve a full, on-demand export of a seller's products and offer mappings, and how to check for existing reports before generating a new one.
Table of contents
- Generate a report: POST /v2/reports/feed
- Check report status: GET /v2/reports/{reportId}/status
- Retrieve a report: GET /v2/reports/{reportId}
- List available reports: GET /v2/reports/channel/available
Introduction
If your channel relies on polling endpoints like GET /v2/products/data and GET /v2/products/offers to stay in sync, you already have a steady stream of updates from your merchants. Polling can still miss things, however — a record that slipped through during downtime, or a sync that failed silently somewhere along the way.
The reports endpoints give you a way to catch those gaps: a full, real-time export of every product and offer mapping a seller currently has, at the exact moment you request it. This article covers how to generate a report with POST /v2/reports/feed, track and retrieve it with the matching GET endpoints, and check for existing reports with GET /v2/reports/channel/available.
GET /v2/products/data and GET /v2/products/offers as your day-to-day sync method, and run a reports feed at most once a night as a safety net for anything those endpoints might miss. /v2/reports is a backup, not your primary sync method. The report is a heavy, full export of all products and offer mappings, not a delta.
Available report types
Right now, the only report type available is PRODUCT_FEED, which is the product and offer mapping export described in this article.
The reports endpoints are built to support more than one report type so that additional types can be added in the future. (As more report types are added to the API, you select between the different report types using the same reportType parameter that you use with GET /v2/reports/channel/available.)
Overview
Generating and retrieving a report follows the same pattern every time:
- Request a new report. Call
POST /v2/reports/feed. ChannelEngine responds immediately with areportIdand then starts building the report in the background — depending on how many products the seller has, this can take a moment. - Poll the status. Call
GET /v2/reports/{reportId}/statususing thatreportId. The status moves fromIN_PROGRESSto eitherDONEorFAILED. - Retrieve the finished report. Once the status returns
DONE, callGET /v2/reports/{reportId}to get the report itself. - Reconcile against your own data. Compare the report contents against what you already have stored, and update anything that is missing or out of date.
GET /v2/reports/channel/available first. If a recent report already exists, you can use it directly instead of starting a new one.
Requirements
- Channel API key - the same key that you use for all other Channel API endpoints. Find it within a given channel plugin, at Setup, General, API key.
- An existing Channel API integration - the reports endpoints assume that you already have products and offers flowing through the Channel API. If you have not connected yet, see Channel API: getting started first.
Rate limits
Each of the four reports endpoints has its own rate limit of one request per minute. The limit applies per URL, individually — calling POST /v2/reports/feed does not count against your allowance for GET /v2/reports/{reportId}/status, and vice versa. Each endpoint gets its own separate one-per-minute allowance.
GET /v2/reports/{reportId}/status more than once a minute while waiting for a report to finish, later calls to that specific endpoint will be rate-limited, even though your calls to the other three endpoints are unaffected. Space out your status checks accordingly.
Available API endpoints
There are four reports endpoints in the Channel API:
-
Generate a report:
POST /v2/reports/feed
Starts generating a new product feed report and returns areportIdto track it. -
Check report status:
GET /v2/reports/{reportId}/status
Checks whether a report is still being built, finished, or failed. -
Retrieve a report:
GET /v2/reports/{reportId}
Retrieves the finished report by its ID. -
List available reports:
GET /v2/reports/channel/available
Lists the reports already generated for your channel, so you can reuse one instead of generating a new one.
Generate a report: POST /v2/reports/feed
- Endpoint:
POST https://{tenant}.channelengine.net/api/v2/reports/feed
Use this endpoint to start generating a new product feed report. The report contains a complete, real-time snapshot of every product the seller has, along with their offer mappings (the pricing and stock data tied to each product for your channel), exactly as they stand at the moment you make the request.
This endpoint does not take any parameters. When you call it, ChannelEngine starts processing the request in the background and responds straight away with a reportId — it does not wait for the report to finish before replying.
reportId with GET /v2/reports/{reportId}/status to check when it is actually done.
Making the request
Send a POST request with your Channel API key as a query parameter. No request body is needed:
POST https://{tenant}.channelengine.net/api/v2/reports/feedA practical example using cURL:
curl -X POST \ "https://demo.channelengine.net/api/v2/reports/feed?apikey=YOUR_API_KEY" \ -H "accept: application/json"
Response
A successful call returns HTTP 200 with the new report's ID and its starting status:
{
"Content": {
"ReportId": "PF_33fc53b6-86e1-462c-851e-30265a148007",
"ReportStatus": "IN_PROGRESS"
},
"IsSuccess": true,
"TraceId": null,
"Errors": [],
"Validations": []
}| Field | Description |
Content.ReportId |
The unique ID of the report you just requested. Save this — you'll need it for both the status check and the retrieval call. |
Content.ReportStatus |
The report's status at the moment of creation. Always IN_PROGRESS right after this call — ChannelEngine has not finished building the report yet. |
IsSuccess, TraceId, Errors, and Validations rather than the Success, RequestId, LogId, Message, and ValidationErrors fields used elsewhere in the Channel API. If you are parsing responses generically across endpoints, build in a check for which envelope shape you are dealing with.
Check report status: GET /v2/reports/{reportId}/status
- Endpoint:
GET https://{tenant}.channelengine.net/api/v2/reports/{reportId}/status
Use this endpoint to check how far along a report is. Poll it after calling POST /v2/reports/feed, until the report has finished.
| Parameter | Type | Required | Description |
reportId |
string | Required | The report ID returned by POST /v2/reports/feed. Passed as a path parameter. |
Making the request
curl -X GET \ "https://demo.channelengine.net/api/v2/reports/PF_33fc53b6-86e1-462c-851e-30265a148007/status?apikey=YOUR_API_KEY" \ -H "accept: application/json"
Report statuses
The Status field comes back as one of four values:
| Status | Meaning |
IN_PROGRESS |
The report is still being built. Wait and check again. |
DONE |
The report is ready. The response now also includes a ResourceUrl you can use to fetch it. |
FAILED |
Report generation failed. Request a new report with POST /v2/reports/feed. |
NOT_FOUND |
No report exists with the reportId you provided. Double-check the ID, or it may have expired. |
Response
While the report is still being built:
{
"Content": {
"Status": "IN_PROGRESS",
"ResourceUrl": null
},
"StatusCode": 200,
"RequestId": null,
"LogId": null,
"Success": true,
"Message": null,
"ExceptionType": null,
"ValidationErrors": {}
}Once Status switches to DONE, ResourceUrl is populated with a path you can use to retrieve the report:
{
"Content": {
"Status": "DONE",
"ResourceUrl": "/v2/reports/PF_33fc53b6-86e1-462c-851e-30265a148007"
},
"StatusCode": 200,
"Success": true
// remaining envelope fields omitted for brevity
}GET /v2/reports/{reportId}/status has its own limit of one request per minute (see Rate limits above), so check status no more than once every 60 seconds rather than in a tight loop.
Retrieve a report: GET /v2/reports/{reportId}
- Endpoint:
GET https://{tenant}.channelengine.net/api/v2/reports/{reportId}
Use this endpoint to retrieve the finished report once its status is DONE.
| Parameter | Type | Required | Description |
reportId |
string | Required | The report ID returned by POST /v2/reports/feed. Passed as a path parameter. |
Making the request
curl -X GET \ "https://demo.channelengine.net/api/v2/reports/PF_33fc53b6-86e1-462c-851e-30265a148007?apikey=YOUR_API_KEY" \ -H "accept: application/json"
DONE will not give you a usable result. Always check GET /v2/reports/{reportId}/status first, and only call this endpoint once the status confirms the report is ready.
List available reports: GET /v2/reports/channel/available
- Endpoint:
GET https://{tenant}.channelengine.net/api/v2/reports/channel/available
Use this endpoint to see which reports already exist for your channel, instead of generating a new one every time. This is useful if you want to reuse a recent report rather than triggering a fresh export.
| Parameter | Type | Required | Description |
reportType |
string | Required |
The type of report to look up. Currently the only available value is PRODUCT_FEED — see Introduction above for more on upcoming report types.
|
createdFrom |
string ($date-time) | Optional | Only return reports created on or after this date and time. |
createdTo |
string ($date-time) | Optional | Only return reports created on or before this date and time. |
Making the request
curl -X GET \ "https://demo.channelengine.net/api/v2/reports/channel/available?reportType=PRODUCT_FEED&apikey=YOUR_API_KEY" \ -H "accept: application/json"
Response
{
"Content": [
"23-13.csv",
"23-13.xml",
"23.csv",
"23.xml"
],
"Count": 4,
"TotalCount": 4,
"ItemsPerPage": 4,
"StatusCode": 200,
"RequestId": null,
"LogId": null,
"Success": true,
"Message": null,
"ExceptionType": null,
"ValidationErrors": {}
}Content array is a report identifier, not a downloadable file path. Use it the same way you'd use a reportId returned by POST /v2/reports/feed — pass it to GET /v2/reports/{reportId}/status or GET /v2/reports/{reportId} to check on or retrieve that report.
Common issues
| HTTP status/symptom | Likely cause | How to fix |
401 Unauthorized |
API key is missing, incorrect, or belongs to the Merchant API instead of the Channel API. | Check that your Channel API key is included correctly, either as the apikey query parameter or the X-CE-KEY header. |
NOT_FOUND status |
The reportId is incorrect, or the report has expired. |
Double-check the ID you saved from POST /v2/reports/feed. If it has expired, request a new report. |
FAILED status |
Something went wrong while ChannelEngine was building the report. | Request a new report with POST /v2/reports/feed. If it keeps failing, contact ChannelEngine Support. |
Empty result from GET /v2/reports/{reportId} |
The report's status is not DONE yet. |
Poll GET /v2/reports/{reportId}/status until the status confirms it is ready before retrieving it. |
Testing
Use the ChannelEngine demo environment to verify the full reports flow end-to-end before relying on it in production.
- Generate a report. Call
POST /v2/reports/feedwith your test Channel API key. Confirm the response returnsIsSuccess: truealong with aReportId. Note theReportId— you'll need it for the next two steps. - Poll until the report is done. Call
GET /v2/reports/{reportId}/statususing theReportIdfrom step 1. Repeat once every 60 seconds, in line with the rate limit, untilStatusreturnsDONE. IfStatusreturnsFAILEDinstead, go back to Step 1 and generate a new report. - Retrieve the finished report. Call
GET /v2/reports/{reportId}with the sameReportId. Confirm the response contains the product and offer mapping data you expect for your test seller. - Confirm the report shows up as available. Call
GET /v2/reports/channel/available?reportType=PRODUCT_FEEDand verify the report you just generated appears in theContentarray. Try narrowing the result withcreatedFromandcreatedToto confirm the date filters behave as expected. - Test an invalid reportId. Call
GET /v2/reports/{reportId}/statuswith a made-up or expiredreportId. Confirm the response returnsStatus: "NOT_FOUND"rather than an error. - Test retrieving a report too early. Immediately after generating a new report in Step 1, call
GET /v2/reports/{reportId}before its status reachesDONE. Confirm your integration handles this gracefully — for example, by always checking/statusfirst rather than assuming the report is ready right away.
Next steps
- GET /v2/products/data and GET /v2/products/offers are your primary, day-to-day sync endpoints. Reports are a backup, not a replacement for these.
- Schedule report generation for off-peak hours, at most once a night.
- Use
GET /v2/reports/channel/availablebefore generating a new report, in case a recent one already covers what you need.
Comments
0 comments
Article is closed for comments.