API Reference v1 읽기 전용

현재 외부에 열려 있는 엔드포인트는 조회(GET) 5개가 전부입니다. 쓰기(생성·수정·삭제)는 열려 있지 않습니다.

Base URL https://inlink.to/api/v1

기계판독 스펙 /api/v1/openapi.json (OpenAPI 3.1.0 · 이 페이지가 그대로 읽어 그리는 원본)

응답에 개인정보가 없습니다

어떤 응답에도 실명 · 휴대폰 번호 · 이메일 · 배송 주소 · 송장 번호 · 지원 시 작성한 자기소개·기획안 · 브랜드 내부 메모는 포함되지 않습니다.

지원자·제안에 딸려 나오는 influencer 객체는 id, username, nickname, avatar_url 4칸이 전부입니다. 각각 회원번호·닉네임·프로필 이미지입니다. 캠페인에 지원했다는 사실이 그 사람의 프로필 전체를 보여줄 근거가 되지는 않기 때문에 여기까지만 나갑니다.

인플루언서 디렉터리 검색(GET /influencers)은 이보다 넓습니다 — id, username, nickname, avatar_url, bio, tagline, city, country, categories, platforms, total_followers, channels. 서비스의 '인플루언서 찾기' 화면이 이미 누구에게나 보여주는 것과 같은 공개 정보입니다(같은 조회 경로를 씁니다). 실명·연락처·정확한 주소·이메일은 여기에도 들어가지 않습니다.

GET읽기 전용/campaigns

내 캠페인 목록

내 계정이 소유한 브랜드의 캠페인만 최신순(created_at 내림차순)으로 반환합니다. 삭제된 캠페인은 빠집니다. 아직 브랜드가 없는 계정은 빈 목록과 함께 pagination.limit 이 0 으로 나갑니다.

파라미터

  • page

    위치
    쿼리
    타입
    integer
    필수
    선택
    설명
    페이지 번호(1부터). 1 미만을 넣으면 1로 맞춥니다. (기본 1 · 최소 1)
  • limit

    위치
    쿼리
    타입
    integer
    필수
    선택
    설명
    페이지당 개수. 1~50 범위로 맞춰지며 50을 넘겨도 50으로 깎입니다. (기본 20 · 최소 1 · 최대 50)
  • status

    위치
    쿼리
    타입
    string
    필수
    선택
    설명
    캠페인 상태 정확일치 필터(예: active). 생략하면 전체를 반환합니다.

요청 예시

cURL
curl https://inlink.to/api/v1/campaigns \
  -H "Authorization: Bearer $INLINK_API_KEY"

응답 예시 (200)

