Search in documentation
ctrl+4K
Modules
Authentication
Merchant
Catalog
Order
Events
Logistics
Shipping
Review
Financial
Solutions

Errors and troubleshooting

HTTP error codes returned by the Catalog API, diagnosis of common issues, and best practices for resilient integrations.
The request is malformed. Check:
  • Required fields are filled.
  • Correct format of values (dates in ISO 8601, prices as numbers).
  • Referenced IDs exist in the system.
  • Request body is valid JSON.
The token expired or is invalid. Get a new accessToken and try again. See Authentication.You do not have permission for the operation. Common causes:
  • Resource exclusive to another vertical (e.g., wholesale pricing in restaurant account).
  • Module not contracted for your account.
  • Attempt to access data from another account.
The resource does not exist. Confirm that merchantId, catalogId, itemId, and other IDs are correct and that the resource was actually created.Duplicate resource or incompatible change. Examples:
  • externalCode already in use by another item.
  • Attempt to change an item's type to a value incompatible with the category.
The request exceeded the size limit. Occurs in:
  • Image upload above 5 MB.
  • Batch with many items.
Split into smaller requests.The data violates business rules. Check:
  • Item has price defined.
  • min of an add-on group is less than or equal to max.
  • The store has at most one PIZZA category.
  • Pizza categories have all mandatory groups (SIZE, CRUST, EDGE, TOPPING).
You exceeded the rate limit. Wait before retrying. Implement exponential backoff (see best practices).Error on iFood's server. Try again in a few minutes. If it persists, open a ticket with the batchId or call timestamp.
Check in this order:
  1. Item has status: AVAILABLE
  2. Category has status: AVAILABLE
  3. Item has price.value defined
  4. Each mandatory add-on group has at least one option with status AVAILABLE
  5. Availability by shift covers the current time
  6. Sales context is correct
Check the response from the item listing or catalog endpoint to confirm that the item was created and its attributes are correct.Batch endpoints run asynchronously. After calling the endpoint:
  1. Save the returned batchId
  2. Check GET /batch/{batchId} every 5–10 seconds
  3. Wait for status: COMPLETED
  4. Check result: SUCCESS for each item in results
If an item failed, confirm that productId or externalCode exists and that you have permission in that context.Pizzas require this structure:
  • Item with type: "PIZZA"
  • Omit categoryId (the API creates the category automatically)
  • Include the groups SIZE, CRUST, EDGE, and TOPPING
  • Each group needs at least one option with price defined
Example of a size option:
{
  "id": "size-id",
  "status": "AVAILABLE",
  "productId": "size-product-id",
  "fractions": [1, 2],
  "externalCode": "size_code"
}
See the complete guide at Pizza.The API reuses products with the same externalCode. If you don't want reuse, use unique codes. If reuse is intentional (e.g., sharing a product between two items), keep the same externalCode.Confirm:
  • catalogContext is a valid value (DEFAULT, WHITELABEL, INDOOR).
  • contextModifiers is an array inside the entity (item or option).
  • The context exists in the store's catalog.
  • Values in contextModifiers override root values only in the specified context.
Confirm:
  • Format jpg, jpeg, or png.
  • Size less than 5 MB.
  • imagePath was filled with the upload endpoint's return.
  • The upload returned 200 OK.
Before activating the integration:
  • Use the provided test merchant.
  • Test each flow (create, update, pause, delete).
  • Validate with GET /catalogs/{catalogId}/categories?include_items=true to confirm that items and add-ons were created correctly.
Include a unique externalCode in each item and add-on. You can:
  • Update resources using your own ID
  • Track changes originating in your system
  • Do bidirectional synchronization without depending on iFood IDs
For operations subject to transient failures (5xx, 429, timeouts):
AttemptWait
1Immediate
21 s
32 s
44 s
Do not retry on 4xx (except 429) — the problem is in the payload, not the server.Do not assume a batch finished by immediate return:
  1. Save the batchId
  2. Check GET /batch/{batchId} until status: COMPLETED
  3. Record individual failures in results
{
  "batchId": "batch-123",
  "status": "COMPLETED",
  "results": [
    { "resourceId": "item-1", "result": "SUCCESS" },
    { "resourceId": "item-2", "result": "FAILURE" }
  ]
}
Create the item once and adjust price, status, and code per context. Duplicating items per channel makes maintenance difficult and causes divergences.Store for each operation:
  • Timestamp
  • Endpoint and method
  • Payload sent
  • Response received (including batchId)
These logs are essential for debugging and opening support tickets.
If the problem persists, open a ticket at Developer Portal Support with:
  • Affected merchantId.
  • Endpoint and method called.
  • IDs of involved resources.
  • Complete error response.
  • Call timestamp.
Was this page helpful?
Rate your experience in the new Developer portal: