Skip to main content

Document Moderation

This section covers all APIs related to document moderation, including manual editing of field values, verification status tracking, and document-level moderation.

Postman Collection

Field Management

Update Field Value

Postman

Manually update a field value and track moderation.

PATCH /api/v4/workflows/{workflow_id}/documents/{document_id}/pages/{page_id}/fields/{field_data_id}

Overview

  • Updates a specific field value using its unique ID
  • Tracks original and moderated values
  • Records moderation timestamp and user
  • Maintains verification status
  • Useful for manual corrections
  • Preserves audit trail

Request

{
"value": "INV-2024-003"
}

Response

{
"field_data_id": "f1a2b3c4-d5e6-4f7g-8h9i-j0k1l2m3n4o5",
"field_name": "invoice_number",
"value": "INV-2024-003",
"bbox": [100, 200, 300, 250],
"confidence": 0.95,
"verification_status": "unverified",
"verification_message": ""
}

Example

import requests
from requests.auth import HTTPBasicAuth

API_KEY = 'YOUR_API_KEY'
WORKFLOW_ID = '550e8400-e29b-41d4-a716-446655440000'
DOCUMENT_ID = '550e8400-e29b-41d4-a716-446655440001'
PAGE_ID = '550e8400-e29b-41d4-a716-446655440002'
FIELD_DATA_ID = 'f1a2b3c4-d5e6-4f7g-8h9i-j0k1l2m3n4o5'
url = f"https://app.nanonets.com/api/v4/workflows/{WORKFLOW_ID}/documents/{DOCUMENT_ID}/pages/{PAGE_ID}/fields/{FIELD_DATA_ID}"

payload = {
"value": "INV-2024-003"
}

response = requests.patch(
url,
json=payload,
auth=HTTPBasicAuth(API_KEY, '')
)
print(response.json())

Add Field Value

Postman

Add a new field value to a document.

POST /api/v4/workflows/{workflow_id}/documents/{document_id}/pages/{page_id}/fields

Overview

  • Adds a new field value to a specific page in a document
  • Includes bounding box coordinates
  • Sets initial verification status
  • Useful for manual data entry
  • Preserves audit trail

Request

{
"field_name": "invoice_number",
"value": "INV-2024-004",
"bbox": [100, 200, 300, 250],
"confidence": 1.0,
"verification_status": "unverified",
"verification_message": ""
}

Response

{
"field_data_id": "f1a2b3c4-d5e6-4f7g-8h9i-j0k1l2m3n4o5",
"field_name": "invoice_number",
"value": "INV-2024-004",
"bbox": [100, 200, 300, 250],
"confidence": 1.0,
"verification_status": "unverified",
"verification_message": ""
}

Example

import requests
from requests.auth import HTTPBasicAuth

API_KEY = 'YOUR_API_KEY'
WORKFLOW_ID = '550e8400-e29b-41d4-a716-446655440000'
DOCUMENT_ID = '550e8400-e29b-41d4-a716-446655440001'
PAGE_ID = '550e8400-e29b-41d4-a716-446655440002'
url = f"https://app.nanonets.com/api/v4/workflows/{WORKFLOW_ID}/documents/{DOCUMENT_ID}/pages/{PAGE_ID}/fields"

payload = {
"field_name": "invoice_number",
"value": "INV-2024-004",
"bbox": [100, 200, 300, 250],
"confidence": 1.0,
"verification_status": "unverified",
"verification_message": ""
}

response = requests.post(
url,
json=payload,
auth=HTTPBasicAuth(API_KEY, '')
)
print(response.json())

Delete Field Value

Postman

Delete a field value from a document.

DELETE /api/v4/workflows/{workflow_id}/documents/{document_id}/pages/{page_id}/fields/{field_data_id}

Overview

  • Removes a field value from a document
  • Records deletion in moderation history
  • Useful for removing incorrect data
  • Preserves audit trail

Response

{
"success": true,
"message": "Field value deleted successfully"
}

Example

import requests
from requests.auth import HTTPBasicAuth