application/json
{
  "data": [
    {
      "id": "3f2b7c9e-5d41-4a8e-9c10-6b2f0a7d1e34",
      "campaign_number": 10241,
      "title": "글로우 선크림 체험단 모집",
      "status": "active",
      "category": "beauty",
      "platform": "instagram",
      "campaign_type": "sns_content",
      "delivery_type": "delivery",
      "sns_platform": "instagram",
      "shopping_channel": null,
      "recruits": 10,
      "chosen_count": 4,
      "applicants_count": 15,
      "reward_per_person": 30000,
      "cost_estimated": 120000,
      "cost_final": 330000,
      "paid_at": "2026-07-28T02:12:40+00:00",
      "reward_paid_total": 90000,
      "product_provided": true,
      "request_start_at": "2026-08-01T00:00:00+00:00",
      "request_end_at": "2026-08-10T14:59:59+00:00",
      "submit_start_at": "2026-08-11T00:00:00+00:00",
      "submit_end_at": "2026-08-25T14:59:59+00:00",
      "thumbnail_url": "https://example.supabase.co/storage/v1/object/public/campaigns/sample.jpg",
      "created_at": "2026-07-28T02:11:07+00:00",
      "brand": {
        "id": "b1a2c3d4-0000-4000-8000-1234567890ab",
        "company_name": "글로우코스메틱"
      }
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 42,
    "totalPages": 3
  }
}

상태 코드

  • 200

    의미
    OK
    응답 본문
    —
  • 401

    의미
    키 없음·무효·폐기 — { "error": "Invalid or missing API key" }
    응답 본문
    {"error":"Invalid or missing API key"}
  • 403

    의미
    Pro 자격 없음(강등·만료 포함)
    응답 본문
    {"error":"API 접근 자격이 없습니다. Pro 플랜 구독이 필요합니다."}
  • 429

    의미
    호출 한도 초과(IP 분당 300 또는 키 분당 60)
    응답 본문
    {"error":"Rate limit exceeded"}
  • 500

    의미
    서버 내부 오류(일시 장애) — 재시도 대상
    응답 본문
    {"error":"Failed to resolve brand scope"}
GET읽기 전용/campaigns/:id

캠페인 상세

내 소유 캠페인 1건을 반환합니다. 없거나 내 소유가 아니면 똑같이 404 입니다(남의 캠페인이 존재하는지 알려주지 않습니다).

파라미터

  • id

    위치
    경로
    타입
    string(uuid)
    필수
    필수
    설명
    캠페인 id(uuid)

요청 예시

cURL
curl https://inlink.to/api/v1/campaigns/CAMPAIGN_ID \
  -H "Authorization: Bearer $INLINK_API_KEY"

응답 예시 (200)

application/json
{
  "data": {
    "id": "3f2b7c9e-5d41-4a8e-9c10-6b2f0a7d1e34",
    "campaign_number": 10241,
    "title": "글로우 선크림 체험단 모집",
    "status": "active",
    "category": "beauty",
    "platform": "instagram",
    "campaign_type": "sns_content",
    "delivery_type": "delivery",
    "sns_platform": "instagram",
    "shopping_channel": null,
    "recruits": 10,
    "chosen_count": 4,
    "applicants_count": 15,
    "reward_per_person": 30000,
    "cost_estimated": 120000,
    "cost_final": 330000,
    "paid_at": "2026-07-28T02:12:40+00:00",
    "reward_paid_total": 90000,
    "product_provided": true,
    "request_start_at": "2026-08-01T00:00:00+00:00",
    "request_end_at": "2026-08-10T14:59:59+00:00",
    "submit_start_at": "2026-08-11T00:00:00+00:00",
    "submit_end_at": "2026-08-25T14:59:59+00:00",
    "thumbnail_url": null,
    "created_at": "2026-07-28T02:11:07+00:00",
    "brand": {
      "id": "b1a2c3d4-0000-4000-8000-1234567890ab",
      "company_name": "글로우코스메틱"
    }
  }
}

상태 코드

  • 200

    의미
    OK
    응답 본문
    —
  • 401

    의미
    키 없음·무효·폐기 — { "error": "Invalid or missing API key" }
    응답 본문
    {"error":"Invalid or missing API key"}
  • 403

    의미
    Pro 자격 없음(강등·만료 포함)
    응답 본문
    {"error":"API 접근 자격이 없습니다. Pro 플랜 구독이 필요합니다."}
  • 404

    의미
    캠페인이 없거나 내 소유가 아님(두 경우를 구분해 알려주지 않습니다)
    응답 본문
    {"error":"Campaign not found"}
  • 429

    의미
    호출 한도 초과(IP 분당 300 또는 키 분당 60)
    응답 본문
    {"error":"Rate limit exceeded"}
  • 500

    의미
    서버 내부 오류(일시 장애) — 재시도 대상
    응답 본문
    {"error":"Failed to resolve brand scope"}
GET읽기 전용/campaigns/:id/applicants

캠페인 지원자 현황(선정·제출)

내 소유 캠페인의 지원(신청) 목록을 최신순으로 반환합니다. 지원자의 개인정보(실명·연락처·배송 주소·지원서 자유기재)는 조회조차 하지 않으며, 인플루언서는 공개 신원(회원번호·닉네임·프로필 이미지)만 붙습니다.

  • 선정 인원을 세는 정본 규칙은 is_selected=true 입니다. status 문자열만으로 세면 '선정된 뒤 취소 확정된 사람'(status=accepted 이지만 is_cancelled=true)이 함께 세어져 Campaign.chosen_count 와 어긋납니다.
  • 1.1.0-read 까지는 is_selected 가 옛 서비스 이관용 내부 플래그를 그대로 실어, inlink 에서 만든 캠페인에서는 실제 선정자도 false 로 나갔습니다. 1.2.0-read 부터 내부 화면과 같은 규칙으로 계산됩니다.
  • ★이미 수집·저장해 두신 is_selected 값이 있다면 이 엔드포인트로 다시 받아 갱신하시길 권장합니다 — 1.2.0-read 이전에 받아 두신 값은 실제 선정 여부와 다를 수 있습니다.

파라미터

  • id

    위치
    경로
    타입
    string(uuid)
    필수
    필수
    설명
    캠페인 id(uuid)
  • page

    위치
    쿼리
    타입
    integer
    필수
    선택
    설명
    페이지 번호(1부터). 1 미만을 넣으면 1로 맞춥니다. (기본 1 · 최소 1)
  • limit

    위치
    쿼리
    타입
    integer
    필수
    선택
    설명
    페이지당 개수. 1~50 범위로 맞춰지며 50을 넘겨도 50으로 깎입니다. (기본 20 · 최소 1 · 최대 50)
  • status

    위치
    쿼리
    타입
    string
    필수
    선택
    설명
    신청 상태 정확일치 필터. 실측 사용값: pending · accepted · submitted · completed · rejected · cancelled · withdrawn. ★선정자만 뽑을 때 이 필터를 세 번 호출해 합치지 마세요 — 취소 확정자가 accepted 로 남아 섞입니다. 선정 판별은 응답의 is_selected 를 쓰세요(1.2.0-read).

요청 예시

cURL
curl https://inlink.to/api/v1/campaigns/CAMPAIGN_ID/applicants \
  -H "Authorization: Bearer $INLINK_API_KEY"

응답 예시 (200)

application/json
{
  "data": [
    {
      "id": "9c8b7a65-4321-4d0e-9f8a-0b1c2d3e4f50",
      "campaign_id": "3f2b7c9e-5d41-4a8e-9c10-6b2f0a7d1e34",
      "status": "submitted",
      "is_selected": true,
      "is_submitted": true,
      "is_cancelled": false,
      "selected_at": "2026-08-11T01:20:00+00:00",
      "submitted_at": "2026-08-19T09:42:13+00:00",
      "cancelled_at": null,
      "created_at": "2026-08-03T11:05:44+00:00",
      "review_url": "https://www.instagram.com/p/EXAMPLE/",
      "proof_image_url": null,
      "order_number": null,
      "purchase_proof_order_number": "20260902-0004871",
      "purchase_proof_submitted_at": "2026-08-30T05:12:40+00:00",
      "reward_paid_amount": 30000,
      "reward_paid_at": "2026-09-02T00:11:03+00:00",
      "deposit_amount": 10000,
      "deposit_status": "returned",
      "deposit_held_at": "2026-08-11T01:20:05+00:00",
      "deposit_returned_at": "2026-09-02T00:11:03+00:00",
      "deposit_forfeited_at": null,
      "influencer": {
        "id": "5d6e7f80-1122-4334-8556-77889900aabb",
        "username": "312045",
        "nickname": "매일뷰티",
        "avatar_url": "https://example.supabase.co/storage/v1/object/public/avatars/sample.jpg"
      }
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 15,
    "totalPages": 1
  }
}

상태 코드

  • 200

    의미
    OK
    응답 본문
    —
  • 401

    의미
    키 없음·무효·폐기 — { "error": "Invalid or missing API key" }
    응답 본문
    {"error":"Invalid or missing API key"}
  • 403

    의미
    Pro 자격 없음(강등·만료 포함)
    응답 본문
    {"error":"API 접근 자격이 없습니다. Pro 플랜 구독이 필요합니다."}
  • 404

    의미
    캠페인이 없거나 내 소유가 아님(두 경우를 구분해 알려주지 않습니다)
    응답 본문
    {"error":"Campaign not found"}
  • 429

    의미
    호출 한도 초과(IP 분당 300 또는 키 분당 60)
    응답 본문
    {"error":"Rate limit exceeded"}
  • 500

    의미
    서버 내부 오류(일시 장애) — 재시도 대상
    응답 본문
    {"error":"Failed to resolve brand scope"}
GET읽기 전용/proposals

내가 보낸 제안 목록

내 브랜드가 인플루언서에게 보낸 제안을 최신순으로 반환합니다. 제안 본문(메시지)은 응답에 포함되지 않습니다. 아직 브랜드가 없는 계정은 빈 목록과 함께 pagination.limit 이 0 으로 나갑니다.

파라미터

  • page

    위치
    쿼리
    타입
    integer
    필수
    선택
    설명
    페이지 번호(1부터). 1 미만을 넣으면 1로 맞춥니다. (기본 1 · 최소 1)
  • limit

    위치
    쿼리
    타입
    integer
    필수
    선택
    설명
    페이지당 개수. 1~50 범위로 맞춰지며 50을 넘겨도 50으로 깎입니다. (기본 20 · 최소 1 · 최대 50)
  • status

    위치
    쿼리
    타입
    string
    필수
    선택
    설명
    제안 상태 정확일치 필터(예: pending). 생략하면 전체를 반환합니다.

요청 예시

cURL
curl https://inlink.to/api/v1/proposals \
  -H "Authorization: Bearer $INLINK_API_KEY"

응답 예시 (200)

application/json
{
  "data": [
    {
      "id": "11223344-5566-4778-8899-aabbccddeeff",
      "proposal_number": 3312,
      "title": "가을 신제품 협업 제안",
      "status": "pending",
      "budget": 500000,
      "created_at": "2026-08-05T04:00:00+00:00",
      "expires_at": "2026-08-12T04:00:00+00:00",
      "responded_at": null,
      "accepted_at": null,
      "rejected_at": null,
      "submitted_at": null,
      "influencer": {
        "id": "5d6e7f80-1122-4334-8556-77889900aabb",
        "username": "312045",
        "nickname": "매일뷰티",
        "avatar_url": null
      }
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 7,
    "totalPages": 1
  }
}

상태 코드

  • 200

    의미
    OK
    응답 본문
    —
  • 401

    의미
    키 없음·무효·폐기 — { "error": "Invalid or missing API key" }
    응답 본문
    {"error":"Invalid or missing API key"}
  • 403

    의미
    Pro 자격 없음(강등·만료 포함)
    응답 본문
    {"error":"API 접근 자격이 없습니다. Pro 플랜 구독이 필요합니다."}
  • 429

    의미
    호출 한도 초과(IP 분당 300 또는 키 분당 60)
    응답 본문
    {"error":"Rate limit exceeded"}
  • 500

    의미
    서버 내부 오류(일시 장애) — 재시도 대상
    응답 본문
    {"error":"Failed to resolve brand scope"}
GET읽기 전용/influencers

공개 인플루언서 디렉터리 검색

닉네임·지역·채널·팔로워로 공개 인플루언서를 검색합니다. 실명·연락처·주소·이메일은 포함되지 않습니다.

  • platform·category·min_followers·max_followers 는 페이지를 먼저 가져온 뒤 그 페이지 안에서 걸러냅니다 — 한 페이지에 limit 보다 적게 담길 수 있고, 그렇다고 결과가 끝난 것은 아닙니다.
  • 그래서 이 엔드포인트의 pagination.total 은 '조건에 맞는 전체 건수'가 아니라 '이번 페이지에서 필터를 통과한 건수'입니다. totalPages 도 그에 따른 근사치입니다.
  • 전부 모아야 한다면 필터 없이 page 를 1씩 올려 빈 배열이 나올 때까지 받은 뒤, 걸러내기는 받는 쪽에서 하는 편이 정확합니다.

파라미터

  • page

    위치
    쿼리
    타입
    integer
    필수
    선택
    설명
    페이지 번호(1부터). 1 미만을 넣으면 1로 맞춥니다. (기본 1 · 최소 1)
  • limit

    위치
    쿼리
    타입
    integer
    필수
    선택
    설명
    페이지당 개수. 1~50 범위로 맞춰지며 50을 넘겨도 50으로 깎입니다. (기본 20 · 최소 1 · 최대 50)
  • keyword

    위치
    쿼리
    타입
    string
    필수
    선택
    설명
    검색어 — 닉네임만 검색합니다(실명·아이디는 검색 대상이 아닙니다).
  • region

    위치
    쿼리
    타입
    string
    필수
    선택
    설명
    지역 — 프로필의 공개 도시(city) 값과 대조합니다.
  • platform

    위치
    쿼리
    타입
    string
    필수
    선택
    설명
    채널 플랫폼 필터(instagram 등). 페이지를 가져온 뒤 걸러내는 방식이라 아래 주의사항을 함께 보세요.
  • category

    위치
    쿼리
    타입
    string
    필수
    선택
    설명
    카테고리 slug 또는 한글 이름. 페이지를 가져온 뒤 걸러내는 방식입니다.
  • min_followers

    위치
    쿼리
    타입
    integer
    필수
    선택
    설명
    채널 팔로워 합계 하한. 페이지를 가져온 뒤 걸러내는 방식입니다.
  • max_followers

    위치
    쿼리
    타입
    integer
    필수
    선택
    설명
    채널 팔로워 합계 상한. 페이지를 가져온 뒤 걸러내는 방식입니다.

요청 예시

cURL
curl https://inlink.to/api/v1/influencers \
  -H "Authorization: Bearer $INLINK_API_KEY"

응답 예시 (200)

application/json
{
  "data": [
    {
      "id": "5d6e7f80-1122-4334-8556-77889900aabb",
      "username": "312045",
      "nickname": "매일뷰티",
      "avatar_url": "https://example.supabase.co/storage/v1/object/public/avatars/sample.jpg",
      "bio": "매일 쓰는 것만 리뷰합니다.",
      "tagline": "스킨케어 전문",
      "city": "서울",
      "country": "KR",
      "categories": [
        "뷰티",
        "라이프스타일"
      ],
      "platforms": [
        "instagram",
        "youtube"
      ],
      "total_followers": 42350,
      "channels": [
        {
          "platform": "instagram",
          "handle": "everyday_beauty",
          "followers": 38200,
          "engagement_rate": 3.4
        },
        {
          "platform": "youtube",
          "handle": "everydaybeauty",
          "followers": 4150,
          "engagement_rate": null
        }
      ]
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 1,
    "totalPages": 1
  }
}

상태 코드

  • 200

    의미
    OK
    응답 본문
    —
  • 401

    의미
    키 없음·무효·폐기 — { "error": "Invalid or missing API key" }
    응답 본문
    {"error":"Invalid or missing API key"}
  • 403

    의미
    Pro 자격 없음(강등·만료 포함)
    응답 본문
    {"error":"API 접근 자격이 없습니다. Pro 플랜 구독이 필요합니다."}
  • 429

    의미
    호출 한도 초과(IP 분당 300 또는 키 분당 60)
    응답 본문
    {"error":"Rate limit exceeded"}
  • 500

    의미
    서버 내부 오류(일시 장애) — 재시도 대상
    응답 본문
    {"error":"Failed to resolve brand scope"}

더 필요한 것: 에러 코드 · 호출 한도 · 바이브코딩 킷