All topics

DocsDevelopers

API documentation

Last updated 26 October 2026

Drobber’s automation API is what the Drobber apps for Zapier and Make use to read and write comments, replies and statuses, and to send events the moment they happen. Everything is JSON over HTTPS.

Base URL

https://app.drobber.com/api/automation

Authentication

Every request carries a personal Drobber key in the Authorization header (or, if a tool can’t set that, in X-API-Key):

Authorization: Bearer drk_...

To make one, sign in to Drobber, open Integrations, find Zapier & Make and choose Create a key. It starts with drk_ and is shown once. The key acts as the person who made it and sees only the projects they can see in Drobber. Removing it on the Integrations page stops it, and every subscription made with it, straight away.

Keys are for members of an agency team on a workspace with an active plan.

Endpoints

GET /me

Checks the key and says whose it is. Zapier uses it to test a connection and label it.

Example request

curl "https://app.drobber.com/api/automation/me" \
  -H "Authorization: Bearer drk_..."

Response: 200 OK

{
  "id": "usr_2c4e6a8b0d1f3a5c7e9b",
  "name": "Alex Agency",
  "email": "[email protected]",
  "workspace": "Agency Studio"
}

GET /projects

The projects the key’s person can see (archived ones left out).

Example request

curl "https://app.drobber.com/api/automation/projects" \
  -H "Authorization: Bearer drk_..."

Response: 200 OK

[
  {
    "id": "proj_5f2a9c7e1b3d4a6c8e0f",
    "name": "Acme website",
    "type": "website",
    "site_url": "https://acme.example"
  }
]

GET /comments

Comments, newest first. Used for the New Comment trigger’s sample data and for the Comment dropdowns.

Query parameters

  • project_id: Optional. Only this project.
  • status: Optional. in_progress, feedback or resolved.
  • limit: How many, newest first: 1 to 100 (default 25).

Example request

curl "https://app.drobber.com/api/automation/comments?limit=10" \
  -H "Authorization: Bearer drk_..."

Response: 200 OK

[
  {
    "id": "thr_8d1c0e2a4b6f4c1a9e3d",
    "number": 12,
    "project_id": "proj_5f2a9c7e1b3d4a6c8e0f",
    "project_name": "Acme website",
    "status": "in_progress",
    "status_label": "In Progress",
    "body": "Can the heading be a little bigger on mobile?",
    "author_name": "Sam Client",
    "author_type": "client",
    "page_url": "https://acme.example/about",
    "page_path": "/about",
    "browser": "Chrome 129",
    "os": "iOS 18",
    "device": "mobile",
    "viewport": "390x844",
    "reply_count": 0,
    "screenshot_url": "https://app.drobber.com/api/public/shot/att_1?s=abc",
    "dashboard_url": "https://app.drobber.com/dashboard/projects/proj_5f2a9c7e1b3d4a6c8e0f?thread=thr_8d1c0e2a4b6f4c1a9e3d",
    "created_at": "2026-10-14T09:30:00.000Z",
    "updated_at": "2026-10-14T09:30:00.000Z"
  }
]

POST /comments

Creates a comment as the key’s person (the Create Comment action).

JSON body

  • project_id: Required. The project.
  • body: Required. The comment, up to 5,000 characters.
  • page_url: Optional. A full address or a path like /pricing. Defaults to the site’s home page (or the newest file, for a file project).
  • status: Optional. in_progress (default), feedback or resolved.
  • via: Optional. Where it came from, shown on the comment, such as Zapier.

Example request

curl -X POST "https://app.drobber.com/api/automation/comments" \
  -H "Authorization: Bearer drk_..." \
  -H "Content-Type: application/json" \
  -d '{"project_id":"proj_5f2a9c7e1b3d4a6c8e0f","body":"Can the heading be a little bigger on mobile?","page_url":"/about","status":"in_progress","via":"Zapier"}'

Response: 201 Created

