---
title: "Create a conversion destination"
method: POST
path: "/v1/ads/conversions/destinations"
tags: ["Conversions"]
---

# Create a conversion destination

`POST /v1/ads/conversions/destinations`

## Request

- Base URL: `https://zernio.com/api`
- URL: `https://zernio.com/api/v1/ads/conversions/destinations`
- Auth: HTTP bearer

Creates a new place to send conversion events: a Google Ads conversion action or a LinkedIn conversion rule.

Supported for LinkedIn (conversion rule) and Google Ads (conversion action). It returns 405 for:

- Meta and OpenAI Ads: their pixels are created via their own tracking-tags flow instead (`POST /v1/accounts/{accountId}/tracking-tags`)
- Reddit: create Reddit pixels in Reddit Ads Manager

### LinkedIn

Creation is NOT idempotent. A retry creates a second destination. Deduplicate before retrying.

The rule is created with `conversionMethod=CONVERSIONS_API` and (by default) auto-associated with all of the ad account's campaigns via `autoAssociationType=ALL_CAMPAIGNS`. Pass `autoAssociationType: NONE` to opt out and manage associations explicitly via the associations endpoints below.

365-day attribution windows are only valid for these rule types; the API rejects other combinations locally:

- `SUBMIT_APPLICATION`
- `PURCHASE`
- `ADD_TO_CART`
- `QUALIFIED_LEAD`
- `LEAD`

### Google Ads

Calling with a name that already exists reuses the existing conversion action transparently (the response is identical to a fresh create).

Calling with the same name but a different category, or a name already used by a website (`WEBPAGE`) action, returns a typed `IDEMPOTENCY_CONFLICT` (409) rather than silently returning the mismatched action.

The conversion action is created with `type=UPLOAD_CLICKS` (required for API-uploaded offline conversions, immutable after creation).

The `type` field carries the Google `ConversionActionCategory` enum value, e.g. `PURCHASE`, `SUBSCRIBE_PAID`, `SIGNUP`, `IMPORTED_LEAD`, `BOOK_APPOINTMENT`. Unified standard event names (e.g. `Purchase`, `Subscribe`, `CompleteRegistration`, `Lead`, `Schedule`) are resolved to their Google category equivalents automatically.

The action defaults to secondary (non-primary) to avoid immediately steering Smart Bidding; pass `primaryForGoal: true` to opt in.

## Request body

- object
  - `accountId` string, required: The connected ads account (SocialAccount ID).
  - `adAccountId` string, required: Ad account ID. For LinkedIn: numeric (e.g. "5123456") or full `urn:li:sponsoredAccount:{id}` URN. For Google: numeric customer ID (e.g. "1234567890") or `customers/{id}` form.
  - `name` string, required
  - `type` string, required: Conversion type. Unknown values pass through to the platform. - LinkedIn: a unified standard event name (e.g. "Purchase", "Lead", "AddToCart") or a LinkedIn rule type enum (e.g. "PURCHASE", "QUALIFIED_LEAD"). - Google: a unified standard event name (Purchase, Subscribe, CompleteRegistration, Lead, Schedule) or a Google ConversionActionCategory enum value directly (e.g. "PURCHASE", "SUBSCRIBE_PAID", "SIGNUP", "IMPORTED_LEAD", "BOOK_APPOINTMENT").
  - `attributionType` 'LAST_TOUCH_BY_CAMPAIGN' | 'LAST_TOUCH_BY_CONVERSION': LinkedIn only.
  - `postClickAttributionWindowSize` 1 | 7 | 30 | 90 | 365: LinkedIn only. Default 30. 365 only allowed for LEAD, PURCHASE, ADD_TO_CART, QUALIFIED_LEAD, SUBMIT_APPLICATION rule types; the API rejects other combinations locally.
  - `viewThroughAttributionWindowSize` 1 | 7 | 30 | 90 | 365: LinkedIn only. Default 7. Same 365-day-window type restriction applies as `postClickAttributionWindowSize`.
  - `valueType` 'DYNAMIC' | 'FIXED' | 'NO_VALUE': LinkedIn only. DYNAMIC (default) uses the per-event `value` from `sendConversions`. FIXED uses the rule's `value` field. NO_VALUE drops monetary value entirely.
  - `value` object: LinkedIn only. Static conversion value. Used when `valueType=FIXED`. The currency should match the ad account's currency.
    - `currencyCode` string, required: ISO 4217 (e.g. "USD").
    - `amount` string, required: Decimal string (e.g. "49.99").
  - `autoAssociationType` 'ALL_CAMPAIGNS' | 'OBJECTIVE_BASED' | 'NONE': LinkedIn only. Controls campaign association at rule-creation time: - ALL_CAMPAIGNS: associate the rule with every active, paused, and draft campaign in the ad account. - OBJECTIVE_BASED: associate only campaigns whose objective matches the rule's type. - NONE: don't auto-associate. Manage associations via the `/associations` endpoints below. Auto-association runs once at create time; campaigns added after the rule still need explicit association.
  - `countingType` 'MANY_PER_CLICK' | 'ONE_PER_CLICK': Google Ads only. Whether to count multiple conversions from the same click (MANY_PER_CLICK) or at most one (ONE_PER_CLICK). Defaults to MANY_PER_CLICK if omitted.
  - `primaryForGoal` boolean: Google Ads only. When true, the conversion action is marked as primary and immediately influences Smart Bidding. Defaults to false (secondary, record-only) to avoid unintentionally steering the customer's campaigns on creation.

