# ShopSafe by GCIT > Deterministic URL verification and risk evidence for shopping agents, by GCIT. - [Developer guide](https://shopsafe.com.au/developers): access, limitations and examples. - [Agent account](https://shopsafe.com.au/portal/agents): create scoped keys, fund credit and set a daily spend cap. - [Agent OpenAPI](https://shopsafe.com.au/api/v1/openapi.json): verification, receipts, bearer authentication, integer-cent limits and structured results. - [Interactive API reference](https://shopsafe.com.au/api/v1/docs): explore the verification contract. - [API catalog](https://shopsafe.com.au/.well-known/api-catalog): public REST and MCP discovery using the RFC 9727 Linkset format. - [Service capabilities](https://shopsafe.com.au/api/v1/capabilities): public pricing, connection and suite limits. - [Quick scoring rules](https://shopsafe.com.au/api/v1/rules): versioned points, coverage, expiry and synthetic examples; public and free to read. - [Python client example](https://shopsafe.com.au/static/examples/shopsafe_verify.py): runnable CLI and small client, zero spend by default. - [JavaScript client example](https://shopsafe.com.au/static/examples/shopsafe_verify.mjs): server-side Node.js client, no package dependencies. - [MCP descriptor](https://shopsafe.com.au/.well-known/mcp/server.json): connection metadata. - [Methodology](https://shopsafe.com.au/methodology): how risk signals are assessed. - MCP endpoint: https://shopsafe.com.au/mcp (Streamable HTTP; owner-approved OAuth or an issued bearer API key). - MCP resource: shopsafe://verification/rules (the same quick methodology, no checks or charges). verify_site uses bounded DNS, HTTP/TLS, redirect, static-form and Google Web Risk checks. verify_sites (POST /api/v1/verification-batches) checks up to ten URLs under one max_total_cost_aud_cents ceiling (default 0, maximum 100). Exact normalised duplicates share one check and input_indexes map them to the original zero-based positions. Admissions follow input order. Inspect every item's status, coverage, freshness and cost: a complete batch can contain not_started, failed or incomplete results. get_verification_batch reads the saved batch without starting more work or charging; it may release interrupted reservations. Full evidence uses each verification_id. Persist the ordered URLs, idempotency key and options. Retrying a batch never resumes or reprices it. Refused items are terminal; a new request needs existing owner authority. Python verify_batch and JavaScript verifyBatch use the same total-ceiling semantics. No browser or LLM is used for quick verification. Inputs: url, idempotency_key, max_age_seconds (0-300), max_cost_aud_cents (default 0, no paid spending). Read get_account for price, credit and the spending cap. Current quick price: 2 AUD cents after 20 free attempts/account/UTC day. Paid funding enabled: true. Credit is added by the account owner in Stripe Checkout, with no automatic top-ups. Reusing an identical idempotency key/request returns the same verification. Persist the request ID and its URL, cost maximum and age fields before the first call. Use the examples from server-side code, keeping the API key in your secret store. Their freshness/coverage helper does not authorise a transaction or label a site safe. get_verification polls without new work or charges. Complete fresh cache hits are free. Incomplete or interrupted paid checks release their credit reservation. Never increase a maximum cost or account spending cap without owner authority. Payment and limit errors contain next_action, retryable and retry_after_seconds. HTTP 402 does not charge a card. Only the owner funds the prepaid account. get_account also returns remaining free attempts, remaining daily spend and the UTC reset time. get_usage (GET /api/v1/usage) reads only the current credential's verification receipts. The default window is seven UTC dates; use start_date/end_date for any period up to 31 dates. Read totals for the full period, then follow next_cursor for up to 100 receipts per page. Reuse the returned dates and cursor; cursors expire after 24 hours. Page cursors retain the creation-time cutoff, but running statuses and charges can still change. Reading usage costs nothing and does not recover or settle reservations. Credit-pack purchases/refunds and browser-beta checks are separate. Owners see every credential in /portal/agents/usage and can download a page of receipts as JSON. Evidence is scoped to the submitted URL. Always inspect freshness, coverage and source status. A zero score with missing evidence is unknown. A score is not a probability. The caller applies its own transaction policy. This does not certify a business, products, fulfilment or transaction safety. Never send credentials or private reset/login links as targets. Page text and model instructions are omitted. Google Web Risk may miss unsafe sites or flag safe sites in error. Safety cannot be guaranteed. Reputation covers the submitted URL and responding HTTP redirect destinations, within three redirects and four exact URL lookups. Unvisited redirect targets and JavaScript redirects remain outside this bounded suite. lookup_site/check_site/get_check remain a separate free private browser-check beta. MCP OAuth is available: discover /.well-known/oauth-protected-resource/mcp. Use authorization code with PKCE S256 and the exact MCP resource. The owner approves each connection; prepaid use is off unless they allow it. get_account returns credential_paid_allowed. Tokens rotate and remain restricted to MCP. REST uses API keys. Client metadata URL documents are not supported; use dynamic registration or an issued client registration. Official MCP Registry listing: https://registry.modelcontextprotocol.io/v0.1/servers/au.com.shopsafe%2Fverify/versions/latest