Integration readiness teardown

fulfilment-api.json

Sealed report
22aca6e881d8
Profile
default v1
Engine
0.1.0
Coverage
complete
Read
968 fragments

At a glance

127
findings
16
causes (one piece of work each)
87
points taken off
2
critical or high findings
CriticalHighMediumLow
0210223

Rules: 13 found a gap, 8 found none, 14 not applicable, 4 could not be assessed, 2 switched off, 0 failed. The weakest family is contract. 364 points were not taken because a rule reached its cap.

Fix first

Clearing these 5 causes takes back 69 points of 87 points (79.3%).

#SeverityRuleCausePlacesPointsRunning total
1mediumCC-ERR-01no error response documented531515
2mediumCC-PARAM-01required parameter without description421530
3mediumPAG-01no pagination51545
4highCC-SCHEMA-01no schema for application/json21560
5lowCC-DESC-02weak description: restates its name9969

Families

FamilySub-scoreFindingsCausesPointsShareRules: applied · clean · not assessedWorst rules (findings)
contract34116106675.9%13 · 6 · 1CC-ERR-01 (53), CC-PARAM-01 (43), CC-SCHEMA-01 (2), CC-DESC-02 (11), CC-RESP-01 (4)
pagination85511517.2%1 · 0 · 0PAG-01 (5)
onboarding982122.3%2 · 1 · 1AUTH-02 (2)
data991111.1%1 · 0 · 0DATA-02 (1)
examples991111.1%2 · 1 · 0CC-EX-01 (1)
limits991111.1%1 · 0 · 0RATE-01 (1)
reliability991111.1%1 · 0 · 0IDEM-01 (1)

No rule applied, so nothing was assessed for: documentation, errors, lifecycle, links, webhooks, workflow. That is not a clean result.

Hotspots

53 operations with findings. 8 findings are about the document as a whole (11 points).

Operations

OperationPointsFindingsCrit.HighMed.LowFamiliesRules
GET /api/fulfilment-capacity/resources/carrier@{capacityType}@{shippingPolicyId}/time-frames/{windowDay}F{windowStartTime}T{windowEndTime}1020110contractCC-ERR-01, CC-SCHEMA-01
GET /api/fulfilment/v1/configuration/warehouses820020contract, paginationCC-ERR-01, PAG-01
GET /api/fulfilment/v1/configuration/warehouses/{warehouseId}820020contractCC-ERR-01, CC-PARAM-01
GET /api/fulfilment/v1/configuration/freights/{carrierId}/{postalCode}/values640022contract, paginationCC-DESC-02, CC-ERR-01, PAG-01
GET /api/fulfilment-capacity/resources/carrier@{capacityType}@{shippingPolicyId}/time-frames520110contractCC-ERR-01, CC-SCHEMA-01
GET /api/fulfilment/v1/configuration/pickuppoints/{pickupPointId}430021contractCC-ERR-01, CC-PARAM-01, CC-RESP-01
POST /api/fulfilment/v1/configuration/docks/{dockId}/activation430021contractCC-DESC-02, CC-ERR-01, CC-PARAM-01
DELETE /api/fulfilment/v1/configuration/holidays/{holidayId}420020contractCC-ERR-01, CC-PARAM-01
DELETE /api/fulfilment/v1/configuration/pickuppoints/{pickupPointId}420020contractCC-ERR-01, CC-PARAM-01
GET /api/fulfilment/v1/configuration/docks420020contract, paginationCC-ERR-01, PAG-01
POST /api/fulfilment/v1/inventory/items/{skuId}/warehouses/{warehouseId}/supplyLots/{supplyLotId}/transfer410010contractCC-ERR-01
GET /api/fulfilment/v1/inventory/items/{itemId}/warehouses/{warehouseId}/dispatched340040contract, paginationCC-ERR-01, CC-PARAM-01, PAG-01
PUT /api/fulfilment/v1/inventory/skus/{skuId}/warehouses/{warehouseId}140031contractCC-DESC-02, CC-ERR-01, CC-PARAM-01
GET /api/fulfilment/v1/inventory/skus/{skuId}130021contractCC-ERR-01, CC-PARAM-01, CC-RESP-01
POST /api/fulfilment/v1/configuration/docks/{dockId}/deactivation130021contractCC-DESC-02, CC-ERR-01, CC-PARAM-01

