{
  "openapi": "3.1.0",
  "info": {
    "title": "RobotTraining.jobs open data",
    "version": "1.0.0",
    "summary": "Robot training job market data: open roles by kind of work and employer, and advertised hourly pay.",
    "description": "Free, read-only data on robot training jobs (paid work piloting, teaching, recording for and testing robots, autonomous vehicles and drones), measured daily from about 60 employers' public job feeds. No key, CORS enabled. Field reference: https://robottraining.jobs/data . License CC BY 4.0: credit RobotTraining.jobs and cite the date in temporal_coverage. The same data is available to AI assistants as a remote MCP server at https://robottraining.jobs/api/mcp .",
    "contact": {
      "name": "RobotTraining.jobs",
      "url": "https://robottraining.jobs/data",
      "email": "hello@robottraining.jobs"
    },
    "license": {
      "name": "CC BY 4.0",
      "identifier": "CC-BY-4.0"
    }
  },
  "externalDocs": {
    "description": "Field reference and terms",
    "url": "https://robottraining.jobs/data"
  },
  "servers": [
    {
      "url": "https://robottraining.jobs"
    }
  ],
  "paths": {
    "/roles.json": {
      "get": {
        "operationId": "getOpenRoles",
        "summary": "Open roles by kind of work and employer",
        "description": "How many robot training roles are open now, how many were first listed in the last 7 days and in each recent ISO week, and open roles by kind of work and by employer, with pay where at least three employers advertise a rate. Aggregates only: no individual roles.",
        "responses": {
          "200": {
            "description": "The open-roles document for the day in temporal_coverage.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RolesDocument"
                }
              }
            }
          }
        }
      }
    },
    "/pay.json": {
      "get": {
        "operationId": "getPayByWorkType",
        "summary": "Advertised hourly pay by kind of work",
        "description": "Median and typical (25th to 75th percentile) advertised hourly pay by kind of work, for each kind whose rate at least three employers advertise.",
        "responses": {
          "200": {
            "description": "The pay document for the day in temporal_coverage.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayDocument"
                }
              }
            }
          }
        }
      }
    },
    "/pay.csv": {
      "get": {
        "operationId": "getPayByWorkTypeCsv",
        "summary": "Advertised hourly pay by kind of work, as CSV",
        "description": "The same rows as /pay.json as a dated CSV file.",
        "responses": {
          "200": {
            "description": "CSV file.",
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "DocumentInfo": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "format": "uri",
            "description": "The page that renders the same numbers."
          },
          "license": {
            "type": "string",
            "format": "uri"
          },
          "measurement_technique": {
            "type": "string"
          },
          "updated": {
            "type": "string",
            "format": "date-time",
            "description": "When the job feeds were last read (UTC)."
          },
          "temporal_coverage": {
            "type": "string",
            "format": "date",
            "description": "The day the figures describe. Cite this date."
          }
        }
      },
      "PayBand": {
        "type": "object",
        "properties": {
          "currency": {
            "type": [
              "string",
              "null"
            ],
            "examples": [
              "USD"
            ]
          },
          "unit": {
            "type": [
              "string",
              "null"
            ],
            "examples": [
              "per hour"
            ]
          },
          "median": {
            "type": [
              "number",
              "null"
            ]
          },
          "typical_low": {
            "type": [
              "number",
              "null"
            ],
            "description": "25th percentile of advertised rates."
          },
          "typical_high": {
            "type": [
              "number",
              "null"
            ],
            "description": "75th percentile of advertised rates."
          },
          "rate_samples": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Distinct advertised rates measured, after removing relistings."
          },
          "platforms": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Platforms advertising those rates."
          }
        }
      },
      "PayDocument": {
        "allOf": [
          {
            "$ref": "#/components/schemas/DocumentInfo"
          },
          {
            "type": "object",
            "properties": {
              "pay_by_work_type": {
                "type": "array",
                "items": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/PayBand"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "slug": {
                          "type": "string"
                        },
                        "label": {
                          "type": "string"
                        },
                        "open_total": {
                          "type": "integer",
                          "description": "Open roles of that kind."
                        },
                        "unpriced": {
                          "type": "integer",
                          "description": "Open roles of that kind that state no rate."
                        }
                      }
                    }
                  ]
                }
              }
            }
          }
        ]
      },
      "RolesDocument": {
        "allOf": [
          {
            "$ref": "#/components/schemas/DocumentInfo"
          },
          {
            "type": "object",
            "properties": {
              "totals": {
                "type": "object",
                "properties": {
                  "open_roles": {
                    "type": "integer"
                  },
                  "platforms_live": {
                    "type": "integer"
                  },
                  "new_last_7d": {
                    "type": "integer"
                  },
                  "new_last_7d_measurement": {
                    "type": "string"
                  }
                }
              },
              "recent_market_momentum": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "unit": {
                    "type": "string"
                  },
                  "measurement": {
                    "type": "string"
                  },
                  "avg_new_roles_per_week": {
                    "type": "number"
                  },
                  "weeks_measured": {
                    "type": "integer"
                  },
                  "weekly": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "week_start": {
                          "type": "string",
                          "format": "date"
                        },
                        "new_roles": {
                          "type": "integer"
                        }
                      }
                    }
                  }
                }
              },
              "open_by_work_type": {
                "type": "array",
                "items": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/PayBand"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "slug": {
                          "type": "string"
                        },
                        "label": {
                          "type": "string"
                        },
                        "open_count": {
                          "type": "integer"
                        }
                      }
                    }
                  ]
                }
              },
              "open_by_platform": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "slug": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    },
                    "open_count": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          }
        ]
      }
    }
  }
}
