---
title: "Connect Api Key"
method: POST
path: "/api/connections/{provider}/api-key"
tags: ["connections"]
---

# Connect Api Key

`POST /api/connections/{provider}/api-key`

## Request

- Base URL: `https://api.heymetra.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.heymetra.com/api/connections/{provider}/api-key`
- Auth: none declared

Connect a custom (API-key) source, e.g. Adapty.

There is no OAuth popup: the customer pastes their secret key, the backend
imports it into Nango's vault, then proves it works before saving anything.
A key that Nango accepts but the provider rejects must not leave a live
connection behind, so a failed verification rolls the stored key back.

## Path parameters

- `provider` 'google_ads' | 'meta_ads' | 'meta_instagram' | 'meta_page' | 'ga4' | 'gsc' | 'zoho_crm' | 'zoho_salesiq' | 'zoho_marketing' | 'telegram' | 'slack' | 'email' | 'adapty' | 'trendyol' | 'revenuecat' | 'appsflyer' | 'app_store_connect' | 'woocommerce' | 'shopify' | 'stripe' | 'posthog' | 'jira' | 'hepsiburada' | 'n11' | 'ciceksepeti' | 'amazon_seller' | 'ikas', required

## Headers

- `authorization` string, nullable
- `x-workspace-id` string, nullable

## Request body

- ApiKeyConnectIn: The values a customer typed for a custom (API-key) connector, plus a name they give the connection. Keys match the connector's ``credential_fields``. Secret values are stored in Nango's vault and never returned; they exist in this request and nowhere else in the application. Non-secret values (a seller id) stay on our side. The name is required and must be unique among the tenant's connections for the same provider.
  - `credentials` object, required
  - `account_name` string, required
  - `write_enabled` boolean, required
  - `shared_with_workspace` boolean

## Response `200`

Successful Response

- ConnectionOut
  - `id` string, uuid, required
  - `provider` 'google_ads' | 'meta_ads' | 'meta_instagram' | 'meta_page' | 'ga4' | 'gsc' | 'zoho_crm' | 'zoho_salesiq' | 'zoho_marketing' | 'telegram' | 'slack' | 'email' | 'adapty' | 'trendyol' | 'revenuecat' | 'appsflyer' | 'app_store_connect' | 'woocommerce' | 'shopify' | 'stripe' | 'posthog' | 'jira' | 'hepsiburada' | 'n11' | 'ciceksepeti' | 'amazon_seller' | 'ikas', required
  - `account_id` string, required
  - `account_name` string, nullable, required
  - `alias` string, nullable, required
  - `display_name` string, required
  - `is_active` boolean, required
  - `paused_for_plan` boolean, required
  - `write_enabled` boolean, required
  - `ask_before_sending` boolean
  - `currency` string, nullable, required
  - `consent_version` integer, nullable
  - `is_mine` boolean
  - `may_administer` boolean
  - `shared_with_workspace` boolean
  - `reconsent` ReconsentOut: What this connection has not agreed to yet, and how it is fixed. Present only when there is something to offer, so a row without it is a row with nothing to say — never a row whose state is unknown.
    - `connector` string, required
    - `granted_version` integer, nullable, required
    - `current_version` integer, required
    - `reconnect_required` boolean, required
    - `what_changed` string[], required
    - `how_to_fix` string, required
  - `reference` string, required
  - `identity` object, required
  - `credentials` object
  - `last_error` string, nullable, required
  - `created_at` string, date-time, required
  - `grant_shape` 'separable' | 'read_only' | 'inseparable' | 'channel', required: What a customer's read-or-write choice can actually buy at this provider. The choice is offered on every connector, because a customer deciding whether an assistant may change their account should not have to know which providers happen to model that as a scope. What differs is what the choice BUYS, and saying so is this enum's whole job: a screen that offers the same two options everywhere while one of them is unenforceable at three providers is worse than one that says which is which.

## Other responses

- `422`: Validation Error

## Changes

- **2026-10-20** `877b0f87d6d0`: 2 breaking, 2 info
  - removed the enum value `google_calendar` from the `path` request parameter `provider`
  - removed the enum value `google_meet` from the `path` request parameter `provider`
  - removed the `google_calendar` enum value from the `provider` response property for the response status `200`
  - removed the `google_meet` enum value from the `provider` response property for the response status `200`
- **2026-10-20** `488ce9683884`: 1 warning, 1 info
  - added the new `ikas` enum value to the `provider` response property for the response status `200`
  - added the new enum value `ikas` to the `path` request parameter `provider`
- **2026-10-19** `8153ccd4dea1`: 4 warning, 4 info
  - added the new `amazon_seller` enum value to the `provider` response property for the response status `200`
  - added the new `ciceksepeti` enum value to the `provider` response property for the response status `200`
  - added the new `hepsiburada` enum value to the `provider` response property for the response status `200`
  - added the new `n11` enum value to the `provider` response property for the response status `200`
  - …4 more

[Operation history](https://skmtc.dev/heymetra/apis/heymetra-api/changes/api/connections/:provider/api-key/post.md)

---

[API](https://skmtc.dev/heymetra/apis/heymetra-api.md) · [All operations](https://skmtc.dev/heymetra/apis/heymetra-api/llms.txt) · [OpenAPI document](https://skmtc.dev/heymetra/apis/heymetra-api/revisions/877b0f87d6d0?raw)
