# Sample merchant coverage

Sample Blinkit delivery points within an area and group serving merchant IDs with location and delivery estimates.

- Platform: [Blinkit](https://docs.upscrape.com/docs/platforms/blinkit)
- Capability ID: `blinkit.merchant.coverage`
- Cost: 1 credit per request
- Maximum runtime: 180 seconds
- Execute endpoint: `POST https://data.upscrape.com/execute`

## Request

Use the exact public capability ID in the shared execute envelope.

```bash
curl --request POST \
  --url https://data.upscrape.com/execute \
  --header "Authorization: Bearer $UPSCRAPE_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Prefer: wait=30" \
  --data '{
  "input": {
    "bounds": {
      "east": 77.6,
      "north": 12.872,
      "south": 12.87,
      "west": 77.598
    },
    "grid_step_km": 5,
    "sampling_limit": 1
  },
  "capability": "blinkit.merchant.coverage"
}'
```

## Input

Provide bounds with south, north, west and east coordinates. South must be below north and west below east. The area can be at most 10,000 square km and each side at most 200 km.

grid_step_km sets the sampling spacing, from 1.5 to 20 km, default 5. sampling_limit caps the sampled points, from 1 to 200, default 25.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `bounds` | `object` | Yes | Geographic bounds of the requested area. |
| `bounds.east` | `number` | Yes | From -180 to 180. |
| `bounds.north` | `number` | Yes | From -85 to 85. |
| `bounds.south` | `number` | Yes | From -85 to 85. |
| `bounds.west` | `number` | Yes | From -180 to 180. |
| `grid_step_km` | `number` | No | From 1.5 to 20. Default: `5`. |
| `sampling_limit` | `integer` | No | From 1 to 200. Default: `25`. |

### Example input

```json
{
  "bounds": {
    "east": 77.6,
    "north": 12.872,
    "south": 12.87,
    "west": 77.598
  },
  "grid_step_km": 5,
  "sampling_limit": 1
}
```

## Response

Successful output is returned in `results[0].data`.

Each merchant contains observations at sampled delivery points. The coordinates identify those points, not physical stores.

Use grid_complete, completed_points and stop_reason to understand sampling coverage. A capped or interrupted grid does not establish coverage of the full area or every address in a pincode. Physical store addresses, opening state and delivery radii are not returned.

### Illustrative sample output

This example shows one response. Values and optional fields vary with the data available.

```json
{
  "results": [
    {
      "merchant_id": "35940",
      "observations": [
        {
          "city": "Bengaluru",
          "fulfillment": [
            {
              "eta_minutes": 10,
              "type": "instant"
            }
          ],
          "latitude": 12.87,
          "locality": "Hulimavu",
          "longitude": 77.6,
          "observed_at": "2026-10-02T00:00:00Z",
          "pincode": "560076"
        }
      ]
    }
  ],
  "sampling": {
    "attempted_points": 1,
    "bounds": {
      "east": 77.6,
      "north": 12.872,
      "south": 12.87,
      "west": 77.598
    },
    "completed_points": 1,
    "coordinates_scope": "sampled_delivery_points",
    "elapsed_ms": 0,
    "grid_complete": false,
    "grid_points": 4,
    "grid_step_km": 5,
    "points": [
      {
        "latitude": 12.87,
        "longitude": 77.6,
        "observed_at": "2026-10-02T00:00:00Z",
        "status": "serviceable"
      }
    ],
    "selected_points": 1,
    "serviceable_points": 1,
    "stop_reason": "sampling_limit"
  }
}
```
### Illustrative output fields

Derived from the sample above for orientation only. These fields are not a fixed response schema.

| Path | Observed type | Example |
| --- | --- | --- |
| `results` | `array` | 1 items |
| `results` | `array` | 1 items |
| `sampling` | `object` | 12 fields |
| `sampling.attempted_points` | `integer` | 1 |
| `sampling.bounds` | `object` | 4 fields |
| `sampling.completed_points` | `integer` | 1 |
| `sampling.coordinates_scope` | `string` | sampled_delivery_points |
| `sampling.elapsed_ms` | `integer` | 0 |
| `sampling.grid_complete` | `boolean` | false |
| `sampling.grid_points` | `integer` | 4 |
| `sampling.grid_step_km` | `integer` | 5 |
| `sampling.points` | `array` | 1 items |
| `sampling.selected_points` | `integer` | 1 |
| `sampling.serviceable_points` | `integer` | 1 |
| `sampling.stop_reason` | `string` | sampling_limit |

## Execution behavior

A `200` response completed inline. A `202` response was queued; poll `GET /jobs/{id}` until the job reaches `completed` or `failed`. Use an `Idempotency-Key` when retrying must not create a duplicate logical job.

## Related documentation

- [Authentication](https://docs.upscrape.com/docs/api/authentication)
- [Jobs and results](https://docs.upscrape.com/docs/api/jobs)
- [Errors and retries](https://docs.upscrape.com/docs/api/errors)
- [Idempotency](https://docs.upscrape.com/docs/api/idempotency)