## Response `201`

Destination created

- object
  - `platform` 'linkedinads' | 'googleads'
  - `destination` ConversionDestination: A discoverable conversion destination on an ad platform: a Meta pixel, Google conversion action, or LinkedIn conversion rule. Returned by `listConversionDestinations`, `getConversionDestination`, `createConversionDestination`, and `updateConversionDestination`.
    - `id` string, required: Platform-native identifier. Pass back as `destinationId` on event send and as the path segment on CRUD endpoints.
    - `name` string, required
    - `type` string: Present when the platform locks the event type/category to the destination (Google conversion actions, LinkedIn conversion rules). Absent for Meta pixels (which accept any event name per request).
    - `status` 'active' | 'inactive': For LinkedIn, `inactive` means the rule is soft-deleted (`enabled: false`).
    - `adAccountId` string: Set by adapters whose destinations are scoped to a specific ad account (LinkedIn). Pass back on subsequent CRUD calls to identify the parent ad account.

## Other responses

- `400`: Invalid body or platform validation failure.
- `401`: Missing or invalid API key. `code` is `missing_credentials` when no Authorization header was sent and `invalid_credentials` when the key is unknown, revoked or expired.
- `403`: Ads access required (Ads add-on on legacy plans, included on usage-based plans), or the connected LinkedIn account lacks the `rw_conversions` scope (reconnect required). Also returned with code `ad_account_not_selected` when the connection has selected ad accounts and the targeted ad account is not among them. `details` carries `accountId`, `adAccountId` and `selectedAdAccountIds`. Fix: add the ad account to the selection (GET /v1/connect/{platform}/ads with adAccountIds, which replaces the selection) or use a connection that has it selected.
- `404`: The account or requested resource was not found or is not accessible. An account ID may have been disconnected and removed. Read GET /v1/accounts for current account IDs.
- `405`: Platform does not support destination creation.
- `409`: Conflict. One of: - `IDEMPOTENCY_CONFLICT` (Google Ads only): a conversion action with the given name already exists but has a different category. Use a different name or the existing destination. - ads_connection_required: the account is inactive or needs reconnection. Reconnect it and read GET /v1/accounts for its current ID before retrying.
- `422`: Google Ads connection not usable. - Code `ads_connection_required`: no Google Ads customer account is left on this connection after its ad-account selection. Reconnect via GET /v1/connect/googleads/ads with a Google user that can reach the ad account, or select one of its ad accounts. - Code `invalid_resource_state`: the connection reaches only a Google Ads manager account with no client accounts yet. Create one with POST /v1/ads/accounts or under the manager in Google Ads, then retry.
- `429`: Rate limit hit. Retry with backoff.

## Changes

- **2026-11-11** `34f8dbff5e0d`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/ads/conversions/destinations/post.md)

---

[API](https://skmtc.dev/zernio/apis/zernio-api.md) - [All operations](https://skmtc.dev/zernio/apis/zernio-api/llms.txt) - [OpenAPI document](https://skmtc.dev/zernio/apis/zernio-api/revisions/21ba7421089d?raw)
