space ocr
GuidesArticlesPricingDocs
comparison

Google Vision vs Space OCR

Google Cloud Vision OCR vs space-ocr structured extraction: compare text and geometry with fields, cells, review queues, normalized values, async, and MCP.

9 min read· 2026-08-31

Google Cloud Vision and space-ocr solve different layers of a document workflow. Cloud Vision's TEXT_DETECTION and DOCUMENT_TEXT_DETECTION features return OCR text and geometry. The dense-document response is a fullTextAnnotation hierarchy of pages, blocks, paragraphs, words, and symbols. That is a strong fit when your application needs the page transcription and each detected region.

Named invoice fields are a different Google product surface. Google's Document AI processor list describes Form Parser for key-value pairs and tables, and Invoice Parser for invoice header and line-item entities. A Document AI integration creates a processor instance in a Google Cloud project before processing documents.

space-ocr is an opinionated structured-extraction layer: send fields or ask for autoFields, then receive business values, source cells, a review queue, and deterministic typed representations. This article compares those contracts without treating Cloud Vision and Document AI as the same API.

✓ Verified

This is not an engine-versus-engine shootout. space-ocr uses Google Cloud Vision as its OCR pass, then adds structured extraction, source matching, declared validation rules, normalization, and workflow surfaces. The practical choice is often between calling the lower-level OCR output directly, using Google's Document AI processors, or using a per-request structured contract.

Keep the three product surfaces separate

QuestionGoogle Cloud VisionGoogle Document AIspace-ocr
Primary responseOCR text and layout geometryA Document response shaped by the selected processorNamed business data plus source, review, and normalized layers
Named invoice fieldsNot the Cloud Vision OCR contractInvoice Parser returns invoice entities, including header and line-item fieldsDeclare the names in fields, or use autoFields while exploring
General formsYou interpret OCR text and layoutForm Parser extracts key-value pairs, tables, selection marks, and generic fieldsDefine scalar, object, or array fields with recursive children
Setup unitEnable Vision in a Google Cloud project and authenticate the requestCreate a processor instance in a project and call that processorUse a Bearer API key; the extraction schema travels with the request
Human-review handoffRecognition confidence and geometry are inputs to the workflow you buildDepends on the processor output and the workflow you build around itdata.review.flagged names the paths to inspect; returned cells use the same paths
Typed business valuesNot part of the raw OCR responseAvailable for supported processor entitiesDeclared number, integer, and date leaves appear in data.normalized without replacing data.values

The Cloud Vision OCR documentation explicitly points scanned-document users toward Document AI for structured form parsing and entity extraction. That product boundary matters: comparing Cloud Vision alone with a structured-field API understates Google's offering, while describing Document AI features as Cloud Vision features overstates the raw OCR endpoint.

Text geometry and structured source cells are different contracts

Cloud Vision's document OCR returns fullTextAnnotation, with the text hierarchy and a boundingPoly around detected units. For images, those polygon points use the scale of the original image. The documented OCR confidence is a recognition signal: it describes the OCR result, not whether a particular string is the correct invoice number, supplier, or total. See Google's full-text annotation guide and response reference.

space-ocr separates the response into layers:

  • data.values is the business-data tree matching the requested schema. It is the model's reading, not a byte-for-byte transcription.
  • data.cells[path] is the flat source and verdict map. Each cell can include box, quad, verified, review, and diagnostic evidence.
  • data.review.flagged is the review queue. A flag's path uses the same syntax as the cells map, including paths such as items[0].amount. A required value flagged as missing has no source cell, so the queue is its only surface.
  • data.normalized is a sparse tree of deterministic parsed values for declared scalar types. It does not rewrite the strings in values.
  • data.image reports the pixel frame used by the response after image orientation and any server processing.

box and quad use a 0-1000 coordinate grid. Render them against data.image, or use an SVG view box of 0 0 1000 1000. A diagnostic value such as cells[path].evidence.match_ratio can help explain a result, but it is not a fixed human-review threshold. Build the queue from review.flagged; when a cell exists, show cells[path].review.reasons and its source region.

