{
    "openapi": "3.1.0",
    "info": {
        "title": "jmpaul.com Agent API",
        "version": "1.0.0",
        "summary": "Headless API for agents: candidate profile and resume for hiring, and product catalog, downloads, and support for the apps.",
        "description": "Public, read-mostly JSON API. Reads are cached with ETags and rate limited per IP. Writes (inquiries, support) are rate limited more tightly and delivered to the site owner by email.\n\nAlso available as an MCP server at http://www.jmpaul.com/mcp (Streamable HTTP, stateless) and as installable Agent Skills at http://www.jmpaul.com/skills/index.json.",
        "contact": {
            "name": "Jason Paul",
            "email": "jmpauldevelopment@gmail.com",
            "url": "http://www.jmpaul.com/agents"
        },
        "x-llms-txt": "http://www.jmpaul.com/llms.txt",
        "x-mcp-endpoint": "http://www.jmpaul.com/mcp",
        "x-agent-skills": "http://www.jmpaul.com/skills/index.json"
    },
    "servers": [
        {
            "url": "http://www.jmpaul.com/api/v1"
        }
    ],
    "tags": [
        {
            "name": "hiring",
            "description": "Candidate profile, experience, skills, resume, inquiries"
        },
        {
            "name": "products",
            "description": "App catalog, downloads, support"
        },
        {
            "name": "meta"
        }
    ],
    "paths": {
        "/": {
            "get": {
                "tags": [
                    "meta"
                ],
                "operationId": "index",
                "summary": "API index with links to every resource",
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/health": {
            "get": {
                "tags": [
                    "meta"
                ],
                "operationId": "health",
                "summary": "Liveness check",
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/profile": {
            "get": {
                "tags": [
                    "hiring"
                ],
                "operationId": "getProfile",
                "summary": "Candidate profile: availability, target roles, focus areas, contact and sharing policy",
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/experience": {
            "get": {
                "tags": [
                    "hiring"
                ],
                "operationId": "searchExperience",
                "summary": "Career history (newest first) with optional filters",
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Case-insensitive text match across organization, role, summary, highlights, tech"
                    },
                    {
                        "name": "tech",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Only roles whose tech list contains this string"
                    },
                    {
                        "name": "category",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "engineering",
                                "leadership",
                                "founder",
                                "education"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/experience/{id}": {
            "get": {
                "tags": [
                    "hiring"
                ],
                "operationId": "getExperience",
                "summary": "One role by id",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Role id, e.g. alembic, payken, apollo21"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Error",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "error": {
                                            "type": "object",
                                            "properties": {
                                                "code": {
                                                    "type": "string"
                                                },
                                                "message": {
                                                    "type": "string"
                                                },
                                                "status": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        "/skills": {
            "get": {
                "tags": [
                    "hiring"
                ],
                "operationId": "getSkills",
                "summary": "Languages, technologies, and per-skill usage derived from experience",
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/resume": {
            "get": {
                "tags": [
                    "hiring"
                ],
                "operationId": "getResumeJson",
                "summary": "Resume in JSON Resume format (also at /resume.json on the site root)",
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/resume.md": {
            "get": {
                "tags": [
                    "hiring"
                ],
                "operationId": "getResumeMarkdown",
                "summary": "Resume as Markdown (also at /resume.md on the site root)",
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "text/markdown": {
                                "schema": {
                                    "type": "string"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/activity": {
            "get": {
                "tags": [
                    "hiring"
                ],
                "operationId": "getActivity",
                "summary": "GitHub commit activity summary (counts only) from the Commit City cache",
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/inquiries": {
            "post": {
                "tags": [
                    "hiring"
                ],
                "operationId": "submitInquiry",
                "summary": "Submit a role inquiry; delivered to the candidate by email",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "company",
                                    "role",
                                    "contact_email"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                    "company": {
                                        "type": "string",
                                        "maxLength": 200,
                                        "description": "Hiring company"
                                    },
                                    "role": {
                                        "type": "string",
                                        "maxLength": 200,
                                        "description": "Role title"
                                    },
                                    "contact_email": {
                                        "type": "string",
                                        "format": "email",
                                        "description": "Human the candidate can reply to"
                                    },
                                    "contact_name": {
                                        "type": "string",
                                        "maxLength": 200
                                    },
                                    "job_url": {
                                        "type": "string",
                                        "format": "uri",
                                        "maxLength": 2000,
                                        "description": "Link to the posting"
                                    },
                                    "description": {
                                        "type": "string",
                                        "maxLength": 8000,
                                        "description": "Job description or summary"
                                    },
                                    "compensation": {
                                        "type": "string",
                                        "maxLength": 300,
                                        "description": "Salary band or range, with currency"
                                    },
                                    "work_mode": {
                                        "type": "string",
                                        "enum": [
                                            "remote",
                                            "hybrid",
                                            "onsite"
                                        ],
                                        "description": "The candidate is seeking remote"
                                    },
                                    "employment_type": {
                                        "type": "string",
                                        "enum": [
                                            "W2 full-time",
                                            "contract",
                                            "C2C",
                                            "other"
                                        ],
                                        "description": "The candidate is seeking W2 full-time"
                                    },
                                    "location": {
                                        "type": "string",
                                        "maxLength": 200,
                                        "description": "Company location or timezone expectations"
                                    },
                                    "message": {
                                        "type": "string",
                                        "maxLength": 4000,
                                        "description": "Anything else, including why the match looks good"
                                    },
                                    "agent": {
                                        "type": "string",
                                        "maxLength": 200,
                                        "description": "Name and operator of the agent submitting this, e.g. \"Acme Recruiter Bot (acme.com)\""
                                    },
                                    "website": {
                                        "type": "string",
                                        "maxLength": 0,
                                        "description": "Honeypot. Leave empty."
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Received",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Error",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "error": {
                                            "type": "object",
                                            "properties": {
                                                "code": {
                                                    "type": "string"
                                                },
                                                "message": {
                                                    "type": "string"
                                                },
                                                "status": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Error",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "error": {
                                            "type": "object",
                                            "properties": {
                                                "code": {
                                                    "type": "string"
                                                },
                                                "message": {
                                                    "type": "string"
                                                },
                                                "status": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        "/inquiries/{id}": {
            "get": {
                "tags": [
                    "hiring"
                ],
                "operationId": "getInquiry",
                "summary": "Status of a submitted inquiry",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Inquiry id returned on submit"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Error",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "error": {
                                            "type": "object",
                                            "properties": {
                                                "code": {
                                                    "type": "string"
                                                },
                                                "message": {
                                                    "type": "string"
                                                },
                                                "status": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        "/products": {
            "get": {
                "tags": [
                    "products"
                ],
                "operationId": "listProducts",
                "summary": "Product catalog",
                "parameters": [
                    {
                        "name": "status",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "live",
                                "all"
                            ]
                        },
                        "description": "Default all (includes retired entries flagged status=retired)"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/products/{id}": {
            "get": {
                "tags": [
                    "products"
                ],
                "operationId": "getProduct",
                "summary": "One product with per-platform store data",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "cure-crystals, alpha-desk, nft-hot-or-not"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Error",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "error": {
                                            "type": "object",
                                            "properties": {
                                                "code": {
                                                    "type": "string"
                                                },
                                                "message": {
                                                    "type": "string"
                                                },
                                                "status": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        "/products/{id}/download": {
            "get": {
                "tags": [
                    "products"
                ],
                "operationId": "downloadProduct",
                "summary": "Redirect (302) to the store or web app for a platform; without platform returns the options as JSON",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Product id"
                    },
                    {
                        "name": "platform",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "ios",
                                "android",
                                "web"
                            ]
                        }
                    }
                ],
                "responses": {
                    "302": {
                        "description": "Redirect to the store"
                    },
                    "200": {
                        "description": "Download options",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Error",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "error": {
                                            "type": "object",
                                            "properties": {
                                                "code": {
                                                    "type": "string"
                                                },
                                                "message": {
                                                    "type": "string"
                                                },
                                                "status": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        "/support": {
            "post": {
                "tags": [
                    "products"
                ],
                "operationId": "submitSupport",
                "summary": "Submit a support request for a product",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "product",
                                    "email",
                                    "message"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                    "product": {
                                        "type": "string",
                                        "description": "Product id or name, e.g. cure-crystals"
                                    },
                                    "kind": {
                                        "type": "string",
                                        "enum": [
                                            "bug",
                                            "feature",
                                            "other"
                                        ],
                                        "default": "other"
                                    },
                                    "email": {
                                        "type": "string",
                                        "format": "email",
                                        "description": "User the reply should go to"
                                    },
                                    "name": {
                                        "type": "string",
                                        "maxLength": 200
                                    },
                                    "subject": {
                                        "type": "string",
                                        "maxLength": 200
                                    },
                                    "message": {
                                        "type": "string",
                                        "maxLength": 8000
                                    },
                                    "platform": {
                                        "type": "string",
                                        "enum": [
                                            "ios",
                                            "android",
                                            "web"
                                        ]
                                    },
                                    "app_version": {
                                        "type": "string",
                                        "maxLength": 50
                                    },
                                    "agent": {
                                        "type": "string",
                                        "maxLength": 200
                                    },
                                    "website": {
                                        "type": "string",
                                        "maxLength": 0,
                                        "description": "Honeypot. Leave empty."
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Received",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Error",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "error": {
                                            "type": "object",
                                            "properties": {
                                                "code": {
                                                    "type": "string"
                                                },
                                                "message": {
                                                    "type": "string"
                                                },
                                                "status": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Error",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "error": {
                                            "type": "object",
                                            "properties": {
                                                "code": {
                                                    "type": "string"
                                                },
                                                "message": {
                                                    "type": "string"
                                                },
                                                "status": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
