> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.claw-ops.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.claw-ops.com/_mcp/server.

# 배치 수신자·결과 조회

GET https://api.claw-ops.com/v1/accounts/{accountId}/call-batches/{batchId}/tasks

수신자별 발신 결과를 조회합니다. 콜 플로우가 통화 중 수집한 값은 `result`에 담깁니다
(설문·예약 확인 등의 산출물).

Reference: https://docs.claw-ops.com/api-레퍼런스/claw-ops-api/call-batches/list-call-batch-tasks

## Authentication

- `Authorization` header (bearer token, required) — API Key를 Bearer 토큰으로 전달

## Request

### Path parameters

- `accountId` (string, required)
- `batchId` (string, required)

### Query parameters

- `status` (enum, optional) — 상태로 필터링
  - Allowed values: `pending`, `dialing`, `done`, `failed`, `canceled`, `suppressed`, `expired`
- `page` (integer, optional, default: 1)
- `pageSize` (integer, optional, default: 50)
- `page_size` (integer, optional, deprecated) — `pageSize` 의 별칭(하위호환). 신규 연동은 `pageSize` 를 사용하세요.
- `limit` (integer, optional, deprecated) — `pageSize` 의 별칭(하위호환). 신규 연동은 `pageSize` 를 사용하세요.

## Response

### 200

조회 성공

- `tasks` (list of object, optional)
  - `taskId` (string, optional)
  - `to` (string, optional)
  - `status` (enum, optional)
    - Allowed values: `pending`, `dialing`, `done`, `failed`, `canceled`, `suppressed`, `expired`
  - `attempt` (integer, optional) — 내부 발신 시도 횟수(통신 오류 재시도 포함). 사람이 읽는 "몇 번 걸었나"는 dialRound 입니다.
  - `dialRound` (integer, optional) — 실제로 벨이 울린 횟수이자 **다음에 걸 차수의 인덱스**입니다(0이면 다음이 1차) — 발신 자체가 실패한 경우(통신 오류)는 세지 않으므로, 고객이 설정한 재시도 횟수가 망 장애로 소모되지 않습니다.
  - `nextAttemptAt` (datetime, optional, nullable) — 다음 재시도 예정 시각(정책상). **그 차수의 발신 가능 시간대 밖이면 실제 발신은 더 뒤로 밀립니다** — 저녁 차수의 "30분 뒤"가 낮 10시 30분이면 실제로는 18시입니다. 보정된 값은 expectedDialAt 을 보세요.
  - `expectedDialAt` (datetime, optional, nullable) — 발신 가능 시간대까지 반영한 **실제** 예상 발신 시각. 화면에 보여줄 값은 이쪽입니다 — nextAttemptAt 을 그대로 쓰면 금지 시간대에 걸린 시도가 "21시 20분 예정"으로 보입니다. 대기 중(status=pending)이 아니면 null 입니다.
  - `callId` (string, optional, nullable) — 발신된 통화 ID. 이 값으로 통화 상세·녹취·전사를 조회할 수 있다.
  - `disposition` (string, optional, nullable) — 통화 종료 상태 (completed · failed · busy · no-answer)
  - `answeredBy` (string, optional, nullable) — AMD 판정 (human · machine). AMD 애드온이 있는 계정만 채워진다.
  - `result` (map from string to any, optional, nullable) — 콜 플로우가 통화 중 수집한 변수. 설문·예약확인 배치의 결과물.
  - `lastError` (string, optional, nullable)
  - `messageKind` (enum, optional, nullable) — 예약된 미연결 문자의 종류. first=첫 통화 실패 후 · final=끝내 미연결.
    - Allowed values: `first`, `final`
  - `messageStatus` (enum, optional, nullable) — 문자 처리 상태. `queued` 는 **통신사에 넘겼다**는 뜻이지 전달 성공이 아닙니다 — 실제 전달 여부는 messageDeliveryStatus 를 보세요. `skipped` 는 배치 취소·기간 만료· 24시간 초과로 보내지 않은 경우입니다.
    - Allowed values: `pending`, `queued`, `failed`, `skipped`
  - `messageDeliveryStatus` (enum, optional, nullable) — 통신사 리포트로 확정된 **전달** 상태. 발신번호가 문자용으로 등록되지 않은 경우 여기서 failed 로 드러납니다.
    - Allowed values: `queued`, `sent`, `failed`
  - `messageError` (string, optional, nullable)

## Examples

**Response**

```json
{
  "tasks": [
    {
      "taskId": "string",
      "to": "01012345678",
      "status": "pending",
      "attempt": 1,
      "dialRound": 2,
      "nextAttemptAt": "2024-01-15T09:30:00Z",
      "expectedDialAt": "2024-01-15T09:30:00Z",
      "callId": "string",
      "disposition": "string",
      "answeredBy": "string",
      "result": {},
      "lastError": "string",
      "messageKind": "first",
      "messageStatus": "pending",
      "messageDeliveryStatus": "queued",
      "messageError": "string"
    }
  ]
}
```

**SDK Code**

```python
import requests

url = "https://api.claw-ops.com/v1/accounts/AC1a2b3c4d/call-batches/clx1a2b3c4d5e/tasks"

querystring = {"limit":"200","page":"1","pageSize":"50","page_size":"100","status":"done"}

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers, params=querystring)

print(response.json())
```

```javascript
const url = 'https://api.claw-ops.com/v1/accounts/AC1a2b3c4d/call-batches/clx1a2b3c4d5e/tasks?limit=200&page=1&pageSize=50&page_size=100&status=done';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.claw-ops.com/v1/accounts/AC1a2b3c4d/call-batches/clx1a2b3c4d5e/tasks?limit=200&page=1&pageSize=50&page_size=100&status=done"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.claw-ops.com/v1/accounts/AC1a2b3c4d/call-batches/clx1a2b3c4d5e/tasks?limit=200&page=1&pageSize=50&page_size=100&status=done")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.claw-ops.com/v1/accounts/AC1a2b3c4d/call-batches/clx1a2b3c4d5e/tasks?limit=200&page=1&pageSize=50&page_size=100&status=done")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.claw-ops.com/v1/accounts/AC1a2b3c4d/call-batches/clx1a2b3c4d5e/tasks?limit=200&page=1&pageSize=50&page_size=100&status=done', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.claw-ops.com/v1/accounts/AC1a2b3c4d/call-batches/clx1a2b3c4d5e/tasks?limit=200&page=1&pageSize=50&page_size=100&status=done");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.claw-ops.com/v1/accounts/AC1a2b3c4d/call-batches/clx1a2b3c4d5e/tasks?limit=200&page=1&pageSize=50&page_size=100&status=done")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```