Resources

ResourcePointsFindingsCrit.HighMed.LowFamiliesRules
/api (53 operations)761190210116contract, examples, paginationCC-DESC-02, CC-ERR-01, CC-EX-01, CC-PARAM-01, CC-RESP-01, CC-SCHEMA-01, PAG-01

What this report cannot say

SourceProvidesCoverageReadNot readFailed
fulfilment-api.jsonan API descriptioncomplete100

Causes in detail

medium CC-ERR-01 no error response documented

contract · 53 places · 15 points taken, 197 points withheld by the rule's cap

Impact. Developers cannot tell which failures to expect or how to handle them, so error paths are discovered in production.

Recommendation. Document the error responses (4xx and 5xx or a default) with their bodies and when each occurs.

Where. GET /api/fulfilment/v1/configuration/warehouses/{warehouseId}, GET /api/fulfilment/v1/configuration/warehouses, POST /api/fulfilment/v1/inventory/items/{skuId}/warehouses/{warehouseId}/supplyLots/{supplyLotId}/transfer, POST /api/fulfilment/v1/configuration/docks/{dockId}/activation, DELETE /api/fulfilment/v1/configuration/warehouses/{warehouseId}, GET /api/fulfilment/v1/inventory/skus/{skuId}, GET /api/fulfilment/v1/configuration/geoshape, POST /api/fulfilment/v1/inventory/reservations/{reservationId}/confirm and 45 more

Evidence, first place. not found: an error response (4xx, 5xx or default); inspected fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1configuration~1warehouses~1{warehouseId}/get, fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1configuration~1warehouses~1{warehouseId}/get/responses/200

medium CC-PARAM-01 required parameter without description

contract · 42 places · 15 points taken, 153 points withheld by the rule's cap

Impact. Developers must guess the meaning, format and valid values of a parameter they are required to send.

Recommendation. Describe what the parameter means, its format and valid values.

Where. GET /api/fulfilment/v1/configuration/warehouses/{warehouseId}, DELETE /api/fulfilment/v1/configuration/pickuppoints/{pickupPointId}, DELETE /api/fulfilment/v1/configuration/holidays/{holidayId}, GET /api/fulfilment/v1/configuration/pickuppoints/{pickupPointId}, GET /api/fulfilment/v1/configuration/pickuppoints/_search, GET /api/fulfilment/v1/inventory/items/{skuId}/docks/{dockId}/warehouses/{warehouseId}, GET /api/fulfilment/v1/inventory/items/{skuId}/docks/{dockId}, GET /api/fulfilment/v1/inventory/items/{skuId}/warehouses/{warehouseId} and 24 more

Evidence, first place. not found: description; inspected fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1configuration~1warehouses~1{warehouseId}/get/parameters/2

medium PAG-01 no pagination

pagination · 5 places · 15 points taken, 5 points withheld by the rule's cap

Impact. Clients cannot retrieve more than the first batch reliably, or must guess how paging works.

Recommendation. Document a pagination mechanism (cursor or page parameters and the field or header carrying the next position).

Where. GET /api/fulfilment/v1/configuration/warehouses, GET /api/fulfilment/v1/configuration/docks, GET /api/fulfilment/v1/configuration/freights/{carrierId}/{postalCode}/values, GET /api/fulfilment/v1/inventory/items/{itemId}/warehouses/{warehouseId}/dispatched, GET /api/fulfilment/v1/configuration/pickuppoints

Evidence, first place. not found: pagination parameters, next-page field or Link header; inspected fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1configuration~1warehouses/get, fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1configuration~1warehouses/get/responses/200

high CC-SCHEMA-01 no schema for application/json

contract · 2 places · 15 points taken, 5 points withheld by the rule's cap

Impact. Developers cannot know the fields, types or required properties, and generated clients fall back to untyped data.

