---
title: "Approve every ticked task"
method: POST
path: "/outreach-tasks/bulk/approve/"
tags: ["outreach"]
---

# Approve every ticked task

`POST /outreach-tasks/bulk/approve/`

## Request

- Base URL: `https://api.getoneprofile.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.getoneprofile.ai/outreach-tasks/bulk/approve/`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

The queue's bulk approve, over the rows a person ticked. Each is approved exactly as it would be on its own (a LinkedIn step joining its sender's line), and a row that has moved on meanwhile is counted as skipped rather than failing the batch, because a selection goes stale while it is being read; so is a LinkedIn step LinkedIn cannot take now (the sender is not connected), which still waits. The answer says when the approved work is expected to run (`schedule`): per sender, when their LinkedIn steps start, how many wait for the daily reset and what stops them (no browser open, a limit); and whether the emails go now or when the sending window opens. Of the rows the person had opened (`opened_task_ids`), words the agent wrote that nobody changed are recorded as approved as written: their Looks good, kept as a record that never trains the agent.

## Request body

- BulkApproveSchema: The ticked rows, and which of them the person had opened.
  - `opened_task_ids` string[]: The ticked tasks the person opened and read before approving. Words the agent wrote on those that nobody changed are recorded as approved as written: a record of their Looks good, which never trains the agent.
  - `task_ids` string[], required

## Response `200`

Successful Response

- BulkDecisionResponseSchema: What the batch actually did, so the page can say so in one sentence.
  - `decided` integer, required: How many rows the decision applied to.
  - `schedule` OutreachApprovalScheduleReadSchema: When the work an approval just let go is expected to run, per channel.
    - `email_count` integer, required: How many approved emails the engine now sends.
    - `email_held` integer: How many of the approved emails wait for their paused sequence to be resumed. They go out after Resume sequence, not before.
    - `email_starts_at` string, date-time, nullable, required: When the approved emails start, if every one of their running sequences' sending windows is closed now: the earliest opening. Null when they go now, or when every one of them waits for a paused sequence.
    - `linkedin` LinkedInApprovalScheduleReadSchema[], required: One entry per sender whose LinkedIn steps were approved.
      - `account_id` string, uuid, required
      - `after_reset` integer, required: How many wait for that reset or later.
      - `before_reset` integer, required: How many are expected to start before the next daily reset (midnight in the sender's timezone).
      - `blocked` 'browser_offline' | 'account_blocked' | 'weekly_limit' | 'kind_disabled' | 'outside_window', required: The one thing that stops a batch of approved steps from running as scheduled.
      - `count` integer, required: How many of the approved steps are this sender's.
      - `first_at` string, date-time, nullable, required: When the first of them starts; null when no time can be named.
      - `held` integer: How many of them wait for their paused sequence or paused contact to be resumed. They are in no line until then, and the counts and times above leave them out.
      - `last_at_estimate` string, date-time, nullable, required: When the last of them is expected to start; null when it cannot be named.
      - `opens_at` string, date-time, nullable: When the sending hours the first of them waits for open; null when none wait for them.
      - `outside_window` integer: How many of them wait for their sequence's sending hours, shut now in the sender's timezone.
      - `resets_at` string, date-time, nullable, required: The daily reset those wait for; null when none do.
      - `sender_name` string, required: The sender as the Senders page names them.
      - `sender_profile_id` string, uuid, required
  - `skipped` integer, required: How many had already moved on (settled, decided by somebody else, or a task nobody approves), and how many LinkedIn steps LinkedIn could not take now (the sender is not connected), which still wait. Not an error: a selection goes stale while it is read.

## Other responses

- `401`: Unauthorized
- `403`: Forbidden
- `422`: Invalid request made to the API.
- `500`: Internal server error.
- `502`: Bad gateway error.
- `503`: Service unavailable.

---

[API](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile.md) · [All operations](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile/llms.txt) · [OpenAPI document](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile/revisions/4a6bd71e3f02?raw)
