{"openapi":"3.1.0","info":{"title":"PromptMetrics Agent Actions","version":"1.0.0","summary":"The actions an agent can take on promptmetrics.dev.","description":"Public, unauthenticated actions for agents acting on a person's behalf:\nrequesting a call, a pilot, or cohort seats, and subscribing to Field Notes.\n\nVersioning: this API is versioned in the path. `https://www.promptmetrics.dev/v1` is canonical.\nThe unversioned `https://www.promptmetrics.dev/actions/*` paths are permanent aliases\nkept for existing callers; new integrations should use the versioned base.\nBreaking changes ship under a new version prefix, never in place.\n\nErrors: every 4xx and 5xx returns the Error schema with a stable\n`error.code`. Branch on the code, never on `error.message`.\n\nRate limiting: 20 requests per 60 seconds per client IP.\nResponses carry a RateLimit-Policy header whenever the limit is being\nenforced; a 429 carries Retry-After. There are no live remaining/reset\ncounters, so none are advertised.\n\nSite content is also machine-readable: /llms.txt indexes every page, and\nany blog post is available as markdown at its URL plus `.md`.","contact":{"name":"PromptMetrics","email":"hello@promptmetrics.dev","url":"https://www.promptmetrics.dev"},"license":{"name":"Proprietary","url":"https://www.promptmetrics.dev/privacy"}},"servers":[{"url":"https://www.promptmetrics.dev/v1","description":"Versioned base (v1), canonical."},{"url":"https://www.promptmetrics.dev","description":"Unversioned aliases, kept for existing callers."}],"security":[],"externalDocs":{"description":"Developer resources","url":"https://www.promptmetrics.dev/llms.txt"},"paths":{"/actions/subscribe-blog":{"post":{"operationId":"subscribeBlog","summary":"Subscribe to Field Notes","description":"Subscribes an email address to the Field Notes newsletter. Double opt-in: the subscriber must confirm via the email they receive before they are active.","tags":["actions"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"additionalProperties":false,"properties":{"email":{"type":"string","format":"email","description":"A valid email address."}}}}}},"responses":{"200":{"description":"Subscribe to Field Notes","content":{"application/json":{"schema":{"type":"object","required":["message"],"properties":{"message":{"type":"string","description":"Confirmation copy for the caller to display."}}}}}},"400":{"description":"Bad request. error.code is one of: invalid_body, invalid_email.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests. error.code is one of: rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error. error.code is one of: not_configured, internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Upstream service failed. error.code is one of: upstream_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/actions/landing-signup":{"post":{"operationId":"landingSignup","summary":"Sign up via a landing-page segment","description":"Adds an email address to one of three audience segments. The mailing list for each segment is resolved server-side, so the caller cannot choose a list.","tags":["actions"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","segment"],"additionalProperties":false,"properties":{"email":{"type":"string","format":"email","description":"A valid email address."},"segment":{"type":"string","enum":["cohort_waitlist","discovery_requested","newsletter_only"],"description":"cohort_waitlist = Operator Cohort founding seat; discovery_requested = free discovery call queue; newsletter_only = Field Notes."},"note":{"type":"string","maxLength":500,"description":"Optional free text. Truncated to 500 characters."}}}}}},"responses":{"200":{"description":"Sign up via a landing-page segment","content":{"application/json":{"schema":{"type":"object","required":["message"],"properties":{"message":{"type":"string"}}}}}},"400":{"description":"Bad request. error.code is one of: invalid_body, invalid_email, unknown_segment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests. error.code is one of: rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error. error.code is one of: not_configured, internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Upstream service failed. error.code is one of: upstream_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/actions/book-discovery-call":{"post":{"operationId":"bookDiscoveryCall","summary":"Request a discovery call","description":"Submits a request for a free 30-minute discovery call. The request is recorded in the CRM and the team is notified; expect a reply within one business day.","tags":["actions"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","email","what_are_you_trying_to_fix"],"additionalProperties":false,"properties":{"name":{"type":"string","description":"Caller's name."},"email":{"type":"string","format":"email","description":"A valid email address."},"what_are_you_trying_to_fix":{"type":"string","description":"The broken workflow, in a sentence."}}}}}},"responses":{"200":{"description":"Request a discovery call","content":{"application/json":{"schema":{"type":"object","required":["success","message"],"properties":{"success":{"type":"boolean"},"message":{"type":"string"},"request_id":{"type":"string","description":"CRM record id for the request. Absent if the request was captured by notification only."}}}}}},"400":{"description":"Bad request. error.code is one of: invalid_body, missing_field, invalid_email.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests. error.code is one of: rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error. error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Upstream service failed. error.code is one of: upstream_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/actions/request-flagship-pilot":{"post":{"operationId":"requestFlagshipPilot","summary":"Request a Flagship Pilot","description":"Submits a request for a Flagship Pilot engagement (one team, one workflow, 4-6 weeks). The request is recorded in the CRM and the team is notified; expect a reply within one business day.","tags":["actions"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","email","company","workflow"],"additionalProperties":false,"properties":{"name":{"type":"string"},"email":{"type":"string","format":"email","description":"A valid email address."},"company":{"type":"string"},"workflow":{"type":"string","description":"The workflow to turn into a governed AI skill."},"team_size":{"type":"integer","minimum":1,"description":"Approximate number of operators on that workflow."}}}}}},"responses":{"200":{"description":"Request a Flagship Pilot","content":{"application/json":{"schema":{"type":"object","required":["success","message"],"properties":{"success":{"type":"boolean"},"message":{"type":"string"},"request_id":{"type":"string","description":"CRM record id for the request. Absent if the request was captured by notification only."},"team_size":{"type":"integer"}}}}}},"400":{"description":"Bad request. error.code is one of: invalid_body, missing_field, invalid_email.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests. error.code is one of: rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error. error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Upstream service failed. error.code is one of: upstream_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/actions/join-ai-fluency-cohort":{"post":{"operationId":"joinRealWorkCohort","summary":"Reserve Real-Work Cohort seats","description":"Requests seats in the next Real-Work Cohort (live, Ranya-led, capped). The request is recorded in the CRM and the team is notified; expect a reply with the next cohort dates.","tags":["actions"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","email","seats"],"additionalProperties":false,"properties":{"name":{"type":"string"},"email":{"type":"string","format":"email","description":"A valid email address."},"seats":{"type":"integer","minimum":1,"description":"Number of seats requested."}}}}}},"responses":{"200":{"description":"Reserve Real-Work Cohort seats","content":{"application/json":{"schema":{"type":"object","required":["success","message"],"properties":{"success":{"type":"boolean"},"message":{"type":"string"},"reservation_id":{"type":"string","description":"CRM record id for the reservation request. Absent if it was captured by notification only."},"seats":{"type":"integer"}}}}}},"400":{"description":"Bad request. error.code is one of: invalid_body, missing_field, invalid_email.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests. error.code is one of: rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error. error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Upstream service failed. error.code is one of: upstream_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/actions/install-operator-stack":{"post":{"operationId":"installOperatorStack","summary":"Get Operator Stack install instructions","description":"Returns the command that installs an Operator Stack skill. There is no CLI and no npm package: a skill is a folder of markdown, so the command is a git clone. Takes no parameters.","tags":["actions"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{}}}}},"responses":{"200":{"description":"Get Operator Stack install instructions","content":{"application/json":{"schema":{"type":"object","required":["success","command","repository","message"],"properties":{"success":{"type":"boolean"},"command":{"type":"string","description":"The git command to run."},"repository":{"type":"string","format":"uri"},"message":{"type":"string"}}}}}},"429":{"description":"Too many requests. error.code is one of: rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error. error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_body","missing_field","invalid_email","unknown_segment","rate_limited","not_configured","internal_error","upstream_error"],"description":"Stable machine-readable failure code."},"message":{"type":"string","description":"Human-readable explanation. Do not branch on this."},"details":{"type":"array","items":{"type":"string"},"description":"Field names that failed validation, when applicable."}}}}}}},"tags":[{"name":"actions","description":"Things an agent can do on a visitor's behalf."}]}