{
  "awp_version": "0.2",
  "domain": "agentsfirst.ai",
  "intent": "Agents First helps businesses make their websites, documentation, and client systems readable and useful to AI agents.",
  "protocols": {
    "openapi": {
      "version": "3.1.0",
      "endpoint": "https://agentsfirst.ai/api/openapi.json"
    }
  },
  "capabilities": {
    "streaming": true,
    "idempotency": true
  },
  "auth": {
    "type": "none",
    "required_for": [],
    "optional_for": []
  },
  "entities": {
    "website_score_check": {
      "fields": {
        "label": "string",
        "pass": "boolean",
        "detail": "string"
      }
    },
    "website_score_axis": {
      "fields": {
        "score": "float",
        "grade": "enum[A, B, C, D, F]",
        "finding": "string",
        "checks": "array[website_score_check]"
      }
    },
    "website_score": {
      "fields": {
        "url": "url",
        "overall": "float",
        "grade": "enum[A, B, C, D, F]",
        "copy": "object[website_score_axis]",
        "seo": "object[website_score_axis]",
        "aeo": "object[website_score_axis]",
        "tracking": "object[website_score_axis]"
      }
    },
    "website_score_partial_event": {
      "fields": {
        "event": "enum[copy, seo, aeo, tracking]",
        "data": "object[website_score_axis]"
      }
    },
    "website_score_partial": {
      "fields": {
        "responseMode": "enum[sse]",
        "bounded": "boolean",
        "terminal": "boolean",
        "terminalEvent": "enum[overall]",
        "eventCount": "integer",
        "events": "array[website_score_partial_event]"
      }
    }
  },
  "actions": [
    {
      "id": "discover-consulting-services",
      "description": "Browse Agents First product and service areas",
      "auth_required": false,
      "inputs": {},
      "outputs": {
        "ok": "boolean",
        "data": "object"
      },
      "via": "openapi",
      "operation": "getServiceCatalog",
      "endpoint": "/api/v1/services",
      "method": "GET",
      "execution_model": "sync",
      "sensitivity": "standard",
      "reversible": true,
      "effects": [],
      "errors": [],
      "output_trust": "trusted",
      "retry": {
        "automatic": true,
        "guidance": "Retry transient failures with bounded exponential backoff."
      }
    },
    {
      "id": "submit-consultation-request",
      "description": "Submit a consultation or support request to Agents First",
      "auth_required": false,
      "inputs": {
        "name": {
          "type": "string",
          "required": true,
          "description": "Full name"
        },
        "email": {
          "type": "string",
          "required": true
        },
        "phone": {
          "type": "string",
          "required": false
        },
        "website": {
          "type": "string",
          "required": false,
          "description": "Optional public website URL or domain"
        },
        "company": {
          "type": "string",
          "required": false
        },
        "message": {
          "type": "string",
          "required": true,
          "description": "How can we help?"
        },
        "source": {
          "type": "string",
          "required": false,
          "description": "Optional attribution label; defaults to website"
        }
      },
      "outputs": {
        "ok": "boolean",
        "data": "object"
      },
      "via": "openapi",
      "operation": "submitConsultationRequest",
      "endpoint": "/api/v1/contact",
      "method": "POST",
      "rate_limit": "10/ip/hour",
      "idempotency": {
        "supported": true,
        "key_field": "Idempotency-Key",
        "window": "24h"
      },
      "execution_model": "sync",
      "sensitivity": "standard",
      "reversible": false,
      "effects": [
        {
          "kind": "rate_limit_claim",
          "disposition": "required",
          "description": "Atomically persist the caller's IP rate-limit claim."
        },
        {
          "kind": "persistence",
          "disposition": "required",
          "description": "Persist the consultation request and deduplication identity."
        },
        {
          "kind": "notification",
          "disposition": "best_effort",
          "description": "Notify the Agents First operator after a new request is accepted."
        }
      ],
      "errors": [
        "INVALID_REQUEST",
        "BODY_TOO_LARGE",
        "UNSUPPORTED_MEDIA_TYPE",
        "RATE_LIMITED",
        "CONTACT_UNAVAILABLE",
        "CONTACT_FAILED"
      ],
      "output_trust": "trusted",
      "retry": {
        "automatic": false,
        "guidance": "Retry only transient failures or 429 after its window, always with the same Idempotency-Key and canonical payload."
      }
    },
    {
      "id": "get-consulting-faq",
      "description": "Get answers to frequently asked questions about Agents First",
      "auth_required": false,
      "inputs": {},
      "outputs": {
        "ok": "boolean",
        "data": "object"
      },
      "via": "openapi",
      "operation": "getFaq",
      "endpoint": "/api/v1/faq",
      "method": "GET",
      "execution_model": "sync",
      "sensitivity": "standard",
      "reversible": true,
      "effects": [],
      "errors": [],
      "output_trust": "trusted",
      "retry": {
        "automatic": true,
        "guidance": "Retry transient failures with bounded exponential backoff."
      }
    },
    {
      "id": "scan-agent-readiness",
      "description": "Audit a public website's discovery, content clarity, and agent infrastructure",
      "auth_required": false,
      "inputs": {
        "url": {
          "type": "string",
          "required": true,
          "description": "Public website URL or domain to scan for agent readiness"
        }
      },
      "outputs": {
        "url": "url",
        "scannedAt": "ISO8601",
        "overallScore": "float",
        "level": "integer",
        "levelLabel": "string",
        "categories": "array[object]",
        "totalChecks": "integer",
        "passedChecks": "integer"
      },
      "via": "openapi",
      "operation": "scanAgentReadiness",
      "endpoint": "/api/scan",
      "method": "POST",
      "rate_limit": "3/ip/hour; 2/url/day",
      "execution_model": "sync",
      "sensitivity": "standard",
      "reversible": false,
      "effects": [
        {
          "kind": "rate_limit_claim",
          "disposition": "required",
          "description": "Atomically persist IP and URL rate-limit claims."
        },
        {
          "kind": "external_requests",
          "disposition": "required",
          "description": "Fetch the submitted public website and its discovery surfaces."
        },
        {
          "kind": "persistence",
          "disposition": "required",
          "description": "Persist the completed agent-readiness scan."
        },
        {
          "kind": "notification",
          "disposition": "best_effort",
          "description": "Notify the Agents First operator after the response is committed."
        }
      ],
      "errors": [
        "INVALID_REQUEST",
        "BODY_TOO_LARGE",
        "UNSUPPORTED_MEDIA_TYPE",
        "RATE_LIMITED",
        "SCAN_FAILED"
      ],
      "output_trust": "untrusted_external_content",
      "retry": {
        "automatic": false,
        "guidance": "Do not retry automatically. Ask the user before a new attempt and respect every advertised rate-limit window."
      }
    },
    {
      "id": "score-website-performance",
      "description": "Score a public website across copy, SEO, AI readiness, and tracking",
      "auth_required": false,
      "inputs": {
        "url": {
          "type": "url",
          "required": true,
          "description": "Public HTTP(S) website URL to score"
        }
      },
      "outputs": {
        "terminal_result": "object[website_score]",
        "partial_result": "object[website_score_partial]"
      },
      "via": "openapi",
      "operation": "scoreWebsitePerformance",
      "endpoint": "/api/score",
      "method": "POST",
      "rate_limit": "3/ip/hour; 2/url/day",
      "execution_model": "sync",
      "sensitivity": "standard",
      "reversible": false,
      "effects": [
        {
          "kind": "rate_limit_claim",
          "disposition": "required",
          "description": "Atomically persist IP and URL rate-limit claims before provider work."
        },
        {
          "kind": "external_requests",
          "disposition": "required",
          "description": "Resolve and vet the submitted public website before scoring begins."
        },
        {
          "kind": "external_requests",
          "disposition": "best_effort",
          "description": "Fetch target pages, Google PageSpeed, and Anthropic analysis inputs when available."
        },
        {
          "kind": "persistence",
          "disposition": "best_effort",
          "description": "Persist the completed website score when storage is available. Cancellation prevents later work but cannot roll back a write already accepted by Supabase."
        },
        {
          "kind": "notification",
          "disposition": "best_effort",
          "description": "Send an operator notification after scoring completes. Cancellation prevents terminal output but cannot revoke a request already accepted by the email provider."
        }
      ],
      "errors": [
        "INVALID_REQUEST",
        "BODY_TOO_LARGE",
        "UNSUPPORTED_MEDIA_TYPE",
        "RATE_LIMITED",
        "SCORE_TIMEOUT",
        "SCORE_FAILED"
      ],
      "output_trust": "untrusted_external_content",
      "retry": {
        "automatic": false,
        "guidance": "Do not retry automatically. Ask the user before a new attempt and respect every advertised rate-limit window."
      },
      "streaming": {
        "protocol": "sse",
        "bounded": true,
        "max_events": 5,
        "terminal_event": "overall",
        "terminal_output": "terminal_result",
        "partial_output": "partial_result",
        "events": [
          {
            "name": "copy",
            "terminal": false,
            "schema": {
              "type": "object",
              "required": [
                "score",
                "grade",
                "finding",
                "checks"
              ],
              "properties": {
                "score": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100
                },
                "grade": {
                  "type": "string",
                  "enum": [
                    "A",
                    "B",
                    "C",
                    "D",
                    "F"
                  ]
                },
                "finding": {
                  "type": "string"
                },
                "checks": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "label",
                      "pass",
                      "detail"
                    ],
                    "properties": {
                      "label": {
                        "type": "string"
                      },
                      "pass": {
                        "type": "boolean"
                      },
                      "detail": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          {
            "name": "seo",
            "terminal": false,
            "schema": {
              "type": "object",
              "required": [
                "score",
                "grade",
                "finding",
                "checks"
              ],
              "properties": {
                "score": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100
                },
                "grade": {
                  "type": "string",
                  "enum": [
                    "A",
                    "B",
                    "C",
                    "D",
                    "F"
                  ]
                },
                "finding": {
                  "type": "string"
                },
                "checks": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "label",
                      "pass",
                      "detail"
                    ],
                    "properties": {
                      "label": {
                        "type": "string"
                      },
                      "pass": {
                        "type": "boolean"
                      },
                      "detail": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          {
            "name": "aeo",
            "terminal": false,
            "schema": {
              "type": "object",
              "required": [
                "score",
                "grade",
                "finding",
                "checks"
              ],
              "properties": {
                "score": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100
                },
                "grade": {
                  "type": "string",
                  "enum": [
                    "A",
                    "B",
                    "C",
                    "D",
                    "F"
                  ]
                },
                "finding": {
                  "type": "string"
                },
                "checks": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "label",
                      "pass",
                      "detail"
                    ],
                    "properties": {
                      "label": {
                        "type": "string"
                      },
                      "pass": {
                        "type": "boolean"
                      },
                      "detail": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          {
            "name": "tracking",
            "terminal": false,
            "schema": {
              "type": "object",
              "required": [
                "score",
                "grade",
                "finding",
                "checks"
              ],
              "properties": {
                "score": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100
                },
                "grade": {
                  "type": "string",
                  "enum": [
                    "A",
                    "B",
                    "C",
                    "D",
                    "F"
                  ]
                },
                "finding": {
                  "type": "string"
                },
                "checks": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "label",
                      "pass",
                      "detail"
                    ],
                    "properties": {
                      "label": {
                        "type": "string"
                      },
                      "pass": {
                        "type": "boolean"
                      },
                      "detail": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          {
            "name": "overall",
            "terminal": true,
            "schema": {
              "type": "object",
              "required": [
                "url",
                "overall",
                "grade",
                "copy",
                "seo",
                "aeo",
                "tracking"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "overall": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100
                },
                "grade": {
                  "type": "string",
                  "enum": [
                    "A",
                    "B",
                    "C",
                    "D",
                    "F"
                  ]
                },
                "copy": {
                  "type": "object",
                  "required": [
                    "score",
                    "grade",
                    "finding",
                    "checks"
                  ],
                  "properties": {
                    "score": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 100
                    },
                    "grade": {
                      "type": "string",
                      "enum": [
                        "A",
                        "B",
                        "C",
                        "D",
                        "F"
                      ]
                    },
                    "finding": {
                      "type": "string"
                    },
                    "checks": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "label",
                          "pass",
                          "detail"
                        ],
                        "properties": {
                          "label": {
                            "type": "string"
                          },
                          "pass": {
                            "type": "boolean"
                          },
                          "detail": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                },
                "seo": {
                  "type": "object",
                  "required": [
                    "score",
                    "grade",
                    "finding",
                    "checks"
                  ],
                  "properties": {
                    "score": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 100
                    },
                    "grade": {
                      "type": "string",
                      "enum": [
                        "A",
                        "B",
                        "C",
                        "D",
                        "F"
                      ]
                    },
                    "finding": {
                      "type": "string"
                    },
                    "checks": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "label",
                          "pass",
                          "detail"
                        ],
                        "properties": {
                          "label": {
                            "type": "string"
                          },
                          "pass": {
                            "type": "boolean"
                          },
                          "detail": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                },
                "aeo": {
                  "type": "object",
                  "required": [
                    "score",
                    "grade",
                    "finding",
                    "checks"
                  ],
                  "properties": {
                    "score": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 100
                    },
                    "grade": {
                      "type": "string",
                      "enum": [
                        "A",
                        "B",
                        "C",
                        "D",
                        "F"
                      ]
                    },
                    "finding": {
                      "type": "string"
                    },
                    "checks": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "label",
                          "pass",
                          "detail"
                        ],
                        "properties": {
                          "label": {
                            "type": "string"
                          },
                          "pass": {
                            "type": "boolean"
                          },
                          "detail": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                },
                "tracking": {
                  "type": "object",
                  "required": [
                    "score",
                    "grade",
                    "finding",
                    "checks"
                  ],
                  "properties": {
                    "score": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 100
                    },
                    "grade": {
                      "type": "string",
                      "enum": [
                        "A",
                        "B",
                        "C",
                        "D",
                        "F"
                      ]
                    },
                    "finding": {
                      "type": "string"
                    },
                    "checks": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "label",
                          "pass",
                          "detail"
                        ],
                        "properties": {
                          "label": {
                            "type": "string"
                          },
                          "pass": {
                            "type": "boolean"
                          },
                          "detail": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          {
            "name": "error",
            "terminal": false,
            "schema": {
              "type": "object",
              "required": [
                "code",
                "message",
                "retryable"
              ],
              "properties": {
                "code": {
                  "type": "string",
                  "enum": [
                    "SCORE_TIMEOUT",
                    "SCORE_FAILED"
                  ]
                },
                "message": {
                  "type": "string"
                },
                "retryable": {
                  "type": "boolean"
                }
              },
              "additionalProperties": false
            }
          }
        ]
      }
    }
  ],
  "errors": {
    "INVALID_REQUEST": {
      "recovery": "Correct the input using the action input schema, then submit a new request."
    },
    "BODY_TOO_LARGE": {
      "recovery": "Reduce the request body to the documented input fields, then submit a new request."
    },
    "UNSUPPORTED_MEDIA_TYPE": {
      "recovery": "Set Content-Type to application/json or an application media type ending in +json, then submit a new request."
    },
    "RATE_LIMITED": {
      "recovery": "Wait until the applicable advertised rate-limit window has elapsed before retrying."
    },
    "CONTACT_UNAVAILABLE": {
      "recovery": "Wait and submit the same payload with the same Idempotency-Key."
    },
    "CONTACT_FAILED": {
      "recovery": "Retry once with the same payload and Idempotency-Key; otherwise contact Agents First directly."
    },
    "SCAN_FAILED": {
      "recovery": "Ask the user before starting a new scan; repeated attempts consume rate-limit capacity."
    },
    "SCORE_TIMEOUT": {
      "recovery": "Ask the user before starting a new score request; a retry consumes rate-limit capacity. Keep received axis events only as partial data and ask the user before starting a new score request."
    },
    "SCORE_FAILED": {
      "recovery": "Ask the user before starting a new score request; a retry consumes rate-limit capacity. Keep received axis events only as partial data and ask the user before starting a new score request."
    }
  }
}