{
  "$id": "https://app.autodeskforma.com/forma-element-schema/v1.json",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Forma Element",
  "description": "Learn more about the element system here: https://aps.autodesk.com/en/docs/forma/v1/working-with-forma/element-system/\n",
  "type": "object",
  "properties": {
    "urn": {
      "description": "Unique Resource Name (URN) for an element, used to identify a specific\nrevision of an element.\n\nThe element URN scheme is `urn:adsk-forma-elements:{system}:{authcontext}:{id}:{revision}`.\n",
      "$ref": "#/$defs/Urn"
    },
    "metadata": {
      "description": "Metadata about an element. Does not describe the element itself, but\nrather the context in which it has been created/updated and potential\nlicensing information.\n",
      "$ref": "#/$defs/Metadata"
    },
    "properties": {
      "description": "Properties of an element are inherent attributes which are independent\nof the representation used to interpret its geometry.\n\nFor example, setting an element's `virtual` property to `true` will\nindicate that the element should not be included as a physical object\nwhich e.g.  blocks sun rays -- regardless of which representation you\nare looking at.\n",
      "$ref": "#/$defs/Properties"
    },
    "representations": {
      "description": "Representations provide ways for an element to be interpreted. An\nelement can have zero, one, or several representations which unlock\ndifferent functionality.\n\nSee:\nhttps://aps.autodesk.com/en/docs/forma/v1/working-with-forma/element-system/forma-element-specification/#representations\n",
      "$ref": "#/$defs/Representations"
    },
    "children": {
      "description": "An element can include other elements as children, which results in\na tree structure. Elements may be referenced multiple times, with\ndifferent transforms and under different parents.\n\nSee:\nhttps://aps.autodesk.com/en/docs/forma/v1/working-with-forma/element-system/forma-element-specification/#children\n",
      "type": "array",
      "items": {
        "$ref": "#/$defs/Child"
      }
    }
  },
  "required": [
    "urn"
  ],
  "$defs": {
    "Urn": {
      "type": "string",
      "pattern": "^urn:adsk-forma-elements:[A-Za-z\\d_\\-]{1,100}:[A-Za-z\\d_\\-]{1,100}:[A-Za-z\\d_\\-+]{1,100}:[A-Za-z\\d_\\-]{1,100}$",
      "description": "Unique Resource Name (URN) for an element, used to identify a specific\nrevision of an element.\n\nThe element URN scheme is `urn:adsk-forma-elements:{system}:{authcontext}:{id}:{revision}`.\n",
      "examples": [
        "urn:adsk-forma-elements:basic:myauthcontext:myelementid:myrevision"
      ]
    },
    "Metadata": {
      "type": "object",
      "properties": {
        "predecessor": {
          "$ref": "#/$defs/Urn",
          "description": "Pointer to the previous revision of this element."
        },
        "createdAt": {
          "type": "string",
          "description": "Creation timestamp, in ISO8601 datetime format.",
          "format": "date-time",
          "examples": [
            "2023-10-03T13:37:00.000Z"
          ]
        },
        "createdBy": {
          "type": "string"
        },
        "licensing": {
          "$ref": "#/$defs/Licensing",
          "description": "Information related to the licensing governing the use and transfer of this element."
        }
      }
    },
    "Properties": {
      "type": "object",
      "properties": {
        "category": {
          "type": "string",
          "description": "The category is used to indicate the user intent of the element. It can\nbe used to group and filter top-level elements in the UI.\n\nThe category is a string, and can be any value.\n",
          "examples": [
            "building",
            "site_limit",
            "vegetation",
            "road",
            "terrain"
          ]
        },
        "noiseIgnore": {
          "description": "For elements with a `volumeMesh` representation, this flag signals\nthat the element should be ignored when analyzing traffic noise. In\ncontrast to the `virtual` property, it does _not_ imply that the\nelement isn't a physical object -- just that it does not block\nnoise.\n\nTypically used for vegetation elements, since it is common practice\nto ignore vegetation when performing traffic noise analysis.\n",
          "type": "boolean",
          "default": false
        },
        "treatAsVegetationInWindAnalysis": {
          "description": "If true, and if the element has a `volumeMesh` representation, the\nwind analysis will interpret the element as vegetation modelled as a\nporous medium. See\n[this help center article](https://help.autodeskforma.com/autodeskforma/en/articles/6932520-detailed-wind-analysis#h_0d2614b60e)\nfor details about the implementation.\n",
          "type": "boolean",
          "default": false
        },
        "virtual": {
          "description": "This field can be used to identify something that isn't real, like a\nconstraint or an illustrative boy with balloon. If this is set,\nanalyses and possibly other modes will ignore the element.\n",
          "type": "boolean",
          "default": false
        },
        "functionId": {
          "deprecated": true,
          "description": "Deprecated: This field is being removed. Function tagging will be\nre-introduced using a new concept.\n\nThis field will assign a function to the element, which will dictate\nthe color with which it is rendered in addition to providing\nfunction breakdowns in Area Metrics.\n",
          "type": "string",
          "examples": [
            "residential",
            "commercial",
            "unspecified"
          ]
        },
        "trafficData": {
          "$ref": "#/$defs/TrafficData",
          "description": "Providing this field will include the element as a noise source in the rapid and detailed noise analysis."
        }
      },
      "additionalProperties": true
    },
    "Representations": {
      "type": "object",
      "additionalProperties": {
        "$ref": "#/$defs/Representation"
      }
    },
    "BinaryRepresentations": {
      "type": "object",
      "properties": {
        "volumeMesh": {
          "description": "The volume mesh is a visual representation of the element based on a\ntriangulated polygon mesh consisting of vertices, edges and faces. All\nelements which represent visible 3d objects are expected to support this\nrepresentation.\n\nSee:\nhttps://aps.autodesk.com/en/docs/forma/v1/working-with-forma/element-system/forma-element-specification/#volumemesh\n"
        },
        "semanticMesh": {
          "description": "Like volume mesh, semantic mesh is a triangulated mesh representation\nin the form of a glb file. But individual parts of the building\ngeometry can also be tagged with additional metadata such as unit\nidentifiers and geometry types.\n\nThe primary goal of the representation is to allow producers to attach\nmetadata which enables detailed stats and filtering in analyses.\n\nSee:\nhttps://aps.autodesk.com/en/docs/forma/v1/working-with-forma/element-system/forma-element-specification/#semanticmesh\n"
        }
      }
    },
    "JsonRepresentations": {
      "type": "object",
      "properties": {
        "grossFloorAreaPolygons": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/GrossFloorAreaPolygon"
          },
          "description": "The complete gross floor area of an element, consisting of a set of polygons\nwith correct 3D positioning in the building model.\n\nSee:\nhttps://aps.autodesk.com/en/docs/forma/v1/working-with-forma/element-system/forma-element-specification/#grossfloorareapolygons\n"
        },
        "terrainShape": {
          "description": "This representation is used for visualizing 2d vector shapes on the\nterrain, useful for visualizing roads, parking, zoning, etc..\n\nSee:\nhttps://aps.autodesk.com/en/docs/forma/v1/working-with-forma/element-system/forma-element-specification/#terrainshape\n",
          "tsType": "GeoJson.FeatureCollection<GeoJson.Geometry, TerrainShapeFeatureProperties>"
        },
        "footprint": {
          "description": "A representation of the area on the ground that the element 'occupies' or\noverlaps with.\n\nSee:\nhttps://aps.autodesk.com/en/docs/forma/v1/working-with-forma/element-system/forma-element-specification/#footprint\n",
          "tsType": "GeoJson.FeatureCollection<GeoJson.Polygon | GeoJson.LineString>"
        },
        "volume25DCollection": {
          "description": "This representation gives you a 2.5D geojson representation of the\nelement. An element can point to several features in the geojson, so\nto correctly get all the features for the element, you need to find\nall features that _start with_ the id.\n\nSee:\nhttps://aps.autodesk.com/en/docs/forma/v1/working-with-forma/element-system/forma-element-specification/#volume25dcollection\n",
          "$ref": "#/$defs/Volume25DCollection"
        },
        "graphBuilding": {
          "description": "A representation of a building as a vertical and horizontal partitioning of space.\nThe building contains a collection of ordered levels with non-intersecting spaces dividing the level and\na collection of units - potentially spanning multiple levels - which are composed of spaces.\n",
          "$ref": "#/$defs/GraphBuilding"
        }
      },
      "required": [
        "grossFloorAreaPolygons",
        "terrainShape",
        "footprint",
        "volume25DCollection",
        "graphBuilding"
      ]
    },
    "Child": {
      "type": "object",
      "properties": {
        "urn": {
          "$ref": "#/$defs/Urn",
          "description": "Unique Resource Name (URN) for an element, used to identify a specific\nrevision of an element.\n\nThe element URN scheme is `urn:adsk-forma-elements:{system}:{authcontext}:{id}:{revision}`.\n"
        },
        "key": {
          "type": "string",
          "description": "Unique id under parent. Used to build up paths. Prefer short values for space efficiency."
        },
        "transform": {
          "$ref": "#/$defs/Transform",
          "description": "Flat array of 16 numbers representing column-major 4x4 affine matrix.\nTranslation values use metres as unit.\n\nThe matrix is applied to the element's geometry, and the resulting\ngeometry is then transformed by the parent's matrix.\n\nSee:\nhttps://aps.autodesk.com/en/docs/forma/v1/working-with-forma/element-system/forma-element-specification/#transformation-matrix\n"
        },
        "name": {
          "type": "string",
          "description": "User defined naming of this specific reference, typically used to distinguish elements in eg. UI listings"
        }
      },
      "required": [
        "urn",
        "key"
      ]
    },
    "Transform": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "minItems": 16,
      "maxItems": 16,
      "default": [
        1,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        0,
        1
      ]
    },
    "Representation": {
      "oneOf": [
        {
          "$ref": "#/$defs/LinkedRepresentation"
        },
        {
          "$ref": "#/$defs/EmbeddedJsonRepresentation"
        },
        {
          "$ref": "#/$defs/EmbeddedBinaryRepresentation"
        }
      ]
    },
    "RepresentationSelection": {
      "description": "The underlying data for a representation can be shared\nacross multiple elements/representations.\n\nThis field, if present, should be used to select the relevant parts\nfrom the data that belongs to this representation. The exact details\nis specific for the representation/format, but in most cases this\nis used with an ID in the data and comparing it against this value\nusing the specified operator.\n",
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "type": {
              "enum": [
                "equals"
              ]
            },
            "value": {
              "description": "The relevant data for the representation will be under this value.\n",
              "type": "string"
            }
          },
          "required": [
            "type",
            "value"
          ]
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "enum": [
                "startsWith"
              ]
            },
            "value": {
              "description": "Any value with this prefix is relevant for the representation.\n",
              "type": "string"
            }
          },
          "required": [
            "type",
            "value"
          ]
        }
      ]
    },
    "LinkedRepresentation": {
      "type": "object",
      "title": "LinkedRepresentation",
      "description": "The data for a linked representation must be fetched by\na separate API using the blob ID.\n",
      "properties": {
        "type": {
          "enum": [
            "linked"
          ]
        },
        "blobId": {
          "type": "string",
          "description": "Blob ID. Used to retrieve the data for this representation."
        },
        "selection": {
          "$ref": "#/$defs/RepresentationSelection"
        },
        "properties": {
          "type": "object",
          "description": "Additional information about the representation.",
          "additionalProperties": true
        }
      },
      "required": [
        "type",
        "blobId"
      ],
      "additionalProperties": false
    },
    "EmbeddedJsonRepresentation": {
      "type": "object",
      "title": "EmbeddedJsonRepresentation",
      "description": "The data for an embedded representation can be accessed directly under the `data` key.\n",
      "properties": {
        "type": {
          "enum": [
            "embedded-json"
          ]
        },
        "data": {},
        "selection": {
          "$ref": "#/$defs/RepresentationSelection"
        },
        "properties": {
          "type": "object",
          "description": "Additional information about the representation.",
          "additionalProperties": true
        }
      },
      "required": [
        "type",
        "data"
      ]
    },
    "EmbeddedBinaryRepresentation": {
      "type": "object",
      "title": "EmbeddedBinaryRepresentation",
      "description": "The data for an embedded representation can be accessed directly under the `data` key.\n",
      "properties": {
        "type": {
          "enum": [
            "embedded-binary"
          ]
        },
        "data": {
          "type": "string",
          "contentEncoding": "base64"
        },
        "selection": {
          "$ref": "#/$defs/RepresentationSelection"
        },
        "properties": {
          "type": "object",
          "description": "Additional information about the representation.",
          "additionalProperties": true
        }
      },
      "required": [
        "type",
        "data"
      ]
    },
    "BaseTrafficData": {
      "type": "object",
      "description": "Base object for traffic data. Currently used for rail and road traffic data.\n",
      "properties": {
        "speed": {
          "description": "Average speed in km/h. Often proxied by the speed limit",
          "type": "number"
        },
        "adt": {
          "description": "Annual average daily traffic",
          "type": "number"
        },
        "adtDistribution": {
          "description": "Annual average daily traffic distribution. All values must sum to 100",
          "type": "object",
          "properties": {
            "dayPercentage": {
              "description": "Percentage of traffic during the day (07:00-19:00). Number between 0 and 100",
              "type": "number"
            },
            "eveningPercentage": {
              "description": "Percentage of traffic during the evening (19:00-23:00). Number between 0 and 100",
              "type": "number"
            },
            "nightPercentage": {
              "description": "Percentage of traffic during the night (23:00-07:00). Number between 0 and 100",
              "type": "number"
            }
          }
        }
      }
    },
    "RailTrafficData": {
      "type": "object",
      "title": "RailTrafficData",
      "description": "Properties required for rail traffic data\n",
      "allOf": [
        {
          "$ref": "#/$defs/BaseTrafficData"
        },
        {
          "type": "object",
          "properties": {
            "railType": {
              "type": "string",
              "description": "Type of rail traffic. Note: The `subway` and `train` properties are used for the beta \nand will be removed in future releases.\n",
              "enum": [
                "train",
                "subway",
                "high_speed",
                "regional",
                "tram"
              ]
            },
            "vehicleLength": {
              "description": "Length of the vehicle in meters. Note: This property is used for the beta and will \nbe removed in future releases.\n",
              "type": "number",
              "deprecated": true
            }
          }
        }
      ]
    },
    "RoadTrafficData": {
      "type": "object",
      "title": "RoadTrafficData",
      "description": "Properties required for road traffic data\n",
      "allOf": [
        {
          "$ref": "#/$defs/BaseTrafficData"
        },
        {
          "type": "object",
          "properties": {
            "heavyVehiclePercentage": {
              "description": "Percentage of heavy-duty vehicles, motor home vehicles, buses, with three or more axles. Number between 0 and 100",
              "type": "number"
            }
          }
        }
      ]
    },
    "TrafficData": {
      "type": "object",
      "anyOf": [
        {
          "$ref": "#/$defs/RoadTrafficData"
        },
        {
          "$ref": "#/$defs/RailTrafficData"
        }
      ]
    },
    "GrossFloorAreaPolygon": {
      "description": "Object representing a floor, with a polygon defining its shape and\nrelevant metadata describing its contribution to gross floor area\ncalculations.\n",
      "type": "object",
      "properties": {
        "grossFloorPolygon": {
          "$ref": "#/$defs/MultiRingPolygon",
          "description": "2D polygon which defines the shape of the floor.\n\nThe first entry in the list MUST be a counterclockwise polygon\nrepresenting the outline of the area. Any following members MUST have a\nclockwise winding, and represent holes in the polygon.\n"
        },
        "elevation": {
          "type": "number",
          "description": "Elevation of the polygon, relative to elevation of containing element.\n\nExample: If a building with two floors is modeled as a single element with two gfa polygons, the first floor\npolygon would have elevation 0 (resolves to same elevation as building element) while the second floor polygon\nwould have a positive, non-zero value for elevation. The absolute elevation of a polygon is resolved by applying\nthe chain of transformation matrices following the element tree, before adding the relative polygon elevation.\n"
        },
        "areaType": {
          "$ref": "#/$defs/GrossFloorAreaType",
          "description": "Type of area whose aggregated gross area the floor contributes towards."
        }
      },
      "required": [
        "grossFloorPolygon",
        "elevation"
      ]
    },
    "MultiRingPolygon": {
      "type": "array",
      "items": {
        "description": "Ring",
        "type": "array",
        "items": {
          "description": "Point",
          "type": "array",
          "items": {
            "type": "number"
          },
          "minItems": 2,
          "maxItems": 2
        }
      }
    },
    "GrossFloorAreaType": {
      "enum": [
        "CORE",
        "CORRIDOR",
        "LIVING_UNIT",
        "UNASSIGNED"
      ],
      "default": "UNASSIGNED"
    },
    "Volume25D": {
      "type": "object",
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "Feature"
          ]
        },
        "id": {
          "type": "string",
          "description": "Formatted as `<floorId>+<shortId>`"
        },
        "geometry": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "Polygon"
              ]
            },
            "coordinates": {
              "$ref": "#/$defs/MultiRingPolygon"
            }
          },
          "required": [
            "type",
            "coordinates"
          ]
        },
        "properties": {
          "type": "object",
          "properties": {
            "height": {
              "type": "number",
              "description": "Height of the volume, in meters."
            },
            "elevation": {
              "type": "number",
              "description": "Elevation of the volume, in meters, relative to elevation of containing element.\nExample: If a building with two floors is modeled as a single element with two volumes in the collection, the first floor\nvolume would have elevation 0 (resolves to same elevation as building element) while the second floor volume\nwould have a positive, non-zero value for elevation. The absolute elevation of a volume is resolved by applying\nthe chain of transformation matrices following the element tree, before adding the relative volume elevation.\n"
            },
            "structure": {
              "oneOf": [
                {
                  "enum": [
                    "GENERATOR"
                  ]
                },
                {
                  "$ref": "#/$defs/GrossFloorAreaType"
                }
              ]
            }
          },
          "required": [
            "height"
          ]
        }
      },
      "required": [
        "type",
        "id",
        "geometry",
        "properties"
      ]
    },
    "Volume25DCollection": {
      "type": "object",
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "FeatureCollection"
          ]
        },
        "features": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/Volume25D"
          }
        }
      },
      "required": [
        "type",
        "features"
      ],
      "examples": [
        {
          "type": "FeatureCollection",
          "features": [
            {
              "id": "floor1+5a68908d133fe",
              "type": "Feature",
              "properties": {
                "height": 3,
                "elevation": 0
              },
              "geometry": {
                "type": "Polygon",
                "coordinates": []
              }
            },
            {
              "id": "floor2+a04f82b9db179",
              "type": "Feature",
              "properties": {
                "height": 3,
                "elevation": 3,
                "structure": "LIVING_UNIT"
              },
              "geometry": {
                "type": "Polygon",
                "coordinates": []
              }
            },
            {
              "id": "floor2+943c4dfd8feb1",
              "type": "Feature",
              "properties": {
                "height": 3,
                "elevation": 3,
                "structure": "LIVING_UNIT"
              },
              "geometry": {
                "type": "Polygon",
                "coordinates": []
              }
            }
          ]
        }
      ]
    },
    "GraphBuildingUnit": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "description": "Unique identifier for the unit"
        },
        "properties": {
          "type": "object",
          "properties": {
            "function": {
              "type": "string",
              "description": "The function of the unit, e.g. \"residential\", \"office\", \"retail\""
            },
            "program": {
              "type": "string",
              "description": "The program of the unit, e.g. \"apartment\", \"office\", \"store\""
            }
          }
        },
        "spaceIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "List of the ids of spaces that compose this unit."
        }
      },
      "required": [
        "id",
        "properties",
        "spaceIds"
      ]
    },
    "GraphBuildingCoSurface": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "description": "The id of the GraphBuildingCoSurface"
        },
        "partnerId": {
          "type": [
            "string",
            "null"
          ],
          "description": "The id of the GraphBuildingCoSurface with which this GraphBuildingCoSurface shares a GraphBuildingSurface. If null, the corresponding GraphBuildingSurface is a boundary GraphBuildingSurface."
        },
        "surfaceId": {
          "type": "string",
          "description": "The id of the surface that this GraphBuildingCoSurface refers to"
        },
        "directionAToB": {
          "type": "boolean",
          "description": "Whether the surface goes from pointA to pointB"
        }
      },
      "required": [
        "id",
        "partnerId",
        "surfaceId",
        "directionAToB"
      ]
    },
    "GraphBuildingSurface": {
      "type": "object",
      "description": "A vertically extruded surface defined by two XY points.",
      "properties": {
        "id": {
          "type": "string",
          "description": "The id of the surface"
        },
        "pointA": {
          "type": "string",
          "description": "The id of the point that defines the start of the surface"
        },
        "pointB": {
          "type": "string",
          "description": "The id of the point that defines the end of the surface"
        }
      },
      "required": [
        "id",
        "pointA",
        "pointB"
      ]
    },
    "GraphBuildingSpace": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "description": "The id of the GraphBuildingSpace"
        },
        "outerLoop": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/GraphBuildingCoSurface"
          },
          "description": "The outer loop of the space"
        },
        "innerLoops": {
          "type": "array",
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/GraphBuildingCoSurface"
            }
          },
          "description": "The inner loops (holes) of the space"
        }
      },
      "required": [
        "outerLoop",
        "id"
      ]
    },
    "GraphBuildingLevel": {
      "type": "object",
      "properties": {
        "height": {
          "type": "number",
          "description": "Height of the level, in meters."
        },
        "points": {
          "type": "object",
          "minProperties": 1,
          "additionalProperties": {
            "type": "array",
            "items": {
              "type": "number"
            },
            "minItems": 2,
            "maxItems": 2
          },
          "description": "Map of point id to point coordinates."
        },
        "spaces": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/GraphBuildingSpace"
          },
          "description": "List of spaces in the level"
        },
        "surfaces": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/GraphBuildingSurface"
          },
          "description": "List of surfaces in the level"
        }
      },
      "required": [
        "height",
        "points",
        "spaces",
        "surfaces"
      ]
    },
    "GraphBuilding": {
      "type": "object",
      "properties": {
        "units": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/GraphBuildingUnit"
          }
        },
        "levels": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/GraphBuildingLevel"
          }
        }
      },
      "required": [
        "units",
        "levels"
      ]
    },
    "TerrainShapeFeatureProperties": {
      "type": "object",
      "properties": {
        "fill": {
          "type": "object",
          "description": "Only supported for Polygon and MultiPolygon feature objects",
          "properties": {
            "color": {
              "type": "string",
              "description": "Color hex. E.g. `#ff0000`."
            },
            "opacity": {
              "type": "number",
              "minimum": 0,
              "maximum": 1
            }
          }
        },
        "stroke": {
          "type": "object",
          "properties": {
            "color": {
              "type": "string",
              "description": "Color hex. E.g. `#ff0000`."
            },
            "lineWidth": {
              "type": "number",
              "minimum": 0,
              "description": "In meters, not affected by element transform"
            }
          }
        }
      }
    },
    "Licensing": {
      "type": "object",
      "required": [
        "exportable",
        "attributions",
        "licenseUrl",
        "providerDescriptionUrl"
      ],
      "properties": {
        "exportable": {
          "type": "boolean",
          "description": "Whether or not data can be transferred out of Forma, for example by downloading a data file or sending a project to Revit."
        },
        "attributions": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/LicensingAttribution"
          },
          "description": "Attribution requirements that must be followed. Empty if there are no requirements"
        },
        "licenseUrl": {
          "type": "string",
          "description": "Link to the original license for the data"
        },
        "providerDescriptionUrl": {
          "type": "string",
          "description": "Link to the providers description on how the license should be interpreted. For auditing purposes."
        }
      },
      "examples": [
        {
          "exportable": true,
          "attributions": [
            {
              "action": "display",
              "content": "Open City Model is made available by BuildZero.Org under the Open Database License",
              "url": "http://opendatacommons.org/licenses/odbl/1.0/"
            },
            {
              "action": "transfer",
              "content": "Open City Model is made available by BuildZero.Org under the Open Database License",
              "url": "http://opendatacommons.org/licenses/odbl/1.0/"
            }
          ],
          "licenseUrl": "http://opendatacommons.org/licenses/odbl/1.0/",
          "providerDescriptionUrl": "https://github.com/opencitymodel/opencitymodel"
        }
      ]
    },
    "LicensingAttribution": {
      "type": "object",
      "required": [
        "action",
        "content",
        "url"
      ],
      "properties": {
        "action": {
          "type": "string",
          "enum": [
            "display",
            "transfer"
          ],
          "description": "We support two types of attribution actions, depending on what happens to the data:\n  - display: A watermark (clickable text) to be shown whenever data is displayed.\n  - transfer: Text to be shown to users (or put in LICENCE files or similar) whenever data is imported or exported.\n"
        },
        "content": {
          "type": "string"
        },
        "url": {
          "type": "string"
        }
      }
    }
  }
}