Recommendation. Add a schema to each structured media type, or remove the media type if no body is exchanged.

Where. GET /api/fulfilment-capacity/resources/carrier@{capacityType}@{shippingPolicyId}/time-frames/{windowDay}F{windowStartTime}T{windowEndTime}, GET /api/fulfilment-capacity/resources/carrier@{capacityType}@{shippingPolicyId}/time-frames

Evidence, first place. not found: a schema for application/json; inspected fulfilment-api.json#/paths/~1api~1fulfilment-capacity~1resources~1carrier@{capacityType}@{shippingPolicyId}~1time-frames~1{windowDay}F{windowStartTime}T{windowEndTime}/get/responses/200

low CC-DESC-02 weak description: restates its name

contract · 9 places · 9 points taken

Impact. A description that says nothing beyond the name gives a developer no more than the name already did.

Recommendation. Say what it does, what it returns or accepts, and anything the name does not show.

Where. POST /api/fulfilment/v1/inventory/reservations/{reservationId}/confirm, POST /api/fulfilment/v1/configuration/warehouses/{warehouseId}/activation, PUT /api/fulfilment/v1/configuration/holidays/{holidayId}, POST /api/fulfilment/v1/configuration/warehouses/{warehouseId}/deactivation, POST /api/fulfilment/v1/inventory/reservations/{reservationId}/acknowledge, POST /api/fulfilment/v1/inventory/reservations/{reservationId}/cancel, POST /api/fulfilment/v1/configuration/docks/{dockId}/deactivation, PUT /api/fulfilment/v1/inventory/skus/{skuId}/warehouses/{warehouseId} and 1 more

Evidence, first place. "Confirms reservation by reservation ID." at fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1inventory~1reservations~1{reservationId}~1confirm/post

low CC-RESP-01 response without description

contract · 4 places · 4 points taken

Impact. Developers do not learn what the response means or when it occurs.

Recommendation. Describe when this response is returned and what it contains.

Where. PUT /api/fulfilment/v1/configuration/pickuppoints/{pickupPointId}, GET /api/fulfilment/v1/inventory/skus/{skuId}, GET /api/fulfilment/v1/configuration/pickuppoints/{pickupPointId}, POST /api/fulfilment/v1/shipping/calculate

Evidence, first place. not found: description; inspected fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1configuration~1pickuppoints~1{pickupPointId}/put/responses/200

medium CC-CONSIST-01 conflicting types for freight-values.absolutemoneycost

contract · 1 place · 4 points taken

Impact. A client that models the property once breaks on the other schema, and readers cannot tell which type is meant.

Recommendation. Use one type for a property name across schemas, or rename one of them to say it is a different thing.

Where. Property `absoluteMoneyCost` has different types across variants of `freight-values`: number in `ListFreightValues`, string in `CreateUpdateFreightValuesRequest`

Evidence. "absoluteMoneyCost" at fulfilment-api.json#/components/schemas/ListFreightValues/properties

Evidence. "absoluteMoneyCost" at fulfilment-api.json#/components/schemas/CreateUpdateFreightValuesRequest/properties

low AUTH-02 security scheme without description

onboarding · 2 places · 2 points taken

Impact. Developers are not told how to obtain or send credentials for this scheme.

Recommendation. Describe how to obtain credentials and how to send them.

Where. Security scheme `appToken` has no description, Security scheme `appKey` has no description

Evidence, first place. not found: description; inspected fulfilment-api.json#/components/securitySchemes/appToken

low CC-DESC-02 weak description: too short

contract · 2 places · 2 points taken

Impact. A description that says nothing beyond the name gives a developer no more than the name already did.

Recommendation. Say what it does, what it returns or accepts, and anything the name does not show.

Where. GET /api/fulfilment/v1/configuration/freights/{carrierId}/{postalCode}/values

Evidence, first place. "Postal code." at fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1configuration~1freights~1{carrierId}~1{postalCode}~1values/get/parameters/3

low CC-EX-01 no request or response example

examples · 1 place · 1 point taken

Impact. Developers have to infer payload shape from the schema alone, which slows a first successful call.

