REST API reference

Dribbble API

11 endpoints for Dribbble. Each one is a POST with a JSON body, called with your API key.

Base URL
https://cotlet.dev/api/v1/dribbble
Connects with
Your own Dribbble account (a Pro account for Pro Analytics)
Integration page
Dribbble
Dribbble Endpoints
Endpoint Access Description
list_shots read Your shots, newest first, with title, tags, publish date and URL.
get_shot_stats read Views, likes, saves and comment count of one of your shots.
get_pro_analytics read Pro Analytics: leads, proposals, funded projects, response time and rate, conversion and earnings.
list_conversations read Your Messages inbox: who, last message, time and whether it is unread.
get_conversation read All messages in a conversation, with sender, text, time and attached files.
list_leads read Project and Service Requests you received, with client, date, type and whether you replied.
list_comments read Comments on one of your shots, with author, text, time and whether you replied.
upload_shot write Publish a new shot from an image, with title, description and tags.
update_shot write Change the title, description or tags of one of your shots.
reply_to_message write Send a message as you in an existing conversation.
reply_to_comment write Reply as you under a comment on one of your shots.

List shots

read

POST https://cotlet.dev/api/v1/dribbble/list_shots

Returns your own shots, newest first, the same order as your profile. Each item has the title, tags, publish date and URL. Use the shot_id of an item in get_shot_stats, list_comments and update_shot. Pass next_cursor back as cursor for the next page.

Parameters

Parameters: list_shots
NameTypeDescription
limit integer 1 to 100. Default: 24.
cursor string Next page cursor from the previous call.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/dribbble/list_shots \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("dribbble", "list_shots")
Node.js
const result = await cotlet.call('dribbble', 'list_shots');
CLI
cotlet call dribbble list_shots

Example response

{
  "shots": [
    {
      "shot_id": "21847531",
      "title": "Fintech dashboard",
      "tags": [
        "ui",
        "fintech",
        "dashboard"
      ],
      "published_at": "2026-10-08T09:30:00Z",
      "url": "https://dribbble.com/shots/21847531-Fintech-dashboard"
    },
    {
      "shot_id": "21790442",
      "title": "Onboarding flow",
      "tags": [
        "ux",
        "mobile"
      ],
      "published_at": "2026-09-30T14:10:00Z",
      "url": "https://dribbble.com/shots/21790442-Onboarding-flow"
    }
  ],
  "next_cursor": "eyJvZmZzZXQiOjI0fQ"
}

POST https://cotlet.dev/api/v1/dribbble/get_shot_stats

Returns the engagement numbers Dribbble shows for one of your shots: views, likes, saves and the number of comments. It works for your own shots only. The numbers are the ones Dribbble shows at the time of the call.

Parameters

Parameters: get_shot_stats
NameTypeDescription
shot_id required string Shot ID from list_shots.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/dribbble/get_shot_stats \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"shot_id":"shot_8c41d2"}'
Python
result = client.call("dribbble", "get_shot_stats", {"shot_id":"shot_8c41d2"})
Node.js
const result = await cotlet.call('dribbble', 'get_shot_stats', {"shot_id":"shot_8c41d2"});
CLI
cotlet call dribbble get_shot_stats --data '{"shot_id":"shot_8c41d2"}'

Example response

{
  "shot_id": "21847531",
  "title": "Fintech dashboard",
  "views": 4120,
  "likes": 186,
  "saves": 74,
  "comments": 12
}

POST https://cotlet.dev/api/v1/dribbble/get_pro_analytics

Returns the figures of your Pro Analytics dashboard for a period: leads, project proposals, funded and completed projects, average project value, response time, response rate, lead conversion rate, cancellation rate and earnings. Dribbble refreshes these once a day. Needs a Pro account.

Parameters

Parameters: get_pro_analytics
NameTypeDescription
period enum 30d, 60d, 90d or all_time. Default: 30d.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/dribbble/get_pro_analytics \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"period":"60d"}'
Python
result = client.call("dribbble", "get_pro_analytics", {"period":"60d"})
Node.js
const result = await cotlet.call('dribbble', 'get_pro_analytics', {"period":"60d"});
CLI
cotlet call dribbble get_pro_analytics --data '{"period":"60d"}'

Example response

{
  "period": "30d",
  "leads": 14,
  "project_proposals": 6,
  "funded_projects": 3,
  "completed_projects": 2,
  "average_project_value": 2400,
  "response_time_hours": 3.5,
  "response_rate": 92.9,
  "lead_conversion_rate": 21.4,
  "cancellation_rate": 0,
  "earnings": 4800,
  "currency": "USD"
}

POST https://cotlet.dev/api/v1/dribbble/list_conversations

Lists your Dribbble Messages conversations, most recent first, with the other person, a preview of the last message, its time and whether it is unread. Set unread_only to see only what needs an answer. Pass conversation_id to get_conversation or reply_to_message.

Parameters

Parameters: list_conversations
NameTypeDescription
unread_only boolean Only conversations with unread messages.
limit integer 1 to 50. Default: 20.
cursor string Next page cursor from the previous call.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/dribbble/list_conversations \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("dribbble", "list_conversations")
Node.js
const result = await cotlet.call('dribbble', 'list_conversations');
CLI
cotlet call dribbble list_conversations

Example response

{
  "conversations": [
    {
      "conversation_id": "8841207",
      "with": "Marta Kowal",
      "last_message": "Hi! We need a redesign of our analytics dashboard.",
      "updated_at": "2026-10-10T08:14:00Z",
      "unread": true
    }
  ],
  "next_cursor": null
}

POST https://cotlet.dev/api/v1/dribbble/get_conversation

Returns the messages of one conversation, oldest first, with the sender, text, time and any attached files. Your agent reads the whole thread before it drafts a reply.

Parameters

Parameters: get_conversation
NameTypeDescription
conversation_id required string Conversation ID from list_conversations.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/dribbble/get_conversation \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversation_id":"conversation_8c41d2"}'
Python
result = client.call("dribbble", "get_conversation", {"conversation_id":"conversation_8c41d2"})
Node.js
const result = await cotlet.call('dribbble', 'get_conversation', {"conversation_id":"conversation_8c41d2"});
CLI
cotlet call dribbble get_conversation --data '{"conversation_id":"conversation_8c41d2"}'

Example response

{
  "conversation_id": "8841207",
  "with": "Marta Kowal",
  "messages": [
    {
      "from": "Marta Kowal",
      "body": "Hi! We need a redesign of our analytics dashboard.",
      "sent_at": "2026-10-10T08:14:00Z",
      "attachments": []
    }
  ]
}

List leads

read

POST https://cotlet.dev/api/v1/dribbble/list_leads

Lists the Project and Service Requests you received, newest first, the same requests Pro Analytics counts as Leads. Each item has the client, the date, the request type and whether you have replied. Use unanswered_only to see what still needs an answer.

Parameters

Parameters: list_leads
NameTypeDescription
since date Only leads received on or after this date.
unanswered_only boolean Skip leads you already replied to.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/dribbble/list_leads \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"since":"2026-10-05","unanswered_only":true}'
Python
result = client.call("dribbble", "list_leads", {"since":"2026-10-05","unanswered_only":True})
Node.js
const result = await cotlet.call('dribbble', 'list_leads', {"since":"2026-10-05","unanswered_only":true});
CLI
cotlet call dribbble list_leads --data '{"since":"2026-10-05","unanswered_only":true}'

Example response

{
  "leads": [
    {
      "lead_id": "ld_30912",
      "client": "Marta Kowal",
      "type": "Project Request",
      "received_at": "2026-10-08T11:02:00Z",
      "replied": false,
      "conversation_id": "8841207"
    }
  ],
  "next_cursor": null
}

POST https://cotlet.dev/api/v1/dribbble/list_comments

Lists the comments on one of your shots, newest first, with the author, text, time and whether you replied. Set unanswered_only to skip comments you already answered. Pass comment_id to reply_to_comment.

Parameters

Parameters: list_comments
NameTypeDescription
shot_id required string Shot ID from list_shots.
unanswered_only boolean Skip comments you already replied to.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/dribbble/list_comments \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"shot_id":"shot_8c41d2"}'
Python
result = client.call("dribbble", "list_comments", {"shot_id":"shot_8c41d2"})
Node.js
const result = await cotlet.call('dribbble', 'list_comments', {"shot_id":"shot_8c41d2"});
CLI
cotlet call dribbble list_comments --data '{"shot_id":"shot_8c41d2"}'

Example response

{
  "shot_id": "21847531",
  "comments": [
    {
      "comment_id": "c_4471",
      "author": "Jonas Weber",
      "body": "Clean grid. What spacing scale is this?",
      "created_at": "2026-10-09T17:40:00Z",
      "replied": false
    }
  ],
  "next_cursor": null
}

Upload shot

write Confirm

POST https://cotlet.dev/api/v1/dribbble/upload_shot

Publishes a new shot on your profile from an image URL, with a title, an optional description and tags. Set publish_at to schedule it. The shot appears under your name and is public once published. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: upload_shot
NameTypeDescription
image_url required string PNG, JPG or GIF by URL.
title required string Shot title.
description string Text shown under the shot.
tags string[] Tags that help the shot show up in search.
publish_at datetime Schedule it, ISO 8601 with time zone.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/dribbble/upload_shot \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"image_url":"https://example.com","title":"title"}'
Python
result = client.call("dribbble", "upload_shot", {"image_url":"https://example.com","title":"title"})
Node.js
const result = await cotlet.call('dribbble', 'upload_shot', {"image_url":"https://example.com","title":"title"});
CLI
cotlet call dribbble upload_shot --data '{"image_url":"https://example.com","title":"title"}'

Example response

{
  "shot_id": "21901377",
  "status": "published",
  "title": "Fintech dashboard",
  "tags": [
    "ui",
    "fintech",
    "dashboard"
  ],
  "url": "https://dribbble.com/shots/21901377-Fintech-dashboard",
  "published_at": "2026-10-11T10:00:00+02:00"
}

Update shot

write

POST https://cotlet.dev/api/v1/dribbble/update_shot

Changes the title, description or tags of one of your own shots. Fields you leave out stay as they are. It sends nothing to anyone and one more call restores the old text, so it runs without asking first.

Parameters

Parameters: update_shot
NameTypeDescription
shot_id required string Shot ID from list_shots.
fields required object Any of title, description, tags.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/dribbble/update_shot \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"shot_id":"shot_8c41d2","fields":"fields"}'
Python
result = client.call("dribbble", "update_shot", {"shot_id":"shot_8c41d2","fields":"fields"})
Node.js
const result = await cotlet.call('dribbble', 'update_shot', {"shot_id":"shot_8c41d2","fields":"fields"});
CLI
cotlet call dribbble update_shot --data '{"shot_id":"shot_8c41d2","fields":"fields"}'

Example response

{
  "shot_id": "21847531",
  "status": "updated",
  "title": "Fintech dashboard v2",
  "tags": [
    "ui",
    "fintech",
    "dashboard"
  ]
}

Reply to message

write Confirm

POST https://cotlet.dev/api/v1/dribbble/reply_to_message

Sends a message in an existing conversation, under your name. The other person sees it in their Dribbble Messages. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: reply_to_message
NameTypeDescription
conversation_id required string Conversation ID from list_conversations.
body required string Message text.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/dribbble/reply_to_message \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversation_id":"8841207","body":"Thanks for reaching out! I can start on the dashboard redesign next week. Could you share the current screens?"}'
Python
result = client.call("dribbble", "reply_to_message", {"conversation_id":"8841207","body":"Thanks for reaching out! I can start on the dashboard redesign next week. Could you share the current screens?"})
Node.js
const result = await cotlet.call('dribbble', 'reply_to_message', {"conversation_id":"8841207","body":"Thanks for reaching out! I can start on the dashboard redesign next week. Could you share the current screens?"});
CLI
cotlet call dribbble reply_to_message --data '{"conversation_id":"8841207","body":"Thanks for reaching out! I can start on the dashboard redesign next week. Could you share the current screens?"}'

Example response

{
  "message_id": "55120934",
  "conversation_id": "8841207",
  "status": "sent",
  "sent_at": "2026-10-10T14:22:05+02:00"
}

Reply to comment

write Confirm

POST https://cotlet.dev/api/v1/dribbble/reply_to_comment

Posts a reply under one comment on your shot, under your name. The reply is public on the shot. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: reply_to_comment
NameTypeDescription
comment_id required string Comment ID from list_comments.
body required string Reply text.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/dribbble/reply_to_comment \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"comment_id":"comment_8c41d2","body":"body"}'
Python
result = client.call("dribbble", "reply_to_comment", {"comment_id":"comment_8c41d2","body":"body"})
Node.js
const result = await cotlet.call('dribbble', 'reply_to_comment', {"comment_id":"comment_8c41d2","body":"body"});
CLI
cotlet call dribbble reply_to_comment --data '{"comment_id":"comment_8c41d2","body":"body"}'

Example response

{
  "comment_id": "c_4480",
  "reply_to": "c_4471",
  "status": "published"
}