---
title: "Forecast LinkedIn bid and budget ranges"
method: POST
path: "/api/v1/tools/linkedin_forecast_campaign_supply/execute"
tags: ["LinkedIn Ads"]
---

# Forecast LinkedIn bid and budget ranges

`POST /api/v1/tools/linkedin_forecast_campaign_supply/execute`

## Request

- Base URL: `https://adako.ai`
- URL: `https://adako.ai/api/v1/tools/linkedin_forecast_campaign_supply/execute`
- Auth: HTTP bearer

Asks LinkedIn what the auction currently costs for a targeting spec: the suggested bid and its range, the lowest and highest bid allowed, and the daily budget limits, for the objective and cost type you intend to use. It does not forecast impressions, clicks or leads.
Use when: the user asks what a campaign will cost before it exists, or when choosing a bid. It is the only honest answer to "what CPC should I set" — LinkedIn's ranges vary enormously by audience and season, and a remembered benchmark is worse than no number.
Do not present the forecast as a promise. It is the platform's estimate for an unproven audience, it moves week to week, and actual cost per lead depends on the landing page, which LinkedIn knows nothing about.
Do not use it in place of linkedin_estimate_audience_size — a forecast against a sub-minimum audience is meaningless.
Returns the suggested bid with its range, the allowed bid range and the daily budget limits, in the account currency.
If LinkedIn returns nothing for this spec (it does for very narrow audiences), say the forecast is unavailable and fall back to the audience size plus the platform minimum daily budget. Do not invent a number.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `arguments` object, required
    - `ad_account_id` string: LinkedIn ad account id — the numeric id from Campaign Manager, as a string ("506699162"). Omit it to use the primary account; pass it when the user manages several.
    - `targeting` object, required: Targeting entity URNs per facet, exactly as linkedin_search_targeting returned them (for example locations: ["urn:li:geo:103644278"]). Never free text. locations is required. Entities inside one facet widen the audience (title A or title B); separate facets narrow it (location and title).
      - `locations` string[]
      - `titles` string[]
      - `industries` string[]
      - `seniorities` string[]
      - `staffCountRanges` string[]
      - `skills` string[]
      - `interests` string[]
      - `memberBehaviors` string[]
      - `employers` string[]
      - `degrees` string[]
      - `fieldsOfStudy` string[]
      - `interfaceLocales` string[]
    - `objective` 'BRAND_AWARENESS' | 'WEBSITE_VISIT' | 'ENGAGEMENT' | 'VIDEO_VIEW' | 'LEAD_GENERATION' | 'WEBSITE_CONVERSION' | 'JOB_APPLICANT', required: The objective the campaign will use — the forecast depends on it.
    - `cost_type` 'CPM' | 'CPC' | 'CPV': How the campaign will be billed (default CPC).
    - `campaign_type` 'SPONSORED_UPDATES' | 'TEXT_AD' | 'SPONSORED_INMAILS' | 'DYNAMIC': Campaign type (default SPONSORED_UPDATES).
    - `daily_budget` number: The daily budget being considered, a decimal in the account currency.
    - `raw_data` boolean: Return compact JSON only (no markdown). Use when you will compute on the result.

## Response `200`

The tool ran. A write returns proposal_id and approve_url while the change waits for approval.

- SuccessEnvelope
  - `success` unknown, required
  - `tool` string, required
  - `data` object, required: Machine-readable result.
  - `markdown` string, required: The same result written for a person or a model.
  - `quota` Quota: Task usage for the current billing period.
    - `plan` string
    - `used` integer
    - `limit` integer
    - `period_end` string
    - `upgrade_url` string
  - `proposal_id` string: Present for writes. Nothing changes on the ad platform until it is approved.
  - `approve_url` string: Where a person approves the proposal.
  - `request_id` string, required

## Other responses

- `400`: Invalid arguments, or the ad account could not be resolved.
- `401`: Missing, invalid, revoked or expired API key.
- `402`: Monthly task quota used up, or the plan does not include this tool.
- `403`: The connected ad account lacks the access level this tool needs.
- `404`: Unknown tool name.
- `409`: Not connected, reconnect needed, confirmation required, a proposal already pending or no longer pending, an identical create that failed earlier today (proposal_failed_before), a create that duplicates an approved one (duplicate_create), the ad-account limit of the plan reached (account_limit), or an Idempotency-Key reused with different arguments.
- `429`: Rate limited by Adako or by the ad platform. See Retry-After.
- `500`: Unexpected error inside Adako.
- `502`: The ad platform returned an error.

---

[API](https://skmtc.dev/adako/apis/adako-rest-api.md) · [All operations](https://skmtc.dev/adako/apis/adako-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/adako/apis/adako-rest-api/revisions/59ee60d48a56?raw)