{
  "id": "thr_8d1c0e2a4b6f4c1a9e3d",
  "number": 12,
  "project_id": "proj_5f2a9c7e1b3d4a6c8e0f",
  "project_name": "Acme website",
  "status": "in_progress",
  "status_label": "In Progress",
  "body": "Can the heading be a little bigger on mobile?",
  "author_name": "Sam Client",
  "author_type": "client",
  "page_url": "https://acme.example/about",
  "page_path": "/about",
  "browser": "Chrome 129",
  "os": "iOS 18",
  "device": "mobile",
  "viewport": "390x844",
  "reply_count": 0,
  "screenshot_url": "https://app.drobber.com/api/public/shot/att_1?s=abc",
  "dashboard_url": "https://app.drobber.com/dashboard/projects/proj_5f2a9c7e1b3d4a6c8e0f?thread=thr_8d1c0e2a4b6f4c1a9e3d",
  "created_at": "2026-10-14T09:30:00.000Z",
  "updated_at": "2026-10-14T09:30:00.000Z"
}

Errors: 400 when the project is missing or not visible to the key, or the body is empty.

GET /comments/{id}

One comment.

Example request

curl "https://app.drobber.com/api/automation/comments/thr_8d1c0e2a4b6f4c1a9e3d" \
  -H "Authorization: Bearer drk_..."

Response: 200 OK

{
  "id": "thr_8d1c0e2a4b6f4c1a9e3d",
  "number": 12,
  "project_id": "proj_5f2a9c7e1b3d4a6c8e0f",
  "project_name": "Acme website",
  "status": "in_progress",
  "status_label": "In Progress",
  "body": "Can the heading be a little bigger on mobile?",
  "author_name": "Sam Client",
  "author_type": "client",
  "page_url": "https://acme.example/about",
  "page_path": "/about",
  "browser": "Chrome 129",
  "os": "iOS 18",
  "device": "mobile",
  "viewport": "390x844",
  "reply_count": 0,
  "screenshot_url": "https://app.drobber.com/api/public/shot/att_1?s=abc",
  "dashboard_url": "https://app.drobber.com/dashboard/projects/proj_5f2a9c7e1b3d4a6c8e0f?thread=thr_8d1c0e2a4b6f4c1a9e3d",
  "created_at": "2026-10-14T09:30:00.000Z",
  "updated_at": "2026-10-14T09:30:00.000Z"
}

Errors: 404 when there is no comment with that id the key can see.

PATCH /comments/{id}

Changes a comment’s status (the Change Comment Status action).

JSON body

  • status: Required. in_progress, feedback or resolved.

Example request

curl -X PATCH "https://app.drobber.com/api/automation/comments/thr_8d1c0e2a4b6f4c1a9e3d" \
  -H "Authorization: Bearer drk_..." \
  -H "Content-Type: application/json" \
  -d '{"status":"resolved"}'

Response: 200 OK

{
  "id": "thr_8d1c0e2a4b6f4c1a9e3d",
  "number": 12,
  "project_id": "proj_5f2a9c7e1b3d4a6c8e0f",
  "project_name": "Acme website",
  "status": "resolved",
  "status_label": "Resolved",
  "body": "Can the heading be a little bigger on mobile?",
  "author_name": "Sam Client",
  "author_type": "client",
  "page_url": "https://acme.example/about",
  "page_path": "/about",
  "browser": "Chrome 129",
  "os": "iOS 18",
  "device": "mobile",
  "viewport": "390x844",
  "reply_count": 0,
  "screenshot_url": "https://app.drobber.com/api/public/shot/att_1?s=abc",
  "dashboard_url": "https://app.drobber.com/dashboard/projects/proj_5f2a9c7e1b3d4a6c8e0f?thread=thr_8d1c0e2a4b6f4c1a9e3d",
  "created_at": "2026-10-14T09:30:00.000Z",
  "updated_at": "2026-10-14T09:30:00.000Z"
}