Recommendation. Add a realistic example for the request body and the success response.

Where. PUT /api/fulfilment/v1/configuration/geoshape

Evidence. not found: an example request or response body; inspected fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1configuration~1geoshape/put, fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1configuration~1geoshape/put/responses/200

low DATA-02 unformatted date/time properties

data · 1 place · 1 point taken

Impact. Clients cannot tell whether values are ISO 8601, epoch text or local time, so parsing and timezone handling are guesses.

Recommendation. Set `format: date-time` or `date`, or describe the format and timezone (for example ISO 8601 in UTC).

Where. 25 date/time-named string properties declare no format or timezone

Evidence. "closingTime" at fulfilment-api.json#/components/schemas/BusinessHour/properties

Evidence. "openingTime" at fulfilment-api.json#/components/schemas/BusinessHour/properties

Evidence. "startDate" at fulfilment-api.json#/components/schemas/CreateUpdateHolidayRequest/properties

Evidence. "dockTime" at fulfilment-api.json#/components/schemas/DeliveryItemOption/properties

Evidence. "timeToDockPlusDockTime" at fulfilment-api.json#/components/schemas/DeliveryItemOption/properties

Evidence. "totalTime" at fulfilment-api.json#/components/schemas/DeliveryItemOption/properties

Evidence. "transitTime" at fulfilment-api.json#/components/schemas/DeliveryItemOption/properties

Evidence. "endTime" at fulfilment-api.json#/components/schemas/DeliveryRange/properties

Evidence. "startTime" at fulfilment-api.json#/components/schemas/DeliveryRange/properties

Evidence. "endTime" at fulfilment-api.json#/components/schemas/DeliveryRange1/properties

low IDEM-01 no idempotency

reliability · 1 place · 1 point taken

Impact. A retry after a timeout can create the resource twice, so clients cannot retry safely.

Recommendation. Accept an Idempotency-Key header on creating operations and document how long keys are remembered.

Where. None of the 4 resource-creating POST operations documents an idempotency key

Evidence. not found: an Idempotency-Key header parameter; inspected fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1configuration~1docks/post, fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1configuration~1warehouses/post, fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1inventory~1reservations/post and 1 more

low NAME-01 verbs in some paths

contract · 1 place · 1 point taken

Impact. Action verbs in some resource paths duplicate what the HTTP method already says and break the pattern of the other paths.

Recommendation. Name paths after resources and express the action with the HTTP method.

Where. 1 of 40 paths put an action verb in the path while the rest do not

Evidence. "/api/fulfilment/v1/configuration/freights/{carrierId}/values/update" at fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1configuration~1freights~1{carrierId}~1values~1update/post

low NAME-01 inconsistent casing: kebab-case,snake_case,camelcase

contract · 1 place · 1 point taken

Impact. Inconsistent naming makes the API harder to learn and guess; developers cannot predict names from the ones they have seen.

Recommendation. Choose one naming convention and apply it everywhere; keep old names only as documented deprecated aliases.

Where. paths mix kebab-case, snake_case, camelCase with no dominant convention

Evidence. "/api/fulfilment-capacity/resources/carrier@{capacityType}@{shippingPolicyId}/time-frames" at fulfilment-api.json#/paths/~1api~1fulfilment-capacity~1resources~1carrier@{capacityType}@{shippingPolicyId}~1time-frames/get

Evidence. "/api/fulfilment/v1/configuration/pickuppoints/_search" at fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1configuration~1pickuppoints~1_search/get

Evidence. "/api/fulfilment/v1/inventory/items/{skuId}/warehouses/{warehouseId}/supplyLots" at fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1inventory~1items~1{skuId}~1warehouses~1{warehouseId}~1supplyLots/get

Evidence. "/api/fulfilment-capacity/resources/carrier@{capacityType}@{shippingPolicyId}/time-frames/{windowDay}F{windowStartTime}T{windowEndTime}" at fulfilment-api.json#/paths/~1api~1fulfilment-capacity~1resources~1carrier@{capacityType}@{shippingPolicyId}~1time-frames~1{windowDay}F{windowStartTime}T{windowEndTime}/get

