Instacart Public Retailer Phone Scraper
Pricing
from $2.99 / 1,000 retailer phones
Instacart Public Retailer Phone Scraper
Extract bounded publicly displayed retailer business phone numbers from supplied Instacart pages with explicit access diagnostics.
Pricing
from $2.99 / 1,000 retailer phones
Rating
0.0
(0)
Developer
w3crawler
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
What does Instacart Public Retailer Phone Auditor do?
This Actor audits caller-supplied public Instacart retailer and location pages for a phone number that the page explicitly publishes as a retailer-business contact. It reads public JSON-LD, tel: links, and clearly labelled visible text. A normal row is emitted only when the source page provides the phone evidence and the record retains its canonical source, final URL, extraction method, evidence context, confidence classification, and publication flags.
The Actor does not promise that every Instacart page has a phone. If the supplied page has no qualifying public phone, the run emits a bounded NO_PUBLIC_PHONE diagnostic. It never infers a generic retailer number, copies a directory or reader result, treats Instacart support as a retailer phone, or substitutes a cached or mirrored page for the supplied Instacart source.
This Actor does not log in, use customer profiles, submit credentials, reuse cookies, solve CAPTCHAs, bypass security pages, or call private Instacart APIs. A separately authorized first-party or business-location API is outside this Actor's current contract.
Why use Instacart Public Retailer Phone Auditor?
- Audit which retailer-business phone information a specific public Instacart contact or location page discloses.
- Build a bounded evidence-preserving contact list from pages supplied by the caller.
- Detect changes in a public retailer page with Apify scheduling, monitoring, API access, and integrations.
The input is intentionally caller-supplied. There is no default retailer page that is treated as phone evidence. The current public Kroger routes tested for this Actor returned usable pages without a qualifying retailer phone, so an empty result is an honest outcome rather than a placeholder.
How to run the Actor
- Add one or more public HTTPS Instacart retailer, storefront, or location contact pages to
contactUrls. - Keep
fixturefalse for a live public run and choose bounded limits and timeouts. - Run the Actor, then inspect the dataset and
OUTPUT_SUMMARYkey-value record.
The Actor fetches each supplied URL once, follows only a bounded redirect chain that remains on an official Instacart host, and removes duplicate normalized URLs and phone identities. Product paths are ignored because contact text there may belong to a manufacturer. The maxItems limit applies to normal phone records; diagnostics do not consume it.
Input
contactUrls is the primary input. Each item is an object with a required url string. URLs must be absolute HTTPS URLs on an Instacart host and must identify a retailer/location path such as /retailer/... or /store/.... Credentials, arbitrary external domains, and product paths are rejected or reported as diagnostics.
| Field | Type and bounds | Description |
|---|---|---|
contactUrls | array of { "url": string } objects | Caller-supplied public retailer/location contact pages. Default is an empty array; a useful run must supply at least one URL. |
startUrls | array of { "url": string } objects | Compatibility alias for contactUrls. |
urls, url | array/object and string aliases | Additional compatibility aliases for caller-supplied pages. |
maxItems | integer 1–100; default 50 | Maximum normal phone records. Diagnostics do not consume this limit. |
timeoutMs | integer 5,000–120,000; default 30,000 | Per-request timeout. |
maxBytes | integer 100,000–5,000,000; default 2,000,000 | Maximum public response size retained. |
requestDelayMs | integer 0–10,000; default 0 | Delay before a retry or redirect. The first request is sent immediately. |
maxRequestRetries | integer 0–2; default 1 | Retries only timeouts, transport failures, and HTTP 5xx responses. |
userAgent | string up to 300 characters | Optional transparent user-agent string. Credentials and control characters are rejected. |
proxyConfiguration | object or null | Optional Apify Proxy settings. Direct access is the default; proxy use does not bypass access controls. |
fixture | boolean; default false | Checked-in parser QA only. Fixture records never qualify as live evidence. |
Live input
{"contactUrls": [{"url": "https://www.instacart.com/retailer/kroger-delivery/tx/near-me-in-telephone-tx"}],"maxItems": 2,"timeoutMs": 15000,"maxBytes": 1000000,"maxRequestRetries": 0,"fixture": false}
This is a valid audit input. It may return NO_PUBLIC_PHONE because the page must be the source of the phone; the Actor does not fill the gap from another website.
Multiple caller-supplied pages with standard proxy
{"contactUrls": [{"url": "https://www.instacart.com/retailer/kroger-delivery/tx/near-me-in-telephone-tx"},{"url": "https://www.instacart.com/store/kroger/storefront"}],"maxItems": 10,"timeoutMs": 30000,"maxBytes": 2000000,"requestDelayMs": 500,"maxRequestRetries": 1,"fixture": false,"proxyConfiguration": {"useApifyProxy": true}}
apifyProxyGroups and apifyProxyCountry are optional account-enabled settings. The Actor does not use stealth, fingerprint evasion, CAPTCHA solving, login bypass, or private cookies. If the proxy cannot be initialized, the run records INVALID_PROXY.
Compatibility aliases
{"startUrls": [{"url": "https://www.instacart.com/store/kroger/storefront"}],"url": "https://www.instacart.com/retailer/kroger-delivery/tx/near-me-in-telephone-tx","maxItems": 5,"maxRequestRetries": 0,"fixture": false}
Local fixture QA
{"contactUrls": [{"url": "https://www.instacart.com/store/fresh-market"}],"maxItems": 5,"maxRequestRetries": 0,"fixture": true}
Fixture mode reads the checked-in HTML fixture and proves only parser/schema behavior. Its phone number is not a live Instacart result and is never qualification evidence.
Output
Normal dataset rows use recordType: "instacart-retailer-phone" and contactScope: "retailer-public-business". Required provenance fields include sourceUrl, canonicalUrl, finalUrl, sourceDomain, evidenceContext, extractionMethod, confidence, publicationStatus, and isPublic. Missing source values are omitted; no retailer identity, address, or phone is inferred.
Illustrative normal record
Values below are synthetic examples and are not Cloud evidence.
{"recordType": "instacart-retailer-phone","contactScope": "retailer-public-business","recordId": "phone_0123456789abcdef0123","source": "Instacart","url": "https://www.instacart.com/store/example-market","sourceUrl": "https://www.instacart.com/store/example-market","canonicalUrl": "https://www.instacart.com/store/example-market","finalUrl": "https://www.instacart.com/store/example-market","sourceDomain": "www.instacart.com","retailerUrl": "https://www.instacart.com/store/example-market","retailerName": "Example Market","phoneNumber": "+1 (212) 555-0134","phoneDigits": "12125550134","phoneSource": "json-ld","evidenceContext": "JSON-LD telephone","extractionMethod": "json-ld.telephone","confidence": "high","publicationStatus": "explicit-public-business-contact","isPublic": true,"scrapedAt": "2026-09-08T00:00:00.000Z","retrievedAt": "2026-09-08T00:00:00.000Z"}
confidence is a source-strength classification, not a probability: JSON-LD and tel: evidence is high, while clearly labelled visible public text is medium. isPublic means the phone was visible without credentials in the fetched page; it is not a legal privacy determination.
Exact diagnostic record
{"url": "https://www.instacart.com/retailer/example-delivery/tx/near-me-in-example-tx","error": "No public retailer phone number was exposed in the bounded page response.","errorCode": "NO_PUBLIC_PHONE","scrapedAt": "2026-09-08T00:00:00.000Z"}
Diagnostics use only url, error, errorCode, and scrapedAt. Common codes are CONTACT_URL_REQUIRED, INVALID_INPUT, NO_PUBLIC_PHONE, BLOCKED, LOGIN_REDIRECT, HTTP_ERROR, TIMEOUT, REQUEST_FAILED, RESPONSE_TOO_LARGE, and INVALID_PROXY.
OUTPUT_SUMMARY
Operational counts and route information are stored in OUTPUT_SUMMARY. OUTPUT is also written as a compatibility alias.
{"status": "NO_PUBLIC_DATA","source": "Instacart","actor": "instacart-phone-number-scraper","targetCount": 1,"itemCount": 1,"phoneRecordCount": 0,"normalRecordCount": 0,"diagnosticCount": 1,"blockedCount": 0,"dataAvailable": false,"sourceTransport": "direct","inputMode": "caller-supplied-contact-url","fixture": false,"pagesProcessed": 1,"requestCount": 1,"diagnosticCounts": { "NO_PUBLIC_PHONE": 1 },"completedAt": "2026-09-08T00:00:00.000Z"}
SUCCEEDED means at least one normal record was produced. COMPLETED_WITH_DIAGNOSTICS means normal records and diagnostics coexist. NO_PUBLIC_DATA, BLOCKED, or INVALID_INPUT never count as a successful phone extraction.
You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.
Cost and troubleshooting
Cost depends on the number of supplied pages, response sizes, retries, redirects, proxy use, and Actor runtime. Start with one URL, maxItems 1–5, a bounded timeout, and maxRequestRetries: 0. Apify compute, proxy, and storage pricing is shown in the Console for your account and plan; this README does not invent a fixed price.
If a run contains only a diagnostic, inspect errorCode, error, the fresh build/run IDs, the dataset, and OUTPUT_SUMMARY. NO_PUBLIC_PHONE means the bounded public response was usable but did not expose a qualifying retailer-business number. BLOCKED or LOGIN_REDIRECT means the requested public route was not available to this client. Do not add credentials or replace the source with a directory, reader, cache, or generic retailer lookup.
For an issue report, include the current build ID, run ID, input route, proxy setting, diagnostic code, and whether fixture mode was enabled. Use the Actor Issues tab or API support request.
Privacy, legal, and non-affiliation
This is an independent public-data extraction tool and is not affiliated with, endorsed by, or sponsored by Instacart. Instacart is a trademark of its respective owner.
The Actor is designed to collect only retailer-business contact information that the caller-supplied public page explicitly publishes. It does not intentionally collect private customer data, credentials, cookies, authenticated sessions, protected endpoints, or personal contact information from unrelated pages. Public business pages can still contain personal data. You are responsible for having a lawful and legitimate purpose, complying with Instacart’s terms and robots guidance, respecting applicable privacy and data-protection laws, securing downloaded data, and honoring requests or restrictions that apply to your use. Do not use this Actor to evade access controls or to identify a person from a phone number.
Local development
From this Actor directory:
npm testnpm run lintnpm run schemaapify run --purge --input-file test/inputs/live-smoke.jsonnpm run validate
Only non-fixture normal rows from a fresh, exact current Cloud build can qualify the Actor. For list-like inputs, qualification also requires at least two distinct target-backed normal rows; diagnostics and fixture rows do not count.