Feeef Cloud

Conventions

The error envelope, headers, pagination, and rate limits every endpoint on the platform shares.

Geo, Parcels and Inventory use the conventions below. AI preserves OpenAI-compatible JSON, SSE and binary responses and uses an OpenAI error envelope; see AI errors.

Errors

Commerce API errors use this envelope:

{
  "error": {
    "code": "carrier_unsupported",
    "message": "zrexpress does not support editing submitted parcels",
    "details": { "carrier": "zrexpress", "operation": "edit" }
  }
}
HTTPcodemeaning
400validation_failedbody/query invalid; details.fields[] per field
400validation_failed + details.reasonParcel carrier rejects — clients localize by reason (see below)
401invalid_api_key / invalid_tokenunknown, revoked, or expired credential
403insufficient_scopecredential lacks the required scope (WWW-Authenticate set)
403product_not_enabledproject has not enabled the product
404not_found / not_coveredresource missing / point outside covered geography
409idempotency_conflictsame Idempotency-Key, different payload
422batch_too_large / unresolvable_geosemantic failures
422insufficient_stock / unbalanced_operation / reserved_stock_conflictInventory quantity guards
422batch_cost_conflict / operation_not_reversible / key_not_foundInventory cost, reversal, and missing-key guards
429rate_limitedper-key rate exceeded; Retry-After set
429quota_exceededdaily product quota exhausted; details.resetAt set
501carrier_unsupportedoperation not supported by this carrier
502carrier_errorupstream carrier failed; details.carrierMessage set
500internala bug — include X-Request-Id when reporting it

Parcel ship details.reason (stable)

When POST /parcels (submit: true) or send fails at the carrier, the envelope keeps a machine-readable reason so UIs do not parse Ecotrack French prose:

details.reasonmeaningtypical code
cod_amount_rejectedcourier rejected COD / montant (often 0)validation_failed
destination_not_covereddestination / commune / wilaya rejectvalidation_failed
carrier_auth_failedbad or revoked courier tokeninvalid_api_key
carrier_validation_failedother field validation from the couriervalidation_failed
carrier_unavailabletimeout / 5xx / empty trackingcarrier_error

details.carrierMessage holds the raw upstream text when available. details.fields[] points at the fixable path (codAmount, destination.city, …).

Headers

  • X-Request-Id — on every response, echo it back when reporting a 500.
  • X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset — returned by metered commerce endpoints; early rejections may omit them. AI publishes its applicable limit and remaining count.
  • Idempotency-Key: <caller-generated, ≤64 chars> — honored on POST /parcels, POST /parcels/batch, POST /inventory/operations, and POST /inventory/reservations for 24 hours. Replaying the same key with a different body is a 409 idempotency_conflict, not a silent overwrite.

Pagination

Paginated resource lists use cursors; some catalog lists return a complete array. Check the endpoint schema:

GET /parcels?limit=50&cursor=eyJpZCI6InBjbF84WHcifQ

For the parcel list, limit defaults to 50 and caps at 200. Its response carries meta.nextCursor, which is null once you've reached the end.

Localization

Catalog resources always include the full locales map (ar/fr/en). ?lang= additionally sets displayName for the requested language — the resource ID remains stable, but the response display name changes. Cache localized responses by language and query. Conditional ETag/304 handling is not currently implemented.

Attribution

Any response carrying OSM-derived fields includes meta.attribution: "© OpenStreetMap contributors (ODbL)". Where you display that data, the license requires you to show it too.

Rate limits and quotas

Launch defaults — catalog-configurable per project, shown live in the API catalog:

ProductRate (per key)Daily quota (per project)Notes
Geo catalog / search / nearby / reverse20 rps, burst 6050,000Successful reads count toward quota
Geo resolve10 rps10,000 rowsbatch rows count individually
Parcels reads40 rps, burst 80200,000
Parcels writes20 rps, burst 4050,000 parcelsbatch items count individually
Labels20 rps, burst 4050,000bulk PDF counts per parcel
Inventory reads20 rps50,000objects, availability, movements
Inventory writes8 rps20,000operations, rules
Inventory reserve15 rps50,000hold, consume, release

| AI reads | 20 rps, burst 40 | 50,000 | Model, task and video reads | | AI generation | 10 rps, burst 20 | 10,000 | Paid submissions; project/tenant policy can tighten these |

Daily quotas use Africa/Algiers. Monthly spend uses UTC. Honor Retry-After; limits can change with project policy. AI controls explain layered admission.

On this page