Read saved image records through the API.

Inspect a ComfyUI workflow or compare the creation details in an original image and its export. These two endpoints read the files you supply without calling an AI model or running a workflow.

No account or API key is required for these current public endpoints. Upload and service limits apply. Use them from a server or CLI; cross-origin browser requests are rejected.

Read ComfyUI workflow and API graphs

Send one multipart file to POST /v1/workflow. Use a PNG containing saved graph fields, or a standalone .json export. The PNG's workflow record describes the editor graph; its prompt record describes the API execution graph. The latter is a graph, not a single positive prompt string.

Download the controlled PNG with both graph records, then run:

curl --fail-with-body --max-time 30 https://isgenai.com/v1/workflow \
  -F "file=@with-workflow.png"

The response has two top-level arrays: records and unreadable. Each supported record contains kind (workflow or prompt), the saved JSON string in text, a nodes inventory and sorted node_types. Each node exposes its id, type and input names.

The example should return two records, each with two nodes: LoadImage and SaveImage. We attached those hand-built records to a code-drawn image; they do not claim to have generated its pixels. You can also submit the editor JSON or API JSON with the same multipart field.

A supported PNG without graph records returns HTTP 200 with { "records": [], "unreadable": [] }. An unsupported or malformed standalone graph can return HTTP 200 with unreadable: ["json"]. Check both arrays rather than treating every HTTP 200 as a recovered workflow. Graph records can be edited; finding one does not authenticate an image's origin.

Try the interactive ComfyUI workflow viewer or read how the two saved graph types differ.

Compare the records before and after export

Send two multipart files, before and after, to POST /v1/metadata-compare. Download the original demonstration PNG and its re-encoded copy:

curl --fail-with-body --max-time 30 https://isgenai.com/v1/metadata-compare \
  -F "before=@a1111-original.png" \
  -F "after=@a1111-png-reencode.png"

The response includes before and after observations, each with a file sha256, readable values and warnings. identical_files compares the file hashes. The rows array reports each supported field's before/after values and one of these states:

Comparison states describe this reader's observations.
StateMeaning
sameThe readable value matches in both files.
changedBoth files have a readable value, and the values differ.
unreadable_afterThe reader found a value before but cannot read it in the after file.
readable_afterThe reader can read a value only in the after file.
not_foundThe reader found no supported value in either file.

For these two fixtures, identical_files is false and the saved prompt row is unreadable_after. A missing field can reflect removal, damage or an unsupported encoding. It does not certify that every copy lacks the field, and it does not distinguish an AI image from a camera photo.

Readable fields include format, dimensions, byte size, supported saved prompts, model names, generation settings and ComfyUI graph fingerprints. Seeds remain strings. Graph fingerprints hash the saved text, so JSON formatting alone can change a fingerprint. File hashes describe bytes; they do not measure visual similarity.

This endpoint does not compare GPS, camera EXIF fields, every XMP property or C2PA signatures. Use the Content Credentials checker for supported signed records. The interactive comparison includes all 18 export observations, with downloadable results and hashes and an example scope and license.

Use the dependency-free Node.js CLI

Install Node.js 22 or newer and download image-records-example.mjs. No npm packages are required. Supply explicit local file paths:

node image-records-example.mjs workflow with-workflow.png
node image-records-example.mjs workflow workflow.json
node image-records-example.mjs compare a1111-original.png a1111-png-reencode.png

Each command sends one request to isgenai.com and prints the JSON result. The script checks file extensions and sizes before upload, uses generic multipart filenames, rejects URL inputs and redirects, times out after 30 seconds, and does not retry. The server validates file contents. The example is CC0-1.0; adapt it to your own application.

For your own local server, set ISGENAI_BASE_URL=http://localhost:3000. A hosted override must be an HTTPS origin without credentials, a path or query parameters. That override changes the recipient of your files; use a deployment you trust.

Limits and error handling

Limits are binary byte limits: 1 MiB = 1,048,576 bytes.
EndpointAccepted input and limits
/v1/workflowPNG up to 20 MiB, or standalone JSON up to 1 MiB. Each supported graph is limited to 1 MiB of JSON and 1,000 nodes; editor graphs allow up to 10,000 links. Additional structure/depth checks apply.
/v1/metadata-compareTwo PNG, JPEG or WebP files, up to 10 MiB and 40 million pixels each. Animated or multipage inputs are rejected. EXIF data over 1 MiB is skipped with a warning.

Send multipart form data and let your HTTP client set its boundary. Do not send JSON containing a remote image URL. Both endpoints reject a foreign Origin or Sec-Fetch-Site: cross-site; they are not a cross-origin browser API.

  • 400: missing input, unsupported file or unreadable upload. Workflow errors include missing_file, unsupported_file and invalid_file; comparison errors include missing_files and unsupported_file.
  • 403: invalid_origin. Make the request from your backend or CLI.
  • 413: too_large. Reduce the file or request size.
  • 429: the shared upload service is busy. Honor Retry-After when present; the current busy response sends 5 seconds. Offer a manual retry rather than an immediate request loop.

The busy response uses an error.message object; most validation responses use an error string. Hosting and network failures can return another format. Check the HTTP status before assuming a success-shaped JSON result.

Keep file contents and results private

These commands upload the supplied files to isGenAI for parsing. The two handlers process file buffers and return JSON; they do not create a public receipt, publish an image or save a public workflow. They make no paid model calls and never execute graph nodes, install custom nodes or fetch URLs embedded in saved records.

Saved JSON and prompts may contain private instructions, input paths or other sensitive values. The CLI prints those records, so keep its output out of shared logs and review files before uploading them. Generic multipart filenames hide the local filename, not private content inside the file. See the privacy policy for the wider service policy.

For a prompt string instead of the full graph, use POST /v1/prompt in saved-only mode as documented in the saved-prompt API example. For more controlled files and explanations, explore the image metadata lab and comparison guide.