# Halowerk Entity Graph Extractor

> Halowerk Entity Graph Extractor is a paid API for AI agents from buero.halowerk.com, paid per call via x402, $0.004/call, status unknown (last checked 2026-10-10).

Extracts a structured knowledge graph of named entities (people, orgs, places, products, documents, events) and their stated relations from a document, with verified source quotes and character offsets.

## Facts

- Endpoint: POST https://buero.halowerk.com/v1/entity-graph?utm_source=zero.xyz
- Price: $0.004/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-10
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/halowerk-entity-graph-extractor-5745b258
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_h6gUIl1iDWGZVieanWhJ-

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability halowerk-entity-graph-extractor-5745b258 -d '<json body>'
```

Example prompt: Extract all people, organisations, and places from this PDF — https://example.com/annual-report-2024.pdf — and give me a graph of how they're related, with the exact sentence from the document supporting each relationship.

## When to prefer this

Choose this endpoint when you need a structured, citation-backed knowledge graph from a document rather than a plain list of entities or a summary. It is especially valuable when you need to trust the output — every relation carries a verbatim quote and character offset verified against the source, making it suitable for legal, compliance, investigative, or research workflows where hallucinated relationships are unacceptable. Prefer it over generic NER tools when relational structure (not just entity lists) matters, and when the source document is a PDF, DOCX, ODT, HTML, or Markdown file that needs format-aware parsing.

## Known failure modes

- document_chars mismatch — if the declared character count is shorter than the actual document length, the request is refused and the real length is returned with no charge
- URL unreachable or private/local address — the service refuses non-public URLs
- Unsupported file format — if format detection fails and no filename hint is provided, parsing may fail
- max_relations cap reached — relations beyond the limit are counted but not returned, noted in the response
- Quote verification failure — relations whose quotes cannot be located in the source are marked unverified (or omitted if include_unverified is false)
- Oversized input — text exceeding 200,000 characters or base64 exceeding 4,000,000 characters is rejected

## How this service works

Takes a text as text, a public URL or inline base64 — PDF, DOCX, ODT, HTML and Markdown are read — and returns it as a graph: the people, organisations, places, products, documents and events it names, and the relations it states between them. Every relation carries the sentence it came from word for word, plus the character offset and line where that sentence stands, and each of those quotes is looked up in the source text before the answer goes out: an exact match, or a match after whitespace…

## Output

A structured entity graph containing: (1) a list of named entities categorised by type (person, organisation, place, product, document, event, amount, other); (2) a list of relations between those entities, each carrying the exact verbatim sentence from the source document, its character offset, and line number; (3) a verification status per relation indicating whether the quote was exactly located in the source; and (4) counts of dropped relations and isolated entities when limits or filters apply.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "document": {
   "type": "object",
   "properties": {
    "url": {
     "type": "string",
     "maxLength": 2048,
     "description": "Public http(s) URL of a PDF, DOCX, ODT, HTML or text file. Private and local addresses are refused."
    },
    "text": {
     "type": "string",
     "maxLength": 200000,
     "description": "The text directly. Cheapest and clearest — its length is billed as counted here."
    },
    "format": {
     "enum": [
      "auto",
      "pdf",
      "docx",
      "odt",
      "html",
      "markdown",
      "rtf",
      "text"
     ],
     "type": "string",
     "default": "auto",
     "description": "Override the detected format. \"auto\" reads it from the bytes."
    },
    "filename": {
     "type": "string",
     "maxLength": 260,
     "description": "Only consulted when the bytes carry no recognisable signature."
    },
    "content_base64": {
     "type": "string",
     "maxLength": 4000000,
     "description": "The file inline, base64."
    }
   },
   "description": "The text to read. Exactly one of text, url or content_base64.",
   "additionalProperties": false
  },
  "entity_types": {
   "type": "array",
   "items": {
    "enum": [
     "person",
     "organisation",
     "place",
     "product",
     "document",
     "event",
     "amount",
     "other"
    ],
    "type": "string"
   },
   "maxItems": 8,
   "minItems": 1,
   "description": "Which kinds of entity to look for. Default: person, organisation, place, product, document, event."
  },
  "max_relations": {
   "type": "integer",
   "default": 60,
   "maximum": 120,
   "minimum": 1,
   "description": "How many relations to return at most. What is dropped is counted, never silently cut."
  },
  "document_chars": {
   "type": "integer",
   "maximum": 24000,
   "minimum": 1,
   "description": "Only needed when the text arrives by url or content_base64: its length in characters, which is what you are billed for. A longer text is refused with its real length and nothing is charged."
  },
  "include_unverified": {
   "type": "boolean",
   "default": true,
   "description": "Also return relations whose quote could not be located in the source, clearly marked. Off means they are only counted."
  },
  "include_isolated_entities": {
   "type": "boolean",
   "default": true,
   "description": "Also return entities that ended up with no relation. Off means they are only counted."
  }
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/halowerk-entity-graph-extractor-5745b258/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from buero.halowerk.com](https://www.zero.xyz/host/buero.halowerk.com/llms.txt)
