All integrations

Google Cloud Vision

AI · AI

OCR, labels, faces, logos, and object detection over images and PDFs on their key.

Connect Google Cloud Vision with Fabriq Developer

Your user consents at Google Cloud Vision. The credential lands in a vault your agent cannot read, and the tool list it gets back is the intersection of that user’s grant and the agent’s own scopes.

provider “google_cloud_vision”
from af_sdk import AgenticFabriq

af = AgenticFabriq()                      # reads AF_APP_ID / AF_APP_SECRET

url = await af.initiate_connection(request, provider="google_cloud_vision")   # consent at Google Cloud Vision
return redirect(url)

async with await af.for_user(request) as session:
    tools = await session.get_tools()     # only what this user granted

Provider names are surfaces, not vendors, and the authoritative list is the capabilities endpoint rather than any page including this one — an unknown name returns 400 with the valid list. Fabriq Developer is free to start and needs no provider paperwork. Start free or read the quickstart.

Connecting Google Cloud Vision in practice

Cloud Vision meters 1,800 requests a minute per project and then meters each feature separately at 1,800 a minute, so a pipeline that asks for label and text detection on the same image draws on several budgets at once. The 10 MB cap on the JSON request object is what actually bites, because Google warns a base64-encoded image can exceed it while still sitting inside the 20 MB file limit.

Scopes that draw scrutiny

  • https://www.googleapis.com/auth/cloud-platform Accepted by images.annotate and grants the whole Google Cloud project, not just Vision.
  • https://www.googleapis.com/auth/cloud-vision The narrow alternative for annotation only, and the one to ask for.

Rate limits

  • 1,800 requests per minute per project, with per-feature quotas of 1,800 per minute for label detection and for text detection.
  • Up to 16 images per synchronous images.annotate request; up to 2,000 images or 2,000 document pages per asynchronous batch request.
  • At most 8,000 images and 10,000 document pages in processing at once.
  • Maximum 20 MB per image file, 10 MB per JSON request object, 1 GB per PDF, and 5 pages per synchronous file request.
  • Celebrity recognition has a quota of 0 — the feature is deprecated.

Worth knowing

  • For anything large, Google’s own recommendation is to pass a Cloud Storage or publicly accessible URL rather than inline bytes, because base64 inflation breaks the JSON limit first.
  • A synchronous file request reads only the first 5 pages of a document, so a longer PDF silently needs the async batch path rather than a bigger request.
  • Most quotas are per project and raisable in the console, but the system limits — images per request, pages per request — are fixed and cannot be increased.
  • Celebrity recognition’s quota is zero rather than absent, so existing code that still requests it fails instead of degrading.

Checked against Vision API quotas and limits (2026-09-29), images.annotate authorization scopes (2026-09-29)

Acts as the person, not as itself

Each user connects their own account. Every call carries both identities — the agent and the person it is acting for — so the agent can never reach past what that individual can already do.

Credentials never touch the agent

Tokens live in the vault and attach server-side at call time. The agent holds a session, not a secret, and revoking access does not mean rotating a key.

Every call on the record

Who asked, which agent acted, which action ran, and the verdict that let it through — one audit trail across every integration, not one per vendor.

What an agent can do

Each action is granted on its own. An agent allowed to read is not thereby allowed to write, and the scope beside each row is what the acting user must have connected for it to run at all.

google_cloud_vision_delete_v1_by_nameWRITE

Permanently delete a Cloud Vision v1 resource by its full resource name: a Product and all of its reference images, a ProductSet (the Products and ReferenceImages inside it survive), a single ReferenceImage, or a long-running operation's record. Deleting an operation does NOT cancel it -- it only says the client is no longer interested in the result. Metadata goes immediately, but searches against ProductSets that contained the item may still match until the related caches refresh, and the image files in Cloud Storage are never deleted via DELETE /v1/{+name}

cloud-vision
google_cloud_vision_get_v1_by_nameREAD