API_KEY = 'YOUR_API_KEY'
WORKFLOW_ID = '550e8400-e29b-41d4-a716-446655440000'
DOCUMENT_ID = '550e8400-e29b-41d4-a716-446655440001'
FIELD_DATA_ID = 'f1a2b3c4-d5e6-4f7g-8h9i-j0k1l2m3n4o5'
url = f"https://app.nanonets.com/api/v4/workflows/{WORKFLOW_ID}/documents/{DOCUMENT_ID}/pages/{PAGE_ID}/fields/{FIELD_DATA_ID}"

response = requests.delete(
url,
auth=HTTPBasicAuth(API_KEY, '')
)
print(response.json())

Table Management

Add Table

Postman

Add a new table to a document.

POST /api/v4/workflows/{workflow_id}/documents/{document_id}/pages/{page_id}/tables

Overview

  • Creates a new table in a document
  • Includes table bounding box
  • Sets initial verification status
  • Allows adding cells during table creation
  • Useful for manual table creation
  • Preserves audit trail

Request

{
"bbox": [100, 300, 800, 600],
"headers": ["item_description", "quantity", "price"],
"verification_status": "unverified",
"verification_message": "",
"cells": [
{
"row": 0,
"col": 0,
"header": "item_description",
"text": "Product A",
"bbox": [100, 330, 300, 360],
"verification_status": "unverified",
"verification_message": ""
},
{
"row": 0,
"col": 1,
"header": "quantity",
"text": "5",
"bbox": [310, 330, 380, 360],
"verification_status": "unverified",
"verification_message": ""
},
{
"row": 0,
"col": 2,
"header": "price",
"text": "$100.00",
"bbox": [390, 330, 480, 360],
"verification_status": "unverified",
"verification_message": ""
}
]
}

Response

{
"table_id": "d8e5c1d2-4e71-4d0e-babc-a845f2de4f1b",
"bbox": [100, 300, 800, 600],
"headers": ["item_description", "quantity", "price"],
"verification_status": "unverified",
"verification_message": "",
"cells": [
{
"cell_id": "1b5d3df7-3df7-420a-a82b-29dbdfd3e1b1",
"row": 0,
"col": 0,
"header": "item_description",
"text": "Product A",
"bbox": [100, 330, 300, 360],
"verification_status": "unverified",
"verification_message": ""
},
{
"cell_id": "2c6e4ef8-4ef8-531b-b93c-3aecfef4e2c2",
"row": 0,
"col": 1,
"header": "quantity",
"text": "5",
"bbox": [310, 330, 380, 360],
"verification_status": "unverified",
"verification_message": ""
},
{
"cell_id": "3d7f5fg9-5fg9-642c-c04d-4bfdgfg5f3d3",
"row": 0,
"col": 2,
"header": "price",
"text": "$100.00",
"bbox": [390, 330, 480, 360],
"verification_status": "unverified",
"verification_message": ""
}
]
}

Example

import requests
from requests.auth import HTTPBasicAuth

API_KEY = 'YOUR_API_KEY'
WORKFLOW_ID = '550e8400-e29b-41d4-a716-446655440000'
DOCUMENT_ID = '550e8400-e29b-41d4-a716-446655440001'
PAGE_ID = '550e8400-e29b-41d4-a716-446655440002'
url = f"https://app.nanonets.com/api/v4/workflows/{WORKFLOW_ID}/documents/{DOCUMENT_ID}/pages/{PAGE_ID}/tables"

payload = {
"bbox": [100, 300, 800, 600],
"headers": ["item_description", "quantity", "price"],
"verification_status": "unverified",
"verification_message": "",
"cells": [
{
"row": 0,
"col": 0,
"header": "item_description",
"text": "Product A",
"bbox": [100, 330, 300, 360],
"verification_status": "unverified",
"verification_message": ""
},
{
"row": 0,
"col": 1,
"header": "quantity",
"text": "5",
"bbox": [310, 330, 380, 360],
"verification_status": "unverified",
"verification_message": ""
},
{
"row": 0,
"col": 2,
"header": "price",
"text": "$100.00",
"bbox": [390, 330, 480, 360],
"verification_status": "unverified",
"verification_message": ""
}
]
}

