Open Application Platform Docs

Reusable resources

Upload a fleet, depot or plan once and reference it by id.

platform.resources Stable free

How to call it

REST

POST /v1/plan/matrix

DELETE /v1/plan/matrix/{matrixId}

POST /v1/plan/matrix/{matrixId}/points

GraphQL

mutation openPlanMatrixOpen

mutation openPlanMatrixClose

mutation openPlanMatrixPoints

MCP

open_plan_matrix_close

Close a distance snapshot opened with open_plan_matrix_open once the plan is no longer edited. `closed` is false when it was already gone. Free; needs any plan capability.

open_plan_matrix_open

Open a distance snapshot for editing one plan, for a region (NA default) and a vehicle profile (car default). Pass its id as `matrix` to open_plan_recost, open_plan_validate, open_plan_resequence, open_plan_move, open_plan_remove, open_plan_insert, open_plan_refine and open_plan_what_if: road legs measured once are then read from it, and the searches rank their candidates on its road matrix; every number answered is still measured on the road. It is removed after an hour without use and after eight hours at most. Free; needs any plan capability.

open_plan_matrix_points

Name new points of a distance snapshot opened with open_plan_matrix_open (a stop dropped on the map, an address picked to insert): their road legs are measured into it at once, so the next open_plan_insert or open_plan_move finds them held. Answers at once with `queued`; with `wait_ms` (at most 1000) it waits until the legs are held and says so in `ready`. Entries that are not a coordinate are left out; at most 50 points a call. Free; needs any plan capability.

Request schema

Generated from the same validation rules the endpoint runs, so a field cannot be documented without being validated.

POST /v1/plan/matrix

{
    "type": "object",
    "properties": {
        "points": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "lat": {
                        "type": "number",
                        "minimum": -90,
                        "maximum": 90,
                        "description": "Required when points is present."
                    },
                    "lng": {
                        "type": "number",
                        "minimum": -180,
                        "maximum": 180,
                        "description": "Required when points is present."
                    }
                }
            }
        },
        "profile": {
            "type": [
                "string",
                "null"
            ],
            "enum": [
                "car",
                "van",
                "truck",
                "bike",
                "foot",
                "motorcycle"
            ]
        },
        "region": {
            "type": [
                "string",
                "null"
            ],
            "enum": [
                "NA",
                "EU",
                "AU",
                "ASIA",
                "na",
                "eu",
                "au",
                "asia"
            ]
        }
    },
    "additionalProperties": false
}

Request example

{
    "region": "NA",
    "profile": "car",
    "points": [
        {
            "lat": 45.5017,
            "lng": -73.5673
        },
        {
            "lat": 45.5088,
            "lng": -73.554
        },
        {
            "lat": 45.4972,
            "lng": -73.5786
        }
    ]
}

POST /v1/plan/matrix/{matrixId}/points

{
    "type": "object",
    "properties": {
        "points": {
            "type": "array",
            "maxItems": 50,
            "items": {
                "type": "object",
                "properties": {
                    "lat": {
                        "type": "number",
                        "minimum": -90,
                        "maximum": 90
                    },
                    "lng": {
                        "type": "number",
                        "minimum": -180,
                        "maximum": 180
                    }
                },
                "required": [
                    "lat",
                    "lng"
                ]
            }
        },
        "wait_ms": {
            "type": [
                "integer",
                "null"
            ],
            "minimum": 0,
            "maximum": 1000
        }
    },
    "additionalProperties": false,
    "required": [
        "points"
    ]
}

Request example

{
    "points": [
        {
            "lat": 45.5231,
            "lng": -73.5817
        }
    ],
    "wait_ms": 1000
}

Response

What a successful call returns: the schema of `data` and `meta`, with a description of each field, followed by an example response from a real call.

POST /v1/plan/matrix

Response schema

{
    "description": "A distance snapshot for editing one plan. Name it as `matrix` in plan calls of the same region and profile. Free.",
    "data": {
        "type": "object",
        "properties": {
            "matrix": {
                "type": "string",
                "description": "The snapshot id, `<node>.<random>`: send it as `matrix`."
            },
            "expires_at": {
                "type": [
                    "string",
                    "null"
                ],
                "format": "date-time",
                "description": "When it is removed if it is not used again: an hour after its last use, and never later than eight hours after it was opened (UTC)."
            },
            "node": {
                "type": "string",
                "description": "The server that holds the snapshot."
            }
        },
        "required": [
            "matrix",
            "expires_at",
            "node"
        ]
    },
    "meta": {
        "type": "object",
        "properties": {
            "region": {
                "type": "string"
            },
            "profile": {
                "type": "string"
            }
        }
    }
}