Errors: 400 for an unknown status; 404 when the comment isn’t visible to the key.

GET /comments/find

Finds a comment by id, or by its number in a project (the Find Comment search). Always a list: one comment, or empty.

Query parameters

  • id: A comment id. Or:
  • project_id: With number: the project.
  • number: With project_id: the comment number, like 12 or #12.

Example request

curl "https://app.drobber.com/api/automation/comments/find?project_id=proj_5f2a9c7e1b3d4a6c8e0f&number=12" \
  -H "Authorization: Bearer drk_..."

Response: 200 OK

[
  {
    "id": "thr_8d1c0e2a4b6f4c1a9e3d",
    "number": 12,
    "project_id": "proj_5f2a9c7e1b3d4a6c8e0f",
    "project_name": "Acme website",
    "status": "in_progress",
    "status_label": "In Progress",
    "body": "Can the heading be a little bigger on mobile?",
    "author_name": "Sam Client",
    "author_type": "client",
    "page_url": "https://acme.example/about",
    "page_path": "/about",
    "browser": "Chrome 129",
    "os": "iOS 18",
    "device": "mobile",
    "viewport": "390x844",
    "reply_count": 0,
    "screenshot_url": "https://app.drobber.com/api/public/shot/att_1?s=abc",
    "dashboard_url": "https://app.drobber.com/dashboard/projects/proj_5f2a9c7e1b3d4a6c8e0f?thread=thr_8d1c0e2a4b6f4c1a9e3d",
    "created_at": "2026-10-14T09:30:00.000Z",
    "updated_at": "2026-10-14T09:30:00.000Z"
  }
]

POST /comments/{id}/replies

Replies to a comment as the key’s person (the Reply to Comment action).

JSON body

  • body: Required. The reply.

Example request

curl -X POST "https://app.drobber.com/api/automation/comments/thr_8d1c0e2a4b6f4c1a9e3d/replies" \
  -H "Authorization: Bearer drk_..." \
  -H "Content-Type: application/json" \
  -d '{"body":"Done, it is 10% bigger now. Can you check?"}'

Response: 201 Created

{
  "id": "msg_3b7e9a1c5d2f4e6a8c0b",
  "comment_id": "thr_8d1c0e2a4b6f4c1a9e3d",
  "comment_number": 12,
  "comment_status": "feedback",
  "project_id": "proj_5f2a9c7e1b3d4a6c8e0f",
  "project_name": "Acme website",
  "body": "Done, it is 10% bigger now. Can you check?",
  "author_name": "Alex Agency",
  "author_type": "agency",
  "page_url": "https://acme.example/about",
  "dashboard_url": "https://app.drobber.com/dashboard/projects/proj_5f2a9c7e1b3d4a6c8e0f?thread=thr_8d1c0e2a4b6f4c1a9e3d",
  "created_at": "2026-10-14T10:05:00.000Z"
}

Errors: 400 when the body is empty; 404 when the comment isn’t visible to the key.

GET /replies

Replies, newest first. Sample data for the New Reply trigger.

Query parameters

  • project_id: Optional. Only this project.
  • limit: How many, newest first: 1 to 100 (default 25).

Example request

curl "https://app.drobber.com/api/automation/replies?limit=10" \
  -H "Authorization: Bearer drk_..."

Response: 200 OK

[
  {
    "id": "msg_3b7e9a1c5d2f4e6a8c0b",
    "comment_id": "thr_8d1c0e2a4b6f4c1a9e3d",
    "comment_number": 12,
    "comment_status": "feedback",
    "project_id": "proj_5f2a9c7e1b3d4a6c8e0f",
    "project_name": "Acme website",
    "body": "Done, it is 10% bigger now. Can you check?",
    "author_name": "Alex Agency",
    "author_type": "agency",
    "page_url": "https://acme.example/about",
    "dashboard_url": "https://app.drobber.com/dashboard/projects/proj_5f2a9c7e1b3d4a6c8e0f?thread=thr_8d1c0e2a4b6f4c1a9e3d",
    "created_at": "2026-10-14T10:05:00.000Z"
  }
]