response = requests.post(
url,
json=payload,
auth=HTTPBasicAuth(API_KEY, '')
)
print(response.json())

Delete Table

Postman

Delete a table from a document.

DELETE /api/v4/workflows/{workflow_id}/documents/{document_id}/pages/{page_id}/tables/{table_id}

Overview

  • Removes a table from a document
  • Records deletion in moderation history
  • Useful for removing incorrect tables
  • Preserves audit trail

Response

{
"success": true,
"message": "Table deleted successfully"
}

Example

import requests
from requests.auth import HTTPBasicAuth

API_KEY = 'YOUR_API_KEY'
WORKFLOW_ID = '550e8400-e29b-41d4-a716-446655440000'
DOCUMENT_ID = '550e8400-e29b-41d4-a716-446655440001'
TABLE_ID = 'd8e5c1d2-4e71-4d0e-babc-a845f2de4f1b'
url = f"https://app.nanonets.com/api/v4/workflows/{WORKFLOW_ID}/documents/{DOCUMENT_ID}/pages/{PAGE_ID}/tables/{TABLE_ID}"

response = requests.delete(
url,
auth=HTTPBasicAuth(API_KEY, '')
)
print(response.json())

Update Table Cell Value

Postman

Manually update a table cell value and track moderation.

PATCH /api/v4/workflows/{workflow_id}/documents/{document_id}/pages/{page_id}/tables/{table_id}/cells/{cell_id}

Overview

  • Updates a specific table cell value using its unique ID
  • Tracks original and moderated values
  • Records moderation timestamp and user
  • Maintains verification status
  • Useful for manual corrections
  • Preserves audit trail

Request

{
"value": "Product B"
}

Response

{
"cell_id": "1b5d3df7-3df7-420a-a82b-29dbdfd3e1b1",
"row": 0,
"col": 0,
"header": "item_description",
"text": "Product B",
"bbox": [100, 330, 300, 360],
"verification_status": "unverified",
"verification_message": ""
}

Example

import requests
from requests.auth import HTTPBasicAuth

API_KEY = 'YOUR_API_KEY'
WORKFLOW_ID = '550e8400-e29b-41d4-a716-446655440000'
DOCUMENT_ID = '550e8400-e29b-41d4-a716-446655440001'
PAGE_ID = '550e8400-e29b-41d4-a716-446655440002'
TABLE_ID = 'd8e5c1d2-4e71-4d0e-babc-a845f2de4f1b'
CELL_ID = '1b5d3df7-3df7-420a-a82b-29dbdfd3e1b1'
url = f"https://app.nanonets.com/api/v4/workflows/{WORKFLOW_ID}/documents/{DOCUMENT_ID}/pages/{PAGE_ID}/tables/{TABLE_ID}/cells/{CELL_ID}"

payload = {
"value": "Product B"
}

response = requests.patch(
url,
json=payload,
auth=HTTPBasicAuth(API_KEY, '')
)
print(response.json())

Add Table Cell

Postman

Add a new cell to an existing table.

POST /api/v4/workflows/{workflow_id}/documents/{document_id}/pages/{page_id}/tables/{table_id}/cells

Overview

  • Adds a new cell to an existing table
  • Includes cell bounding box
  • Sets initial verification status
  • Useful for manual cell addition
  • Preserves audit trail

Request

{
"row": 0,
"col": 0,
"header": "item_description",
"text": "Product A",
"bbox": [100, 330, 300, 360],
"verification_status": "unverified",
"verification_message": ""
}

Response

{
"cell_id": "1b5d3df7-3df7-420a-a82b-29dbdfd3e1b1",
"row": 0,
"col": 0,
"header": "item_description",
"text": "Product A",
"bbox": [100, 330, 300, 360],
"verification_status": "unverified",
"verification_message": ""
}

Example

import requests
from requests.auth import HTTPBasicAuth