Response example

{
    "request_id": "req_01k8zq3m5n7p9r1t3v5x7z9b2d",
    "capability": "platform.resources",
    "billing": {
        "unit": "free",
        "quantity": 0,
        "counted": false
    },
    "data": {
        "matrix": "tile2.3f0c9a5e7b1d4c2a9e8f6d5c4b3a2910",
        "expires_at": "2026-10-23T14:30:00Z",
        "node": "tile2"
    },
    "meta": {
        "region": "NA",
        "profile": "car"
    }
}

DELETE /v1/plan/matrix/{matrixId}

Response schema

{
    "description": "The snapshot is removed at once. `closed` is false when it was already gone (expired, removed or never opened by this account). Free.",
    "data": {
        "type": "object",
        "properties": {
            "matrix": {
                "type": "string"
            },
            "closed": {
                "type": "boolean",
                "description": "True when this call removed it."
            }
        },
        "required": [
            "matrix",
            "closed"
        ]
    }
}

Response example

{
    "request_id": "req_01k8zq3m5n7p9r1t3v5x7z9b2d",
    "capability": "platform.resources",
    "billing": {
        "unit": "free",
        "quantity": 0,
        "counted": false
    },
    "data": {
        "matrix": "tile2.3f0c9a5e7b1d4c2a9e8f6d5c4b3a2910",
        "closed": true
    }
}

POST /v1/plan/matrix/{matrixId}/points

Response schema

{
    "description": "The points are queued on the fast lane and their road legs measured into the snapshot. Without `wait_ms` the answer is sent at once; with it, once the legs are held or the time ran out. Refused with RESOURCE_EXPIRED (410) when the snapshot is unknown, expired or another account's. Free.",
    "data": {
        "type": "object",
        "properties": {
            "matrix": {
                "type": "string"
            },
            "queued": {
                "type": "integer",
                "description": "Points queued on the fast lane by this call: new points, and points still waiting in the background. A point already held, already on the fast lane, named twice or not a coordinate is not counted."
            },
            "ready": {
                "type": "boolean",
                "description": "True when the legs of every point named were held in the snapshot when the answer was sent. Without `wait_ms` usually false for a new point."
            }
        },
        "required": [
            "matrix",
            "queued",
            "ready"
        ]
    }
}

Response example

{
    "request_id": "req_01k8zq3m5n7p9r1t3v5x7z9b2d",
    "capability": "platform.resources",
    "billing": {
        "unit": "free",
        "quantity": 0,
        "counted": false
    },
    "data": {
        "matrix": "tile2.3f0c9a5e7b1d4c2a9e8f6d5c4b3a2910",
        "queued": 1,
        "ready": true
    }
}

What it costs

Never billed, and never disable-able.

Every billable response carries a billing block with the unit, the quantity and how the quantity was derived.

Errors it can return

Status Code Description
401 SESSION_EXPIRED The session token is invalid or has expired.
401 TOKEN_INVALID Unknown or revoked API token.
401 TOKEN_MISSING No API token. Send Authorization: Bearer <your token>.
403 CAPABILITY_NOT_ENABLED This capability is not enabled for your account. See :doc to enable it.
403 CAPABILITY_NOT_GRANTED_TO_KEY Your account has this capability, but this API key was not granted it.
403 OPEN_API_DISABLED Open Platform access is not enabled for this account.
404 JOB_NOT_FOUND No such job, or it belongs to another account.
409 JOB_NOT_FINISHED The job has not finished yet. Poll the job, or wait for the callback.
410 JOB_RESULT_EXPIRED The result has expired and is no longer available. Submit the request again.
422 UNSUPPORTED_REGION That routing region is not available. Use NA, EU, AU or ASIA.
422 VALIDATION_FAILED The request failed validation. See details.
429 RATE_LIMITED Too many requests. Please retry after the indicated delay.
429 SNAPSHOT_LIMIT_REACHED A distance snapshot cannot be opened: a limit is reached (see `limit`). Close a snapshot no longer in use, or call without `matrix`.
500 INTERNAL_ERROR An unexpected error occurred. Quote the request_id when contacting support.
502 ENGINE_UNAVAILABLE The routing engine is temporarily unreachable. Please retry.