Hackle API

Hackle API as documented publicly: 17 operations. Contract generated from the documentation by API Evangelist (2026-11-11); not the provider's own document.

GitHub OpenAPI

Operations 17

GET /v1/catalogs 카탈로그 목록 조회 #
POST /v1/catalogs 카탈로그 생성 #
DELETE /v1/catalogs/{catalogname} 카탈로그 삭제 #
GET /v1/catalogs/{catalogname} 카탈로그 조회 #
POST /v1/catalogs/{catalogname}/fields 필드 추가 #
DELETE /v1/catalogs/{catalogname}/fields/{fieldname} 필드 삭제 #
DELETE /v1/catalogs/{catalogname}/items 아이템 삭제 #
POST /v1/catalogs/{catalogname}/items 아이템 추가 #
PUT /v1/catalogs/{catalogname}/items 아이템 수정 #
POST /v1/kakao-subscriptions POST /v1/kakao-subscriptions #
POST /v1/properties POST /v1/properties #
DELETE /v1/properties/phone-numbers DELETE /v1/properties/phone-numbers #
POST /v1/properties/phone-numbers POST /v1/properties/phone-numbers #
POST /v1/push-subscriptions POST /v1/push-subscriptions #
POST /v1/sms-subscriptions POST /v1/sms-subscriptions #
POST /v1/track POST /v1/track #
POST /v1/variation POST /v1/variation #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/hackle-io:hackle-io-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

hackle-io-openapi-generated.yml Raw ↑
openapi: 3.1.0
info:
  title: Hackle API
  version: '2026-11-11'
  description: 'GENERATED FROM DOCUMENTATION by API Evangelist on 2026-11-11: 17 operation(s) read from 6 public documentation page(s) (each operation
    names its page in x-source). This is not the provider''s published contract; Hackle has published no machine-readable contract that the pipeline
    could find. Engine: local.'
  x-evidence-tiers:
    code-example: 8
    documentation: 9
    pages-with-code: 4
    pages-read: 6
  x-generated-from: documentation
  x-provenance: generated
  x-authored-by: API Evangelist
  x-generated: '2026-11-11'
  x-generator: generate-contract-from-docs.py
  x-engine: local
  x-sources:
  - https://docs.hackle.io/hackle-admin-api/admin-api.md
  - https://docs.hackle.io/development-guide/http-api/api-track
  - https://docs.hackle.io/development-guide/http-api/catalog.md
  - https://docs.hackle.io/development-guide/http-api/api-track.md
  - https://docs.hackle.io/development-guide/http-api/api-variation.md
  - https://docs.hackle.io/development-guide/http-api/api-properties.md