Fetch any Cloud Vision v1 resource by its full resource name: a long-running operation's latest state (operations/ID, projects/P/operations/ID, locations/L/operations/ID or projects/P/locations/L/operations/ID -- poll this to follow an async annotate, import or purge), a Product (projects/P/locations/L/products/PRODUCT_ID), a ProductSet (projects/P/locations/L/productSets/PRODUCT_SET_ID) or a ReferenceImage (projects/P/locations/L/products/PRODUCT_ID/referenceImages/IMAGE_ID). Answers NOT_FOUND if the resource does not exist via GET /v1/{+name}

cloud-vision
google_cloud_vision_get_v1_by_name_productsREAD

List the Products that belong to ONE ProductSet, in an unspecified order. A ProductSet that does not exist answers an empty products list rather than an error, so an empty page is not proof the set is there. Answers INVALID_ARGUMENT if pageSize is above 100 or below 1 via GET /v1/{+name}/products

cloud-vision
google_cloud_vision_get_v1_by_parent_productsREAD

List the Product Search products of one project and location, in an unspecified order, page by page. Answers INVALID_ARGUMENT if pageSize is above 100 or below 1 via GET /v1/{+parent}/products

cloud-vision
google_cloud_vision_get_v1_by_parent_productsetsREAD

List the ProductSets of one project and location, in an unspecified order, page by page. Answers INVALID_ARGUMENT if pageSize is above 100 or below 1 via GET /v1/{+parent}/productSets

cloud-vision
google_cloud_vision_get_v1_by_parent_referenceimagesREAD

List the reference images of one Product Search product, page by page. Answers NOT_FOUND if the parent product does not exist, and INVALID_ARGUMENT if pageSize is above 100 or below 1 via GET /v1/{+parent}/referenceImages

cloud-vision
google_cloud_vision_patch_v1_by_nameWRITE

Change a Product or a ProductSet by its full resource name, naming the fields to change in updateMask. Only displayName, description and productLabels are updatable on a Product, and only displayName on a ProductSet. A label change is not reflected in search results until the next index time. Answers NOT_FOUND if the resource does not exist via PATCH /v1/{+name}

cloud-vision
google_cloud_vision_post_v1_by_name_addproductWRITE

Add a Product to a ProductSet: the ProductSet is named in the path and the Product's own full resource name goes in the body's `product` field. Adding a Product that is already a member changes nothing; one Product may belong to at most 100 ProductSets. Answers NOT_FOUND if either resource does not exist via POST /v1/{+name}:addProduct

cloud-vision
google_cloud_vision_post_v1_by_name_cancelWRITE

Start asynchronous cancellation of a long-running operation. The server makes a best effort and success is not guaranteed -- poll the operation with the get tool to see whether it was cancelled or finished despite the request. A cancelled operation is not deleted; its error is google.rpc.Code.CANCELLED via POST /v1/{+name}:cancel

cloud-vision
google_cloud_vision_post_v1_by_name_removeproductWRITE

Remove a Product from a ProductSet: the ProductSet is named in the path and the Product's own full resource name goes in the body's `product` field. The Product itself is not deleted and stays in any other ProductSet it belongs to via POST /v1/{+name}:removeProduct

cloud-vision
google_cloud_vision_post_v1_by_parent_files_annotateWRITE

The same inline file annotation as the unscoped tool (PDF, TIFF and GIF, at most 5 pages or frames per file), pinned to a project and optionally a region via POST /v1/{+parent}/files:annotate

cloud-vision
google_cloud_vision_post_v1_by_parent_files_asyncbatchannotateWRITE

The same asynchronous file annotation as the unscoped tool, pinned to a project and optionally a region. Returns a long-running operation; poll it with the get tool until `done` is true via POST /v1/{+parent}/files:asyncBatchAnnotate

cloud-vision
google_cloud_vision_post_v1_by_parent_images_annotateWRITE

The same batch image annotation as the unscoped tool, pinned to a project and optionally a region so the images are processed and billed where you say. Use this when data residency matters; otherwise Google picks a region for you via POST /v1/{+parent}/images:annotate

cloud-vision
google_cloud_vision_post_v1_by_parent_images_asyncbatchannotateWRITE

