{"openapi":"3.1.0","info":{"title":"SPF Guru","version":"1","summary":"Measure what an SPF record costs in DNS lookups.","description":"Every response is computed from live DNS at request time. No authentication. Rate limited to 10/minute per address, and API calls are also charged against the site-wide limit.","contact":{"url":"https://spf.guru/about-spf-guru"}},"servers":[{"url":"https://spf.guru"}],"paths":{"/api/analyse":{"get":{"summary":"What a domain's SPF record costs, and its replacement","description":"Returns the DNS lookup count, whether it exceeds the limit of ten, and a replacement record a receiving server resolves in one lookup.","operationId":"analyseDomain","parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string"},"description":"Domain to look up, e.g. example.com"}],"responses":{"200":{"description":"Result"},"400":{"description":"Missing or invalid parameters"},"429":{"description":"Rate limited"}}}},"/api/tree":{"get":{"summary":"Expand a record's include graph","description":"Every nested include, with the cost of each branch including everything beneath it, which is how the ten term limit is actually applied.","operationId":"expandTree","parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string"},"description":"Domain to look up, e.g. example.com"}],"responses":{"200":{"description":"Result"},"400":{"description":"Missing or invalid parameters"},"429":{"description":"Rate limited"}}}},"/api/check":{"get":{"summary":"Evaluate one message the way a receiver would","description":"Walks the record for a given sender and sending IP and returns the SPF result plus every mechanism, DNS query and macro expansion along the way.","operationId":"checkMessage","parameters":[{"name":"sender","in":"query","required":true,"schema":{"type":"string"},"description":"Envelope sender, or a bare domain"},{"name":"ip","in":"query","required":true,"schema":{"type":"string"},"description":"Sending IP address, v4 or v6"},{"name":"helo","in":"query","required":false,"schema":{"type":"string"},"description":"HELO name. Defaults to the sender domain"},{"name":"record","in":"query","required":false,"schema":{"type":"string"},"description":"Evaluate this record instead of the published one, to test a change before publishing it"}],"responses":{"200":{"description":"Result"},"400":{"description":"Missing or invalid parameters"},"429":{"description":"Rate limited"}}}}}}