POST /ocr/fields with an explicit invoice schema
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
curl -s https://api.space-ocr.com/ocr/fields \
  -H "Authorization: Bearer $SPACE_OCR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "image": "https://example.com/invoice.jpg",
    "imageType": "url",
    "fields": [
      { "name": "invoice_number", "type": "string",
        "required": true, "label": ["Invoice No.", "Invoice #"] },
      { "name": "invoice_date", "type": "date",
        "required": true, "label": ["Invoice date", "Date"] },
      { "name": "total", "type": "number",
        "required": true, "min": 0, "label": ["Total", "Amount due"] }
    ]
  }'

Use an explicit schema when downstream columns and validation rules are already known. For an unfamiliar document, omit fields and send "autoFields": true; the service proposes the schema. Once the integration stabilizes, explicit fields make mappings and review rules easier to test.

required, label, near, not_near, pattern, min, max, enum, and review are post-extraction declarations. They add anchors or review signals; they do not authorize the model to invent a missing value.

Representative v2 response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
{
  "status": "success",
  "data": {
    "values": {
      "invoice_number": "INV-4471",
      "invoice_date": "2026/08/31",
      "total": "$4,286.00"
    },
    "cells": {
      "invoice_number": {
        "box": { "xmin": 612, "ymin": 118, "xmax": 846, "ymax": 151 },
        "quad": [
          { "x": 612, "y": 118 }, { "x": 846, "y": 120 },
          { "x": 845, "y": 151 }, { "x": 611, "y": 149 }
        ],
        "verified": true,
        "review": null,
        "evidence": {
          "printed_text": "INV-4471", "text_match": true,
          "source": "vision_symbol_match", "match_ratio": 1.0
        }
      },
      "invoice_date": {
        "box": { "xmin": 612, "ymin": 164, "xmax": 845, "ymax": 197 },
        "quad": [
          { "x": 612, "y": 164 }, { "x": 845, "y": 166 },
          { "x": 844, "y": 197 }, { "x": 611, "y": 195 }
        ],
        "verified": true,
        "review": null,
        "evidence": {
          "printed_text": "2026/08/31", "text_match": true,
          "source": "vision_symbol_match", "match_ratio": 1.0
        },
        "normalized": {
          "value": "2026-08-31", "type": "date", "method": "deterministic"
        }
      },
      "total": {
        "box": { "xmin": 696, "ymin": 802, "xmax": 892, "ymax": 842 },
        "quad": [
          { "x": 696, "y": 802 }, { "x": 892, "y": 804 },
          { "x": 891, "y": 842 }, { "x": 695, "y": 840 }
        ],
        "verified": false,
        "review": { "reasons": ["low_ocr_confidence"] },
        "evidence": {
          "printed_text": "$4,286.00", "text_match": true,
          "source": "vision_symbol_match", "match_ratio": 1.0,
          "ocr_confidence": 0.42
        },
        "normalized": {
          "value": 4286, "type": "number", "method": "deterministic"
        }
      }
    },
    "review": {
      "unit": "field",
      "declared": 3, "returned": 3, "boxed": 3, "verified": 2,
      "flagged": [
        { "path": "total", "reasons": ["low_ocr_confidence"] }
      ],
      "by_reason": { "low_ocr_confidence": 1 }
    },
    "normalized": {
      "invoice_date": "2026-08-31",
      "total": 4286
    },
    "image": { "width": 1654, "height": 2339 }
  }
}
Why it matters

A clean review queue is not a correctness proof. Coordinates and cross-check evidence make a result inspectable, and declared rules can catch missing or malformed fields. Two reading stages can still agree on the same mistake. Keep arithmetic checks, vendor-master checks, date policies, and a sampled audit outside the OCR response.

Recognition confidence vs an explicit review contract

Cloud Vision confidence and the space-ocr review contract answer different questions. Vision's confidence reports how certain the OCR result is at documented text levels. In space-ocr, cells[path].verified is the current cell verdict and cells[path].review.reasons explains why a returned cell was flagged. Reasons can come from OCR evidence or from rules you declared, such as a missing required field, an invalid pattern, an out-of-range number, or a location mismatch.

That distinction changes application code. Do not sort every field by a hard-coded evidence score and call the remainder accepted. Iterate data.review.flagged; if data.cells[flag.path] exists, draw its box or quad, otherwise handle a missing required value without a source region. Keep the final human decision in your own workflow. Use evidence.printed_text when exact comparison with the OCR pass matters; values is the structured model reading and can differ in spacing or character-width presentation.

