Open Mobility Foundation · Schema
models/policy
A policy describes the digital relationship between _mobility as a service_ providers and the agencies that regulate them.
CompanyMobilityOpen SourceOpen StandardsTransportationCitiesMicromobilityData Specifications
Properties
| Name | Type | Description |
|---|---|---|
| name | object | Name of policy. |
| mode_id | object | Mode this rule should apply, see MDS mode list for options. Default `micromobility` for backwards compatibility (this default will likely be removed in a subsequent MDS release). |
| policy_id | object | Unique ID of policy. |
| provider_ids | object | Providers for whom this policy is applicable; empty arrays and null/absent implies all Providers. |
| description | object | Description of policy. |
| currency | object | An ISO 4217 Alphabetic Currency Code representing the currency of all Rules with a `rate_amount`. |
| start_date | object | Beginning date/time of policy enforcement. In order to give providers sufficient time to poll, `start_date` must be at least 20 minutes after `published_date`. |
| end_date | object | End date/time of policy enforcement. |
| published_date | object | Timestamp that the policy was published. |
| prev_policies | object | Unique IDs of prior policies replaced by this one. |
| rules | array | Array of applicable Rule objects |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/api-evangelist/open-mobility-foundation/main/json-schema/open-mobility-foundation-policy-schema.json",
"title": "models/policy",
"description": "A policy describes the digital relationship between _mobility as a service_ providers and the agencies that regulate them.",
"x-generated": "2026-10-09",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/open-mobility-foundation-mds-policy-openapi.yml#/components/schemas/policy",
"type": "object",
"x-stoplight": {
"id": "yp7awu2xd5agd"
},
"required": [
"name",
"mode_id",
"policy_id",
"description",
"start_date",
"published_date",
"rules"
],
"properties": {
"name": {
"$ref": "#/$defs/data-types_string",
"description": "Name of policy."
},
"mode_id": {
"$ref": "#/$defs/data-types_mode",
"description": "Mode this rule should apply, see MDS mode list for options. Default `micromobility` for backwards compatibility (this default will likely be removed in a subsequent MDS release).",
"default": "micromobility"
},
"policy_id": {
"$ref": "#/$defs/data-types_uuid",
"description": "Unique ID of policy."
},
"provider_ids": {
"$ref": "#/$defs/data-types_uuid-array",
"description": "Providers for whom this policy is applicable; empty arrays and null/absent implies all Providers."
},
"description": {
"$ref": "#/$defs/data-types_string",
"description": "Description of policy."
},
"currency": {
"$ref": "#/$defs/data-types_currency",
"description": "An ISO 4217 Alphabetic Currency Code representing the currency of all Rules with a `rate_amount`."
},
"start_date": {
"$ref": "#/$defs/data-types_timestamp",
"description": "Beginning date/time of policy enforcement. In order to give providers sufficient time to poll, `start_date` must be at least 20 minutes after `published_date`."
},
"end_date": {
"$ref": "#/$defs/data-types_timestamp",
"description": "End date/time of policy enforcement."
},
"published_date": {
"$ref": "#/$defs/data-types_timestamp",
"description": "Timestamp that the policy was published."
},
"prev_policies": {
"$ref": "#/$defs/data-types_uuid-array",
"description": "Unique IDs of prior policies replaced by this one."
},
"rules": {
"type": "array",
"description": "Array of applicable Rule objects",
"minItems": 1,
"items": {
"$ref": "#/$defs/policy-rule"
}
}
},
"$defs": {
"data-types_currency": {
"title": "data-types/currency",
"default": "USD",
"description": "An [ISO 4217 Alphabetic Currency Code](https://en.wikipedia.org/wiki/ISO_4217#Active_codes) representing currency of the payee. If null, USD cents is implied.",
"pattern": "^[A-Z]{3}$",
"type": [
"string",
"null"
],
"x-stoplight": {
"id": "85j2txhx6x32o"
}
},
"data-types_day": {
"title": "data-types/day",
"description": "A day of the week.",
"enum": [
"sun",
"mon",
"tue",
"wed",
"thu",
"fri",
"sat"
],
"type": "string",
"x-stoplight": {
"id": "g5u1fwovxmhc3"
}
},
"data-types_days": {
"title": "data-types/days",
"description": "An array of days of the week.",
"items": {
"$ref": "#/$defs/data-types_day"
},
"type": "array",
"uniqueItems": true,
"x-stoplight": {
"id": "g7wntphhazfhv"
}
},
"data-types_event-type": {
"title": "data-types/event-type",
"description": "Events are possible transitions between vehicle states.",
"enum": [
"agency_drop_off",
"agency_pick_up",
"battery_charged",
"battery_low",
"changed_geographies",
"charging_end",
"charging_start",
"comms_lost",
"comms_restored",
"compliance_pick_up",
"customer_cancellation",
"decommissioned",
"driver_cancellation",
"fueling_end",
"fueling_start",
"located",
"maintenance",
"maintenance_end",
"maintenance_pick_up",
"not_located",
"off_hours",
"on_hours",
"order_drop_off",
"order_pick_up",
"passenger_cancellation",
"provider_cancellation",
"provider_drop_off",
"rebalance_pick_up",
"recommission",
"remote_end",
"remote_start",
"reservation_cancel",
"reservation_start",
"reservation_stop",
"service_end",
"service_start",
"system_resume",
"system_suspend",
"trip_cancel",
"trip_end",
"trip_enter_jurisdiction",
"trip_leave_jurisdiction",
"trip_pause",
"trip_resume",
"trip_start",
"trip_stop",
"unspecified"
],
"type": "string",
"x-stoplight": {
"id": "lsm5td7gknbxz"
}
},
"data-types_iso-time": {
"title": "data-types/iso-time",
"description": "Time-of-day expressed as ISO 8601 `hh:mm:ss`.",
"pattern": "([0-2][0-3]|[01]\\d):[0-5]\\d:[0-5]\\d",
"type": "string",
"x-stoplight": {
"id": "v656sfdmwq9s0"
}
},
"data-types_language-tag": {
"title": "data-types/language-tag",
"description": "An [IETF BCP 47](https://www.rfc-editor.org/rfc/bcp/bcp47.txt) language tag string.",
"type": "string",
"x-stoplight": {
"id": "5qws05ove0u6c"
},
"pattern": "([A-Za-z]{2,3})([-][A-Za-z]{3}){0,3}([-]([A-Za-z]{4}))?([-]([A-Za-z]{2}|[0-9]{3}))?"
},
"data-types_mode": {
"title": "data-types/modes",
"description": "The modes supported in MDS.",
"type": "string",
"x-stoplight": {
"id": "rjul1mcjyy8y2"
},
"enum": [
"car-share",
"delivery-robots",
"micromobility",
"passenger-services"
]
},
"data-types_propulsion-type": {
"title": "data-types/propulsion-type",
"description": "The allowed types of propulsion in MDS. Based off of `propulsion_type` in [GBFS vehicle_types](https://github.com/MobilityData/gbfs/blob/master/gbfs.md#vehicle_typesjson)",
"enum": [
"human",
"electric_assist",
"electric",
"combustion",
"combustion_diesel",
"hybrid",
"hydrogen_fuel_cell",
"plug_in_hybrid"
],
"type": "string",
"x-stoplight": {
"id": "1ucdttnwhf2bo"
}
},
"data-types_propulsion-type-array": {
"title": "data-types/propulsion-type-array",
"description": "Array of propulsion types, allowing multiple values.",
"items": {
"$ref": "#/$defs/data-types_propulsion-type"
},
"type": "array",
"uniqueItems": true,
"x-stoplight": {
"id": "4ao4xw23z8wrf"
}
},
"data-types_string": {
"title": "data-types/string",
"description": "A length-limited string type.",
"maxLength": 255,
"pattern": "^(.*)$",
"type": "string",
"x-stoplight": {
"id": "2vqv7166161kh"
}
},
"data-types_timestamp": {
"title": "data-types/timestamp",
"description": "Integer milliseconds since Unix epoch.",
"minimum": 1514764800000,
"multipleOf": 1,
"type": "number",
"x-stoplight": {
"id": "vliol1hqlxw6y"
}
},
"data-types_uuid": {
"title": "data-types/uuid",
"description": "A UUID used to uniquely identity an object.",
"type": "string",
"x-stoplight": {
"id": "np9kodwmy2kqa"
},
"format": "uuid",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
},
"data-types_uuid-array": {
"title": "data-types/uuid-array",
"description": "Array of UUID.",
"type": "array",
"x-stoplight": {
"id": "v932clitbqv31"
},
"uniqueItems": true,
"items": {
"$ref": "#/$defs/data-types_uuid"
}
},
"data-types_vehicle-state": {
"title": "data-types/vehicle-state",
"description": "The state of a vehicle.",
"type": "string",
"x-stoplight": {
"id": "3j1h7u4vvc7kr"
},
"enum": [
"removed",
"available",
"non_operational",
"reserved",
"on_trip",
"stopped",
"non_contactable",
"missing",
"elsewhere"
]
},
"data-types_vehicle-type": {
"title": "data-types/vehicle-type",
"description": "The allowed types of of vehicles in MDS. Based off of `form_factor` in [GBFS vehicle_types](https://github.com/MobilityData/gbfs/blob/master/gbfs.md#vehicle_typesjson), with some additional to support MDS modes.",
"type": "string",
"x-stoplight": {
"id": "gbhhyditnvs5w"
},
"enum": [
"bicycle",
"bus",
"cargo_bicycle",
"car",
"delivery_robot",
"moped",
"motorcycle",
"scooter_standing",
"scooter_seated",
"truck",
"other"
]
},
"data-types_vehicle-type-array": {
"title": "data-types/vehicle-type-array",
"description": "An array of `vehicle_type`.",
"type": "array",
"x-stoplight": {
"id": "85v330buxsong"
},
"uniqueItems": true,
"items": {
"$ref": "#/$defs/data-types_vehicle-type"
}
},
"policy-rule": {
"title": "models/policy-rule",
"description": "An individual rule in a policy.",
"type": "object",
"x-stoplight": {
"id": "dvai555b3tcm8"
},
"additionalProperties": false,
"required": [
"name",
"rule_id",
"rule_type",
"geographies",
"states"
],
"$defs": {
"states": {
"type": "object",
"description": "Vehicle state to which this rule applies. Optionally provide a list of specific vehicle events as a subset of a given state for the rule to apply to. An empty list or null/absent defaults to \"all\" for the state.",
"propertyNames": {
"$ref": "#/$defs/data-types_vehicle-state"
},
"patternProperties": {
"": {
"type": "array",
"uniqueItems": true,
"items": {
"$ref": "#/$defs/data-types_event-type"
}
}
}
}
},
"properties": {
"name": {
"$ref": "#/$defs/data-types_string",
"description": "Name of rule"
},
"rule_id": {
"$ref": "#/$defs/data-types_uuid",
"description": "Unique ID of rule"
},
"rule_type": {
"type": "string",
"description": "The type of rule"
},
"geographies": {
"$ref": "#/$defs/data-types_uuid-array",
"description": "List of Geography UUIDs (non-overlapping) specifying the covered geography.",
"minItems": 1
},
"states": {
"$ref": "#/$defs/states"
},
"rule_units": {
"type": [
"string",
"null"
],
"description": "Measured units of policy"
},
"vehicle_types": {
"$ref": "#/$defs/data-types_vehicle-type-array",
"description": "Applicable vehicle types, default \"all\""
},
"propulsion_types": {
"$ref": "#/$defs/data-types_propulsion-type-array",
"description": "Applicable vehicle propulsion types, default \"all\""
},
"minimum": {
"type": [
"null",
"integer"
],
"description": "Minimum value, if applicable (default 0)",
"default": 0
},
"maximum": {
"type": [
"null",
"integer"
],
"description": "Maximum value, if applicable (default unlimited)"
},
"inclusive_minimum": {
"type": [
"null",
"boolean"
],
"description": "Whether the rule minimum is considered in-bounds (default true)",
"default": true
},
"inclusive_maximum": {
"type": [
"null",
"boolean"
],
"description": "Whether the rule maximum is considered in-bounds (default true)",
"default": true
},
"rate_amount": {
"type": [
"null",
"integer"
],
"description": "The amount of the rate."
},
"rate_recurrence": {
"type": [
"null",
"string"
],
"description": "Recurrence of the rate"
},
"rate_applies_when": {
"type": [
"null",
"string"
],
"description": "Specifies when a rate is applied to a rule (defaults to `out_of_bounds`).",
"enum": [
"in_bounds",
"out_of_bounds"
],
"default": "out_of_bounds"
},
"start_time": {
"$ref": "#/$defs/data-types_iso-time",
"description": "Beginning time-of-day when the rule is in effect (default 00:00:00)",
"default": "00:00:00"
},
"end_time": {
"$ref": "#/$defs/data-types_iso-time",
"description": "Ending time-of-day when the rule is in effect (default 23:59:59)",
"default": "23:59:59"
},
"days": {
"$ref": "#/$defs/data-types_days",
"description": "Days when the rule is in effect (default all)"
},
"messages": {
"type": [
"null",
"object"
],
"description": "Message to rider user, if desired, in various languages, keyed by [BCP 47](https://www.rfc-editor.org/rfc/bcp/bcp47.txt) language tag.",
"propertyNames": {
"$ref": "#/$defs/data-types_language-tag"
}
},
"value_url": {
"type": [
"null",
"string"
],
"description": "URL to an API endpoint that can provide dynamic information for the measured value",
"format": "uri"
}
},
"oneOf": [
{
"title": "Device count rule",
"required": [
"rule_units"
],
"properties": {
"rule_type": {
"const": "count"
},
"rule_units": {
"type": "string",
"const": "devices"
},
"rate_recurrence": {
"enum": [
"once_on_match",
"once_on_unmatch"
]
}
}
},
{
"title": "Speed rule",
"required": [
"rule_units"
],
"properties": {
"rule_type": {
"const": "speed"
},
"rule_units": {
"type": "string",
"enum": [
"mph",
"kph"
]
},
"rate_recurrence": {
"enum": [
"once_on_match",
"once_on_unmatch"
]
}
}
},
{
"title": "Time rule",
"required": [
"rule_units"
],
"properties": {
"rule_type": {
"const": "time"
},
"rule_units": {
"type": "string",
"enum": [
"seconds",
"minutes",
"hours",
"days"
]
},
"rate_recurrence": {
"enum": [
"each_time_unit",
"per_complete_time_unit"
]
}
}
},
{
"title": "User rule",
"properties": {
"rule_type": {
"const": "user"
},
"rule_units": {
"type": "null"
},
"rate_amount": {
"type": "null"
},
"rate_recurrence": {
"type": "null"
},
"rate_applies_when": {
"type": "null"
}
}
}
]
}
}
}
Work with this as data
Every JSON Schema 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 schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.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.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/open-mobility-foundation-policy"
All schemas
curl "https://apis.io/api/v1/json-schemas?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.