{
 "openapi": "3.1.0",
 "info": {
  "title": "Work in Pet API",
  "version": "1.0.0",
  "description": "Access to Work in Pet: open corporate and professional jobs at pet-industry companies, refreshed daily from each employer's own careers site. No key needed. One write, post_job, posts a job for an employer with no ATS. The same operations are available as MCP tools at https://workinpet.com/mcp. Guide: https://workinpet.com/agents.",
  "contact": {
   "email": "hello@workinpet.com"
  }
 },
 "servers": [
  {
   "url": "https://workinpet.com"
  }
 ],
 "paths": {
  "/api/v1/jobs": {
   "get": {
    "operationId": "search_jobs",
    "summary": "Search jobs",
    "description": "Search open corporate and professional jobs at pet-industry companies on Work in Pet, newest first. Clinical, store, warehouse and other hourly roles are not listed. Every filter is optional.",
    "parameters": [
     {
      "name": "q",
      "in": "query",
      "required": false,
      "description": "Keywords matched against title, company and description",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "function",
      "in": "query",
      "required": false,
      "description": "Team or function slug, e.g. marketing, engineering, data. See list_categories.",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "seniority",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "intern",
        "entry",
        "mid",
        "senior",
        "lead",
        "manager",
        "director",
        "vp",
        "c-level"
       ]
      }
     },
     {
      "name": "remote",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "remote",
        "hybrid",
        "onsite"
       ]
      }
     },
     {
      "name": "industry",
      "in": "query",
      "required": false,
      "description": "Company industry",
      "schema": {
       "type": "string",
       "enum": [
        "pet-food",
        "pet-cpg",
        "animal-health",
        "vet-corporate",
        "pet-insurance",
        "pet-retail",
        "pet-services",
        "pet-tech",
        "pet-b2b",
        "other"
       ]
      }
     },
     {
      "name": "location",
      "in": "query",
      "required": false,
      "description": "Location slug, e.g. new-york-ny or minneapolis-mn",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "company",
      "in": "query",
      "required": false,
      "description": "Company slug, e.g. chewy",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "country",
      "in": "query",
      "required": false,
      "description": "ISO 3166 two-letter country code, or US for the US plus US-remote roles",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "salary_listed",
      "in": "query",
      "required": false,
      "description": "Only jobs that list pay",
      "schema": {
       "type": "boolean"
      }
     },
     {
      "name": "page",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 1,
       "default": 1
      }
     },
     {
      "name": "per_page",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 50,
       "default": 20
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "description": "Bad parameter",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   },
   "post": {
    "operationId": "post_job",
    "summary": "Post a job",
    "description": "Post one corporate or professional job for a pet-industry employer that has no applicant tracking system. Only post for an employer that asked you to. It goes live on Work in Pet and Google Jobs after the next daily update when the email domain matches the company website; otherwise a person reviews it first. Employers whose jobs already sync from an ATS are told to post there. Returns a private manage_url for the employer to close the job; give it to them.",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "email": {
          "type": "string",
          "description": "The employer's work email. A domain matching the website skips review."
         },
         "company": {
          "type": "string",
          "description": "Company name"
         },
         "website": {
          "type": "string",
          "description": "Company website, e.g. acmepets.com"
         },
         "title": {
          "type": "string",
          "description": "Job title"
         },
         "location": {
          "type": "string",
          "description": "City and state, e.g. \"Denver, CO\". For remote roles, the country."
         },
         "remote": {
          "type": "string",
          "enum": [
           "onsite",
           "hybrid",
           "remote"
          ]
         },
         "employment_type": {
          "type": "string",
          "enum": [
           "full-time",
           "part-time",
           "contract",
           "internship"
          ],
          "default": "full-time"
         },
         "pay_min": {
          "type": "string",
          "description": "Yearly pay in USD, e.g. 85000 or 85k (optional)"
         },
         "pay_max": {
          "type": "string",
          "description": "Yearly pay in USD (optional)"
         },
         "description": {
          "type": "string",
          "description": "Plain-text description, 100 characters or more"
         },
         "apply": {
          "type": "string",
          "description": "Application URL, or an email address for applications"
         },
         "authorized": {
          "type": "boolean",
          "description": "True: the employer confirmed they are authorized to post this job, the role is open and the details are accurate"
         }
        },
        "required": [
         "email",
         "company",
         "website",
         "title",
         "location",
         "remote",
         "description",
         "apply",
         "authorized"
        ]
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "Saved",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "description": "Bad field",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Too many posts from this address this hour",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/jobs/{id}": {
   "get": {
    "operationId": "get_job",
    "summary": "Get a job",
    "description": "Get one job with its full description, pay and apply link. The id is the 8-character code at the end of the job URL; a full job URL also works. Closed jobs answer with status closed.",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "description": "8-character job id, e.g. 3fa9c21b, or the job URL",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "description": "Bad parameter",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/companies": {
   "get": {
    "operationId": "list_companies",
    "summary": "List companies",
    "description": "List the pet-industry companies we track, with open-role counts, most open roles first.",
    "parameters": [
     {
      "name": "q",
      "in": "query",
      "required": false,
      "description": "Part of the company name",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "industry",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "pet-food",
        "pet-cpg",
        "animal-health",
        "vet-corporate",
        "pet-insurance",
        "pet-retail",
        "pet-services",
        "pet-tech",
        "pet-b2b",
        "other"
       ]
      }
     },
     {
      "name": "hiring_only",
      "in": "query",
      "required": false,
      "description": "Only companies with open roles",
      "schema": {
       "type": "boolean"
      }
     },
     {
      "name": "page",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 1,
       "default": 1
      }
     },
     {
      "name": "per_page",
      "in": "query",
      "required": false,
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 50,
       "default": 20
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "description": "Bad parameter",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/companies/{slug}": {
   "get": {
    "operationId": "get_company",
    "summary": "Get a company",
    "description": "Get one company: industry, headquarters, size, public hiring numbers and up to 50 open roles.",
    "parameters": [
     {
      "name": "slug",
      "in": "path",
      "required": true,
      "description": "Company slug, e.g. the-farmers-dog",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "description": "Bad parameter",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/categories": {
   "get": {
    "operationId": "list_categories",
    "summary": "List categories",
    "description": "List the allowed values for the function, industry, seniority and remote filters, with open-role counts.",
    "parameters": [],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "description": "Bad parameter",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Not found",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  }
 },
 "components": {
  "schemas": {
   "Error": {
    "type": "object",
    "properties": {
     "error": {
      "type": "string"
     }
    },
    "required": [
     "error"
    ]
   }
  }
 }
}