{
  "info": {
    "_postman_id": "ed8bd551-2ae2-4fb9-af2e-f3f0d2b72a96",
    "name": "Ur Next Door API",
    "description": "The Ur Next Door API lets a member publish to https://urnextdoor.com from a script, an automation tool or an AI agent, with a personal API key created in Settings > API keys. Every request acts as that member, with the same permissions they have on the website. Bodies are HTML. Times are ISO 8601 and scheduling stores UTC. Full guides: https://docs.urnextdoor.com\n\nSet apiKey in the \"Ur Next Door\" environment (type: secret). Docs: https://docs.urnextdoor.com/integrations/postman/",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{apiKey}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://urnextdoor.com/api/v1",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Account",
      "description": "Check which member and key a request runs as, see today's quota usage, and fetch the OpenAPI document.",
      "item": [
        {
          "name": "Who am I",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/me",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "me"
              ]
            },
            "description": "Returns the member this key acts as and details of the key itself (name, prefix, scopes, expiry). Works with any valid key. Use it to test a key.\n\nRequired scope: any valid key."
          },
          "response": []
        },
        {
          "name": "Today's quota usage",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/usage",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "usage"
              ]
            },
            "description": "Returns your plan, the current UTC day, when counters reset, and used and remaining counts for each action. Works with any valid key and is not quota-counted.\n\nRequired scope: any valid key."
          },
          "response": []
        },
        {
          "name": "OpenAPI document",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/openapi.json",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "openapi.json"
              ]
            },
            "description": "Returns this OpenAPI 3.1 document. Public: no key needed. Import it into ChatGPT Actions, Postman or a code generator.\n\nRequired scope: any valid key.",
            "auth": {
              "type": "noauth"
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Content",
      "description": "Create posts, questions, polls, MCQs, communities, Marketplace services and jobs, now or at a scheduled time.",
      "item": [
        {
          "name": "Create a post",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A fresh UUID per request. Reuse it only to retry the same request."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/posts",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "posts"
              ]
            },
            "description": "Publishes a post now, or schedules it when scheduled_at is set. title and body (HTML) are required. Send an Idempotency-Key so a retry never posts twice. Counts against the post quota.\n\nRequired scope: content.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"Five easy ways to save water at home\",\n  \"body\": \"<p>Small habits add up. These five saved our building a lot of water this summer.</p><ul><li>Fix dripping taps the same week.</li><li>Run the washing machine only when it is full.</li></ul>\",\n  \"tags\": [\n    \"water\",\n    \"home\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "Ask a question",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A fresh UUID per request. Reuse it only to retry the same request."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/questions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "questions"
              ]
            },
            "description": "Publishes a question now, or schedules it when scheduled_at is set. Only title is required; body (HTML) adds details. Counts against the question quota.\n\nRequired scope: content.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"Which plants survive a north facing balcony?\",\n  \"body\": \"<p>We get about two hours of direct sun. What has worked for you?</p>\",\n  \"tags\": [\n    \"gardening\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "Create a poll",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A fresh UUID per request. Reuse it only to retry the same request."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/polls",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "polls"
              ]
            },
            "description": "Publishes a poll now, or schedules it. title and options (2 to 5 unique strings) are required. Counts against the poll quota.\n\nRequired scope: content.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"When should the weekend cleanup start?\",\n  \"options\": [\n    \"7 am\",\n    \"8 am\",\n    \"9 am\"\n  ],\n  \"tags\": [\n    \"neighbourhood\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "Create an MCQ",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A fresh UUID per request. Reuse it only to retry the same request."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/mcqs",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "mcqs"
              ]
            },
            "description": "Publishes a multiple choice quiz question now, or schedules it. title, options (2 to 5) and correct_option_index (0-based) are required. Counts against the mcq quota.\n\nRequired scope: content.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"Which planet has the shortest year?\",\n  \"options\": [\n    \"Venus\",\n    \"Mercury\",\n    \"Mars\",\n    \"Earth\"\n  ],\n  \"correct_option_index\": 1,\n  \"tags\": [\n    \"science\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "Create a community",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A fresh UUID per request. Reuse it only to retry the same request."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/communities",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "communities"
              ]
            },
            "description": "Creates a community now (201), or schedules its creation (202) when scheduled_at is set. name must be unique. A scheduled creation fails later if the name is taken by then. Counts against the community quota.\n\nRequired scope: content.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Morning Runners Pune\",\n  \"description\": \"<p>Early runs, routes and race plans around Pune.</p>\",\n  \"visibility\": \"public\",\n  \"icon_url\": \"/avatars/community/running.png\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "List a service",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A fresh UUID per request. Reuse it only to retry the same request."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/services",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "services"
              ]
            },
            "description": "Publishes a Marketplace service now, or schedules it. title, body and category_id are required, plus a location (country_code, postal_code, state_id) unless service_mode is online. Prices are in rupees.\n\nRequired scope: content.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"Business website in 7 days\",\n  \"body\": \"<p>I build fast, mobile friendly websites for small shops and clinics.</p><ul><li>Design and build</li><li>Hosting setup</li></ul>\",\n  \"category_id\": 12,\n  \"summary\": \"A fast, mobile friendly website for your shop or clinic.\",\n  \"service_mode\": \"online\",\n  \"packages\": [\n    {\n      \"name\": \"Starter\",\n      \"description\": \"One page site\",\n      \"price\": 4999,\n      \"delivery_days\": 5,\n      \"revisions\": 2,\n      \"features\": [\n        \"1 page\",\n        \"Contact form\"\n      ]\n    },\n    {\n      \"name\": \"Business\",\n      \"description\": \"Up to 5 pages\",\n      \"price\": 14999,\n      \"delivery_days\": 7,\n      \"revisions\": -1,\n      \"features\": [\n        \"5 pages\",\n        \"Blog\",\n        \"Basic SEO\"\n      ]\n    }\n  ],\n  \"faqs\": [\n    {\n      \"q\": \"Do you provide hosting?\",\n      \"a\": \"I set it up on your account, so you own it.\"\n    }\n  ],\n  \"tags\": [\n    \"web-design\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "Post a job",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A fresh UUID per request. Reuse it only to retry the same request."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/jobs",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "jobs"
              ]
            },
            "description": "Publishes a job now, or schedules it. title, body, employment_type, work_mode and experience_level are required (values from GET /job-options). Jobs take featured_image only, no gallery.\n\nRequired scope: content.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"Backend developer (PHP)\",\n  \"body\": \"<p>Join a small team building tools for local shops.</p><ul><li>3+ years with PHP or Node.js</li><li>Comfortable with MySQL</li></ul>\",\n  \"employment_type\": \"full_time\",\n  \"work_mode\": \"remote\",\n  \"experience_level\": \"mid\",\n  \"openings\": 2,\n  \"salary_min\": 900000,\n  \"salary_max\": 1400000,\n  \"salary_period\": \"yearly\",\n  \"currency\": \"INR\",\n  \"application_deadline\": \"2026-11-30\",\n  \"summary\": \"Remote, full time, PHP and MySQL.\",\n  \"tags\": [\n    \"php\",\n    \"hiring\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Media",
      "description": "Upload an image as base64 JSON or multipart, then use the returned URL as a featured image or in a gallery.",
      "item": [
        {
          "name": "Upload an image",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A fresh UUID per request. Reuse it only to retry the same request."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/media",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "media"
              ]
            },
            "description": "Uploads one image as JSON (base64) or multipart. It is converted to WebP and must end at 2 MB or less. Use data.url as featured_image or in gallery. Counts against the media quota.\n\nRequired scope: media.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "file",
                  "type": "file",
                  "src": [],
                  "description": "Choose an image file (PNG, JPEG, GIF or WebP)."
                },
                {
                  "key": "context",
                  "value": "post",
                  "type": "text"
                }
              ]
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Scheduling",
      "description": "List your scheduled items, move them to a new time, publish them now, or cancel them before they go live.",
      "item": [
        {
          "name": "List scheduled items",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/scheduled",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "scheduled"
              ]
            },
            "description": "Returns your pending scheduled items of every type, soonest first. Not quota-counted.\n\nRequired scope: schedule."
          },
          "response": []
        },
        {
          "name": "Reschedule an item",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A fresh UUID per request. Reuse it only to retry the same request."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/scheduled/:type/:id/reschedule",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "scheduled",
                ":type",
                ":id",
                "reschedule"
              ],
              "variable": [
                {
                  "key": "type",
                  "value": "post",
                  "description": "The item type."
                },
                {
                  "key": "id",
                  "value": "41",
                  "description": "The item id (for a community, the scheduled-creation id)."
                }
              ]
            },
            "description": "Moves a scheduled item to a new time (5 minutes to 180 days ahead, UTC). Answers the updated item. 409 if it is no longer scheduled. Not quota-counted.\n\nRequired scope: schedule.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"scheduled_at\": \"2026-10-22T06:00:00Z\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "Publish a scheduled item now",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A fresh UUID per request. Reuse it only to retry the same request."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/scheduled/:type/:id/publish",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "scheduled",
                ":type",
                ":id",
                "publish"
              ],
              "variable": [
                {
                  "key": "type",
                  "value": "post",
                  "description": "The item type."
                },
                {
                  "key": "id",
                  "value": "41",
                  "description": "The item id (for a community, the scheduled-creation id)."
                }
              ]
            },
            "description": "Publishes a scheduled item immediately instead of waiting. No body needed. 409 if it is no longer scheduled. Not quota-counted.\n\nRequired scope: schedule."
          },
          "response": []
        },
        {
          "name": "Cancel a scheduled item",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A fresh UUID per request. Reuse it only to retry the same request."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/scheduled/:type/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "scheduled",
                ":type",
                ":id"
              ],
              "variable": [
                {
                  "key": "type",
                  "value": "post",
                  "description": "The item type."
                },
                {
                  "key": "id",
                  "value": "41",
                  "description": "The item id (for a community, the scheduled-creation id)."
                }
              ]
            },
            "description": "Cancels a scheduled item by deleting it, so it never goes live. This cannot be undone. Not quota-counted.\n\nRequired scope: schedule."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Lookups",
      "description": "Find the ids the create endpoints need: communities you can post in, service categories, job options, places and icons.",
      "item": [
        {
          "name": "Communities you can post in",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/communities/postable",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "communities",
                "postable"
              ]
            },
            "description": "Lists the communities you may post into (you are an editor or above). Use id as community_id or slug as community on any create.\n\nRequired scope: read."
          },
          "response": []
        },
        {
          "name": "Service categories",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/service-categories",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "service-categories"
              ]
            },
            "description": "Returns the Marketplace category tree. Use a category id as category_id when you list a service.\n\nRequired scope: read."
          },
          "response": []
        },
        {
          "name": "Job options",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/job-options",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "job-options"
              ]
            },
            "description": "Returns the allowed values for employment_type, work_mode, experience_level and salary_period on POST /jobs.\n\nRequired scope: read."
          },
          "response": []
        },
        {
          "name": "Countries, states, districts and cities",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/geo?level=states&country=IN",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "geo"
              ],
              "query": [
                {
                  "key": "level",
                  "value": "states",
                  "description": "Which list to return.",
                  "disabled": false
                },
                {
                  "key": "country",
                  "value": "IN",
                  "description": "ISO 3166-1 alpha-2 code. Needed for level=states.",
                  "disabled": false
                },
                {
                  "key": "state",
                  "value": "",
                  "description": "State id. Needed for level=districts and level=cities.",
                  "disabled": true
                },
                {
                  "key": "district",
                  "value": "",
                  "description": "District id. Narrows level=cities.",
                  "disabled": true
                }
              ]
            },
            "description": "Looks up places for service and job locations. level=countries (items have a code), level=states&country=IN, level=districts&state=19, or level=cities&state=19 (optionally &district=329).\n\nRequired scope: read."
          },
          "response": []
        },
        {
          "name": "Community icons",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/community-icons",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "community-icons"
              ]
            },
            "description": "Returns the built-in icons a community may use. Pass one as icon_url on POST /communities.\n\nRequired scope: read."
          },
          "response": []
        }
      ]
    }
  ]
}