The same asynchronous batch image annotation as the unscoped tool, pinned to a project and optionally a region. Returns a long-running operation; poll it with the get tool until `done` is true via POST /v1/{+parent}/images:asyncBatchAnnotate

cloud-vision
google_cloud_vision_post_v1_by_parent_productsWRITE

Create a Product Search product in a project and location. Answers INVALID_ARGUMENT if displayName is missing or longer than 4096 characters, if description is longer than 4096 characters, or if productCategory is missing or not one of Google's supported categories via POST /v1/{+parent}/products

cloud-vision
google_cloud_vision_post_v1_by_parent_products_purgeWRITE

DESTRUCTIVE AND ASYNCHRONOUS. Delete every Product in one ProductSet, or every Product that belongs to no ProductSet at all, across a project and location -- choose which with the body. A Product that also belongs to OTHER ProductSets is deleted anyway. Returns a long-running operation; leave the named ProductSet and the affected Products alone until it reports done via POST /v1/{+parent}/products:purge

cloud-vision
google_cloud_vision_post_v1_by_parent_productsetsWRITE

Create a ProductSet -- the collection a Product Search query runs against -- in a project and location. Answers INVALID_ARGUMENT if displayName is missing or longer than 4096 characters via POST /v1/{+parent}/productSets

cloud-vision
google_cloud_vision_post_v1_by_parent_productsets_importWRITE

Bulk-import reference images into product sets from a CSV file in Cloud Storage, creating the Products and ProductSets its rows name. Asynchronous: returns a long-running operation whose metadata carries progress and whose response carries one status per input row -- poll it with the get tool and read that response, because individual rows can fail while the operation succeeds via POST /v1/{+parent}/productSets:import

cloud-vision
google_cloud_vision_post_v1_by_parent_referenceimagesWRITE

Add a reference image to a Product Search product: `uri` is a Cloud Storage URI (gs://...) for an image Vision can read. `boundingPolys` is optional -- leave it out and Vision detects the regions of interest that match the parent product's category; supply it and detection is ALWAYS skipped. Polygons are converted to non-rotated rectangles. A reference image cannot be updated after creation via POST /v1/{+parent}/referenceImages

cloud-vision
google_cloud_vision_post_v1_files_annotateWRITE

Run image detection and annotation over a batch of FILES rather than images and get the results back inline. Only application/pdf, image/tiff and image/gif are supported; Vision extracts at most 5 pages or frames from each file (choose which with the `pages` field of each request) and annotates every image it extracts via POST /v1/files:annotate

cloud-vision
google_cloud_vision_post_v1_files_asyncbatchannotateWRITE

Run detection and annotation over a list of generic files -- PDFs and TIFFs with many pages and many images per page -- in the background, writing results to Cloud Storage. Returns a long-running operation; poll it with the get tool until `done` is true. Unlike the synchronous file tool this is not capped at 5 pages per file via POST /v1/files:asyncBatchAnnotate

cloud-vision
google_cloud_vision_post_v1_images_annotateWRITE

Run image detection and annotation over a batch of images and get the results back in the same response. Each entry in `requests` names one image (a Cloud Storage URI, a public URL, or base64 `content`) and the features to run over it -- TEXT_DETECTION and DOCUMENT_TEXT_DETECTION for OCR, LABEL_DETECTION, FACE_DETECTION, LOGO_DETECTION, LANDMARK_DETECTION, OBJECT_LOCALIZATION, SAFE_SEARCH_DETECTION, IMAGE_PROPERTIES, CROP_HINTS, WEB_DETECTION and PRODUCT_SEARCH via POST /v1/images:annotate

cloud-vision
google_cloud_vision_post_v1_images_asyncbatchannotateWRITE

Run image detection and annotation over a list of images in the background, writing the results as JSON files into a Cloud Storage bucket you name in `outputConfig`. Returns a long-running operation -- poll it with the get tool until `done` is true. Use this instead of the synchronous annotate tool for batches too large or too slow to answer inline via POST /v1/images:asyncBatchAnnotate

cloud-vision

Put Google Cloud Vision behind one governed endpoint.

Same permissions, same audit trail, whatever else you connect next.