API_KEY = 'YOUR_API_KEY'
WORKFLOW_ID = '550e8400-e29b-41d4-a716-446655440000'
DOCUMENT_ID = '550e8400-e29b-41d4-a716-446655440001'
PAGE_ID = '550e8400-e29b-41d4-a716-446655440002'
TABLE_ID = 'd8e5c1d2-4e71-4d0e-babc-a845f2de4f1b'
url = f"https://app.nanonets.com/api/v4/workflows/{WORKFLOW_ID}/documents/{DOCUMENT_ID}/pages/{PAGE_ID}/tables/{TABLE_ID}/cells"

payload = {
"row": 0,
"col": 0,
"header": "item_description",
"text": "Product A",
"bbox": [100, 330, 300, 360],
"verification_status": "unverified",
"verification_message": ""
}

response = requests.post(
url,
json=payload,
auth=HTTPBasicAuth(API_KEY, '')
)
print(response.json())

Delete Table Cell

Postman

Delete a cell from a table.

DELETE /api/v4/workflows/{workflow_id}/documents/{document_id}/pages/{page_id}/tables/{table_id}/cells/{cell_id}

Overview

  • Removes a cell from a table
  • Records deletion in moderation history
  • Useful for removing incorrect cells
  • Preserves audit trail

Response

{
"success": true,
"message": "Table cell deleted successfully"
}

Example

import requests
from requests.auth import HTTPBasicAuth

API_KEY = 'YOUR_API_KEY'
WORKFLOW_ID = '550e8400-e29b-41d4-a716-446655440000'
DOCUMENT_ID = '550e8400-e29b-41d4-a716-446655440001'
PAGE_ID = '550e8400-e29b-41d4-a716-446655440002'
TABLE_ID = 'd8e5c1d2-4e71-4d0e-babc-a845f2de4f1b'
CELL_ID = '1b5d3df7-3df7-420a-a82b-29dbdfd3e1b1'
url = f"https://app.nanonets.com/api/v4/workflows/{WORKFLOW_ID}/documents/{DOCUMENT_ID}/pages/{PAGE_ID}/tables/{TABLE_ID}/cells/{CELL_ID}"

response = requests.delete(
url,
auth=HTTPBasicAuth(API_KEY, '')
)
print(response.json())

Verification

Verify Field

Postman

Verify a field in a document.

POST /api/v4/workflows/{workflow_id}/documents/{document_id}/pages/{page_id}/fields/{field_data_id}/verify

Overview

  • Marks a field as verified
  • Updates verification status
  • Records verification in moderation history
  • Useful for quality control
  • Preserves audit trail

Request

{
"verification_status": "verified",
"verification_message": "Field value is correct"
}

Response

{
"field_data_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"field_name": "invoice_number",
"value": "INV-2024-001",
"bbox": [100, 200, 300, 250],
"confidence": 0.95,
"verification_status": "verified",
"verification_message": "Field value is correct"
}

Example

import requests
from requests.auth import HTTPBasicAuth

API_KEY = 'YOUR_API_KEY'
WORKFLOW_ID = '550e8400-e29b-41d4-a716-446655440000'
DOCUMENT_ID = '550e8400-e29b-41d4-a716-446655440001'
PAGE_ID = '550e8400-e29b-41d4-a716-446655440002'
FIELD_DATA_ID = 'f1a2b3c4-d5e6-4f7g-8h9i-j0k1l2m3n4o5'
url = f"https://app.nanonets.com/api/v4/workflows/{WORKFLOW_ID}/documents/{DOCUMENT_ID}/pages/{PAGE_ID}/fields/{FIELD_DATA_ID}/verify"

payload = {
"verification_status": "verified",
"verification_message": "Field value is correct"
}

response = requests.post(
url,
json=payload,
auth=HTTPBasicAuth(API_KEY, '')
)
print(response.json())

Verify Table Cell

Postman

Verify a table cell in a document.

POST /api/v4/workflows/{workflow_id}/documents/{document_id}/pages/{page_id}/tables/{table_id}/cells/{cell_id}/verify

Overview

  • Marks a table cell as verified
  • Updates verification status
  • Records verification in moderation history
  • Useful for quality control
  • Preserves audit trail

