2026-10-09
- Breaking: activity dates must fall between 1970 and next year (until now any year was stored, e.g.
0100-01-01or2064-03-01, and calculated for that year). A date outside the range answers422: Create Wastes (v2) rejects the batch withSCHEMA_INVALID; the v1 creates and updates of wastes, purchases, shipments (transport_date), vehicle consumptions, invoices, business travels, hotel stays and employee periods answer a validation error on the date (type: activity_date_out_of_range); logistics requests (shipment_date) and recharges (date) answerACTIVITY_DATE_OUT_OF_RANGE, and their bulk endpoints report it per record. Create Waste and the invoice create and replace also requireend_dateon or afterstart_date, and Update Waste checks it against the stored date when only one of the two is sent (type: end_date_before_start_date). On the invoice replace, the shipment update and Update Waste only a date you change is checked: resending a stored date unchanged (e.g. a 1969 record) is still accepted. On the other updates (purchases, vehicle consumptions, business travels, hotel stays, employee periods, logistics, legacy transport routes) every date you send is checked: saving a record whose stored date is outside the range requires correcting that date. Files uploaded for these categories report such a row as an error. Records you already stored are not changed. - Changed: logistics requests created through the API (v1 and v2, single and bulk:
Create, Create in bulk)
and the legacy
POST /api/v1/logistics/shipmentcalculator, sent withload_unitteuorfeu, now count 10,000 kg per TEU and 20,000 kg per FEU (until now 20,000 and 40,000), the GLEC Framework / ISO 14083 default for a loaded container and the value file uploads already used. Requests stored before this date are not recalculated. - New:
POST /v2/facilitiescreates up to 1,000 facilities in one request and answers201with them, in the order sent. All or nothing, idempotent (Idempotency-Key, withIdempotent-Replayed: trueon a retry),dry_run.countryis required andaddressis never geocoded. - New:
POST /v2/facilities/deletedeletes up to 1,000 facilities with their invoices, wastes and waste water treatments, as an ingest job (entity_type: facilities,operation: delete). - Deprecated:
POST /v1/facilitiesandDELETE /v1/facilities/{facility_id}, superseded by the two above. They keep working and answer withDeprecationandLink: rel="successor-version"headers. No removal date yet. - Changed:
/v2/facilitieserrors are problem details, like the rest of v2. - Changed: a purchase’s
purchase_type(Create, Update, Get, List) follows the emission factor that prices it, and gains a third value,average_data:spend_basedfor EXIOBASE,average_datafor a physical-unit database (e.g. ecoinvent),supplier_specificfor a custom factor. The value you send is replaced by the one its factor implies, except on purchases priced with acustom_emission_factor_id: until now a purchase sent assupplier_specificwithout a custom factor came backsupplier_specific; it now comes back with its factor’s type (spend_basedby default). Acceptaverage_datawherever you read or filter bypurchase_type. - New:
GET /v1/logistics/requests/unique-valuessupportsfield=vehicle_type: the TOC names (<vehicle>_<type>) your active shipments use, with counts, exactly as thevehicle_type[]filter of List Logistics Requests takes them. The newproject_idparameter narrows them to the shipments linked to a project.
2026-10-08
- Changed: shipments (Create, Update)
accept a
quantity_transportedof up to 999,999,999.99999 (9 integer digits, 5 decimal places; until now 9,999,999.999) and a sectionkms_manualwith up to 6 decimal places (until now 2). Bulk uploads keep 5 weight decimals and 6 km decimals instead of rounding them to 3 and 2. - New:
GET /v2/imports/{import_id}/statusreturnssheets, every sheet name of the uploaded workbook, and Create Import Session returns them too when it resumes an existing session for the same file (until nowsheetscame empty there). Sessions created before this date return[].
2026-10-07
- Breaking (BETA):
unit_idis required on every record ofPOST /v2/wastesand must be kilograms (61743a63-ff70-459c-9567-5eee8f7dfd5c), the unit the app’s waste form uses. A waste priced with acustom_ef_record_idmay also be in that record’s unit. A record without a unit (SCHEMA_INVALID) or with another one (new codeUNIT_NOT_SUPPORTED) is rejected with the batch (422 BULK_RECORDS_REJECTED). Until now tonnes, grams and pounds were accepted and calculated: convert them to kilograms. Volume, energy, distance or currency units were stored and then failed asCALCULATION_FAILED. - Changed (BETA):
ingest_job.finishedis sent only for jobs submitted with an API key. A job a person starts while signed in to Dcycle (e.g. the app’s waste form) notifies that person in the app instead, and itssourceis the new valueapp; jobs sent with an API key keepapi_bulk. - New: every webhook delivery records why its last attempt failed (
last_error_code) and the start of what your server answered (last_response_body, up to 2 KB): see Debugging a failed delivery. - Fixed: timestamps of webhook endpoints and deliveries end with
Z(UTC), like the rest of v2; they came without it. - Fixed: the app-wide rate limit answers
429on the v2 resources as problem details (TOO_MANY_REQUESTS), not as{"detail": "Rate limit exceeded"}. - Changed: stationary combustion items of file readings carry
printed_fuel_name, the fuel product as printed, kept by Update Reading when omitted. When the fuel read contradicts it (e.g.TECNODIESEL E+10, a diesel, read as petrole10), the item’sstationary_fuel_idisnulland the fuel must be chosen before the record calculates. - Changed: organizations below a project’s organization see its dashboard in
GET /v2/dashboardandGET /v2/dashboard/{id}when they were invited to it, organization by organization, and only with the widgets of the views they may see. Projects that still use the old “share with child organizations” setting keep sharing with every organization below until that setting is saved again in the app. - Fixed (docs): the error-handling examples of Create Wastes (v2) read the
rejected records from
errors. Until now they readdetail.records, which moved on 2026-10-05: if you copied them, update your code. - Fixed: the OpenAPI document declares every error as problem details
(
application/problem+json, schemaProblem) instead of FastAPI’s default validation body, and its descriptions are written for integrators. Regenerate your client so it parses errors correctly. - Docs: Create Wastes (v2) lists where to find every id
(facility, unit, LER and R/D codes), and the ingest job pages say what to do when a job stops making progress.
The job status
failedand the item statusskippedare reserved: no job or item ends in them today.
2026-10-06
- New:
POST /v1/hotel-stays/bulk-delete-by-filtersdeletes every hotel stay matching the list’s filters in one request, guarded by the list’sfilter_hash.select_all_matching_enabledonGET /v1/hotel-staysis now alwaystrue. - New:
source[]anduploaded_by[]filters onGET /v1/hotel-staysandbulk-delete-by-filters.
2026-10-05
- Changed: the pending mobility survey export leaves out people who were most likely never asked about the period (ex-employees who left before it, and people uploaded afterwards in a list answered for other periods only), and a period longer than a year gets a sheet per year, counted from the period’s start.
- Deprecated:
POST /v1/wastes, superseded byPOST /v2/wastes. It keeps working and now answers withDeprecationandLink: </v2/wastes>; rel="successor-version"headers. No removal date yet; it will be announced here with notice. - Deprecated:
POST /v1/waste/bulk-delete, superseded byPOST /v2/wastes/delete(asynchronous, idempotent). Same headers, no removal date yet. - New: Errors in v2 follow RFC 9457 problem details (
application/problem+json) for/v2/wastes,/v2/ingest-jobsand/v2/webhook-endpoints. Breaking for those BETA endpoints: rejected records moved fromdetail.recordstoerrors, and validation errors fromdetailtoerrors. - New: v2 timestamps are UTC with
Z(2026-10-05T09:35:07.921Z). - New:
GET /v2/ingest-jobslists your jobs;POST /v2/wastes?dry_run=truevalidates without writing. - Fixed:
X-RateLimit-Limitnow reports the bucket capacity, soX-RateLimit-Remainingnever exceeds it; the IETFRateLimitandRateLimit-Policyheaders are added (Rate limits). - New: OpenAPI document of the v2 API, for SDKs and Postman.
- New:
POST /v2/wastes/delete: asynchronous bulk delete as an ingest job. - New: Retry Webhook Delivery, and
api_versionin every event.
2026-10-01
- New: Webhooks: signed
ingest_job.finishedevents with retries. - Breaking (BETA):
Idempotency-Keyis required onPOST /v2/wastes; the same key with a different body is422 IDEMPOTENCY_KEY_REUSED.
2026-09-29
- New:
POST /v2/wastes(BETA): up to 5,000 wastes per request, validated as a whole, calculated asynchronously as an ingest job.