Kardinal Resource API

How to create, retrieve, update and delete resources in a plan.

Operations 6

GET /agencies/{agencyId}/plans/{planId}/resources/{resourceId} Retrieve a plan's resource #
PUT /agencies/{agencyId}/plans/{planId}/resources/{resourceId} Create or update a plan's resource #
DELETE /agencies/{agencyId}/plans/{planId}/resources/{resourceId} Delete a plan's resource #
GET /agencies/{agencyId}/plans/{planId}/resources/{resourceId}/state Retrieve a plan's resource state #
PUT /agencies/{agencyId}/plans/{planId}/resources/{resourceId}/state Update a plan's resource state #
PUT /agencies/{agencyId}/plans/{planId}/resources/{resourceId}/forbid/{stopId} Forbid a resource from doing a stop, and return the updated plan #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/kardinal-resource-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

kardinal-resource-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Kardinal ARO Resource API
  version: 2.55.0
  description: This document specifies the REST API of Kardinal ARO v2.
  contact:
    url: https://kardinal.ai/
    email: contact@kardinal.ai
servers:
- url: /api/v2
security:
- access_token: []
tags:
- name: Resource
  description: How to create, retrieve, update and delete resources in a plan.
paths:
  /agencies/{agencyId}/plans/{planId}/resources/{resourceId}:
    parameters:
    - $ref: '#/components/parameters/agencyId'
    - $ref: '#/components/parameters/planId'
    - $ref: '#/components/parameters/resourceId'
    get:
      summary: Retrieve a plan's resource
      operationId: getPlanResource
      tags:
      - Resource
      responses:
        '200':
          description: Resource response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnvelopedResource'
        '401':
          $ref: '#/components/responses/NotAuthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
    put:
      summary: Create or update a plan's resource
      operationId: putPlanResource
      tags:
      - Resource
      parameters:
      - $ref: '#/components/parameters/force'
      requestBody:
        description: The Resource to update.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Resource'
      responses:
        '200':
          description: Resource response updated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnvelopedResource'
        '201':
          description: Resource response created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnvelopedResource'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/NotAuthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
    delete:
      summary: Delete a plan's resource
      operationId: deletePlanResource
      tags:
      - Resource
      parameters:
      - $ref: '#/components/parameters/force'
      responses:
        '204':
          description: Resource is deleted and No content is returned.
        '401':
          $ref: '#/components/responses/NotAuthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /agencies/{agencyId}/plans/{planId}/resources/{resourceId}/state:
    parameters:
    - $ref: '#/components/parameters/agencyId'
    - $ref: '#/components/parameters/planId'
    - $ref: '#/components/parameters/resourceId'
    get:
      summary: Retrieve a plan's resource state
      operationId: getPlanResourceState
      tags:
      - Resource
      responses:
        '200':
          description: State response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnvelopedState'
        '401':
          $ref: '#/components/responses/NotAuthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
    put:
      summary: Update a plan's resource state
      operationId: putPlanResourceState
      tags:
      - Resource
      parameters:
      - $ref: '#/components/parameters/force'
      requestBody:
        description: The State to update.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/State'
      responses:
        '200':
          description: State response updated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnvelopedState'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/NotAuthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /agencies/{agencyId}/plans/{planId}/resources/{resourceId}/forbid/{stopId}:
    parameters:
    - $ref: '#/components/parameters/agencyId'
    - $ref: '#/components/parameters/planId'
    - $ref: '#/components/parameters/resourceId'
    - $ref: '#/components/parameters/stopId'
    put:
      summary: Forbid a resource from doing a stop, and return the updated plan
      description: 'Forbidding a resource from doing a stop is performed internally by adding a forbidden assignment in the

        list of additional constraints of the plan. The forbidden assignment relies on:

        - a generated resource tag, based on the id of the resource (example: `generatedTag:$resource-2$:forbid`),

        - a generated stop tag, based on the id of the parent order of the stop (example: `generatedTag:$order-1$:forbid`).


        Important: all the sibling stops receive this same stop tag, which means that **all the stops of

        the order become forbidden for the resource**.

        '
      operationId: putForbidResourceStop
      tags:
      - Resource
      parameters:
      - $ref: '#/components/parameters/force'
      responses:
        '200':
          description: Updated plan response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnvelopedPlan'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/NotAuthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  schemas:
    CountryCodes:
      type: array
      items:
        $ref: '#/components/schemas/CountryCode'
      example:
      - Switzerland
      - BE
      - ITA
    Duration:
      type: string
      description: A period of time, expressed in the ISO8601 **duration** format.
      pattern: ^P(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(\d+H)?(\d+M)?(\d+S)?)?$
      example: PT4M
    EnvelopedErrors:
      type: object
      properties:
        errors:
          type: array
          items:
            $ref: '#/components/schemas/Error'
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    AdditionalConstraintCapacities:
      type: object
      description: This constraint is valid if all the capacities are satisfied.
      properties:
        type:
          type: string
          enum:
          - capacities
          description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
        name:
          type: string
          description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
        capacities:
          $ref: '#/components/schemas/Capacities'
        resourceTag:
          type: string
          allOf:
          - $ref: '#/components/schemas/RegexIdValidation'
      required:
      - type
      - capacities
      - resourceTag
    AdditionalConstraintMaxStopTagGroups:
      type: object
      description: If the tour has stops whose stopTags constitute too many groups, then the tour is invalid.
      properties:
        type:
          type: string
          enum:
          - maxStopTagGroups
          description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
        name:
          type: string
          description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
        resourceTags:
          type: array
          items:
            type: string
            allOf:
            - $ref: '#/components/schemas/RegexIdValidation'
          example:
          - subcontractorA
          - subcontractorB
        maxGroupsByStopTag:
          $ref: '#/components/schemas/MaxGroupsByStopTag'
          description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
      required:
      - type
      - maxGroupsByStopTag
    RegexIdValidation:
      type: string
      description: 'At least one character among those allowed: unaccented alpha-numeric characters, "-", ".", "_", "~", ":", "@", "!", "$", ",".'
      pattern: ^[a-zA-Z0-9-._~:@!$,]+$
    Properties:
      type: object
      additionalProperties:
        type: string
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    PlanObjectives:
      type: array
      items:
        oneOf:
        - $ref: '#/components/schemas/ObjectivesEnum'
        - $ref: '#/components/schemas/MaximizePrecedencesObjective'
        - $ref: '#/components/schemas/CustomObjective'
      default:
      - maximizeMandatoryStops
      - minimizeDelay
      - minimizeCosts
      - minimizeResources
      - minimizeOverOverlappingCapacitiesOnStops
      - maximizeOptionalStops
      - maximizePreferredStops
      - minimizeWorkingDuration
      - minimizeDistance
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    AdditionalConstraintAtLeastOneConstraint:
      type: object
      description: If one of the constraint is valid, then the tour is valid.
      properties:
        type:
          type: string
          enum:
          - atLeastOneConstraint
          description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
        name:
          type: string
          description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
        constraints:
          type: array
          items:
            oneOf:
            - $ref: '#/components/schemas/AdditionalConstraintAtLeastOneValidCapacity'
            - $ref: '#/components/schemas/AdditionalConstraintForbiddenAssignment'
            - $ref: '#/components/schemas/AdditionalConstraintIncompatibleStopTags'
            - $ref: '#/components/schemas/AdditionalConstraintAtLeastOneConstraint'
            - $ref: '#/components/schemas/AdditionalConstraintCapacities'
            - $ref: '#/components/schemas/AdditionalConstraintMaxStopTagGroups'
            - $ref: '#/components/schemas/AdditionalConstraintRemovalStrategy'
          description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
      required:
      - type
      - constraints
    TimeWindow:
      type: object
      properties:
        begin:
          $ref: '#/components/schemas/DateTime'
        end:
          $ref: '#/components/schemas/DateTime'
      required:
      - begin
      - end
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    AlternativesStop:
      type: object
      description: A stop composed of different alternative single stops.
      properties:
        id:
          allOf:
          - $ref: '#/components/schemas/RegexIdValidation'
        type:
          type: string
          enum:
          - alternatives
          description: Discriminator identifying this as an alternatives stop, as opposed to a single stop.
        alternatives:
          type: array
          items:
            allOf:
            - $ref: '#/components/schemas/SingleStop'
          description: The list of single stops among which the algorithm must choose the best one to visit (for example choosing among multiple charging points or waste disposal sites). Using alternatives can increase optimization time.
      required:
      - type
      - alternatives
    IncompatibleStopTags:
      type: array
      description: Incompatibilities between stop tags (all elements must be different regardless of order).
      uniqueItems: true
      deprecated: true
      items:
        $ref: '#/components/schemas/StopTagPair'
      example:
      - - goat
        - cabbage
      - - wolf
        - goat
    PlanStatus:
      type: object
      readOnly: true
      properties:
        planVersionInSolution:
          description: The plan version taken into account in the current solution.
          allOf:
          - $ref: '#/components/schemas/PlanVersion'
        waitingRoom:
          description: If the maximum number of simultaneous running plans has already been reached, the plan waits in the waiting room for one of the running plans to finish.
          allOf:
          - $ref: '#/components/schemas/PlanStatusVersion'
        waitingTraffic:
          description: The plan is waiting for its traffic coefficients to be computed.
          allOf:
          - $ref: '#/components/schemas/PlanStatusVersion'
        creation:
          description: The plan is being created in order to be optimized.
          allOf:
          - $ref: '#/components/schemas/PlanStatusVersion'
        optimization:
          description: The plan is being optimized.
          allOf:
          - $ref: '#/components/schemas/PlanStatusVersion'
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    Plan:
      type: object
      description: A plan for a date and agency, with resource and orders associated.
      properties:
        id:
          $ref: '#/components/schemas/PlanId'
        agencyId:
          $ref: '#/components/schemas/AgencyId'
        version:
          $ref: '#/components/schemas/PlanVersion'
        running:
          type: boolean
          description: To know if the plan is running.
          readOnly: true
        status:
          allOf:
          - $ref: '#/components/schemas/PlanStatus'
          description: The plan's processing status across the optimization pipeline (waiting room, creation, optimization, and traffic-waiting stages), each tracking which plan version is currently waiting and currently running. Poll this field to know when a new solution is ready instead of relying on a push/webhook mechanism. See PlanStatus for the full breakdown of each stage.
        state:
          allOf:
          - $ref: '#/components/schemas/PlanState'
        properties:
          allOf:
          - $ref: '#/components/schemas/Properties'
          description: Free-form key-value pairs (strings only) with no impact on optimization. Used to carry integration-specific information (for example an internal reference) that is returned unchanged in the plan and its solution. Can also be set on resources, orders, and stops.
        resources:
          type: array
          items:
            $ref: '#/components/schemas/Resource'
          description: The list of resources (vehicle/driver pairs) available to fulfill the plan's orders.
        nbResources:
          type: number
          format: integer
          minimum: 0
          readOnly: true
          description: The number of resources in the plan.
        orders:
          type: array
          items:
            $ref: '#/components/schemas/Order'
          description: The list of orders (sequences of stops) to be planned across the available resources.
        nbOrders:
          type: number
          format: integer
          minimum: 0
          readOnly: true
          description: The number of orders in the plan.
        additionalOperationDurations:
          type: array
          description: Additional operation time for a resource and a stop, according to tags (pairs of tags must be unique).
          uniqueItems: true
          items:
            $ref: '#/components/schemas/AdditionalOperationDuration'
        operationDurationPoliciesByResourceTag:
          type: object
          description: Policies to remove the operation durations, by resource tag.
          additionalProperties:
            type: array
            items:
              $ref: '#/components/schemas/OperationDurationPolicy'
        forbiddenAssignments:
          type: array
          uniqueItems: true
          deprecated: true
          items:
            $ref: '#/components/schemas/ForbiddenAssignment'
        incompatibleStopTags:
          allOf:
          - $ref: '#/components/schemas/IncompatibleStopTags'
        additionalConstraints:
          type: array
          items:
            oneOf:
            - $ref: '#/components/schemas/AdditionalConstraintAtLeastOneValidCapacity'
            - $ref: '#/components/schemas/AdditionalConstraintForbiddenAssignment'
            - $ref: '#/components/schemas/AdditionalConstraintIncompatibleStopTags'
            - $ref: '#/components/schemas/AdditionalConstraintAtLeastOneConstraint'
            - $ref: '#/components/schemas/AdditionalConstraintCapacities'
            - $ref: '#/components/schemas/AdditionalConstraintMaxStopTagGroups'
            - $ref: '#/components/schemas/AdditionalConstraintRemovalStrategy'
          description: A list of advanced constraints that go beyond what the standard modeling objects (resources, orders, stops) can express, each identified by a type (for example atLeastOneValidCapacity, forbiddenAssignment, incompatibleStopTags, atLeastOneConstraint, capacities, maxStopTagGroups, or removalStrategy). See the constraints catalog for the full list and their parameters.
        globalConstraints:
          type: array
          description: List of global constraints to be satisfied by the returned solution.
          items:
            oneOf:
            - $ref: '#/components/schemas/GlobalConstraintMaxCumulatedCost'
        accessDurationsByStopTag:
          type: object
          description: Access durations is an additional duration before the beginning of a group of stops with the same stop tag.
          additionalProperties:
            allOf:
            - $ref: '#/components/schemas/Duration'
          example:
            access:parking33: PT5M
        overlappingCapacitiesByStopTag:
          type: object
          description: This field allows users to define a limit in the number of resources that are simultaneously present at stops sharing the same stop tag.
          additionalProperties:
            type: integer
          example:
            capa:bat22: 3
        setupDurations:
          type: array
          items:
            $ref: '#/components/schemas/SetupDuration'
          description: Defines an additional duration incurred when a resource transitions from a stop tagged fromStopTag to a stop tagged toStopTag (for example customs crossings between countries, or cleaning required between incompatible cargo types), identified by the "setup:" tag convention.
        objectives:
          allOf:
          - $ref: '#/components/schemas/PlanObjectives'
          description: 'The ordered list of optimization objectives, processed lexicographically: the algorithm prioritizes improving higher-ranked objectives before lower-ranked ones, so the order should reflect business priorities. Defaults to a sequence that works well for most cases. See ObjectivesEnum for the available objectives.'
        maxOptimizationDuration:
          allOf:
          - $ref: '#/components/schemas/Duration'
        tz:
          $ref: '#/components/schemas/TimeZone'
        createdAt:
          description: The plan's creation datetime.
          readOnly: true
          allOf:
          - $ref: '#/components/schemas/DateTime'
        createdBy:
          type: string
          description: The username of the user who created this plan
          readOnly: true
        updatedAt:
          description: The plan's last update datetime.
          readOnly: true
          allOf:
          - $ref: '#/components/schemas/DateTime'
        updatedBy:
          type:
          - string
          - 'null'
          description: The username of the user who last updated this plan
          readOnly: true
        archivedAt:
          description: 'The plan''s archiving datetime: if not null, the plan is archived.'
          readOnly: true
          example: null
          allOf:
          - $ref: '#/components/schemas/DateTime'
        lateDeparture:
          description: True if lateDeparture is requested for Resources, false otherwise.
          type: boolean
          default: false
        sharedCapacities:
          description: True if sharedCapacities is requested for Resources, false otherwise. It enables resources to share capacities between stops of different orders.
          type: boolean
          default: false
        emptyThresholdByCapacityByResourceTag:
          description: 'Thresholds for capacities below which a resource is considered "empty" for empty distance calculation, grouped by resource tag.

            A resource is "empty" (kilometers traveled count as empty distance) when all capacities are at or below their threshold.

            The wildcard tag "*" matches all resources.

            '
          type: object
          additionalProperties:
            allOf:
            - $ref: '#/components/schemas/Capacities'
          example:
            heavy:
              weight: 150.0
              volume: 75.0
            '*':
              weight: 50.0
        avoidEarlyLoadingsByResourceTag:
          type: object
          description: 'Early loading declarations grouped by resource tag. The wildcard tag "*" matches all resources.

            Each entry identifies a stop tag and optional capacities used to compute the minimizeEarlyLoadings objective.

            '
          additionalProperties:
            type: array
            items:
              $ref: '#/components/schemas/AvoidEarlyLoading'
          example:
            '*':
            - stopTag: depot1
              capacities:
              - weight
              - volume
            heavy:
            - stopTag: warehouse
        CO2EmissionCalculationByResourceTag:
          type: object
          description: 'Optional CO2 emission calculation parameters grouped by resource tag. Each value is a `Cost`-shaped object.

            Applies to every resource carrying the corresponding tag.

            When set, the resulting emissions are reported on tours as `CO2Emission` and aggregated on the solution as `CO2Emission`.

            If a resource matches multiple tags, only its first declared matching tag is used.

            Overridden by the resource-level declaration.

            '
          additionalProperties:
            $ref: '#/components/schemas/Cost'
          example:
            resTag2:
              km:
                costCoeff: 0.55
              costPerCapacityPerTravelledKm:
                weight:
                  costCoeff: 0.2
      required:
      - id
      - agencyId
      - resources
    MaximizePrecedencesObjective:
      type: object
      properties:
        type:
          type: string
          enum:
          - maximizePrecedences
          description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
        precedences:
          type: array
          items:
            allOf:
            - $ref: '#/components/schemas/StopTagPrecedencePair'
        disableGroupProximity:
          type: boolean
          description: If true, the group proximity objective will be disabled.
      required:
      - type
      - precedences
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    StopTagPrecedencePair:
      type: object
      description: A pair of precedence stop tags.
      properties:
        previous:
          type: string
          example: sector1
          allOf:
          - $ref: '#/components/schemas/RegexIdValidation'
        next:
          type: string
          example: sector2
          allOf:
          - $ref: '#/components/schemas/RegexIdValidation'
      required:
      - previous
      - next
    CostsByResourceTag:
      type: object
      additionalProperties:
        $ref: '#/components/schemas/Cost'
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    SetupDuration:
      type: object
      properties:
        fromStopTag:
          type: string
          example: setup:france
          allOf:
          - $ref: '#/components/schemas/RegexIdValidation'
        toStopTag:
          type: string
          example: setup:belgium
          allOf:
          - $ref: '#/components/schemas/RegexIdValidation'
        setupDuration:
          allOf:
          - $ref: '#/components/schemas/Duration'
      required:
      - fromStopTag
      - toStopTag
      - setupDuration
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    StopKind:
      type: string
      enum:
      - pickup
      - delivery
      - acknowledgement
      default: delivery
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    MaxInterStopDurationBounds:
      type: object
      description: 'Per-segment maximum duration between two consecutive stops on a tour.

        Each key is independent; an absent key means no constraint on that segment.

        '
      properties:
        firstTravel:
          description: Maximum duration between the resource's departure and the first stop.
          allOf:
          - $ref: '#/components/schemas/Duration'
        interStop:
          description: Maximum duration between two consecutive intermediate stops (excluding the first and last travels).
          allOf:
          - $ref: '#/components/schemas/Duration'
        lastTravel:
          description: Maximum duration between the last stop and the resource's arrival.
          allOf:
          - $ref: '#/components/schemas/Duration'
      example:
        firstTravel: PT15M
        interStop: PT30M
        lastTravel: PT20M
    PlanState:
      type: string
      readOnly: true
      description: "The corresponding plan's state.\n  - waiting: The plan was received and is awaiting processing.\n  - processing: The plan is being processed.\n  - preOptimizing: The plan is being optimized while awaiting traffic or other information.\n  - preOptimized: While still awaiting traffic or other information, one of the following events has occurred:\n      no better solution can be produced, or the optimization period has reached its limit.\n      Note that 'preOptimized' should be followed by 'optimizing' and 'optimized'.\n  - optimizing: The plan is being optimized with all required information.\n  - optimized: This state can be triggered by one of the following events:\n      no better solution can be produced, or the optimization period has reached its limit.\n  - stopped: The plan's awaiting optimizations were canceled.\n  - deleted: The plan was deleted and awaiting optimizations were canceled.\n  - interrupted: The plan was either updated, stopped or deleted during its optimization.\n"
      enum:
      - waiting
      - processing
      - preOptimizing
      - preOptimized
      - optimizing
      - optimized
      - stopped
      - deleted
      - interrupted
    Position:
      type: object
      properties:
        lon:
          type: number
          minimum: -180
          maximum: 180
          description: Longitude coordinate.
        lat:
          type: number
          minimum: -90
          maximum: 90
          description: Latitude coordinate.
      required:
      - lon
      - lat
      example:
        lon: 2.3269331
        lat: 48.8812658
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    CountryCode:
      type: string
      description: A country standard name or Alpha-2 code or Alpha-3 code.
    VehicleProfileBicycle:
      type: object
      properties:
        type:
          type: string
          enum:
          - bicycle
          description: 'Discriminator value: "bicycle".'
        avoidFerry:
          type: boolean
          description: When true, avoids ferry crossings when calculating routes.
        avoidSeasonalClosure:
          type: boolean
          description: When true, avoids roads that are seasonally closed.
        avoidTunnel:
          type: boolean
          description: When true, avoids tunnels.
        avoidDirtRoad:
          type: boolean
          description: When true, avoids unpaved or dirt roads.
        excludedCountries:
          $ref: '#/components/schemas/CountryCodes'
          description: The list of countries to exclude from calculated routes.
      required:
      - type
      description: A cyclist profile. Unaffected by traffic variations.
    CostFloorsAndCoeffs:
      type: object
      description: Cost floors and coefficients. A cost cannot be empty. An overcost cannot be set if there is no cost, and the overcostFloor must be greater than costFloor.
      properties:
        constantCost:
          type: number
          description: A one-off cost added once whenever this cost component applies, independent of any measured quantity (distance, duration, or capacity) — use it for a flat charge that doesn't scale with usage.
        costFloor:
          type: number
          description: The quantity (distance, duration, or capacity — whatever this object is scoped to) below which no cost accrues from this component. `costCoeff` applies only to the portion of the quantity above this floor.
        costCoeff:
          type: number
          description: The rate charged per unit of quantity above `costFloor` (for example cost per km, per hour, or per capacity unit) — the linear component of this cost.
        overcostFloor:
          type: number
          description: A second, higher quantity threshold at which the `overcostCoeff` rate starts applying instead of `costCoeff`, for the portion of the quantity above this threshold (for example an overtime-style tariff beyond a normal-usage allowance). Must be strictly greater than `costFloor`, and can only be set alongside `overcostCoeff`.
        overcostCoeff:
          type: number
          description: The rate charged per unit of quantity above `overcostFloor` — the higher, second-tier rate for usage beyond the range already covered by `costFloor`/`costCoeff`. Requires `overcostFloor` to also be set.
    VehicleProfileMotorbike:
      type: object
      properties:
        type:
          type: string
          enum:
          - motorbike
          description: 'Discriminator value: "motorbike".'
        avoidFerry:
          type: boolean
          description: When true, avoids ferry crossings when calculating routes.
        avoidSeasonalClosure:
          type: boolean
          description: When true, avoids roads that are seasonally closed.
        avoidControlledAccessHighway:
          type: boolean
          description: When true, avoids controlled-access highways (e.g. motorways).
        avoidCarShuttleTrain:
          type: boolean
          description: When true, avoids routes requiring a car shuttle train.
        avoidTunnel:
          type: boolean
          description: When true, avoids tunnels.
        avoidDirtRoad:
          type: boolean
          description: When true, avoids unpaved or dirt roads.
        excludedCountries:
          $ref: '#/components/schemas/CountryCodes'
          description: The list of countries to exclude from calculated routes.
        speedCap:
          type: number
          description: Caps the vehicle's maximum speed used in travel time calculations, in km/h.
      required:
      - type
      description: A motorized profile for vehicles over 125cc, unrestricted in terms of roads. Unaffected by traffic variations.
    MaxInterStopDistanceInKmBounds:
      type: object
      description: 'Per-segment maximum distance, in km, between two consecutive stops on a tour.

        Each key is independent; an absent key means no constraint on that segment.

        '
      properties:
        firstTravel:
          description: Maximum distance, in km, between the resource's departure and the first stop.
          type: number
        interStop:
          description: Maximum distance, in km, between two consecutive intermediate stops (excluding the first and last travels).
          type: number
        lastTravel:
          description: Maximum distance, in km, between the last stop and the resource's arrival.
          type: number
      example:
        firstTravel: 10
        interStop: 25
        lastTravel: 15
    TimeWindowBreak:
      type: object
      de

# --- truncated at 32 KB (81 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/kardinal/refs/heads/main/openapi/kardinal-resource-api-openapi.yml