A flagged path opens its matching source cell, so the reviewer sees the value, the reason, and the exact page region together.

Storage, async processing, and agent access

A direct /ocr/fields request is synchronous and returns the structured response inline. The public API can wait up to 180 seconds; split documents into page images, or use the async upload path for denser and multi-file work.

MySpace is optional workflow infrastructure rather than part of the direct OCR response. /upload can place images into a sheet or a markdown/text document bundle and is asynchronous by default. It returns jobs that can be polled or completed through webhooks. /space lists the stored tree and /view reads a sheet or document bundle without re-running OCR.

For agent clients, the official MCP endpoint is https://mcp.space-ocr.com/mcp. That gives an MCP-capable client access to the product workflow without changing the REST response contract. See the API documentation for current request and webhook details, and pricing before comparing operational costs.

Which option fits?

Choose Cloud Vision when the desired artifact is OCR text and layout geometry and your team wants to own the structuring, storage, and review logic. It also fits naturally when those pieces already live in a Google Cloud architecture.

Evaluate Document AI when a Google processor already matches the job: Form Parser for general forms, Invoice Parser for invoice entities, or a custom extractor for a schema specific to your documents. Test the exact processor, region, language, page limits, and output fields you plan to deploy; these are processor-specific and can change.

Evaluate space-ocr when the integration should carry its field schema per request and return a stable application-facing split between values, cells, review, and normalized. MySpace, async jobs, webhooks, and MCP are useful when extraction also needs a lightweight operational surface.

There is no universal winner. Benchmark the same documents, compare the business fields you actually need, and include review labor and integration code in the decision. For coordinate rendering, continue with an OCR API with bounding boxes. For invoice schemas, see the invoice data extraction API guide.

How to compare Google Vision and space-ocr on your documents

  1. Define the output you need
    List the required artifact: full OCR text and layout, processor-defined entities, or a custom business schema with a review queue. This determines whether Cloud Vision, Document AI, or space-ocr is the relevant comparison.
  2. Run Cloud Vision on a fixed test set
    Use DOCUMENT_TEXT_DETECTION when dense document text is the target. Save the fullTextAnnotation, geometry, and recognition confidence together with the input file and request settings.
  3. Include Document AI when structured Google output is required
    Test the actual Form Parser, Invoice Parser, or custom extractor you would deploy. Do not attribute its entities to the Cloud Vision OCR endpoint.
  4. Run the same images through a field schema
    Call POST /ocr/fields with explicit fields, or use autoFields for initial discovery. Read business data from data.values and deterministic typed leaves from data.normalized.
  5. Measure review and operations
    Inspect data.review.flagged through data.cells[path] when a source cell exists, and handle missing required values directly from the queue. Then compare field accuracy, review time, storage, async processing, webhooks, MCP access, security requirements, and current pricing for the complete workflow.
Does Google Cloud Vision return structured invoice fields?
Cloud Vision's OCR contract returns text and geometry, not a named invoice schema. Google's structured route is Document AI: Invoice Parser returns invoice entities, while Form Parser handles key-value pairs and tables. Those are processor-based Document AI products, not Cloud Vision OCR response fields.
Does space-ocr replace Google Cloud Vision?
Not at the OCR-engine layer. space-ocr uses Google Cloud Vision as its OCR pass and adds per-request structured extraction, source cells, validation and review signals, deterministic normalization, and optional workflow surfaces. The choice is about the API and workflow contract you want to own.
What is the difference between Vision confidence and space-ocr review flags?
Vision confidence is a recognition signal for OCR text. space-ocr's review queue is an application-facing verdict that can combine OCR evidence with declared rules such as required, pattern, range, enum, near, and not_near. Use data.review.flagged for routing; do not turn evidence.match_ratio into a fixed acceptance threshold.
How do the coordinates differ?
Cloud Vision's OCR boundingPoly uses the image's coordinate scale. space-ocr cells use box and quad on a 0-1000 grid and provide data.image as the pixel frame used for rendering. Convert x with x / 1000 * data.image.width and y with y / 1000 * data.image.height.
Should I use fields or autoFields with space-ocr?
Use autoFields when exploring an unfamiliar document. Use explicit fields when column names, types, line-item children, and validation rules are part of a production contract. Both routes return business values under data.values and review metadata under data.cells and data.review.
Related