servers:
- url: https://api.hackle.io
paths:
  /v1/catalogs:
    get:
      operationId: get_v1_catalogs
      tags:
      - Catalogs
      summary: 카탈로그 목록 조회
      x-source: https://docs.hackle.io/development-guide/http-api/catalog.md
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetV1CatalogsResponse'
      x-evidence:
        kind: documentation
    post:
      operationId: post_v1_catalogs
      tags:
      - Catalogs
      summary: 카탈로그 생성
      x-source: https://docs.hackle.io/development-guide/http-api/catalog.md
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1CatalogsRequest'
      responses:
        '201':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostV1CatalogsResponse'
      x-evidence:
        kind: documentation
  /v1/catalogs/{catalogname}:
    delete:
      operationId: delete_v1_catalogs_catalogname
      tags:
      - Catalogs
      summary: 카탈로그 삭제
      x-source: https://docs.hackle.io/development-guide/http-api/catalog.md
      parameters:
      - name: catalogname
        in: path
        required: true
        schema:
          type: string
      responses:
        '204':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
    get:
      operationId: get_v1_catalogs_catalogname
      tags:
      - Catalogs
      summary: 카탈로그 조회
      x-source: https://docs.hackle.io/development-guide/http-api/catalog.md
      parameters:
      - name: catalogname
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetV1CatalogsCatalognameResponse'
      x-evidence:
        kind: documentation
  /v1/catalogs/{catalogname}/fields:
    post:
      operationId: post_v1_catalogs_catalogname_fields
      tags:
      - Catalogs
      summary: 필드 추가
      x-source: https://docs.hackle.io/development-guide/http-api/catalog.md
      parameters:
      - name: catalogname
        in: path
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1CatalogsCatalognameFieldsRequest'
      responses:
        '201':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostV1CatalogsCatalognameFieldsResponse'
      x-evidence:
        kind: documentation
  /v1/catalogs/{catalogname}/fields/{fieldname}:
    delete:
      operationId: delete_v1_catalogs_catalogname_fields_fieldname
      tags:
      - Catalogs
      summary: 필드 삭제
      x-source: https://docs.hackle.io/development-guide/http-api/catalog.md
      parameters:
      - name: catalogname
        in: path
        required: true
        schema:
          type: string
      - name: fieldname
        in: path
        required: true
        schema:
          type: string
      responses:
        '204':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/catalogs/{catalogname}/items:
    delete:
      operationId: delete_v1_catalogs_catalogname_items
      tags:
      - Catalogs
      summary: 아이템 삭제
      x-source: https://docs.hackle.io/development-guide/http-api/catalog.md
      parameters:
      - name: catalogname
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeleteV1CatalogsCatalognameItemsResponse'
      x-evidence:
        kind: documentation
    post:
      operationId: post_v1_catalogs_catalogname_items
      tags:
      - Catalogs
      summary: 아이템 추가
      x-source: https://docs.hackle.io/development-guide/http-api/catalog.md
      parameters:
      - name: catalogname
        in: path
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1CatalogsCatalognameItemsRequest'
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostV1CatalogsCatalognameItemsResponse'
      x-evidence:
        kind: documentation
    put:
      operationId: put_v1_catalogs_catalogname_items
      tags:
      - Catalogs
      summary: 아이템 수정
      x-source: https://docs.hackle.io/development-guide/http-api/catalog.md
      parameters:
      - name: catalogname
        in: path
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PutV1CatalogsCatalognameItemsRequest'
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PutV1CatalogsCatalognameItemsResponse'
      x-evidence:
        kind: documentation
  /v1/kakao-subscriptions:
    post:
      operationId: post_v1_kakao_subscriptions
      tags:
      - Kakao Subscriptions
      summary: POST /v1/kakao-subscriptions
      x-source: https://docs.hackle.io/development-guide/http-api/api-properties.md
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1KakaoSubscriptionsRequest'
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -i -X POST  'https://api.hackle.io/v1/kakao-subscriptions'  -H 'X-HACKLE-API-KEY: YOUR_API_KEY_HERE'  -H 'Content-Type:\
          \ application/json'  -d '{\n    \"userId\": \"19285035\",\n    \"marketingSubscriptionStatus\": \"UNSUBSCRIBED\",\n    \"informationSubscriptionStatus\"\
          \ : \"SUBSCRIBED\"\n }'\n```"
  /v1/properties:
    post:
      operationId: post_v1_properties
      tags:
      - Properties
      summary: POST /v1/properties
      x-source: https://docs.hackle.io/development-guide/http-api/api-properties.md
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1PropertiesRequest'
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -i -X POST  'https://api.hackle.io/v1/properties'  -H 'X-HACKLE-API-KEY: YOUR_SDK_KEY_HERE'  -H 'Content-Type: application/json'\
          \  -d '{\n    \"userId\": \"19285035\",\n    \"deviceId\": \"ae2182e0\",\n    \"operations\": {\n      \"$set\": {\n        \"age\"\
          : 42,\n        \"grade\": \"GOLD\"\n      },\n      \"$setOnce\": {\n        \"sign_up_date\": \"2020-01-01\"\n      },\n      \"$unset\"\
          : {\n        \"membership_type\": \"-\"\n  "
  /v1/properties/phone-numbers:
    delete:
      operationId: delete_v1_properties_phone_numbers
      tags:
      - Properties
      summary: DELETE /v1/properties/phone-numbers
      x-source: https://docs.hackle.io/development-guide/http-api/api-properties.md
      parameters:
      - name: userId
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -i -X DELETE  'https://api.hackle.io/v1/properties/phone-numbers?userId=targetUserId'  -H 'X-HACKLE-API-KEY: YOUR_API_KEY_HERE'\
          \  -H 'Content-Type: application/json' \n```"
    post:
      operationId: post_v1_properties_phone_numbers
      tags:
      - Properties
      summary: POST /v1/properties/phone-numbers
      x-source: https://docs.hackle.io/development-guide/http-api/api-properties.md
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1PropertiesPhoneNumbersRequest'
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -i -X POST  'https://api.hackle.io/v1/properties/phone-numbers'  -H 'X-HACKLE-API-KEY: YOUR_API_KEY_HERE'  -H 'Content-Type:\
          \ application/json'  -d '{\n    \"userId\": \"19285035\",\n    \"phoneNumber\": \"+821012345678\"\n  }'\n```"
  /v1/push-subscriptions:
    post:
      operationId: post_v1_push_subscriptions
      tags:
      - Push Subscriptions
      summary: POST /v1/push-subscriptions
      x-source: https://docs.hackle.io/development-guide/http-api/api-properties.md
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1PushSubscriptionsRequest'
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -i -X POST  'https://api.hackle.io/v1/push-subscriptions'  -H 'X-HACKLE-API-KEY: YOUR_API_KEY_HERE'  -H 'Content-Type:\
          \ application/json'  -d '{\n    \"userId\": \"19285035\",\n    \"deviceId\": null,\n    \"marketingSubscriptionStatus\": \"UNSUBSCRIBED\"\
          ,\n    \"informationSubscriptionStatus\" : \"SUBSCRIBED\"\n }'\n```"
  /v1/sms-subscriptions:
    post:
      operationId: post_v1_sms_subscriptions
      tags:
      - Sms Subscriptions
      summary: POST /v1/sms-subscriptions
      x-source: https://docs.hackle.io/development-guide/http-api/api-properties.md
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1SmsSubscriptionsRequest'
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -i -X POST  'https://api.hackle.io/v1/sms-subscriptions'  -H 'X-HACKLE-API-KEY: YOUR_API_KEY_HERE'  -H 'Content-Type: application/json'\
          \  -d '{\n    \"userId\": \"19285035\",\n    \"marketingSubscriptionStatus\": \"UNSUBSCRIBED\",\n    \"informationSubscriptionStatus\"\
          \ : \"SUBSCRIBED\"\n }'\n```"
  /v1/track:
    post:
      operationId: post_v1_track
      tags:
      - Track
      summary: POST /v1/track
      x-source: https://docs.hackle.io/development-guide/http-api/api-track
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1TrackRequest'
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -i -X POST  'https://api.hackle.io/v1/track'  -H 'X-HACKLE-API-KEY: YOUR_SDK_KEY_HERE'  -H 'Content-Type: application/json'\
          \  -d '{ \n \"event\": { \n \"key\": \"purchase\", \n \"properties\": { \n \"paymentMethod\": \"CARD\", \n \"discountAmount\": 420 \n\
          \ } \n }, \n \"user\": { \n \"userId\": \"19285035\", \n \"deviceId\": \"ae2182e0\", \n \"identifiers\": { \n \"sessionId\": \"16930492542\"\
          , \n \"myCustomId\": \"ff01eae2\" \n }, \n \"proper"
  /v1/variation:
    post:
      operationId: post_v1_variation
      tags:
      - Variation
      summary: POST /v1/variation
      x-source: https://docs.hackle.io/development-guide/http-api/api-variation.md
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1VariationRequest'
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -i -X POST  'https://api.hackle.io/v1/variation'  -H 'X-HACKLE-API-KEY: YOUR_SDK_KEY_HERE'  -H 'Content-Type: application/json'\
          \  -d '{\n    \"experimentKey\": 42,\n    \"user\": {\n      \"userId\": \"19285035\",\n      \"deviceId\": \"ae2182e0\",\n      \"\
          identifiers\": {\n        \"sessionId\": \"16930492542\",\n        \"myCustomId\": \"ff01eae2\"\n      },\n      \"properties\": {\n\
          \        \"grade\": \"GOLD\",\n        \"age\": "
components:
  schemas:
    GetV1CatalogsResponse:
      type: object
      properties:
        catalogs:
          type: array
          description: 카탈로그 목록
        catalogs[].catalogName:
          type: string
          description: 카탈로그 이름
        catalogs[].description:
          type: string
          description: 카탈로그 설명
        catalogs[].itemCount:
          type: number
          description: 아이템 수 (API 키의 환경 기준)
        catalogs[].createdAt:
          type: string
          description: 생성 일시
        catalogs[].modifiedAt:
          type: string
          description: 수정 일시
    PostV1CatalogsRequest:
      type: object
      properties:
        catalogName:
          type: string
          description: 카탈로그 이름. 영문, 숫자, '-', '_' 만 사용하며 200자 이하
        description:
          type: string
          description: 카탈로그 설명
        fields:
          type: array
          description: 함께 만들 필드 목록 (최대 50개)
        fields[].fieldName:
          type: string
          description: 필드 이름. 카탈로그 안에서 유일해야 하며 `id` 는 사용할 수 없음
        fields[].fieldType:
          type: string
          description: '`STRING` / `NUMBER` / `BOOLEAN` / `TIME`'
      required:
      - catalogName
      - fields[].fieldName
      - fields[].fieldType
    PostV1CatalogsResponse:
      type: object
      properties:
        catalogName:
          type: string
          description: 카탈로그 이름
        description:
          type: string
          description: 카탈로그 설명
        itemCount:
          type: number
          description: 아이템 수 (API 키의 환경 기준)
        createdAt:
          type: string
          description: 생성 일시
        modifiedAt:
          type: string
          description: 수정 일시
        fields:
          type: array
          description: 필드 목록
        fields[].fieldName:
          type: string
          description: 필드 이름
        fields[].fieldType:
          type: string
          description: 필드 타입
    GetV1CatalogsCatalognameResponse:
      type: object
      properties:
        catalogName:
          type: string
          description: 카탈로그 이름
        description:
          type: string
          description: 카탈로그 설명
        itemCount:
          type: number
          description: 아이템 수 (API 키의 환경 기준)
        createdAt:
          type: string
          description: 생성 일시
        modifiedAt:
          type: string
          description: 수정 일시
        fields:
          type: array
          description: 필드 목록
        fields[].fieldName:
          type: string
          description: 필드 이름
        fields[].fieldType:
          type: string
          description: 필드 타입
    PostV1CatalogsCatalognameFieldsRequest:
      type: object
      properties:
        fieldName:
          type: string
          description: 필드 이름. 카탈로그 안에서 유일해야 하며 `id` 는 사용할 수 없음
        fieldType:
          type: string
          description: '`STRING` / `NUMBER` / `BOOLEAN` / `TIME`'
      required:
      - fieldName
      - fieldType
    PostV1CatalogsCatalognameFieldsResponse:
      type: object
      properties:
        fieldName:
          type: string
          description: 필드 이름
        fieldType:
          type: string
          description: 필드 타입
    DeleteV1CatalogsCatalognameItemsResponse:
      type: object
      properties:
        processedCount:
          type: number
          description: 처리한 아이템 수
    PostV1CatalogsCatalognameItemsRequest:
      type: object
      properties:
        items:
          type: array
          description: 추가할 아이템 목록. 1개 이상 500개 이하
        items[].id:
          type: string
          description: 아이템 식별자. 영문, 숫자, '-', '_' 만 사용하며 300자 이하
        items[].fields:
          type: object
          description: 필드 이름과 값. 카탈로그에 정의된 필드만 사용 가능
      required:
      - items
      - items[].id
    PostV1CatalogsCatalognameItemsResponse:
      type: object
      properties:
        processedCount:
          type: number
          description: 처리한 아이템 수
    PutV1CatalogsCatalognameItemsRequest:
      type: object
      properties:
        items:
          type: array
          description: 수정할 아이템 목록. 1개 이상 500개 이하
        items[].id:
          type: string
          description: 아이템 식별자
        items[].fields:
          type: object
          description: 필드 이름과 값
      required:
      - items
      - items[].id
    PutV1CatalogsCatalognameItemsResponse:
      type: object
      properties:
        processedCount:
          type: number
          description: 처리한 아이템 수
    PostV1KakaoSubscriptionsRequest:
      type: object
      properties:
        userId:
          type: string
        marketingSubscriptionStatus:
          type: string
        informationSubscriptionStatus:
          type: string
    PostV1PropertiesRequest:
      type: object
      properties:
        userId:
          type: string
        deviceId:
          type: string
        operations:
          type: object
          properties:
            $set:
              type: object
              properties:
                age:
                  type: integer
                grade:
                  type: string
            $setOnce:
              type: object
              properties:
                sign_up_date:
                  type: string
                  format: date
            $unset:
              type: object
              properties:
                membership_type:
                  type: string
    PostV1PropertiesPhoneNumbersRequest:
      type: object
      properties:
        userId:
          type: string
        phoneNumber:
          type: string
    PostV1PushSubscriptionsRequest:
      type: object
      properties:
        userId:
          type: string
        deviceId:
          type:
          - string
          - 'null'
        marketingSubscriptionStatus:
          type: string
        informationSubscriptionStatus:
          type: string
    PostV1SmsSubscriptionsRequest:
      type: object
      properties:
        userId:
          type: string
        marketingSubscriptionStatus:
          type: string
        informationSubscriptionStatus:
          type: string
    PostV1TrackRequest:
      type: object
      properties:
        event:
          type: object
          properties:
            key:
              type: string
            properties:
              type: object
              properties:
                paymentMethod:
                  type: string
                discountAmount:
                  type: integer
        user:
          type: object
          properties:
            userId:
              type: string
            deviceId:
              type: string
            identifiers:
              type: object
              properties:
                sessionId:
                  type: string
                myCustomId:
                  type: string
            properties:
              type: object
              properties:
                grade:
                  type: string
                age:
                  type: integer
                isLogin:
                  type: boolean
    PostV1VariationRequest:
      type: object
      properties:
        experimentKey:
          type: integer
        user:
          type: object
          properties:
            userId:
              type: string
            deviceId:
              type: string
            identifiers:
              type: object
              properties:
                sessionId:
                  type: string
                myCustomId:
                  type: string
            properties:
              type: object
              properties:
                grade:
                  type: string
                age:
                  type: integer
                isLogin:
                  type: boolean
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: X-HACKLE-API-KEY
security:
- apiKey: []
tags:
- name: Catalogs
- name: Kakao Subscriptions
- name: Properties
- name: Push Subscriptions
- name: Sms Subscriptions
- name: Track
- name: Variation