Evidence. "/api/fulfilment/v1/inventory/items/{skuId}/warehouses/{warehouseId}/supplyLots/{supplyLotId}" at fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1inventory~1items~1{skuId}~1warehouses~1{warehouseId}~1supplyLots~1{supplyLotId}/put

Evidence. "/api/fulfilment/v1/inventory/items/{skuId}/warehouses/{warehouseId}/supplyLots/{supplyLotId}/transfer" at fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1inventory~1items~1{skuId}~1warehouses~1{warehouseId}~1supplyLots~1{supplyLotId}~1transfer/post

Evidence. "/api/fulfilment/v1/shipping-policies" at fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1shipping-policies/get

Evidence. "/api/fulfilment/v1/shipping-policies/{id}" at fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1shipping-policies~1{id}/get

low RATE-01 no rate limit documentation

limits · 1 place · 1 point taken

Impact. Integrators cannot size their clients or plan back-off, and learn the limits from production errors.

Recommendation. Document the limits, a 429 response and the headers that report remaining quota and when to retry.

Where. No rate limiting is documented

Evidence. not found: a 429 response, rate-limit headers, or a description of rate limits; inspected fulfilment-api.json#, fulfilment-api.json#/paths/~1api~1fulfilment-capacity~1resources~1carrier@{capacityType}@{shippingPolicyId}~1time-frames/get, fulfilment-api.json#/paths/~1api~1fulfilment-capacity~1resources~1carrier@{capacityType}@{shippingPolicyId}~1time-frames~1{windowDay}F{windowStartTime}T{windowEndTime}/get and 3 more

medium CC-PARAM-01 required request property without description

contract · 1 place · 0 points taken, 4 points withheld by the rule's cap

Impact. Developers must guess the meaning, format and valid values of a field they are required to send.

Recommendation. Describe what the property means, its format and valid values.

Where. POST /api/fulfilment/v1/shipping-policies

Evidence. not found: description; inspected fulfilment-api.json#/paths/~1api~1fulfilment~1v1~1shipping-policies/post/requestBody/content/application~1json/schema/properties/cubicWeightSettings/properties/minimunAcceptableVolumetricWeight

Every rule

RuleFamilyVersionResultFindings
CC-REF-01contract1not applicable0
CC-DESC-01contract1no gap found0
CC-PARAM-01contract1gap found43
CC-RESP-01contract1gap found4
CC-ERR-01contract1gap found53
CC-EX-01examples1gap found1
CC-EX-02examples1no gap found0
ERR-05errors1not applicable0
CC-CONFLICT-01contract1could not be assessed (needs guide pages; none was supplied)0
CC-PATH-01contract1no gap found0
CC-SCHEMA-01contract1gap found2
CC-TYPE-01contract1no gap found0
CC-CONSIST-01contract1gap found1
RATE-02limits1not applicable0
WH-01webhooks1not applicable0
WH-02webhooks1not applicable0
WH-03webhooks1not applicable0
AUTH-03onboarding1not applicable0
IDEM-02reliability1not applicable0
ERR-04errors1not applicable0
WF-04workflow1not applicable0
DATA-02data1gap found1
DATA-03data1not applicable0
CC-ENV-01contract1no gap found0
AUTH-04onboarding1not applicable0
AUTH-01onboarding1no gap found0
AUTH-02onboarding1gap found2
CC-SEC-01contract1no gap found0
NAME-01contract1gap found2
PAG-01pagination1gap found5
PAG-02pagination1switched off0
RATE-01limits1gap found1
ERR-02errors1not applicable0
IDEM-01reliability1gap found1
CC-DEP-01lifecycle1not applicable0
CC-DESC-02contract1gap found11
CC-DESC-03contract1switched off0
CC-DESC-04contract1no gap found0
LINK-01links1could not be assessed (needs guide pages; none was supplied)0
ON-ENV-01onboarding1could not be assessed (needs guide pages; none was supplied)0
DOC-CODE-01documentation1could not be assessed (needs guide pages; none was supplied)0

Method