REST API reference

Nextdoor API

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

Base URL
https://cotlet.dev/api/v1/nextdoor
Connects with
Your own Nextdoor account with a claimed Business Page (owner, employee or authorized representative)
Integration page
Nextdoor
Nextdoor Endpoints
Endpoint Access Description
get_business_page read Your page: name, category, contact details, neighborhoods, recommendation and Fave counts.
list_posts read Business posts from your Business Page, newest first.
get_post read One post: title, text, audience, reactions and comment count.
list_comments read Comments on one of your posts, with author, neighborhood, text and whether you replied.
list_recommendations read Recommendations from the What neighbors say section, with author, neighborhood, text, date and your reply.
get_page_share_link read The link to your Business Page from the Share menu, to send to customers who should leave a recommendation.
list_conversations read Messages neighbors sent to your Business Page, with the last message and who wrote it.
get_conversation read Full message thread with one neighbor.
create_post write Publish a business post to the neighborhoods you choose.
reply_to_comment write Reply as your business under a comment on one of your posts.
reply_to_recommendation write Public reply from your business to a neighbor's recommendation.
send_message write Reply to a neighbor inside an existing Business Page conversation.
delete_post write Remove one of your business posts from Nextdoor.

POST https://cotlet.dev/api/v1/nextdoor/get_business_page

Returns the page the signed-in account manages. Use the neighborhoods it lists as the audience for create_post. The call fails if the account has no claimed Business Page.

Parameters

No parameters.

Request

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

Example response

{
  "page_id": "pg_2204",
  "name": "Clearwater Gutter Care",
  "category": "Gutter cleaning",
  "phone": "+1 555 0142",
  "neighborhoods": [
    "Maple Hill",
    "Oak Park",
    "Riverside"
  ],
  "recommendations": 41,
  "faves": 118
}

List posts

read

POST https://cotlet.dev/api/v1/nextdoor/list_posts

Returns each post with title, text, audience, reactions and comment count. Nextdoor's Post Insights are not available for business posts, so there are no view counts. Use the cursor to read older posts.

Parameters

Parameters: list_posts
NameTypeDescription
limit integer Number of posts per call. Default: 20.
cursor string Next page cursor from the previous call.

Request

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

Example response

{
  "posts": [
    {
      "post_id": "bp_8812046",
      "title": "Open house this Saturday",
      "reactions": 12,
      "comments": 3,
      "created_at": "2026-10-08T09:30:00Z"
    },
    {
      "post_id": "bp_8790311",
      "title": "Fall gutter checks",
      "reactions": 7,
      "comments": 1,
      "created_at": "2026-10-01T08:00:00Z"
    }
  ],
  "next_cursor": null
}

Get post

read

POST https://cotlet.dev/api/v1/nextdoor/get_post

Returns the full text and the audience (distance or neighborhoods) the post was published to. Comments are read with list_comments.

Parameters

Parameters: get_post
NameTypeDescription
post_id required string Post ID from list_posts.

Request

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

Example response

{
  "post_id": "bp_8812046",
  "title": "Open house this Saturday",
  "body": "Drop by 10:00 to 14:00 for free coffee and a look at the new workshop.",
  "neighborhoods": [
    "Maple Hill",
    "Oak Park"
  ],
  "reactions": 12,
  "comments": 3
}

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

Returns comments oldest first, so your agent reads the discussion in order. Each comment has the ID that reply_to_comment needs.

Parameters

Parameters: list_comments
NameTypeDescription
post_id required string Post ID from list_posts.
unanswered_only boolean Skip comments you already replied to.

Request

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

Example response

{
  "comments": [
    {
      "comment_id": "cm_77120",
      "author": "Priya S.",
      "neighborhood": "Maple Hill",
      "body": "Do you service Maple Hill?",
      "replied": false
    }
  ]
}

POST https://cotlet.dev/api/v1/nextdoor/list_recommendations

Returns newest first. Each recommendation has the ID that reply_to_recommendation needs, and your existing reply if you wrote one.

Parameters

Parameters: list_recommendations
NameTypeDescription
since date Only recommendations on or after this date.
unanswered_only boolean Skip recommendations you already replied to.
limit integer Number of recommendations per call. Default: 50.

Request

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

Example response

{
  "recommendations": [
    {
      "recommendation_id": "rec_30418",
      "author": "Dana K.",
      "neighborhood": "Oak Park",
      "body": "Cleaned our gutters in one morning and left the yard spotless.",
      "date": "2026-10-06",
      "reply": null
    }
  ]
}

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

Returns the most recent threads first. Neighbors start these conversations; a business cannot start one.

Parameters

Parameters: list_conversations
NameTypeDescription
unanswered_only boolean Only threads where the last message is not yours.
limit integer Number of threads per call. Default: 20.

Request

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

Example response

{
  "conversations": [
    {
      "conversation_id": "conv_5530",
      "neighbor": "Priya S.",
      "last_message": "Can you come Thursday morning?",
      "last_from": "neighbor",
      "updated_at": "2026-10-10T16:12:00Z"
    }
  ]
}

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

Returns the messages oldest first. Reading a thread does not send anything.

Parameters

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

Request

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

Example response

