{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/riveterhq-com/json-schema/riveterhq-com-tool-catalog-schema.json",
  "title": "ToolCatalog",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/riveterhq-com-openapi.json#/components/schemas/ToolCatalog",
  "type": "object",
  "properties": {
    "tools": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The name to use in only_tools / additional_tools"
          },
          "description": {
            "type": "string"
          },
          "credits_per_call": {
            "type": "number"
          },
          "price_note": {
            "type": [
              "string",
              "null"
            ],
            "description": "When the price is not flat — the scrape settles to its outcome, pdf and image to the tokens their model spent reading the file (credits_per_call is what is booked before the call), text_search_pdf to the PDF's page count; the LinkedIn email / phone tools are charged only when the call returns a contact. Null for a flat price."
          },
          "default": {
            "type": "boolean",
            "description": "On without being named"
          },
          "requires_opt_in": {
            "type": "boolean",
            "description": "A Riveter admin enables it on the account; false for the default tools and the ones any account may add"
          },
          "enabled": {
            "type": "boolean",
            "description": "Usable on this account (opt-in satisfied or not needed; says nothing about the API key)"
          },
          "requires_api_key": {
            "type": "boolean",
            "description": "Calls its provider with the account's own API key (Apollo, Hunter, Findymail, curl, USPTO); refused until one is linked under Settings > API keys"
          },
          "api_key_linked": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Whether the account has linked a key for this tool; null when the tool needs none"
          },
          "companions": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Free helper tools this tool brings along"
          },
          "inputs": {
            "type": "array",
            "description": "What a call takes. On a pinned column the agent fills these from the row's columns or its research, so the dataset should carry them (a LinkedIn URL column for the LinkedIn tools, a domain for the Hunter domain search).",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "type": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "string / integer / number / boolean / object; null when the input takes more than one shape"
                },
                "required": {
                  "type": "boolean"
                },
                "description": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              }
            }
          },
          "input_groups": {
            "type": [
              "array",
              "null"
            ],
            "description": "When set, any one complete group of inputs is enough (`[[\"linkedin_handle\"], [\"domain\", \"full_name\"]]`) and `required` is false on each",
            "items": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "returns": {
            "type": [
              "string",
              "null"
            ],
            "description": "What a call gives back — on a pinned column, what the cell holds"
          }
        }
      }
    },
    "budget": {
      "type": "object",
      "properties": {
        "default_credits_per_output_column": {
          "type": "number",
          "description": "A new enrichment's budget per row is this times its output columns; it moves by this much per column added or removed until locked"
        },
        "min_credits_per_row": {
          "type": "number"
        },
        "max_credits_per_row": {
          "type": "number"
        }
      }
    }
  }
}