# Import from Google Sheet

> POST /audiences/:id/contacts/import-sheet — import a link-shared sheet; headers become merge tags.

`POST /audiences/:id/contacts/import-sheet`

Imports contacts from a Google Sheet shared as “Anyone with the link can view”. The sheet needs an `email` column; every other header (e.g. `name`, `phone_no`, `marks`, `country`) is auto-registered as a contact property, so each column is usable as a merge tag — `Hi {{name}}, we tried reaching you at {{phone_no}}` resolves per row. Rows land in a fresh segment you can target from a campaign.

**Body parameters**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `url` | string | Yes | The sheet's share URL (docs.google.com/spreadsheets/…). A #gid selects a tab. |
| `segment_name` | string | No | Name for the created segment. Defaults to a dated “Sheet import”. |

**Node.js**

```js
import { SendPing } from 'sendping';

const mb = new SendPing('mb_xxxxxxxxx');

const { data, error } = await mb.audiences.importSheet('AUDIENCE_ID', {
  "url": "https://docs.google.com/spreadsheets/d/SHEET_ID",
  "segment_name": "Webinar signups"
});
console.log({ data, error });
```

**Ruby**

```ruby
require "sendping"

SendPing.api_key = "mb_xxxxxxxxx"

SendPing::Audiences.import_sheet("AUDIENCE_ID", {
  "url": "https://docs.google.com/spreadsheets/d/SHEET_ID",
  "segment_name": "Webinar signups"
})
```

**PHP**

```php
<?php
require 'vendor/autoload.php';

use SendPing\SendPing;

$sendping = SendPing::client('mb_xxxxxxxxx');

$sendping->audiences->importSheet('AUDIENCE_ID', [
  'url' => "https://docs.google.com/spreadsheets/d/SHEET_ID",
  'segment_name' => "Webinar signups"
]);
```

**Python**

```python
import sendping

sendping.api_key = "mb_xxxxxxxxx"

sendping.Audiences.import_sheet("AUDIENCE_ID", {
  "url": "https://docs.google.com/spreadsheets/d/SHEET_ID",
  "segment_name": "Webinar signups"
})
```

**Go**

```go
import "github.com/shekhu10/sendping-sdks/sendping-go"

client := sendping.NewClient("mb_xxxxxxxxx")

imported, err := client.Audiences.ImportSheet("AUDIENCE_ID", &sendping.ImportSheetRequest{
    Url:         "https://docs.google.com/spreadsheets/d/SHEET_ID",
    SegmentName: "Webinar signups",
})
```

**Rust**

```rust
use sendping::{ImportSheetOptions, SendPing};

let mb = SendPing::new("mb_xxxxxxxxx");

let params = ImportSheetOptions::new("https://docs.google.com/spreadsheets/d/SHEET_ID")
    .with_segment_name("Webinar signups");
let _imported = mb.audiences.import_sheet("AUDIENCE_ID", params).await?;
```

**Java**

```java
import co.sendping.SendPing;
import co.sendping.SendPingResponse;

SendPing sendping = new SendPing("mb_xxxxxxxxx");

SendPingResponse response = sendping.audiences().importSheet(
        "AUDIENCE_ID",
        "https://docs.google.com/spreadsheets/d/SHEET_ID",
        "Webinar signups");
```

**.NET**

```csharp
using SendPing;

ISendPing sendping = SendPingClient.Create("mb_xxxxxxxxx");

var resp = await sendping.AudienceImportSheetAsync(
    "AUDIENCE_ID",
    "https://docs.google.com/spreadsheets/d/SHEET_ID",
    "Webinar signups");
```

**cURL**

```bash
curl -X POST 'https://www.sendping.co/api/audiences/AUDIENCE_ID/contacts/import-sheet' \
  -H 'Authorization: Bearer mb_xxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
  "url": "https://docs.google.com/spreadsheets/d/SHEET_ID",
  "segment_name": "Webinar signups"
}'
```

**CLI**

```bash
sendping audiences import-sheet AUDIENCE_ID \
  --url 'https://docs.google.com/spreadsheets/d/SHEET_ID' \
  --segment-name 'Webinar signups'
```

### Response

```json
{
  "object": "sheet_import", "imported": 42, "updated": 3, "skipped": 0, "total": 45,
  "segment_id": "4c1f8b2e-9a2f-4d71-8f0c-2b5d7e6a1c93", "segment_name": "Sheet import 2026-07-04", "segment_added": 45,
  "variables": ["name", "phone_no", "marks", "country"]
}
```
