{
  "openapi": "3.1.0",
  "info": {
    "title": "Metix AI tools JSON contract",
    "version": "2026-10-30",
    "description": "Tool endpoint contract for the public site. Browser origin limits apply: same origin and configured Metix origins only; other browser origins receive 403. Requests without Origin are subject to the same validation and quotas. No caller API key. No access to upstream credentials. robots.txt disallows /api and responses carry X-Robots-Tag: noindex. Documentation does not widen access. Boolean generator and scorecard run only in the browser."
  },
  "servers": [
    {
      "url": "https://tools.metix.ai"
    }
  ],
  "paths": {
    "/api/gate": {
      "post": {
        "summary": "Add daily quota after work-email verification",
        "description": "Stores a work email under lead: with source quota_gate and adds the daily bonus on this network. contact_ok must be true. Does not send mail. Disposable and consumer inboxes are rejected. No unauthenticated export.",
        "responses": {
          "200": {
            "description": "Quota added"
          },
          "400": {
            "description": "invalid_input, consent_required, disposable_email, work_email_required, turnstile_required, or turnstile_failed"
          },
          "429": {
            "description": "email_cap or hard_limited"
          }
        }
      }
    },
    "/api/jd-checklist": {
      "post": {
        "summary": "jd-checklist",
        "description": "40 free attempts per network per UTC day, then a work email can add 40 more on that tool. 32 KiB maximum JSON body. Validation precedes quota consumption. Upstream failures may consume a run. Public profile data is self-reported; no contact details. Talent moves and People Router may include public LinkedIn profile URLs. Cache-only misses do not consume a run.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "jd": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 20000
                  }
                },
                "required": [
                  "jd"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Tool result; empty arrays are valid, not fabricated rows.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "runs_left": {
                      "type": "integer",
                      "description": "Remaining daily attempts when a run was consumed; omitted for cache hits."
                    },
                    "missing": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_input",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "origin_not_allowed",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "not_cached (talent-moves cacheOnly)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "method_not_allowed",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "payload_too_large",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited; Retry-After header gives seconds until reset",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "Upstream failure; error code supplied",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "tool_offline",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "Upstream timeout",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/jd-to-boolean": {
      "post": {
        "summary": "jd-to-boolean",
        "description": "40 free attempts per network per UTC day, then a work email can add 40 more on that tool. 32 KiB maximum JSON body. Validation precedes quota consumption. Upstream failures may consume a run. Public profile data is self-reported; no contact details. Talent moves and People Router may include public LinkedIn profile URLs. Cache-only misses do not consume a run.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "jd": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 20000
                  }
                },
                "required": [
                  "jd"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Tool result; empty arrays are valid, not fabricated rows.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "runs_left": {
                      "type": "integer",
                      "description": "Remaining daily attempts when a run was consumed; omitted for cache hits."
                    },
                    "titles": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "must": {
                      "type": "array",
                      "items": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "nice": {
                      "type": "array",
                      "items": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "extra": {
                      "type": "array",
                      "items": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "locations": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "confidence": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_input",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "origin_not_allowed",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "not_cached (talent-moves cacheOnly)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "method_not_allowed",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "payload_too_large",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited; Retry-After header gives seconds until reset",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "Upstream failure; error code supplied",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "tool_offline",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "Upstream timeout",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/shortlist": {
      "post": {
        "summary": "shortlist",
        "description": "5 free attempts per network per UTC day, then a work email can add 10 more on that tool. 32 KiB maximum JSON body. Validation precedes quota consumption. Upstream failures may consume a run. Public profile data is self-reported; no contact details. Talent moves and People Router may include public LinkedIn profile URLs. Cache-only misses do not consume a run.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "jd": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 20000
                  }
                },
                "required": [
                  "jd"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Tool result; empty arrays are valid, not fabricated rows.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "runs_left": {
                      "type": "integer",
                      "description": "Remaining daily attempts when a run was consumed; omitted for cache hits."
                    },
                    "profiles": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "name": {
                            "type": "string"
                          },
                          "title": {
                            "type": "string"
                          },
                          "company": {
                            "type": "string"
                          },
                          "location": {
                            "type": "string"
                          }
                        },
                        "additionalProperties": true
                      }
                    },
                    "icp_attrs": {
                      "type": "array",
                      "description": "Source-labeled ICP details in the same order as icp; values match icp one-to-one.",
                      "items": {
                        "type": "object",
                        "required": [
                          "label",
                          "value"
                        ],
                        "properties": {
                          "label": {
                            "type": "string"
                          },
                          "value": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "icp": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "query": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_input",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "origin_not_allowed",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "not_cached (talent-moves cacheOnly)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "method_not_allowed",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "payload_too_large",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited; Retry-After header gives seconds until reset",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "Upstream failure; error code supplied",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "tool_offline",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "Upstream timeout",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/talent-map": {
      "post": {
        "summary": "talent-map",
        "description": "5 free attempts per network per UTC day, then a work email can add 10 more on that tool. 32 KiB maximum JSON body. Validation precedes quota consumption. Upstream failures may consume a run. Public profile data is self-reported; no contact details. Talent moves and People Router may include public LinkedIn profile URLs. Cache-only misses do not consume a run.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "company": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "title": {
                    "type": "string",
                    "maxLength": 200
                  },
                  "country": {
                    "type": "string",
                    "description": "ISO-3166 alpha-2. Omitted or blank defaults to US. UK is accepted as GB.",
                    "pattern": "^[A-Za-z]{2}$",
                    "default": "US"
                  }
                },
                "required": [
                  "company"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Tool result; empty arrays are valid, not fabricated rows.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "runs_left": {
                      "type": "integer",
                      "description": "Remaining daily attempts when a run was consumed; omitted for cache hits."
                    },
                    "profiles": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "name": {
                            "type": "string"
                          },
                          "title": {
                            "type": "string"
                          },
                          "company": {
                            "type": "string"
                          },
                          "location": {
                            "type": "string"
                          }
                        },
                        "additionalProperties": true
                      }
                    },
                    "filtered": {
                      "type": "integer"
                    },
                    "disclaimer": {
                      "type": "string"
                    },
                    "country": {
                      "type": "string",
                      "description": "ISO-3166 alpha-2 applied to this sample."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_input",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "origin_not_allowed",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "not_cached (talent-moves cacheOnly)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "method_not_allowed",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "payload_too_large",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited; Retry-After header gives seconds until reset",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "Upstream failure; error code supplied",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "tool_offline",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "Upstream timeout",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/talent-moves": {
      "post": {
        "summary": "talent-moves",
        "description": "5 free attempts per network per UTC day, then a work email can add 10 more on that tool. 32 KiB maximum JSON body. Validation precedes quota consumption. Upstream failures may consume a run. Public profile data is self-reported; no contact details. Talent moves and People Router may include public LinkedIn profile URLs. Cache-only misses do not consume a run.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "company": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "window": {
                    "type": "integer",
                    "enum": [
                      3,
                      6,
                      12,
                      24
                    ]
                  },
                  "cacheOnly": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "company",
                  "window"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Tool result; empty arrays are valid, not fabricated rows.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "runs_left": {
                      "type": "integer",
                      "description": "Remaining daily attempts when a run was consumed; omitted for cache hits."
                    },
                    "rows": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "name": {
                            "type": "string"
                          },
                          "title": {
                            "type": "string"
                          },
                          "previous_title": {
                            "type": "string"
                          },
                          "from": {
                            "type": "string"
                          },
                          "to": {
                            "type": "string"
                          },
                          "date": {
                            "type": "string"
                          },
                          "direction": {
                            "type": "string"
                          },
                          "linkedin": {
                            "type": "string"
                          },
                          "location": {
                            "type": "string"
                          }
                        },
                        "additionalProperties": true
                      }
                    },
                    "sample_size": {
                      "type": "integer"
                    },
                    "fetched_at": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_input",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "origin_not_allowed",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "not_cached (talent-moves cacheOnly)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "method_not_allowed",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "payload_too_large",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited; Retry-After header gives seconds until reset",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "Upstream failure; error code supplied",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "tool_offline",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "Upstream timeout",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/who-is-hiring": {
      "post": {
        "summary": "who-is-hiring",
        "description": "5 free attempts per network per UTC day, then a work email can add 10 more on that tool. 32 KiB maximum JSON body. Validation precedes quota consumption. Upstream failures may consume a run. Public profile data is self-reported; no contact details. Talent moves and People Router may include public LinkedIn profile URLs. Cache-only misses do not consume a run.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "country": {
                    "type": "string",
                    "pattern": "^[A-Za-z]{2}$"
                  },
                  "city": {
                    "type": "string",
                    "maxLength": 200
                  }
                },
                "required": [
                  "title",
                  "country"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Tool result; empty arrays are valid, not fabricated rows.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "runs_left": {
                      "type": "integer",
                      "description": "Remaining daily attempts when a run was consumed; omitted for cache hits."
                    },
                    "jobs": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "title": {
                            "type": "string"
                          },
                          "company_name": {
                            "type": "string"
                          },
                          "location": {
                            "type": "string"
                          },
                          "posted_date": {
                            "type": "string"
                          },
                          "url": {
                            "type": "string"
                          }
                        },
                        "additionalProperties": true
                      }
                    },
                    "companies": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      }
                    },
                    "sample_size": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_input",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "origin_not_allowed",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "not_cached (talent-moves cacheOnly)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "method_not_allowed",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "payload_too_large",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "rate_limited; Retry-After header gives seconds until reset",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "Upstream failure; error code supplied",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "tool_offline",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "Upstream timeout",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/jd-toolkit": {
      "post": {
        "summary": "jd-toolkit",
        "description": "40 free attempts per network per UTC day, then a work email can add 40 more on that tool. Reads the pasted job description only and returns a checklist, boolean terms, and an interview scorecard. No candidate search. 32 KiB maximum JSON body. Validation precedes quota consumption. Public profile data is self-reported; no contact details.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "jd": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 20000
                  }
                },
                "required": [
                  "jd"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Checklist, boolean terms, and scorecard. Empty arrays are valid.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "runs_left": {
                      "type": "integer"
                    },
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      }
                    },
                    "checklist": {
                      "type": "object",
                      "additionalProperties": true
                    },
                    "boolean": {
                      "type": "object",
                      "additionalProperties": true
                    },
                    "scorecard": {
                      "type": "object",
                      "additionalProperties": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_input"
          },
          "429": {
            "description": "rate_limited or gate_required"
          }
        }
      }
    },
    "/api/people-router": {
      "post": {
        "summary": "Route a hiring brief into a public candidate shortlist",
        "description": "Five searches per network per UTC day; the existing work-email gate adds ten. Local plan previews use no search allowance. Briefs and results are not persisted or put in URLs. Uses public professional fields only, never email or phone. Optional GitHub repository contributor evidence is separate from candidate identity. Upstream failures may consume a run.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "brief": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 5000
                  },
                  "planOnly": {
                    "type": "boolean",
                    "default": false
                  }
                },
                "required": [
                  "brief"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "planOnly returns an approach without a search or quota charge. A full run returns a bounded sample; empty profiles are a valid result. GitHub failure never removes a Mira result.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/PeopleRouterPreview"
                    },
                    {
                      "$ref": "#/components/schemas/PeopleRouterResult"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "invalid_input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PeopleRouterError"
                }
              }
            }
          },
          "403": {
            "description": "origin_not_allowed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PeopleRouterError"
                }
              }
            }
          },
          "405": {
            "description": "method_not_allowed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PeopleRouterError"
                }
              }
            }
          },
          "413": {
            "description": "payload_too_large",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PeopleRouterError"
                }
              }
            }
          },
          "429": {
            "description": "gate_required (work email can add ten daily runs), hard_limited, or rate_limited",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PeopleRouterError"
                }
              }
            }
          },
          "401": {
            "description": "auth_failed from the sample service",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PeopleRouterError"
                }
              }
            }
          },
          "402": {
            "description": "quota_exhausted from the sample service",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PeopleRouterError"
                }
              }
            }
          },
          "502": {
            "description": "upstream_error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PeopleRouterError"
                }
              }
            }
          },
          "503": {
            "description": "tool_offline, upstream_error, quota_busy, or circuit_open",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PeopleRouterError"
                }
              }
            }
          },
          "504": {
            "description": "upstream_timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PeopleRouterError"
                }
              }
            }
          }
        }
      }
    },
    "/api/jd-brief": {
      "post": {
        "summary": "Extract reviewed hiring facts from multi-source intake",
        "description": "40 attempts per network/session per UTC day, shared by extraction, URL import and optional ASR. capabilities is free. JSON max 96 KiB. Source text is never persisted. Public HTML allowlist: jobs.lever.co, boards.greenhouse.io, job-boards.greenhouse.io, jobs.ashbyhq.com, a subdomain of notion.site, and docs.google.com/document/d/(e/)?ID/pub. No credentials, custom ports, fragments or arbitrary hosts. Query parameters are removed; redirects are revalidated. HTML max 512 KiB / 8 seconds. Audio is disabled by default; when configured, accepts only canonical 44-byte-header PCM WAV, 16kHz mono, 16-bit, 1–60 seconds (max 1,920,044 bytes). A separate atomic global budget hard-caps ASR at 10 attempts/day. No third-party paid API keys.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "object",
                    "required": [
                      "action"
                    ],
                    "properties": {
                      "action": {
                        "type": "string",
                        "enum": [
                          "capabilities"
                        ]
                      }
                    }
                  },
                  {
                    "type": "object",
                    "required": [
                      "action",
                      "url"
                    ],
                    "properties": {
                      "action": {
                        "type": "string",
                        "enum": [
                          "import-url"
                        ]
                      },
                      "url": {
                        "type": "string",
                        "format": "uri",
                        "maxLength": 2048
                      }
                    }
                  },
                  {
                    "type": "object",
                    "required": [
                      "action",
                      "sources"
                    ],
                    "properties": {
                      "action": {
                        "type": "string",
                        "enum": [
                          "extract"
                        ]
                      },
                      "sources": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 6,
                        "items": {
                          "$ref": "#/components/schemas/BriefSource"
                        },
                        "description": "Combined text cannot exceed 20,000 characters."
                      }
                    }
                  }
                ]
              }
            },
            "audio/wav": {
              "schema": {
                "type": "string",
                "format": "binary"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Source evidence, imported text, reviewed-transcript input, or audio availability. Drafts are composed from human-reviewed fields in the browser.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/BriefExtraction"
                    },
                    {
                      "type": "object",
                      "required": [
                        "ok",
                        "audio",
                        "max_audio_seconds"
                      ],
                      "properties": {
                        "ok": {
                          "type": "boolean"
                        },
                        "audio": {
                          "type": "boolean"
                        },
                        "max_audio_seconds": {
                          "type": "integer",
                          "enum": [
                            60
                          ]
                        }
                      }
                    },
                    {
                      "type": "object",
                      "required": [
                        "ok",
                        "source"
                      ],
                      "properties": {
                        "ok": {
                          "type": "boolean"
                        },
                        "source": {
                          "$ref": "#/components/schemas/BriefSource"
                        },
                        "runs_left": {
                          "type": "integer"
                        }
                      }
                    },
                    {
                      "type": "object",
                      "required": [
                        "ok",
                        "transcript"
                      ],
                      "properties": {
                        "ok": {
                          "type": "boolean"
                        },
                        "transcript": {
                          "type": "string",
                          "maxLength": 20000
                        },
                        "runs_left": {
                          "type": "integer"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid action, sources, URL or PCM WAV",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "ok",
                    "error"
                  ],
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    },
                    "retry_after": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Origin not allowed",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "ok",
                    "error"
                  ],
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    },
                    "retry_after": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "Request, page, or extracted text exceeds its limit",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "ok",
                    "error"
                  ],
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    },
                    "retry_after": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "415": {
            "description": "Only HTML is accepted for URL imports",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "ok",
                    "error"
                  ],
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    },
                    "retry_after": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "Page unavailable, unreadable or timed out",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "ok",
                    "error"
                  ],
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    },
                    "retry_after": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Run or shared audio quota reached",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "ok",
                    "error"
                  ],
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    },
                    "retry_after": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "Intake or transcription unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "ok",
                    "error"
                  ],
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    },
                    "retry_after": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Audio disabled or quota store unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "ok",
                    "error"
                  ],
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    },
                    "retry_after": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "504": {
            "description": "Transcription timeout; attempt may have been counted",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "ok",
                    "error"
                  ],
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "enum": [
                        false
                      ]
                    },
                    "error": {
                      "type": "string"
                    },
                    "retry_after": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/screen-playbook": {
      "post": {
        "summary": "Build an HR first-screen conversation playbook",
        "description": "Deterministic, no third-party or model calls. 20,000 characters per field, 40,000 total (UTF-16 units); JSON body at most 256 KiB. Resume and JD must be nonblank. History is optional. Validates before consuming quota. 40 builds per network/session/UTC day and 12 per minute; no email bonus. Source text and results are not persisted, cached, logged or sent to a lead form. Editing/export in the browser is free. If quota storage is absent, pure text generation remains available without runs_left. All facts require human review; no candidate rating or hiring decision.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "resume",
                  "jd"
                ],
                "properties": {
                  "resume": {
                    "type": "string",
                    "maxLength": 20000,
                    "minLength": 1
                  },
                  "jd": {
                    "type": "string",
                    "maxLength": 20000,
                    "minLength": 1
                  },
                  "history": {
                    "type": "string",
                    "maxLength": 20000
                  }
                }
              },
              "example": {
                "resume": "Experience: Built Python services.",
                "jd": "Role: Engineer\nRequirements: Python OR Go",
                "history": "Candidate: Notice period: Six weeks."
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Conversation guide with source references.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScreenPlaybook"
                }
              }
            }
          },
          "400": {
            "description": "invalid_input"
          },
          "403": {
            "description": "origin_not_allowed"
          },
          "405": {
            "description": "method_not_allowed"
          },
          "413": {
            "description": "payload_too_large"
          },
          "429": {
            "description": "gate_required or hard_limited; reason burst or quota and retry_after seconds. Wait for the reset; this page has no email gate."
          },
          "503": {
            "description": "quota_busy"
          }
        }
      }
    },
    "/tools/api/screen-playbook": {
      "post": {
        "summary": "Build an HR first-screen conversation playbook",
        "description": "Mounted alias; same counter and behavior as /api/screen-playbook. Deterministic, no third-party or model calls. 20,000 characters per field, 40,000 total (UTF-16 units); JSON body at most 256 KiB. Resume and JD must be nonblank. History is optional. Validates before consuming quota. 40 builds per network/session/UTC day and 12 per minute; no email bonus. Source text and results are not persisted, cached, logged or sent to a lead form. Editing/export in the browser is free. If quota storage is absent, pure text generation remains available without runs_left. All facts require human review; no candidate rating or hiring decision.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "resume",
                  "jd"
                ],
                "properties": {
                  "resume": {
                    "type": "string",
                    "maxLength": 20000,
                    "minLength": 1
                  },
                  "jd": {
                    "type": "string",
                    "maxLength": 20000,
                    "minLength": 1
                  },
                  "history": {
                    "type": "string",
                    "maxLength": 20000
                  }
                }
              },
              "example": {
                "resume": "Experience: Built Python services.",
                "jd": "Role: Engineer\nRequirements: Python OR Go",
                "history": "Candidate: Notice period: Six weeks."
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Conversation guide with source references.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScreenPlaybook"
                }
              }
            }
          },
          "400": {
            "description": "invalid_input"
          },
          "403": {
            "description": "origin_not_allowed"
          },
          "405": {
            "description": "method_not_allowed"
          },
          "413": {
            "description": "payload_too_large"
          },
          "429": {
            "description": "gate_required or hard_limited; reason burst or quota and retry_after seconds. Wait for the reset; this page has no email gate."
          },
          "503": {
            "description": "quota_busy"
          }
        }
      }
    }
  },
  "x-tools": [
    {
      "slug": "jd-brief",
      "processing": "worker-text-and-browser-review",
      "audio": "optional-workers-ai-disabled-by-default"
    },
    {
      "slug": "boolean-search-generator",
      "processing": "browser-local"
    },
    {
      "slug": "interview-scorecard",
      "processing": "browser-local"
    },
    {
      "slug": "jd-checklist",
      "processing": "worker-text"
    },
    {
      "slug": "jd-to-boolean",
      "processing": "worker-text"
    },
    {
      "slug": "jd-toolkit",
      "processing": "worker-text"
    },
    {
      "slug": "jd-shortlist",
      "processing": "sample-service"
    },
    {
      "slug": "who-is-hiring",
      "processing": "sample-service"
    },
    {
      "slug": "talent-map",
      "processing": "sample-service"
    },
    {
      "slug": "talent-moves",
      "processing": "sample-service"
    },
    {
      "slug": "people-router",
      "processing": "sample-service"
    },
    {
      "slug": "screen-playbook",
      "name": "HR screen playbook",
      "url": "https://tools.metix.ai/screen-playbook",
      "api": "/api/screen-playbook",
      "mode": "deterministic",
      "description": "Turn a candidate resume, a job brief and previous conversations into focused first-screen questions, source notes and a simple call script.",
      "processing": "worker-text-and-browser-review"
    }
  ],
  "components": {
    "schemas": {
      "PeopleRouterCriteria": {
        "type": "object",
        "properties": {
          "role": {
            "type": "string"
          },
          "location": {
            "type": "string"
          },
          "skills": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "companies": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "repositories": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "role",
          "location",
          "skills",
          "companies",
          "repositories"
        ],
        "additionalProperties": false
      },
      "PeopleRouterPlan": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "enum": [
                "brief",
                "mira",
                "github"
              ]
            },
            "title": {
              "type": "string"
            },
            "status": {
              "type": "string",
              "enum": [
                "planned",
                "completed",
                "empty",
                "skipped",
                "unavailable"
              ]
            },
            "detail": {
              "type": "string"
            }
          },
          "required": [
            "id",
            "title",
            "status",
            "detail"
          ],
          "additionalProperties": false
        }
      },
      "PeopleRouterProfile": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "company": {
            "type": "string"
          },
          "location": {
            "type": "string"
          },
          "linkedin": {
            "type": "string"
          },
          "why": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "verify": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "id",
          "name",
          "title",
          "company",
          "location",
          "linkedin",
          "why",
          "verify"
        ],
        "additionalProperties": false
      },
      "PeopleRouterGitHub": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "planned",
              "completed",
              "empty",
              "skipped",
              "unavailable"
            ]
          },
          "reason": {
            "type": "string"
          },
          "repository": {
            "type": "string"
          },
          "contributors": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "login": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "contributions": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "minimum": 0
                }
              },
              "required": [
                "login",
                "url",
                "contributions"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "status",
          "reason",
          "repository",
          "contributors"
        ],
        "additionalProperties": false
      },
      "PeopleRouterResult": {
        "type": "object",
        "properties": {
          "ok": {
            "const": true
          },
          "criteria": {
            "$ref": "#/components/schemas/PeopleRouterCriteria"
          },
          "plan": {
            "$ref": "#/components/schemas/PeopleRouterPlan"
          },
          "profiles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PeopleRouterProfile"
            },
            "maxItems": 10
          },
          "github": {
            "$ref": "#/components/schemas/PeopleRouterGitHub"
          },
          "runs_left": {
            "type": "integer",
            "minimum": 0
          },
          "quota_low": {
            "type": "boolean"
          }
        },
        "required": [
          "ok",
          "criteria",
          "plan",
          "profiles",
          "github",
          "runs_left"
        ],
        "additionalProperties": false
      },
      "PeopleRouterPreview": {
        "type": "object",
        "properties": {
          "ok": {
            "const": true
          },
          "criteria": {
            "$ref": "#/components/schemas/PeopleRouterCriteria"
          },
          "plan": {
            "$ref": "#/components/schemas/PeopleRouterPlan"
          }
        },
        "required": [
          "ok",
          "criteria",
          "plan"
        ],
        "additionalProperties": false
      },
      "PeopleRouterError": {
        "type": "object",
        "required": [
          "ok",
          "error"
        ],
        "properties": {
          "ok": {
            "const": false
          },
          "error": {
            "type": "string"
          },
          "criteria": {
            "$ref": "#/components/schemas/PeopleRouterCriteria"
          },
          "plan": {
            "$ref": "#/components/schemas/PeopleRouterPlan"
          },
          "retry_after": {
            "type": "integer"
          },
          "reason": {
            "type": "string"
          },
          "bonus": {
            "type": "integer"
          }
        }
      },
      "BriefSource": {
        "type": "object",
        "required": [
          "name",
          "kind",
          "text"
        ],
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120
          },
          "kind": {
            "type": "string",
            "enum": [
              "text",
              "file",
              "url",
              "transcript"
            ]
          },
          "text": {
            "type": "string",
            "minLength": 1,
            "maxLength": 20000
          }
        }
      },
      "BriefEvidence": {
        "type": "object",
        "required": [
          "value",
          "quote",
          "source"
        ],
        "properties": {
          "value": {
            "type": "string"
          },
          "quote": {
            "type": "string",
            "description": "Verbatim source line."
          },
          "source": {
            "type": "integer",
            "minimum": 0,
            "maximum": 5
          }
        }
      },
      "BriefExtraction": {
        "type": "object",
        "required": [
          "ok",
          "mode",
          "fields",
          "unassigned"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "mode": {
            "type": "string",
            "enum": [
              "structured"
            ]
          },
          "runs_left": {
            "type": "integer"
          },
          "fields": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "key",
                "status",
                "evidence"
              ],
              "properties": {
                "key": {
                  "type": "string",
                  "enum": [
                    "role",
                    "company",
                    "team",
                    "mission",
                    "location",
                    "employment",
                    "seniority",
                    "experience",
                    "salary",
                    "reportsTo",
                    "responsibilities",
                    "mustHave",
                    "niceToHave",
                    "success",
                    "culture",
                    "constraints",
                    "benefits",
                    "application"
                  ]
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "missing",
                    "review",
                    "uncertain",
                    "conflict"
                  ]
                },
                "evidence": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BriefEvidence"
                  }
                }
              }
            }
          },
          "unassigned": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BriefEvidence"
            }
          }
        }
      },
      "ScreenEvidence": {
        "type": "object",
        "required": [
          "source",
          "line",
          "quote"
        ],
        "properties": {
          "source": {
            "type": "string",
            "enum": [
              "resume",
              "jd",
              "history"
            ]
          },
          "line": {
            "type": "integer",
            "minimum": 1,
            "description": "1-based line in the submitted text."
          },
          "quote": {
            "type": "string",
            "description": "Verbatim source line, trimmed."
          }
        }
      },
      "ScreenPoint": {
        "type": "object",
        "required": [
          "label",
          "text",
          "evidence"
        ],
        "properties": {
          "label": {
            "type": "string"
          },
          "text": {
            "type": "string"
          },
          "evidence": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ScreenEvidence"
            }
          }
        }
      },
      "ScreenQuestion": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ScreenPoint"
          },
          {
            "type": "object",
            "required": [
              "id",
              "reason",
              "state"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "reason": {
                "type": "string"
              },
              "state": {
                "type": "string",
                "enum": [
                  "recorded",
                  "unresolved",
                  "different",
                  "missing"
                ]
              }
            }
          }
        ]
      },
      "ScreenPlaybook": {
        "type": "object",
        "required": [
          "ok",
          "mode",
          "points",
          "history",
          "mustAsk",
          "optional",
          "checks",
          "script",
          "omitted"
        ],
        "properties": {
          "ok": {
            "const": true
          },
          "mode": {
            "const": "deterministic"
          },
          "points": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ScreenPoint"
            }
          },
          "history": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ScreenQuestion"
            }
          },
          "mustAsk": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ScreenQuestion"
            }
          },
          "optional": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "checks": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "script": {
            "type": "object",
            "required": [
              "opening",
              "bridge",
              "closing"
            ],
            "properties": {
              "opening": {
                "type": "string"
              },
              "bridge": {
                "type": "string"
              },
              "closing": {
                "type": "string"
              }
            }
          },
          "omitted": {
            "type": "integer",
            "minimum": 0
          },
          "runs_left": {
            "type": "integer",
            "minimum": 0,
            "description": "Omitted when quota storage is not bound."
          }
        }
      }
    }
  }
}