Request

{
"verification_status": "verified",
"verification_message": "Cell value is correct"
}

Response

{
"cell_id": "1b5d3df7-3df7-420a-a82b-29dbdfd3e1b1",
"row": 0,
"col": 0,
"header": "item_description",
"text": "Product A",
"bbox": [100, 330, 300, 360],
"verification_status": "verified",
"verification_message": "Cell value is correct"
}

Example

import requests
from requests.auth import HTTPBasicAuth

API_KEY = 'YOUR_API_KEY'
WORKFLOW_ID = '550e8400-e29b-41d4-a716-446655440000'
DOCUMENT_ID = '550e8400-e29b-41d4-a716-446655440001'
PAGE_ID = '550e8400-e29b-41d4-a716-446655440002'
TABLE_ID = 'd8e5c1d2-4e71-4d0e-babc-a845f2de4f1b'
CELL_ID = '1b5d3df7-3df7-420a-a82b-29dbdfd3e1b1'
url = f"https://app.nanonets.com/api/v4/workflows/{WORKFLOW_ID}/documents/{DOCUMENT_ID}/pages/{PAGE_ID}/tables/{TABLE_ID}/cells/{CELL_ID}/verify"

payload = {
"verification_status": "verified",
"verification_message": "Cell value is correct"
}

response = requests.post(
url,
json=payload,
auth=HTTPBasicAuth(API_KEY, '')
)
print(response.json())

Verify Table

Postman

Verify an entire table in a document.

POST /api/v4/workflows/{workflow_id}/documents/{document_id}/pages/{page_id}/tables/{table_id}/verify

Overview

  • Marks all cells in a table as verified
  • Updates verification status for the table
  • Records verification in moderation history
  • Useful for bulk table verification
  • Preserves audit trail

Request

{
"verification_status": "verified",
"verification_message": "All table values are correct"
}

Response

{
"table_id": "d8e5c1d2-4e71-4d0e-babc-a845f2de4f1b",
"bbox": [100, 300, 800, 600],
"headers": ["item_description", "quantity", "price"],
"verification_status": "verified",
"verification_message": "All table values are correct",
"cells": [
{
"cell_id": "1b5d3df7-3df7-420a-a82b-29dbdfd3e1b1",
"row": 0,
"col": 0,
"header": "item_description",
"text": "Product A",
"bbox": [100, 330, 300, 360],
"verification_status": "verified",
"verification_message": ""
},
{
"cell_id": "2c6e4ef8-4ef8-531b-b93c-3aecfef4e2c2",
"row": 0,
"col": 1,
"header": "quantity",
"text": "5",
"bbox": [310, 330, 380, 360],
"verification_status": "verified",
"verification_message": ""
},
{
"cell_id": "3d7f5fg9-5fg9-642c-c04d-4bfdgfg5f3d3",
"row": 0,
"col": 2,
"header": "price",
"text": "$100.00",
"bbox": [390, 330, 480, 360],
"verification_status": "verified",
"verification_message": ""
}
]
}

Example

import requests
from requests.auth import HTTPBasicAuth

API_KEY = 'YOUR_API_KEY'
WORKFLOW_ID = '550e8400-e29b-41d4-a716-446655440000'
DOCUMENT_ID = '550e8400-e29b-41d4-a716-446655440001'
PAGE_ID = '550e8400-e29b-41d4-a716-446655440002'
TABLE_ID = 'd8e5c1d2-4e71-4d0e-babc-a845f2de4f1b'
url = f"https://app.nanonets.com/api/v4/workflows/{WORKFLOW_ID}/documents/{DOCUMENT_ID}/pages/{PAGE_ID}/tables/{TABLE_ID}/verify"

payload = {
"verification_status": "verified",
"verification_message": "All table values are correct"
}

response = requests.post(
url,
json=payload,
auth=HTTPBasicAuth(API_KEY, '')
)
print(response.json())

Verify Document

Postman

Verify an entire document.

POST /api/v4/workflows/{workflow_id}/documents/{document_id}/verify

