---
title: SPF
---

[Skip to content](#%5Ftop) 

[API Reference](https://developers.cloudflare.com/api/python)

[Email Auth](https://developers.cloudflare.com/api/python/resources/email%5Fauth)

Copy Markdown

Open in **Claude**

Open in **ChatGPT**

Open in **Cursor**

---

**Copy Markdown**

**View as Markdown**

# SPF

#### SPFInspect

##### [Inspect SPF Record](https://developers.cloudflare.com/api/python/resources/email%5Fauth/subresources/spf/subresources/inspect/methods/get)

email\_auth.spf.inspect.get(InspectGetParams\*\*kwargs)  \-> [InspectGetResponse](https://developers.cloudflare.com/api/python/resources/email%5Fauth#%28resource%29%20email%5Fauth.spf.inspect%20%3E%20%28model%29%20inspect%5Fget%5Fresponse%20%3E%20%28schema%29)

GET/zones/{zone\_id}/email/auth/spf/inspect

##### ModelsExpand Collapse 

class InspectGetResponse: …

Recursive SPF inspection tree

components: List\[object\]

Parsed SPF components (mechanisms)

domain: str

Domain being inspected

record: str

Raw SPF record content

total\_lookups: int

Total number of DNS lookups performed across all includes

errors: Optional\[List\[Error\]\]

All errors encountered during inspection, collected from the entire tree. This includes errors from nested includes at any depth, providing a quick overview of all issues without needing to traverse the nested structure. Each error includes a `domain` field to identify where it occurred. Empty array if no errors (omitted from JSON when empty).

code: str

Error code. Known values:

* `lookup_failed` — DNS TXT lookup failed
* `spf_not_found` — no SPF record found
* `invalid_spf` — record does not start with `v=spf1`
* `invalid_domain` — PSL validation failed
* `loop_detected` — include/redirect cycle detected
* `invalid_mechanism` — unrecognised or malformed mechanism
* `resource_limit_exceeded` — internal resource protection limits exceeded (recursion depth or query budget)
* `max_lookups` — RFC 7208 10-lookup limit exceeded

domain: str

Domain where the error occurred

message: str

Human-readable error message

details: Optional\[str\]

Additional error-specific details (optional).

* For `invalid_domain` errors: the invalid domain string
* For `invalid_mechanism` errors: the invalid mechanism text (e.g., “invalidmech123”)
* For `loop_detected` errors: the domain that caused the loop
* For other error types: not present