{
  "conversation_id": "conv_5530",
  "neighbor": "Priya S.",
  "messages": [
    {
      "from": "neighbor",
      "body": "Hi, do you do gutter guards?",
      "sent_at": "2026-10-10T15:58:00Z"
    },
    {
      "from": "business",
      "body": "Yes, we do. What is the address?",
      "sent_at": "2026-10-10T16:05:00Z"
    },
    {
      "from": "neighbor",
      "body": "Can you come Thursday morning?",
      "sent_at": "2026-10-10T16:12:00Z"
    }
  ]
}

Create post

write Confirm

POST https://cotlet.dev/api/v1/nextdoor/create_post

Publishes a post with a title and a description. Nextdoor's help center says business posts have no fixed radius and reach neighbors through engagement and Faves; radius and neighborhoods apply only where the post form still offers audience settings. The call fails for accounts Nextdoor still asks to verify business documents. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: create_post
NameTypeDescription
title required string Post title.
body required string Post description.
radius integer Reach neighborhoods within this distance of your business, as in the post audience settings.
neighborhoods string[] Neighborhood names to add or remove, from get_business_page.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/nextdoor/create_post \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"Open house this Saturday","body":"Drop by 10:00 to 14:00 for free coffee and a look at the new workshop.","radius":3}'
Python
result = client.call("nextdoor", "create_post", {"title":"Open house this Saturday","body":"Drop by 10:00 to 14:00 for free coffee and a look at the new workshop.","radius":3})
Node.js
const result = await cotlet.call('nextdoor', 'create_post', {"title":"Open house this Saturday","body":"Drop by 10:00 to 14:00 for free coffee and a look at the new workshop.","radius":3});
CLI
cotlet call nextdoor create_post --data '{"title":"Open house this Saturday","body":"Drop by 10:00 to 14:00 for free coffee and a look at the new workshop.","radius":3}'

Example response

{
  "post_id": "bp_8812046",
  "status": "published",
  "neighborhoods": 14,
  "url": "https://nextdoor.com/p/yourname-open-house"
}

Reply to comment

write Confirm

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

The reply is public and appears under your business name. Only the author or the page administrator can edit or delete it later. 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/nextdoor/reply_to_comment \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"comment_id":"cm_77120","body":"Yes, we cover Maple Hill. Message the page with your street and we will suggest a time."}'
Python
result = client.call("nextdoor", "reply_to_comment", {"comment_id":"cm_77120","body":"Yes, we cover Maple Hill. Message the page with your street and we will suggest a time."})
Node.js
const result = await cotlet.call('nextdoor', 'reply_to_comment', {"comment_id":"cm_77120","body":"Yes, we cover Maple Hill. Message the page with your street and we will suggest a time."});
CLI
cotlet call nextdoor reply_to_comment --data '{"comment_id":"cm_77120","body":"Yes, we cover Maple Hill. Message the page with your street and we will suggest a time."}'

Example response

{
  "reply_id": "cm_77135",
  "comment_id": "cm_77120",
  "status": "published"
}

Reply to recommendation

write Confirm

POST https://cotlet.dev/api/v1/nextdoor/reply_to_recommendation

The reply is public and appears under the recommendation as your business, not your personal profile. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: reply_to_recommendation
NameTypeDescription
recommendation_id required string Recommendation ID from list_recommendations.
body required string Reply text.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/nextdoor/reply_to_recommendation \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"recommendation_id":"rec_30418","body":"Thank you, Dana! Glad the gutters are running clear again."}'
Python
result = client.call("nextdoor", "reply_to_recommendation", {"recommendation_id":"rec_30418","body":"Thank you, Dana! Glad the gutters are running clear again."})
Node.js
const result = await cotlet.call('nextdoor', 'reply_to_recommendation', {"recommendation_id":"rec_30418","body":"Thank you, Dana! Glad the gutters are running clear again."});
CLI
cotlet call nextdoor reply_to_recommendation --data '{"recommendation_id":"rec_30418","body":"Thank you, Dana! Glad the gutters are running clear again."}'

Example response

{
  "reply_id": "rr_9120",
  "recommendation_id": "rec_30418",
  "status": "published"
}

Send message

write Confirm

POST https://cotlet.dev/api/v1/nextdoor/send_message

Works only in a conversation the neighbor started. A business cannot message a neighbor first, and Nextdoor bans unsolicited promotional messages. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: send_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/nextdoor/send_message \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversation_id":"conversation_8c41d2","body":"body"}'
Python
result = client.call("nextdoor", "send_message", {"conversation_id":"conversation_8c41d2","body":"body"})
Node.js
const result = await cotlet.call('nextdoor', 'send_message', {"conversation_id":"conversation_8c41d2","body":"body"});
CLI
cotlet call nextdoor send_message --data '{"conversation_id":"conversation_8c41d2","body":"body"}'

Example response

{
  "message_id": "msg_88410",
  "conversation_id": "conv_5530",
  "status": "sent"
}

Delete post

write Confirm

POST https://cotlet.dev/api/v1/nextdoor/delete_post

Removes the post from the newsfeed. Only the author or the page administrator can delete a post. A deleted post cannot be restored with one call. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: delete_post
NameTypeDescription
post_id required string Post ID from list_posts.

Request

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

Example response

{
  "post_id": "bp_8790311",
  "status": "deleted"
}