Kardinal Simple Plan API

How to create a plan through the use of a simple plan.

Business capability
Transport Operations Management BC-2420

Operations 1

POST /agencies/{agencyId}/simplePlans Create a simple 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-simpleplan-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-simpleplan-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Kardinal ARO Simple Plan 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: SimplePlan
  description: How to create a plan through the use of a simple plan.
paths:
  /agencies/{agencyId}/simplePlans:
    parameters:
    - $ref: '#/components/parameters/agencyId'
    post:
      summary: Create a simple plan
      operationId: postSimplePlan
      tags:
      - SimplePlan
      requestBody:
        description: The SimplePlan to create.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SimplePlan'
      responses:
        '201':
          description: The simple plan was created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnvelopedSimplePlan'
        '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:
    Capacities:
      type: object
      additionalProperties:
        type: number
      example:
        volume: 9.5
        weight: 2200
        nbPackages: 23
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    AgencyId:
      description: The agency id.
      readOnly: true
      example: LND_Agency-42
      allOf:
      - $ref: '#/components/schemas/RegexPrefixedIdValidation'
    ErrorProperties:
      type: object
      additionalProperties:
        type: string
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    SimplePlan:
      type: object
      description: A simple plan is a simplified representation of a plan, with simplified resources, simplified stops, and a simplified objective.
      properties:
        id:
          $ref: '#/components/schemas/UUID'
        agencyId:
          $ref: '#/components/schemas/AgencyId'
        version:
          $ref: '#/components/schemas/PlanVersion'
        state:
          $ref: '#/components/schemas/PlanState'
        resources:
          type: array
          items:
            $ref: '#/components/schemas/SimpleResource'
        nbResources:
          type: number
          format: integer
          minimum: 0
          readOnly: true
          description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
        stops:
          type: array
          items:
            $ref: '#/components/schemas/SimpleStop'
        nbStops:
          type: number
          format: integer
          minimum: 0
          readOnly: true
          description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
        objective:
          $ref: '#/components/schemas/SimpleObjective'
        tz:
          $ref: '#/components/schemas/TimeZone'
        lateDeparture:
          description: True if lateDeparture is requested for Resources, false otherwise.
          type: boolean
          default: false
        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 simple 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 simple 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'
      required:
      - id
      - agencyId
      - resources
    StopKind:
      type: string
      enum:
      - pickup
      - delivery
      - acknowledgement
      default: delivery
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    PlanId:
      description: The plan id.
      readOnly: true
      example: plan-AB
      allOf:
      - $ref: '#/components/schemas/RegexIdValidation'
    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
    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
    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.'
    EnvelopedErrors:
      type: object
      properties:
        errors:
          type: array
          items:
            $ref: '#/components/schemas/Error'
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    RegexPrefixedIdValidation:
      type: string
      description: An id beginning with a prefix and an underscore.
      pattern: ^[A-Z]{3,6}_[a-zA-Z0-9-._~:@!$,]+$
    SimpleObjective:
      type: string
      enum:
      - minimizeResources
      - minimizeWorkingDuration
      - minimizeDistance
      default: minimizeResources
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    Break:
      oneOf:
      - $ref: '#/components/schemas/TimeWindowBreak'
      - $ref: '#/components/schemas/TravelDurationSlidingBreak'
      - $ref: '#/components/schemas/WorkingDurationSlidingBreak'
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    TimeWindowBreak:
      type: object
      description: A required break of a given duration in a given time window.
      properties:
        type:
          type: string
          enum:
          - timeWindowBreak
          description: 'Discriminator value: "timeWindowBreak". A standard break (e.g. lunch) defined by a fixed time frame.'
        duration:
          allOf:
          - $ref: '#/components/schemas/Duration'
          description: The duration (ISO 8601) of the break.
        timeWindow:
          allOf:
          - $ref: '#/components/schemas/TimeWindow'
          description: The time frame within which the break must be taken. Acts similarly to a workingTimeWindow combined with a maxWorkingDuration.
      required:
      - duration
      - timeWindow
    TravelDurationSlidingBreak:
      type: object
      description: Limitation rule on max travel duration without any break.
      properties:
        type:
          type: string
          enum:
          - travelDurationSlidingBreak
          description: 'Discriminator value: "travelDurationSlidingBreak". Represents a break tied to driving time, such as a legal break required after a maximum amount of driving (for example, a 10-minute break every 4 hours of driving).'
        minBreakDuration:
          allOf:
          - $ref: '#/components/schemas/Duration'
          description: The minimum duration of the break.
        maxInterBreakDuration:
          allOf:
          - $ref: '#/components/schemas/Duration'
          description: The maximum duration of travel allowed between two breaks.
      required:
      - type
      - minBreakDuration
      - maxInterBreakDuration
    PlanVersion:
      type: integer
      description: The plan version.
      readOnly: true
      minimum: 1
      example: 42
    TimeZone:
      type: string
      description: "The time zone is a string code which identifies a region of the world in the \"time zone database\", also called \"tz database\".\nThe tz database is a partition of the world into regions where local clocks all show the same time.\nThis database gives the rules for time offset and daylight saving time in each region.\n\nHow do we use it?\n\nIn order to work with time events accurately, we usually use datetimes in the iso-8601 format, without explicit time zone.\nThis format is quite well suported by many programming languages, and it is well suited for technical data exchange.\nBut it is not easy to use for humans.\n\nFor instance, here are three datetimes in iso-8601 format, which give the same exact moment in time:\n- \"2025-05-22T05:43:00Z\"\n- \"2025-05-22T06:43:00+01:00\"\n- \"2025-05-22T07:43:00+02:00\"\n\nFor a non-technical user, it is difficult to know how to relate this to the time displayed on a watch or a clock.\n\nWe improve the user experience by adding the support of local datetimes, thanks to the use of the time zone,\nwhich allows to transform a local datetime into an iso-8601 datetime:\n- local datetime + timezone (tz) = iso-8601 datetime\n\nFor instance, here are five datetimes which all give the same exact moment in time:\n- \"2025-05-22T05:43:00Z\"\n- \"2025-05-22T06:43:00+01:00\"\n- \"2025-05-22T07:43:00+02:00\"\n- \"2025-05-22 07:43:00\"       + timezone \"tz\": \"Europe/Paris\"\n- \"2025-05-22 07:43\"          + timezone \"tz\": \"Europe/Paris\"\n\nNote: the last example (\"2025-05-22 07:43\") illustrates the support of local datetimes without seconds,\nwhich can be very practical for users.\n\nIn order for local datetimes to be supported, some JSON input objects contain a \"tz\" time zone property.\nThis \"tz\" property is used to pre-process the JSON input payload, like this:\n- We check if a valid timezone can be extracted from the \"tz\" property,\n- If so, we perform the following actions:\n  - Walk through the whole JSON content to look for local datetimes,\n  - Use the timezone to transform each local datetime into an iso-8601 datetime.\n\nImportant: some objects contain a \"properties\" sub-object, which is a map of custom client data;\nthe content of the \"properties\" sub-objects is always excluded from the time zone pre-processing.\n"
      externalDocs:
        url: https://www.iana.org/time-zones
      example: Europe/Paris
    AtFirstPositionArrival:
      type: string
      description: The resource must go back to it's Tour first position.
      enum:
      - atFirstPosition
    SimpleStop:
      type: object
      properties:
        id:
          description: Single stop ids must be unique within a plan.
          allOf:
          - $ref: '#/components/schemas/RegexIdValidation'
        position:
          $ref: '#/components/schemas/Position'
        kind:
          $ref: '#/components/schemas/StopKind'
        operationDuration:
          allOf:
          - $ref: '#/components/schemas/Duration'
        capacities:
          allOf:
          - $ref: '#/components/schemas/Capacities'
        timeWindow:
          $ref: '#/components/schemas/TimeWindow'
      required:
      - id
      - position
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    UUID:
      type: string
      format: uuid
      description: Universally Unique Identifier.
      pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$
      example: cd4ce4e3-0208-4b10-b346-25f235214e4f
      readOnly: true
    DateTime:
      type: string
      description: 'A full calendar date time, expressed in the ISO8601 **date** format: YYYY-MM-DDThh:mm:ssZ.'
      example: '2019-11-15T12:34:56Z'
    RegexIdValidation:
      type: string
      description: 'At least one character among those allowed: unaccented alpha-numeric characters, "-", ".", "_", "~", ":", "@", "!", "$", ",".'
      pattern: ^[a-zA-Z0-9-._~:@!$,]+$
    WorkingDurationSlidingBreak:
      type: object
      description: Limitation rule on max working duration without any break.
      properties:
        type:
          type: string
          enum:
          - workingDurationSlidingBreak
          description: 'Discriminator value: "workDurationSlidingBreak". Represents a break tied to working time, such as a legal break required after a maximum amount of work (for example, a 10-minute break every 6 hours of work).'
        minBreakDuration:
          allOf:
          - $ref: '#/components/schemas/Duration'
          description: The minimum duration of the break.
        maxInterBreakDuration:
          allOf:
          - $ref: '#/components/schemas/Duration'
          description: The maximum duration of work allowed between two breaks.
      required:
      - type
      - minBreakDuration
      - maxInterBreakDuration
    Error:
      type: object
      readOnly: true
      properties:
        code:
          type: string
          description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
        message:
          type: string
          description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
        properties:
          $ref: '#/components/schemas/ErrorProperties'
      required:
      - message
      - code
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    EnvelopedSimplePlan:
      type: object
      properties:
        item:
          $ref: '#/components/schemas/SimplePlan'
        agencyId:
          $ref: '#/components/schemas/AgencyId'
        planId:
          $ref: '#/components/schemas/PlanId'
        planVersion:
          $ref: '#/components/schemas/PlanVersion'
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    SimpleResource:
      type: object
      properties:
        id:
          description: Resource ids must be unique within a plan.
          allOf:
          - $ref: '#/components/schemas/RegexIdValidation'
        capacities:
          $ref: '#/components/schemas/Capacities'
        departure:
          $ref: '#/components/schemas/Position'
        arrival:
          oneOf:
          - $ref: '#/components/schemas/Position'
          - $ref: '#/components/schemas/AtFirstPositionArrival'
          description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
        workingTimeWindow:
          $ref: '#/components/schemas/TimeWindow'
        maxWorkingDuration:
          $ref: '#/components/schemas/Duration'
        maxDistanceInKm:
          type: number
          description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
        breaks:
          type: array
          items:
            $ref: '#/components/schemas/Break'
      required:
      - id
      - workingTimeWindow
      description: '[TO_VALIDATE] Description pending review by a Kardinal engineer.'
    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.'
  parameters:
    agencyId:
      name: agencyId
      description: The agency id.
      in: path
      required: true
      schema:
        $ref: '#/components/schemas/AgencyId'
  responses:
    Unauthorized:
      description: The caller is not authorized to perform this action.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/EnvelopedErrors'
    NotFound:
      description: The specified resource was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/EnvelopedErrors'
    BadRequest:
      description: The server could not understand the request due to invalid content (bad syntax, bad format, bad values, etc).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/EnvelopedErrors'
    NotAuthenticated:
      description: The caller is not authenticated.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/EnvelopedErrors'
    InternalServerError:
      description: An internal server error has occurred.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/EnvelopedErrors'
  securitySchemes:
    otp_token:
      type: http
      scheme: bearer
      bearerFormat: JWT
    gdpr_token:
      type: http
      scheme: bearer
      bearerFormat: JWT
    access_token:
      type: http
      scheme: bearer
      bearerFormat: JWT
    refresh_token:
      type: http
      scheme: bearer
      bearerFormat: JWT
    password_token:
      type: http
      scheme: bearer
      bearerFormat: JWT