GET /status-changes

Status changes, newest first. Sample data for the Comment Status Changed and Comment Resolved triggers.

Query parameters

  • project_id: Optional. Only this project.
  • resolved: Optional. 1 for resolutions only.
  • limit: How many, newest first: 1 to 100 (default 25).

Example request

curl "https://app.drobber.com/api/automation/status-changes?limit=10" \
  -H "Authorization: Bearer drk_..."

Response: 200 OK

[
  {
    "id": "thr_8d1c0e2a4b6f4c1a9e3d:1791970806547",
    "comment_id": "thr_8d1c0e2a4b6f4c1a9e3d",
    "comment_number": 12,
    "project_id": "proj_5f2a9c7e1b3d4a6c8e0f",
    "project_name": "Acme website",
    "status": "feedback",
    "status_label": "Feedback",
    "previous_status": "in_progress",
    "changed_by": "Alex Agency",
    "body": "Can the heading be a little bigger on mobile?",
    "page_url": "https://acme.example/about",
    "dashboard_url": "https://app.drobber.com/dashboard/projects/proj_5f2a9c7e1b3d4a6c8e0f?thread=thr_8d1c0e2a4b6f4c1a9e3d",
    "changed_at": "2026-10-14T10:05:00.000Z"
  }
]

POST /hooks

Subscribes a URL to an event (a REST hook). Zapier calls this when a Zap with a Drobber trigger is turned on.

JSON body

  • event: Required. One of the events below.
  • url: Required. A public https address to post each event to.
  • project_id: Optional. Only events on this project; empty for every project.

Example request

curl -X POST "https://app.drobber.com/api/automation/hooks" \
  -H "Authorization: Bearer drk_..." \
  -H "Content-Type: application/json" \
  -d '{"event":"comment.created","url":"https://hooks.zapier.com/hooks/standard/123/abc/","project_id":""}'

Response: 201 Created

{
  "id": "hook_7a9c1e3b5d7f9a1c3e5b"
}

Errors: 400 for an unknown event, a URL that isn’t public, or a project the key can’t see.

DELETE /hooks/{id}

Removes a subscription. Zapier calls this when the Zap is turned off.

Example request

curl -X DELETE "https://app.drobber.com/api/automation/hooks/hook_7a9c1e3b5d7f9a1c3e5b" \
  -H "Authorization: Bearer drk_..."

Response: 204 No Content

No body.

Webhook events

After POST /hooks, Drobber posts each event to the subscribed URL as JSON the moment it happens, with the same shape as the matching list endpoint above. Only events on projects the key’s person can still see are sent.

EventZapier triggerPayload
comment.createdNew CommentA comment
reply.createdNew ReplyA reply
comment.status_changedComment Status ChangedA status change
comment.resolvedComment ResolvedA status change

Each delivery is a single POST with a 10 second timeout. If the URL answers 410 Gone, the subscription is removed.

Errors

Errors come back as JSON with a plain-English message:

{
  "error": "That key is not recognised. Make a new one on Drobber’s Integrations page."
}
  • 400: Something in the request is missing or not valid. error says what.
  • 401: No key, or the key isn’t recognised (it was removed, or isn’t a Zapier & Make key).
  • 402: The workspace has no active plan.
  • 403: The key belongs to a client rather than an agency team member, or Zapier & Make aren’t available on the workspace.
  • 404: No comment with that id that the key can see.
  • 413: The request body is over 1 MB.

Limits

There’s no per-key request quota. List endpoints return at most 100 items, request bodies can be up to 1 MB, and a comment can be up to 5,000 characters.

Help

Questions about the API: [email protected].