Overview

  • Marks all fields and tables in a document as verified
  • Updates verification status for all elements
  • Records verification in moderation history
  • Useful for bulk verification
  • Preserves audit trail

Request

{
"verification_status": "verified",
"verification_message": "All values are correct"
}

Response

{
"document_id": "550e8400-e29b-41d4-a716-446655440001",
"status": "verified",
"verification_status": "verified",
"verification_message": "All values are correct",
"pages": [
{
"page_id": "550e8400-e29b-41d4-a716-446655440002",
"page_number": 1,
"fields": [
{
"field_data_id": "f1a2b3c4-d5e6-4f7g-8h9i-j0k1l2m3n4o5",
"field_name": "invoice_number",
"value": "INV-2024-001",
"bbox": [100, 200, 300, 250],
"confidence": 0.95,
"verification_status": "verified",
"verification_message": ""
}
],
"tables": [
{
"table_id": "d8e5c1d2-4e71-4d0e-babc-a845f2de4f1b",
"bbox": [100, 300, 800, 600],
"headers": ["item_description", "quantity", "price"],
"verification_status": "verified",
"verification_message": "",
"cells": [
{
"cell_id": "1b5d3df7-3df7-420a-a82b-29dbdfd3e1b1",
"row": 0,
"col": 0,
"header": "item_description",
"text": "Product A",
"bbox": [100, 330, 300, 360],
"verification_status": "verified",
"verification_message": ""
}
]
}
]
}
]
}

Example

import requests
from requests.auth import HTTPBasicAuth

API_KEY = 'YOUR_API_KEY'
WORKFLOW_ID = '550e8400-e29b-41d4-a716-446655440000'
DOCUMENT_ID = '550e8400-e29b-41d4-a716-446655440001'
url = f"https://app.nanonets.com/api/v4/workflows/{WORKFLOW_ID}/documents/{DOCUMENT_ID}/verify"

payload = {
"verification_status": "verified",
"verification_message": "All values are correct"
}

response = requests.post(
url,
json=payload,
auth=HTTPBasicAuth(API_KEY, '')
)
print(response.json())

Error Handling

All document moderation APIs return standard HTTP status codes:

  • 200 OK: Request successful
  • 400 Bad Request: Invalid request parameters
  • 401 Unauthorized: Invalid or missing API key
  • 404 Not Found: Workflow, document, field, or table cell not found
  • 409 Conflict: Invalid verification status
  • 500 Internal Server Error: Server-side error

Common Error Codes

Example

import requests
from requests.auth import HTTPBasicAuth

API_KEY = 'YOUR_API_KEY'
WORKFLOW_ID = '550e8400-e29b-41d4-a716-446655440000'
DOCUMENT_ID = '550e8400-e29b-41d4-a716-446655440001'
FIELD_DATA_ID = 'f1a2b3c4-d5e6-4f7g-8h9i-j0k1l2m3n4o5'
url = f"https://app.nanonets.com/api/v4/workflows/{WORKFLOW_ID}/documents/{DOCUMENT_ID}/fields/{FIELD_DATA_ID}"

try:
response = requests.get(
url,
auth=HTTPBasicAuth(API_KEY, '')
)
response.raise_for_status() # Raises an HTTPError for bad responses (4xx, 5xx)
print(response.json())
except requests.exceptions.HTTPError as e:
if e.response.status_code == 404:
print("Field not found")
elif e.response.status_code == 401:
print("Unauthorized - Check your API key")
elif e.response.status_code == 403:
print("Forbidden - Insufficient permissions")
else:
print(f"HTTP Error: {e}")
except requests.exceptions.RequestException as e:
print(f"Request Error: {e}")

Best Practices

  1. Field and Table Cell Moderation

    • Verify each field and cell individually
    • Add clear verification notes
    • Track all modifications
  2. Document Verification

    • Verify all fields and cells before marking document as verified
    • Include comprehensive verification notes
    • Maintain audit trail
  3. Moderation History

    • Review moderation history regularly
    • Use history for quality control
    • Track common issues

For more best practices, refer to the Best Practices Guide.