{
  "openapi": "3.1.0",
  "info": {
    "title": "Ur Next Door API",
    "version": "1.0.0",
    "summary": "Create and schedule posts, questions, polls, MCQs, communities, services and jobs on Ur Next Door with a personal API key.",
    "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",
    "termsOfService": "https://urnextdoor.com/terms",
    "contact": {
      "name": "Ur Next Door support",
      "url": "https://docs.urnextdoor.com",
      "email": "support@urnextdoor.com"
    },
    "x-burst-limit-per-minute": 60,
    "x-quotas": {
      "free": {
        "post": 20,
        "question": 20,
        "poll": 10,
        "mcq": 30,
        "community": 2,
        "service": 5,
        "job": 5,
        "media": 50
      },
      "pro": {
        "post": 60,
        "question": 60,
        "poll": 30,
        "mcq": 90,
        "community": 5,
        "service": 15,
        "job": 15,
        "media": 150
      },
      "business": {
        "post": 200,
        "question": 200,
        "poll": 100,
        "mcq": 300,
        "community": 20,
        "service": 50,
        "job": 50,
        "media": 500
      }
    }
  },
  "externalDocs": {
    "description": "Ur Next Door API Docs",
    "url": "https://docs.urnextdoor.com"
  },
  "servers": [
    {
      "description": "Production (apex domain only)",
      "url": "https://urnextdoor.com/api/v1"
    }
  ],
  "security": [
    {
      "bearerAuth": []
    },
    {
      "apiKeyHeader": []
    }
  ],
  "tags": [
    {
      "description": "Check which member and key a request runs as, see today's quota usage, and fetch the OpenAPI document.",
      "name": "Account",
      "x-page-title": "Account endpoints",
      "x-slug": "account"
    },
    {
      "description": "Create posts, questions, polls, MCQs, communities, Marketplace services and jobs, now or at a scheduled time.",
      "name": "Content",
      "x-page-title": "Content endpoints",
      "x-slug": "content"
    },
    {
      "description": "Upload an image as base64 JSON or multipart, then use the returned URL as a featured image or in a gallery.",
      "name": "Media",
      "x-page-title": "Media endpoint",
      "x-slug": "media"
    },
    {
      "description": "List your scheduled items, move them to a new time, publish them now, or cancel them before they go live.",
      "name": "Scheduling",
      "x-page-title": "Scheduling endpoints",
      "x-slug": "scheduling"
    },
    {
      "description": "Find the ids the create endpoints need: communities you can post in, service categories, job options, places and icons.",
      "name": "Lookups",
      "x-page-title": "Lookup endpoints",
      "x-slug": "lookups"
    }
  ],
  "paths": {
    "/me": {
      "get": {
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "tags": [
          "Account"
        ],
        "summary": "Who am I",
        "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.",
        "operationId": "getMe",
        "x-required-scope": null,
        "x-quota-action": null,
        "responses": {
          "200": {
            "description": "The member and the key.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "basic": {
                    "summary": "A free plan member",
                    "value": {
                      "ok": true,
                      "user": {
                        "id": 7,
                        "username": "aarav",
                        "display_name": "Aarav",
                        "plan": "free",
                        "profile_url": "https://urnextdoor.com/users/aarav"
                      },
                      "key": {
                        "id": 3,
                        "name": "Claude Code",
                        "prefix": "und_sk_7Hq2x",
                        "scopes": [
                          "content",
                          "media",
                          "schedule",
                          "read"
                        ],
                        "created_at": "2026-10-15T09:00:00Z",
                        "expires_at": "2027-01-13T09:00:00Z"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/MeResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "421": {
            "$ref": "#/components/responses/WrongHost"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ApiDisabled"
          }
        }
      }
    },
    "/usage": {
      "get": {
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "tags": [
          "Account"
        ],
        "summary": "Today's quota 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.",
        "operationId": "getUsage",
        "x-required-scope": null,
        "x-quota-action": null,
        "responses": {
          "200": {
            "description": "Usage for the current UTC day.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "basic": {
                    "summary": "Three posts used today",
                    "value": {
                      "ok": true,
                      "plan": "free",
                      "day": "2026-10-15",
                      "resets_at": "2026-10-16T00:00:00Z",
                      "quotas": [
                        {
                          "action": "post",
                          "limit": 20,
                          "used": 3,
                          "remaining": 17
                        },
                        {
                          "action": "question",
                          "limit": 20,
                          "used": 0,
                          "remaining": 20
                        },
                        {
                          "action": "media",
                          "limit": 50,
                          "used": 2,
                          "remaining": 48
                        }
                      ],
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/UsageResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "421": {
            "$ref": "#/components/responses/WrongHost"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ApiDisabled"
          }
        }
      }
    },
    "/openapi.json": {
      "get": {
        "security": [],
        "tags": [
          "Account"
        ],
        "summary": "OpenAPI document",
        "description": "Returns this OpenAPI 3.1 document. Public: no key needed. Import it into ChatGPT Actions, Postman or a code generator.",
        "operationId": "getOpenapi",
        "x-required-scope": null,
        "x-quota-action": null,
        "responses": {
          "200": {
            "description": "The OpenAPI document.",
            "headers": {
              "Cache-Control": {
                "description": "public, max-age=3600",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "basic": {
                    "summary": "The document (truncated)",
                    "value": {
                      "openapi": "3.1.0",
                      "info": {
                        "title": "Ur Next Door API",
                        "version": "1.0.0"
                      }
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "404": {
            "description": "The document is not available on this server."
          }
        }
      }
    },
    "/posts": {
      "post": {
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "tags": [
          "Content"
        ],
        "summary": "Create a post",
        "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.",
        "operationId": "createPost",
        "x-required-scope": "content",
        "x-quota-action": "post",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "examples": {
                "basic": {
                  "summary": "Publish now",
                  "value": {
                    "title": "Five easy ways to save water at home",
                    "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>",
                    "tags": [
                      "water",
                      "home"
                    ]
                  }
                },
                "scheduled": {
                  "summary": "Schedule for later",
                  "value": {
                    "title": "Five easy ways to save water at home",
                    "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>",
                    "tags": [
                      "water",
                      "home"
                    ],
                    "scheduled_at": "2026-10-20T09:30:00Z"
                  }
                },
                "withImage": {
                  "summary": "With an uploaded image",
                  "value": {
                    "title": "Five easy ways to save water at home",
                    "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>",
                    "featured_image": "/storage/aarav/post/cover_3f9a1c2b7d4e_1792054800.webp",
                    "tags": [
                      "water",
                      "home"
                    ]
                  }
                }
              },
              "schema": {
                "$ref": "#/components/schemas/CreatePostRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created. Published now, or scheduled when scheduled_at was sent.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "basic": {
                    "summary": "Published now",
                    "value": {
                      "ok": true,
                      "id": 41,
                      "slug": "five-easy-ways-to-save-water-at-home",
                      "url": "/posts/five-easy-ways-to-save-water-at-home",
                      "web_url": "https://urnextdoor.com/posts/five-easy-ways-to-save-water-at-home",
                      "item": {
                        "id": 41,
                        "type": "post",
                        "slug": "five-easy-ways-to-save-water-at-home"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  },
                  "scheduled": {
                    "summary": "Scheduled",
                    "value": {
                      "ok": true,
                      "id": 41,
                      "slug": "five-easy-ways-to-save-water-at-home",
                      "url": "/posts/five-easy-ways-to-save-water-at-home",
                      "web_url": "https://urnextdoor.com/posts/five-easy-ways-to-save-water-at-home",
                      "status": "scheduled",
                      "scheduled_at": "2026-10-20T09:30:00Z",
                      "item": {
                        "id": 41,
                        "type": "post",
                        "slug": "five-easy-ways-to-save-water-at-home"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  },
                  "withImage": {
                    "summary": "Published with a featured image",
                    "value": {
                      "ok": true,
                      "id": 41,
                      "slug": "five-easy-ways-to-save-water-at-home",
                      "url": "/posts/five-easy-ways-to-save-water-at-home",
                      "web_url": "https://urnextdoor.com/posts/five-easy-ways-to-save-water-at-home",
                      "item": {
                        "id": 41,
                        "type": "post",
                        "slug": "five-easy-ways-to-save-water-at-home"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/CreatedResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "421": {
            "$ref": "#/components/responses/WrongHost"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ApiDisabled"
          }
        }
      }
    },
    "/questions": {
      "post": {
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "tags": [
          "Content"
        ],
        "summary": "Ask a question",
        "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.",
        "operationId": "createQuestion",
        "x-required-scope": "content",
        "x-quota-action": "question",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "examples": {
                "basic": {
                  "summary": "Publish now",
                  "value": {
                    "title": "Which plants survive a north facing balcony?",
                    "body": "<p>We get about two hours of direct sun. What has worked for you?</p>",
                    "tags": [
                      "gardening"
                    ]
                  }
                },
                "scheduled": {
                  "summary": "Schedule for later",
                  "value": {
                    "title": "Which plants survive a north facing balcony?",
                    "tags": [
                      "gardening"
                    ],
                    "scheduled_at": "2026-10-20T09:30:00Z"
                  }
                },
                "withImage": {
                  "summary": "With an uploaded image",
                  "value": {
                    "title": "Which plants survive a north facing balcony?",
                    "featured_image": "/storage/aarav/post/cover_3f9a1c2b7d4e_1792054800.webp",
                    "tags": [
                      "gardening"
                    ]
                  }
                }
              },
              "schema": {
                "$ref": "#/components/schemas/CreateQuestionRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created. Published now, or scheduled when scheduled_at was sent.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "basic": {
                    "summary": "Published now",
                    "value": {
                      "ok": true,
                      "id": 52,
                      "slug": "which-plants-survive-a-north-facing-balcony",
                      "url": "/questions/which-plants-survive-a-north-facing-balcony",
                      "web_url": "https://urnextdoor.com/questions/which-plants-survive-a-north-facing-balcony",
                      "item": {
                        "id": 52,
                        "type": "question",
                        "slug": "which-plants-survive-a-north-facing-balcony"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  },
                  "scheduled": {
                    "summary": "Scheduled",
                    "value": {
                      "ok": true,
                      "id": 52,
                      "slug": "which-plants-survive-a-north-facing-balcony",
                      "url": "/questions/which-plants-survive-a-north-facing-balcony",
                      "web_url": "https://urnextdoor.com/questions/which-plants-survive-a-north-facing-balcony",
                      "status": "scheduled",
                      "scheduled_at": "2026-10-20T09:30:00Z",
                      "item": {
                        "id": 52,
                        "type": "question",
                        "slug": "which-plants-survive-a-north-facing-balcony"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  },
                  "withImage": {
                    "summary": "Published with a featured image",
                    "value": {
                      "ok": true,
                      "id": 52,
                      "slug": "which-plants-survive-a-north-facing-balcony",
                      "url": "/questions/which-plants-survive-a-north-facing-balcony",
                      "web_url": "https://urnextdoor.com/questions/which-plants-survive-a-north-facing-balcony",
                      "item": {
                        "id": 52,
                        "type": "question",
                        "slug": "which-plants-survive-a-north-facing-balcony"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/CreatedResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "421": {
            "$ref": "#/components/responses/WrongHost"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ApiDisabled"
          }
        }
      }
    },
    "/polls": {
      "post": {
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "tags": [
          "Content"
        ],
        "summary": "Create a poll",
        "description": "Publishes a poll now, or schedules it. title and options (2 to 5 unique strings) are required. Counts against the poll quota.",
        "operationId": "createPoll",
        "x-required-scope": "content",
        "x-quota-action": "poll",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "examples": {
                "basic": {
                  "summary": "Publish now",
                  "value": {
                    "title": "When should the weekend cleanup start?",
                    "options": [
                      "7 am",
                      "8 am",
                      "9 am"
                    ],
                    "tags": [
                      "neighbourhood"
                    ]
                  }
                },
                "scheduled": {
                  "summary": "Schedule for later",
                  "value": {
                    "title": "When should the weekend cleanup start?",
                    "options": [
                      "7 am",
                      "8 am",
                      "9 am"
                    ],
                    "scheduled_at": "2026-10-20T09:30:00Z"
                  }
                },
                "withImage": {
                  "summary": "With an uploaded image",
                  "value": {
                    "title": "When should the weekend cleanup start?",
                    "options": [
                      "7 am",
                      "8 am",
                      "9 am"
                    ],
                    "featured_image": "/storage/aarav/post/cover_3f9a1c2b7d4e_1792054800.webp"
                  }
                }
              },
              "schema": {
                "$ref": "#/components/schemas/CreatePollRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created. Published now, or scheduled when scheduled_at was sent.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "basic": {
                    "summary": "Published now",
                    "value": {
                      "ok": true,
                      "id": 18,
                      "slug": "when-should-the-weekend-cleanup-start",
                      "url": "/polls/when-should-the-weekend-cleanup-start",
                      "web_url": "https://urnextdoor.com/polls/when-should-the-weekend-cleanup-start",
                      "item": {
                        "id": 18,
                        "type": "poll",
                        "slug": "when-should-the-weekend-cleanup-start"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  },
                  "scheduled": {
                    "summary": "Scheduled",
                    "value": {
                      "ok": true,
                      "id": 18,
                      "slug": "when-should-the-weekend-cleanup-start",
                      "url": "/polls/when-should-the-weekend-cleanup-start",
                      "web_url": "https://urnextdoor.com/polls/when-should-the-weekend-cleanup-start",
                      "status": "scheduled",
                      "scheduled_at": "2026-10-20T09:30:00Z",
                      "item": {
                        "id": 18,
                        "type": "poll",
                        "slug": "when-should-the-weekend-cleanup-start"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  },
                  "withImage": {
                    "summary": "Published with a featured image",
                    "value": {
                      "ok": true,
                      "id": 18,
                      "slug": "when-should-the-weekend-cleanup-start",
                      "url": "/polls/when-should-the-weekend-cleanup-start",
                      "web_url": "https://urnextdoor.com/polls/when-should-the-weekend-cleanup-start",
                      "item": {
                        "id": 18,
                        "type": "poll",
                        "slug": "when-should-the-weekend-cleanup-start"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/CreatedResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "421": {
            "$ref": "#/components/responses/WrongHost"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ApiDisabled"
          }
        }
      }
    },
    "/mcqs": {
      "post": {
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "tags": [
          "Content"
        ],
        "summary": "Create an MCQ",
        "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.",
        "operationId": "createMcq",
        "x-required-scope": "content",
        "x-quota-action": "mcq",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "examples": {
                "basic": {
                  "summary": "Publish now",
                  "value": {
                    "title": "Which planet has the shortest year?",
                    "options": [
                      "Venus",
                      "Mercury",
                      "Mars",
                      "Earth"
                    ],
                    "correct_option_index": 1,
                    "tags": [
                      "science"
                    ]
                  }
                },
                "scheduled": {
                  "summary": "Schedule for later",
                  "value": {
                    "title": "Which planet has the shortest year?",
                    "options": [
                      "Venus",
                      "Mercury",
                      "Mars",
                      "Earth"
                    ],
                    "correct_option_index": 1,
                    "scheduled_at": "2026-10-20T09:30:00Z"
                  }
                },
                "withImage": {
                  "summary": "With an uploaded image",
                  "value": {
                    "title": "Which planet has the shortest year?",
                    "options": [
                      "Venus",
                      "Mercury",
                      "Mars",
                      "Earth"
                    ],
                    "correct_option_index": 1,
                    "featured_image": "/storage/aarav/post/cover_3f9a1c2b7d4e_1792054800.webp"
                  }
                }
              },
              "schema": {
                "$ref": "#/components/schemas/CreateMcqRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created. Published now, or scheduled when scheduled_at was sent.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "basic": {
                    "summary": "Published now",
                    "value": {
                      "ok": true,
                      "id": 77,
                      "slug": "which-planet-has-the-shortest-year",
                      "url": "/mcqs/which-planet-has-the-shortest-year",
                      "web_url": "https://urnextdoor.com/mcqs/which-planet-has-the-shortest-year",
                      "item": {
                        "id": 77,
                        "type": "mcq",
                        "slug": "which-planet-has-the-shortest-year"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  },
                  "scheduled": {
                    "summary": "Scheduled",
                    "value": {
                      "ok": true,
                      "id": 77,
                      "slug": "which-planet-has-the-shortest-year",
                      "url": "/mcqs/which-planet-has-the-shortest-year",
                      "web_url": "https://urnextdoor.com/mcqs/which-planet-has-the-shortest-year",
                      "status": "scheduled",
                      "scheduled_at": "2026-10-20T09:30:00Z",
                      "item": {
                        "id": 77,
                        "type": "mcq",
                        "slug": "which-planet-has-the-shortest-year"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  },
                  "withImage": {
                    "summary": "Published with a featured image",
                    "value": {
                      "ok": true,
                      "id": 77,
                      "slug": "which-planet-has-the-shortest-year",
                      "url": "/mcqs/which-planet-has-the-shortest-year",
                      "web_url": "https://urnextdoor.com/mcqs/which-planet-has-the-shortest-year",
                      "item": {
                        "id": 77,
                        "type": "mcq",
                        "slug": "which-planet-has-the-shortest-year"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/CreatedResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "421": {
            "$ref": "#/components/responses/WrongHost"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ApiDisabled"
          }
        }
      }
    },
    "/communities": {
      "post": {
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "tags": [
          "Content"
        ],
        "summary": "Create a community",
        "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.",
        "operationId": "createCommunity",
        "x-required-scope": "content",
        "x-quota-action": "community",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "examples": {
                "basic": {
                  "summary": "Create now",
                  "value": {
                    "name": "Morning Runners Pune",
                    "description": "<p>Early runs, routes and race plans around Pune.</p>",
                    "visibility": "public",
                    "icon_url": "/avatars/community/running.png"
                  }
                },
                "scheduled": {
                  "summary": "Create later",
                  "value": {
                    "name": "Morning Runners Pune",
                    "description": "<p>Early runs, routes and race plans around Pune.</p>",
                    "visibility": "ask_to_join",
                    "scheduled_at": "2026-10-20T09:30:00Z"
                  }
                }
              },
              "schema": {
                "$ref": "#/components/schemas/CreateCommunityRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created now.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "basic": {
                    "summary": "Created now",
                    "value": {
                      "ok": true,
                      "id": 5,
                      "slug": "morning-runners-pune",
                      "url": "/communities/morning-runners-pune",
                      "web_url": "https://urnextdoor.com/communities/morning-runners-pune",
                      "item": {
                        "id": 5,
                        "type": "community",
                        "slug": "morning-runners-pune",
                        "name": "Morning Runners Pune"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/CreatedResponse"
                }
              }
            }
          },
          "202": {
            "description": "Accepted: the community will be created at scheduled_at. id is the scheduled-creation id.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "scheduled": {
                    "summary": "Scheduled",
                    "value": {
                      "ok": true,
                      "status": "scheduled",
                      "type": "community",
                      "id": 5,
                      "name": "Morning Runners Pune",
                      "scheduled_at": "2026-10-20T09:30:00Z",
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/ScheduledCommunityResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "421": {
            "$ref": "#/components/responses/WrongHost"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ApiDisabled"
          }
        }
      }
    },
    "/services": {
      "post": {
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "tags": [
          "Content"
        ],
        "summary": "List a service",
        "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.",
        "operationId": "createService",
        "x-required-scope": "content",
        "x-quota-action": "service",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "examples": {
                "basic": {
                  "summary": "An online service with packages",
                  "value": {
                    "title": "Business website in 7 days",
                    "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>",
                    "category_id": 12,
                    "summary": "A fast, mobile friendly website for your shop or clinic.",
                    "service_mode": "online",
                    "packages": [
                      {
                        "name": "Starter",
                        "description": "One page site",
                        "price": 4999,
                        "delivery_days": 5,
                        "revisions": 2,
                        "features": [
                          "1 page",
                          "Contact form"
                        ]
                      },
                      {
                        "name": "Business",
                        "description": "Up to 5 pages",
                        "price": 14999,
                        "delivery_days": 7,
                        "revisions": -1,
                        "features": [
                          "5 pages",
                          "Blog",
                          "Basic SEO"
                        ]
                      }
                    ],
                    "faqs": [
                      {
                        "q": "Do you provide hosting?",
                        "a": "I set it up on your account, so you own it."
                      }
                    ],
                    "tags": [
                      "web-design"
                    ]
                  }
                },
                "scheduled": {
                  "summary": "An in person service, scheduled",
                  "value": {
                    "title": "Home tutoring for class 10 maths",
                    "body": "<p>One to one sessions at your home, weekday evenings.</p>",
                    "category_id": 31,
                    "service_mode": "in_person",
                    "country_code": "IN",
                    "postal_code": "411001",
                    "state_id": 19,
                    "area": "Kothrud",
                    "packages": [
                      {
                        "name": "Monthly",
                        "price": 6000,
                        "delivery_days": 30,
                        "features": [
                          "12 sessions"
                        ]
                      }
                    ],
                    "scheduled_at": "2026-10-20T09:30:00Z"
                  }
                },
                "withImage": {
                  "summary": "With an uploaded image",
                  "value": {
                    "title": "Business website in 7 days",
                    "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>",
                    "category_id": 12,
                    "service_mode": "online",
                    "packages": [
                      {
                        "name": "Starter",
                        "price": 4999,
                        "delivery_days": 5
                      }
                    ],
                    "featured_image": "/storage/aarav/post/cover_3f9a1c2b7d4e_1792054800.webp"
                  }
                }
              },
              "schema": {
                "$ref": "#/components/schemas/CreateServiceRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created. Published now, or scheduled when scheduled_at was sent.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "basic": {
                    "summary": "Published now",
                    "value": {
                      "ok": true,
                      "id": 9,
                      "slug": "business-website-in-7-days",
                      "url": "/marketplace/business-website-in-7-days",
                      "web_url": "https://urnextdoor.com/marketplace/business-website-in-7-days",
                      "item": {
                        "id": 9,
                        "type": "service",
                        "slug": "business-website-in-7-days"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  },
                  "scheduled": {
                    "summary": "Scheduled",
                    "value": {
                      "ok": true,
                      "id": 9,
                      "slug": "business-website-in-7-days",
                      "url": "/marketplace/business-website-in-7-days",
                      "web_url": "https://urnextdoor.com/marketplace/business-website-in-7-days",
                      "status": "scheduled",
                      "scheduled_at": "2026-10-20T09:30:00Z",
                      "item": {
                        "id": 9,
                        "type": "service",
                        "slug": "business-website-in-7-days"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  },
                  "withImage": {
                    "summary": "Published with a featured image",
                    "value": {
                      "ok": true,
                      "id": 9,
                      "slug": "business-website-in-7-days",
                      "url": "/marketplace/business-website-in-7-days",
                      "web_url": "https://urnextdoor.com/marketplace/business-website-in-7-days",
                      "item": {
                        "id": 9,
                        "type": "service",
                        "slug": "business-website-in-7-days"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/CreatedResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "421": {
            "$ref": "#/components/responses/WrongHost"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ApiDisabled"
          }
        }
      }
    },
    "/jobs": {
      "post": {
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "tags": [
          "Content"
        ],
        "summary": "Post a job",
        "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.",
        "operationId": "createJob",
        "x-required-scope": "content",
        "x-quota-action": "job",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "examples": {
                "basic": {
                  "summary": "A remote job",
                  "value": {
                    "title": "Backend developer (PHP)",
                    "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>",
                    "employment_type": "full_time",
                    "work_mode": "remote",
                    "experience_level": "mid",
                    "openings": 2,
                    "salary_min": 900000,
                    "salary_max": 1400000,
                    "salary_period": "yearly",
                    "currency": "INR",
                    "application_deadline": "2026-11-30",
                    "summary": "Remote, full time, PHP and MySQL.",
                    "tags": [
                      "php",
                      "hiring"
                    ]
                  }
                },
                "scheduled": {
                  "summary": "An on site job, scheduled",
                  "value": {
                    "title": "Store manager",
                    "body": "<p>Run our Kothrud store: staff, stock and customers.</p>",
                    "employment_type": "full_time",
                    "work_mode": "onsite",
                    "experience_level": "senior",
                    "country_code": "IN",
                    "state_id": 19,
                    "city_id": 1204,
                    "salary_min": 35000,
                    "salary_max": 45000,
                    "salary_period": "monthly",
                    "scheduled_at": "2026-10-20T09:30:00Z"
                  }
                },
                "withImage": {
                  "summary": "With an uploaded image",
                  "value": {
                    "title": "Backend developer (PHP)",
                    "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>",
                    "employment_type": "full_time",
                    "work_mode": "remote",
                    "experience_level": "mid",
                    "featured_image": "/storage/aarav/post/cover_3f9a1c2b7d4e_1792054800.webp"
                  }
                }
              },
              "schema": {
                "$ref": "#/components/schemas/CreateJobRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created. Published now, or scheduled when scheduled_at was sent.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "basic": {
                    "summary": "Published now",
                    "value": {
                      "ok": true,
                      "id": 23,
                      "slug": "backend-developer-php",
                      "url": "/jobs/backend-developer-php",
                      "web_url": "https://urnextdoor.com/jobs/backend-developer-php",
                      "item": {
                        "id": 23,
                        "type": "job",
                        "slug": "backend-developer-php"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  },
                  "scheduled": {
                    "summary": "Scheduled",
                    "value": {
                      "ok": true,
                      "id": 23,
                      "slug": "backend-developer-php",
                      "url": "/jobs/backend-developer-php",
                      "web_url": "https://urnextdoor.com/jobs/backend-developer-php",
                      "status": "scheduled",
                      "scheduled_at": "2026-10-20T09:30:00Z",
                      "item": {
                        "id": 23,
                        "type": "job",
                        "slug": "backend-developer-php"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  },
                  "withImage": {
                    "summary": "Published with a featured image",
                    "value": {
                      "ok": true,
                      "id": 23,
                      "slug": "backend-developer-php",
                      "url": "/jobs/backend-developer-php",
                      "web_url": "https://urnextdoor.com/jobs/backend-developer-php",
                      "item": {
                        "id": 23,
                        "type": "job",
                        "slug": "backend-developer-php"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/CreatedResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "421": {
            "$ref": "#/components/responses/WrongHost"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ApiDisabled"
          }
        }
      }
    },
    "/media": {
      "post": {
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "tags": [
          "Media"
        ],
        "summary": "Upload an image",
        "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.",
        "operationId": "uploadMedia",
        "x-required-scope": "media",
        "x-quota-action": "media",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "examples": {
                "base64": {
                  "summary": "Base64 JSON (for AI generated images)",
                  "value": {
                    "image_base64": "iVBORw0KGgoAAAANSUhEUgAA...",
                    "filename": "cover.png",
                    "context": "post"
                  }
                }
              },
              "schema": {
                "$ref": "#/components/schemas/MediaJsonRequest"
              }
            },
            "multipart/form-data": {
              "examples": {
                "multipart": {
                  "summary": "Multipart file upload",
                  "value": {
                    "file": "@cover.png",
                    "context": "post"
                  }
                }
              },
              "schema": {
                "$ref": "#/components/schemas/MediaMultipartRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Stored.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "base64": {
                    "summary": "Stored as WebP",
                    "value": {
                      "ok": true,
                      "data": {
                        "id": 318,
                        "context": "post",
                        "community_id": null,
                        "url": "/storage/aarav/post/cover_3f9a1c2b7d4e_1792054800.webp",
                        "disk_path": "aarav/post/cover_3f9a1c2b7d4e_1792054800.webp",
                        "original_name": "cover.png",
                        "extension": "webp",
                        "mime_type": "image/webp",
                        "size_bytes": 184320,
                        "created_at": "2026-10-15 09:00:00",
                        "updated_at": "2026-10-15 09:00:00"
                      },
                      "web_url": "https://urnextdoor.com/storage/aarav/post/cover_3f9a1c2b7d4e_1792054800.webp",
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/MediaResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "421": {
            "$ref": "#/components/responses/WrongHost"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ApiDisabled"
          }
        }
      }
    },
    "/scheduled": {
      "get": {
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "tags": [
          "Scheduling"
        ],
        "summary": "List scheduled items",
        "description": "Returns your pending scheduled items of every type, soonest first. Not quota-counted.",
        "operationId": "listScheduled",
        "x-required-scope": "schedule",
        "x-quota-action": null,
        "responses": {
          "200": {
            "description": "Your pending items.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "basic": {
                    "summary": "Two pending items",
                    "value": {
                      "ok": true,
                      "items": [
                        {
                          "type": "post",
                          "id": 41,
                          "title": "Five easy ways to save water at home",
                          "slug": "five-easy-ways-to-save-water-at-home",
                          "url": "/posts/five-easy-ways-to-save-water-at-home",
                          "edit_url": "/posts/five-easy-ways-to-save-water-at-home/edit",
                          "scheduled_at": "2026-10-20T09:30:00Z",
                          "created_at": "2026-10-15T09:00:00Z"
                        },
                        {
                          "type": "community",
                          "id": 5,
                          "title": "Morning Runners Pune",
                          "slug": null,
                          "url": null,
                          "edit_url": null,
                          "scheduled_at": "2026-10-21T04:00:00Z",
                          "created_at": "2026-10-15T09:05:00Z"
                        }
                      ],
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/ScheduledListResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "421": {
            "$ref": "#/components/responses/WrongHost"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ApiDisabled"
          }
        }
      }
    },
    "/scheduled/{type}/{id}/reschedule": {
      "post": {
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "tags": [
          "Scheduling"
        ],
        "summary": "Reschedule an item",
        "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.",
        "operationId": "rescheduleItem",
        "x-required-scope": "schedule",
        "x-quota-action": null,
        "parameters": [
          {
            "$ref": "#/components/parameters/ScheduledTypePath"
          },
          {
            "$ref": "#/components/parameters/ScheduledIdPath"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "examples": {
                "basic": {
                  "summary": "Move to a new time",
                  "value": {
                    "scheduled_at": "2026-10-22T06:00:00Z"
                  }
                }
              },
              "schema": {
                "$ref": "#/components/schemas/RescheduleRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated item.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "basic": {
                    "summary": "Rescheduled",
                    "value": {
                      "ok": true,
                      "item": {
                        "type": "post",
                        "id": 41,
                        "title": "Five easy ways to save water at home",
                        "slug": "five-easy-ways-to-save-water-at-home",
                        "url": "/posts/five-easy-ways-to-save-water-at-home",
                        "edit_url": "/posts/five-easy-ways-to-save-water-at-home/edit",
                        "scheduled_at": "2026-10-22T06:00:00Z",
                        "created_at": "2026-10-15T09:00:00Z"
                      },
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/RescheduleResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "421": {
            "$ref": "#/components/responses/WrongHost"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ApiDisabled"
          }
        }
      }
    },
    "/scheduled/{type}/{id}/publish": {
      "post": {
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "tags": [
          "Scheduling"
        ],
        "summary": "Publish a scheduled item now",
        "description": "Publishes a scheduled item immediately instead of waiting. No body needed. 409 if it is no longer scheduled. Not quota-counted.",
        "operationId": "publishScheduledNow",
        "x-required-scope": "schedule",
        "x-quota-action": null,
        "parameters": [
          {
            "$ref": "#/components/parameters/ScheduledTypePath"
          },
          {
            "$ref": "#/components/parameters/ScheduledIdPath"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "responses": {
          "200": {
            "description": "Published.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "basic": {
                    "summary": "Published",
                    "value": {
                      "ok": true,
                      "status": "published",
                      "url": "/posts/five-easy-ways-to-save-water-at-home",
                      "web_url": "https://urnextdoor.com/posts/five-easy-ways-to-save-water-at-home",
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/PublishNowResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "421": {
            "$ref": "#/components/responses/WrongHost"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ApiDisabled"
          }
        }
      }
    },
    "/scheduled/{type}/{id}": {
      "delete": {
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "tags": [
          "Scheduling"
        ],
        "summary": "Cancel a scheduled item",
        "description": "Cancels a scheduled item by deleting it, so it never goes live. This cannot be undone. Not quota-counted.",
        "operationId": "cancelScheduled",
        "x-required-scope": "schedule",
        "x-quota-action": null,
        "parameters": [
          {
            "$ref": "#/components/parameters/ScheduledTypePath"
          },
          {
            "$ref": "#/components/parameters/ScheduledIdPath"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "responses": {
          "200": {
            "description": "Cancelled.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "basic": {
                    "summary": "Cancelled",
                    "value": {
                      "ok": true,
                      "deleted": true,
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/CancelResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "421": {
            "$ref": "#/components/responses/WrongHost"
          },
          "422": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ApiDisabled"
          }
        }
      }
    },
    "/communities/postable": {
      "get": {
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "tags": [
          "Lookups"
        ],
        "summary": "Communities you can post in",
        "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.",
        "operationId": "listPostableCommunities",
        "x-required-scope": "read",
        "x-quota-action": null,
        "responses": {
          "200": {
            "description": "Communities you can post in.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "basic": {
                    "summary": "One community",
                    "value": {
                      "ok": true,
                      "items": [
                        {
                          "id": 5,
                          "slug": "morning-runners-pune",
                          "name": "Morning Runners Pune",
                          "verified": null,
                          "icon": "/avatars/community/running.png",
                          "role": "creator"
                        }
                      ],
                      "next_offset": 1,
                      "has_more": false,
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/PostableCommunitiesResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "421": {
            "$ref": "#/components/responses/WrongHost"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ApiDisabled"
          }
        }
      }
    },
    "/service-categories": {
      "get": {
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "tags": [
          "Lookups"
        ],
        "summary": "Service categories",
        "description": "Returns the Marketplace category tree. Use a category id as category_id when you list a service.",
        "operationId": "listServiceCategories",
        "x-required-scope": "read",
        "x-quota-action": null,
        "responses": {
          "200": {
            "description": "The category tree.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "basic": {
                    "summary": "Part of the tree",
                    "value": {
                      "ok": true,
                      "categories": [
                        {
                          "id": 3,
                          "name": "Development",
                          "slug": "development",
                          "icon": null,
                          "description": "Websites, apps and software.",
                          "count": 42,
                          "children": [
                            {
                              "id": 12,
                              "name": "Web development",
                              "slug": "web-development",
                              "count": 17
                            }
                          ]
                        }
                      ],
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/ServiceCategoriesResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "421": {
            "$ref": "#/components/responses/WrongHost"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ApiDisabled"
          }
        }
      }
    },
    "/job-options": {
      "get": {
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "tags": [
          "Lookups"
        ],
        "summary": "Job options",
        "description": "Returns the allowed values for employment_type, work_mode, experience_level and salary_period on POST /jobs.",
        "operationId": "getJobOptions",
        "x-required-scope": "read",
        "x-quota-action": null,
        "responses": {
          "200": {
            "description": "Allowed values.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "basic": {
                    "summary": "Allowed values",
                    "value": {
                      "ok": true,
                      "employment_types": [
                        "full_time",
                        "part_time",
                        "contract",
                        "internship",
                        "temporary"
                      ],
                      "work_modes": [
                        "remote",
                        "hybrid",
                        "onsite"
                      ],
                      "experience_levels": [
                        "entry",
                        "mid",
                        "senior",
                        "lead",
                        "executive"
                      ],
                      "salary_periods": [
                        "yearly",
                        "monthly",
                        "hourly",
                        "project"
                      ],
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/JobOptionsResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "421": {
            "$ref": "#/components/responses/WrongHost"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ApiDisabled"
          }
        }
      }
    },
    "/geo": {
      "get": {
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "tags": [
          "Lookups"
        ],
        "summary": "Countries, states, districts and cities",
        "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).",
        "operationId": "getGeo",
        "x-required-scope": "read",
        "x-quota-action": null,
        "parameters": [
          {
            "description": "Which list to return.",
            "name": "level",
            "in": "query",
            "required": true,
            "example": "states",
            "schema": {
              "type": "string",
              "enum": [
                "countries",
                "states",
                "districts",
                "cities"
              ]
            }
          },
          {
            "description": "ISO 3166-1 alpha-2 code. Needed for level=states.",
            "name": "country",
            "in": "query",
            "required": false,
            "example": "IN",
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "State id. Needed for level=districts and level=cities.",
            "name": "state",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "District id. Narrows level=cities.",
            "name": "district",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Places at that level.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "basic": {
                    "summary": "States of India (truncated)",
                    "value": {
                      "ok": true,
                      "items": [
                        {
                          "id": 19,
                          "name": "Maharashtra",
                          "slug": "maharashtra"
                        },
                        {
                          "id": 20,
                          "name": "Manipur",
                          "slug": "manipur"
                        }
                      ],
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/GeoResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "421": {
            "$ref": "#/components/responses/WrongHost"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ApiDisabled"
          }
        }
      }
    },
    "/community-icons": {
      "get": {
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "tags": [
          "Lookups"
        ],
        "summary": "Community icons",
        "description": "Returns the built-in icons a community may use. Pass one as icon_url on POST /communities.",
        "operationId": "listCommunityIcons",
        "x-required-scope": "read",
        "x-quota-action": null,
        "responses": {
          "200": {
            "description": "Icon paths.",
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "basic": {
                    "summary": "Icon paths (truncated)",
                    "value": {
                      "ok": true,
                      "items": [
                        "/avatars/community/running.png",
                        "/avatars/community/books.png"
                      ],
                      "request_id": "9f8e7d6c5b4a3921"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/CommunityIconsResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "421": {
            "$ref": "#/components/responses/WrongHost"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ApiDisabled"
          }
        }
      }
    }
  },
  "components": {
    "parameters": {
      "IdempotencyKey": {
        "description": "Any unique string (a UUID is ideal), 1 to 64 characters of A-Z a-z 0-9 _ . : -. A repeat with the same key and body within 24 hours replays the first 2xx response instead of acting twice.",
        "name": "Idempotency-Key",
        "in": "header",
        "required": false,
        "schema": {
          "type": "string",
          "pattern": "^[A-Za-z0-9_.:-]{1,64}$"
        }
      },
      "ScheduledTypePath": {
        "description": "The item type.",
        "name": "type",
        "in": "path",
        "required": true,
        "example": "post",
        "schema": {
          "$ref": "#/components/schemas/ScheduledType"
        }
      },
      "ScheduledIdPath": {
        "description": "The item id (for a community, the scheduled-creation id).",
        "name": "id",
        "in": "path",
        "required": true,
        "example": 41,
        "schema": {
          "type": "integer"
        }
      }
    },
    "responses": {
      "ApiDisabled": {
        "description": "The API is switched off.",
        "headers": {
          "X-Request-Id": {
            "$ref": "#/components/headers/XRequestId"
          },
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          }
        },
        "content": {
          "application/json": {
            "examples": {
              "api_disabled": {
                "value": {
                  "ok": false,
                  "error": "The API is switched off right now.",
                  "code": "api_disabled",
                  "request_id": "a1b2c3d4e5f60718"
                }
              }
            },
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "BadRequest": {
        "description": "The body is not a JSON object, or the Idempotency-Key header is malformed.",
        "headers": {
          "X-Request-Id": {
            "$ref": "#/components/headers/XRequestId"
          },
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          }
        },
        "content": {
          "application/json": {
            "examples": {
              "invalid_json": {
                "value": {
                  "ok": false,
                  "error": "The body must be a JSON object.",
                  "code": "invalid_json",
                  "request_id": "a1b2c3d4e5f60718"
                }
              },
              "invalid_idempotency_key": {
                "value": {
                  "ok": false,
                  "error": "Idempotency-Key must be 1 to 64 letters, digits or . _ : -",
                  "code": "invalid_idempotency_key",
                  "request_id": "a1b2c3d4e5f60718"
                }
              }
            },
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Conflict": {
        "description": "Conflicts with the current state, or the same Idempotency-Key is still being processed.",
        "headers": {
          "X-Request-Id": {
            "$ref": "#/components/headers/XRequestId"
          },
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          }
        },
        "content": {
          "application/json": {
            "examples": {
              "conflict": {
                "value": {
                  "ok": false,
                  "error": "This item is no longer scheduled.",
                  "code": "conflict",
                  "request_id": "a1b2c3d4e5f60718"
                }
              },
              "idempotency_in_progress": {
                "value": {
                  "ok": false,
                  "error": "A request with this Idempotency-Key is still being processed. Retry shortly.",
                  "code": "idempotency_in_progress",
                  "request_id": "a1b2c3d4e5f60718"
                }
              }
            },
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Forbidden": {
        "description": "The key lacks the scope, or the member may not do this.",
        "headers": {
          "X-Request-Id": {
            "$ref": "#/components/headers/XRequestId"
          },
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          }
        },
        "content": {
          "application/json": {
            "examples": {
              "insufficient_scope": {
                "value": {
                  "ok": false,
                  "error": "This API key does not have the \"content\" scope. Create a key that includes it.",
                  "code": "insufficient_scope",
                  "request_id": "a1b2c3d4e5f60718"
                }
              },
              "forbidden": {
                "value": {
                  "ok": false,
                  "error": "You are not an editor of that community.",
                  "code": "forbidden",
                  "request_id": "a1b2c3d4e5f60718"
                }
              }
            },
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "NotFound": {
        "description": "Unknown route or item, or the item is not yours.",
        "headers": {
          "X-Request-Id": {
            "$ref": "#/components/headers/XRequestId"
          },
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          }
        },
        "content": {
          "application/json": {
            "examples": {
              "not_found": {
                "value": {
                  "ok": false,
                  "error": "Not found.",
                  "code": "not_found",
                  "request_id": "a1b2c3d4e5f60718"
                }
              }
            },
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "PayloadTooLarge": {
        "description": "The body is over the limit, or the image is over 8 MB.",
        "headers": {
          "X-Request-Id": {
            "$ref": "#/components/headers/XRequestId"
          },
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          }
        },
        "content": {
          "application/json": {
            "examples": {
              "payload_too_large": {
                "value": {
                  "ok": false,
                  "error": "The request body is too large.",
                  "code": "payload_too_large",
                  "request_id": "a1b2c3d4e5f60718"
                }
              }
            },
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "ServerError": {
        "description": "Our fault. Safe to retry with the same Idempotency-Key.",
        "headers": {
          "X-Request-Id": {
            "$ref": "#/components/headers/XRequestId"
          },
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          }
        },
        "content": {
          "application/json": {
            "examples": {
              "server_error": {
                "value": {
                  "ok": false,
                  "error": "Something went wrong on our side.",
                  "code": "server_error",
                  "request_id": "a1b2c3d4e5f60718"
                }
              }
            },
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "TooManyRequests": {
        "description": "Over 60 requests a minute from this member (or too many failed key checks from one address), or today's quota for this action is used up.",
        "headers": {
          "X-Request-Id": {
            "$ref": "#/components/headers/XRequestId"
          },
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          },
          "Retry-After": {
            "$ref": "#/components/headers/RetryAfter"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/XRateLimitLimit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/XRateLimitRemaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/XRateLimitReset"
          }
        },
        "content": {
          "application/json": {
            "examples": {
              "rate_limited": {
                "value": {
                  "ok": false,
                  "error": "Too many requests. Slow down and retry after a minute.",
                  "code": "rate_limited",
                  "request_id": "a1b2c3d4e5f60718"
                }
              },
              "quota_exceeded": {
                "value": {
                  "ok": false,
                  "error": "You have used today's 20 posts for the API. The limit resets at 00:00 UTC.",
                  "code": "quota_exceeded",
                  "request_id": "a1b2c3d4e5f60718"
                }
              }
            },
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "No key, or the key is unknown, malformed, revoked or expired, or the member is not active.",
        "headers": {
          "X-Request-Id": {
            "$ref": "#/components/headers/XRequestId"
          },
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          }
        },
        "content": {
          "application/json": {
            "examples": {
              "missing_api_key": {
                "value": {
                  "ok": false,
                  "error": "Send your API key as \"Authorization: Bearer und_sk_...\" or in an \"X-API-Key\" header.",
                  "code": "missing_api_key",
                  "request_id": "a1b2c3d4e5f60718"
                }
              },
              "invalid_api_key": {
                "value": {
                  "ok": false,
                  "error": "This API key is not valid. It may be mistyped, revoked or expired, or the account is not active.",
                  "code": "invalid_api_key",
                  "request_id": "a1b2c3d4e5f60718"
                }
              }
            },
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "UnsupportedMediaType": {
        "description": "Wrong Content-Type, or a file type that is not allowed.",
        "headers": {
          "X-Request-Id": {
            "$ref": "#/components/headers/XRequestId"
          },
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          }
        },
        "content": {
          "application/json": {
            "examples": {
              "unsupported_media_type": {
                "value": {
                  "ok": false,
                  "error": "Send the body as JSON with Content-Type: application/json.",
                  "code": "unsupported_media_type",
                  "request_id": "a1b2c3d4e5f60718"
                }
              }
            },
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "ValidationFailed": {
        "description": "Field errors, or an Idempotency-Key reused with a different body.",
        "headers": {
          "X-Request-Id": {
            "$ref": "#/components/headers/XRequestId"
          },
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          }
        },
        "content": {
          "application/json": {
            "examples": {
              "validation_failed": {
                "value": {
                  "ok": false,
                  "error": "title and body are required",
                  "code": "validation_failed",
                  "errors": {
                    "body": "Body is required."
                  },
                  "request_id": "a1b2c3d4e5f60718"
                }
              },
              "idempotency_key_reused": {
                "value": {
                  "ok": false,
                  "error": "This Idempotency-Key was already used with a different request.",
                  "code": "idempotency_key_reused",
                  "request_id": "a1b2c3d4e5f60718"
                }
              }
            },
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "WrongHost": {
        "description": "Called on a community subdomain. Use https://urnextdoor.com.",
        "headers": {
          "X-Request-Id": {
            "$ref": "#/components/headers/XRequestId"
          },
          "Cache-Control": {
            "$ref": "#/components/headers/CacheControl"
          }
        },
        "content": {
          "application/json": {
            "examples": {
              "wrong_host": {
                "value": {
                  "ok": false,
                  "error": "Call the API on https://urnextdoor.com, not on a community address.",
                  "code": "wrong_host",
                  "request_id": "a1b2c3d4e5f60718"
                }
              }
            },
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    },
    "headers": {
      "XRequestId": {
        "description": "A unique id for this request. Quote it when you contact support.",
        "schema": {
          "type": "string"
        }
      },
      "CacheControl": {
        "description": "Always no-store.",
        "schema": {
          "type": "string",
          "const": "no-store"
        }
      },
      "XRateLimitLimit": {
        "description": "Today's limit for the action this request counts against.",
        "schema": {
          "type": "integer"
        }
      },
      "XRateLimitRemaining": {
        "description": "Requests of this action left today.",
        "schema": {
          "type": "integer"
        }
      },
      "XRateLimitReset": {
        "description": "When the counter resets: unix seconds of the next UTC midnight.",
        "schema": {
          "type": "integer"
        }
      },
      "RetryAfter": {
        "description": "Seconds to wait before trying again.",
        "schema": {
          "type": "integer"
        }
      },
      "IdempotentReplayed": {
        "description": "true when this is a stored response replayed for a repeated Idempotency-Key.",
        "schema": {
          "type": "string",
          "enum": [
            "true"
          ]
        }
      }
    },
    "schemas": {
      "Error": {
        "description": "Every error answers this envelope, whatever the Accept header.",
        "type": "object",
        "required": [
          "ok",
          "error",
          "code",
          "request_id"
        ],
        "properties": {
          "ok": {
            "description": "Always false on an error.",
            "type": "boolean",
            "const": false
          },
          "error": {
            "description": "A human readable message.",
            "type": "string"
          },
          "code": {
            "description": "A stable machine code. See the Errors page.",
            "type": "string",
            "enum": [
              "invalid_json",
              "invalid_idempotency_key",
              "missing_api_key",
              "invalid_api_key",
              "insufficient_scope",
              "forbidden",
              "not_found",
              "conflict",
              "idempotency_in_progress",
              "payload_too_large",
              "unsupported_media_type",
              "wrong_host",
              "validation_failed",
              "idempotency_key_reused",
              "rate_limited",
              "quota_exceeded",
              "server_error",
              "api_disabled"
            ]
          },
          "errors": {
            "description": "Only on validation failures: one message per field name.",
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "request_id": {
            "description": "The same value as the X-Request-Id header. Quote it when you contact support.",
            "type": "string"
          }
        }
      },
      "ImageUrl": {
        "description": "A /storage/... path returned by POST /media (data.url), or any https:// image URL (linked, not copied).",
        "type": "string",
        "examples": [
          "/storage/aarav/post/cover_3f9a1c2b7d4e_1792054800.webp"
        ]
      },
      "ScheduledAt": {
        "description": "Publish later instead of now. ISO 8601 with an offset or Z, at least 5 minutes and at most 180 days ahead. Stored in UTC.",
        "type": "string",
        "format": "date-time",
        "examples": [
          "2026-10-20T09:30:00Z"
        ]
      },
      "User": {
        "type": "object",
        "required": [
          "id",
          "username",
          "display_name",
          "plan",
          "profile_url"
        ],
        "properties": {
          "id": {
            "description": "Member id.",
            "type": "integer"
          },
          "username": {
            "description": "Member handle.",
            "type": "string"
          },
          "display_name": {
            "description": "Name shown on the site.",
            "type": "string"
          },
          "plan": {
            "description": "The plan that sets your daily quotas.",
            "type": "string",
            "enum": [
              "free",
              "pro",
              "business"
            ]
          },
          "profile_url": {
            "description": "Public profile URL.",
            "type": "string",
            "format": "uri"
          }
        }
      },
      "KeyInfo": {
        "type": "object",
        "required": [
          "id",
          "name",
          "prefix",
          "scopes",
          "created_at",
          "expires_at"
        ],
        "properties": {
          "id": {
            "description": "Key id.",
            "type": "integer"
          },
          "name": {
            "description": "The name you gave the key.",
            "type": "string"
          },
          "prefix": {
            "description": "The first 12 characters of the key, safe to display.",
            "type": "string",
            "pattern": "^und_sk_[A-Za-z0-9]{5}$"
          },
          "scopes": {
            "description": "What this key may do.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Scope"
            }
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "expires_at": {
            "description": "null when the key never expires.",
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        }
      },
      "Scope": {
        "type": "string",
        "enum": [
          "content",
          "media",
          "schedule",
          "read"
        ]
      },
      "MeResponse": {
        "type": "object",
        "required": [
          "ok",
          "user",
          "key"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "user": {
            "$ref": "#/components/schemas/User"
          },
          "key": {
            "$ref": "#/components/schemas/KeyInfo"
          },
          "request_id": {
            "description": "The same value as the X-Request-Id header.",
            "type": "string"
          }
        }
      },
      "QuotaUsage": {
        "type": "object",
        "required": [
          "action",
          "limit",
          "used",
          "remaining"
        ],
        "properties": {
          "action": {
            "$ref": "#/components/schemas/QuotaAction"
          },
          "limit": {
            "description": "Allowed per UTC day on your plan.",
            "type": "integer"
          },
          "used": {
            "description": "Successful requests counted today.",
            "type": "integer"
          },
          "remaining": {
            "description": "limit minus used.",
            "type": "integer"
          }
        }
      },
      "QuotaAction": {
        "type": "string",
        "enum": [
          "post",
          "question",
          "poll",
          "mcq",
          "community",
          "service",
          "job",
          "media"
        ]
      },
      "UsageResponse": {
        "type": "object",
        "required": [
          "ok",
          "plan",
          "day",
          "resets_at",
          "quotas"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "plan": {
            "type": "string",
            "enum": [
              "free",
              "pro",
              "business"
            ]
          },
          "day": {
            "description": "The current UTC day.",
            "type": "string",
            "format": "date"
          },
          "resets_at": {
            "description": "Next UTC midnight, when every counter resets.",
            "type": "string",
            "format": "date-time"
          },
          "quotas": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QuotaUsage"
            }
          },
          "request_id": {
            "description": "The same value as the X-Request-Id header.",
            "type": "string"
          }
        }
      },
      "CreatePostRequest": {
        "type": "object",
        "required": [
          "title",
          "body"
        ],
        "properties": {
          "title": {
            "description": "The post title (plain text).",
            "type": "string"
          },
          "body": {
            "description": "The post body as HTML. See the Formatting guide for allowed tags.",
            "type": "string"
          },
          "tags": {
            "description": "Topic tags, without the leading #. Example: [\"water\", \"home\"].",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "community_id": {
            "description": "Post inside this community. Use an id from GET /communities/postable. You must be an editor (or above) of it.",
            "type": "integer"
          },
          "community": {
            "description": "Alternative to community_id: the community slug. It is resolved to its id.",
            "type": "string"
          },
          "featured_image": {
            "$ref": "#/components/schemas/ImageUrl"
          },
          "gallery": {
            "description": "Extra images. Each is a /storage/... path from POST /media or an https:// image URL.",
            "type": "array",
            "maxItems": 12,
            "items": {
              "$ref": "#/components/schemas/ImageUrl"
            }
          },
          "scheduled_at": {
            "$ref": "#/components/schemas/ScheduledAt"
          }
        }
      },
      "CreateQuestionRequest": {
        "type": "object",
        "required": [
          "title"
        ],
        "properties": {
          "title": {
            "description": "The question itself (plain text).",
            "type": "string"
          },
          "body": {
            "description": "Optional details as HTML.",
            "type": "string"
          },
          "tags": {
            "description": "Topic tags, without the leading #. Example: [\"water\", \"home\"].",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "community_id": {
            "description": "Post inside this community. Use an id from GET /communities/postable. You must be an editor (or above) of it.",
            "type": "integer"
          },
          "community": {
            "description": "Alternative to community_id: the community slug. It is resolved to its id.",
            "type": "string"
          },
          "featured_image": {
            "$ref": "#/components/schemas/ImageUrl"
          },
          "gallery": {
            "description": "Extra images. Each is a /storage/... path from POST /media or an https:// image URL.",
            "type": "array",
            "maxItems": 12,
            "items": {
              "$ref": "#/components/schemas/ImageUrl"
            }
          },
          "scheduled_at": {
            "$ref": "#/components/schemas/ScheduledAt"
          }
        }
      },
      "CreatePollRequest": {
        "type": "object",
        "required": [
          "title",
          "options"
        ],
        "properties": {
          "title": {
            "description": "The poll question (plain text).",
            "type": "string"
          },
          "options": {
            "description": "The answers people vote on: 2 to 5 unique strings.",
            "type": "array",
            "minItems": 2,
            "maxItems": 5,
            "uniqueItems": true,
            "items": {
              "type": "string"
            }
          },
          "body": {
            "description": "Optional context as HTML.",
            "type": "string"
          },
          "tags": {
            "description": "Topic tags, without the leading #. Example: [\"water\", \"home\"].",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "community_id": {
            "description": "Post inside this community. Use an id from GET /communities/postable. You must be an editor (or above) of it.",
            "type": "integer"
          },
          "community": {
            "description": "Alternative to community_id: the community slug. It is resolved to its id.",
            "type": "string"
          },
          "featured_image": {
            "$ref": "#/components/schemas/ImageUrl"
          },
          "gallery": {
            "description": "Extra images. Each is a /storage/... path from POST /media or an https:// image URL.",
            "type": "array",
            "maxItems": 12,
            "items": {
              "$ref": "#/components/schemas/ImageUrl"
            }
          },
          "scheduled_at": {
            "$ref": "#/components/schemas/ScheduledAt"
          }
        }
      },
      "CreateMcqRequest": {
        "type": "object",
        "required": [
          "title",
          "options",
          "correct_option_index"
        ],
        "properties": {
          "title": {
            "description": "The quiz question (plain text).",
            "type": "string"
          },
          "options": {
            "description": "The choices: 2 to 5 unique strings.",
            "type": "array",
            "minItems": 2,
            "maxItems": 5,
            "uniqueItems": true,
            "items": {
              "type": "string"
            }
          },
          "correct_option_index": {
            "description": "The 0-based position of the correct choice in options.",
            "type": "integer",
            "minimum": 0,
            "maximum": 4
          },
          "body": {
            "description": "Optional context or explanation as HTML.",
            "type": "string"
          },
          "tags": {
            "description": "Topic tags, without the leading #. Example: [\"water\", \"home\"].",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "community_id": {
            "description": "Post inside this community. Use an id from GET /communities/postable. You must be an editor (or above) of it.",
            "type": "integer"
          },
          "community": {
            "description": "Alternative to community_id: the community slug. It is resolved to its id.",
            "type": "string"
          },
          "featured_image": {
            "$ref": "#/components/schemas/ImageUrl"
          },
          "gallery": {
            "description": "Extra images. Each is a /storage/... path from POST /media or an https:// image URL.",
            "type": "array",
            "maxItems": 12,
            "items": {
              "$ref": "#/components/schemas/ImageUrl"
            }
          },
          "scheduled_at": {
            "$ref": "#/components/schemas/ScheduledAt"
          }
        }
      },
      "CreateCommunityRequest": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "description": "The community name. It must be unique.",
            "type": "string"
          },
          "description": {
            "description": "What the community is about, as HTML.",
            "type": "string"
          },
          "visibility": {
            "description": "Who can see and join it.",
            "type": "string",
            "enum": [
              "public",
              "ask_to_join",
              "private"
            ]
          },
          "icon_url": {
            "description": "One of the paths returned by GET /community-icons.",
            "type": "string"
          },
          "scheduled_at": {
            "$ref": "#/components/schemas/ScheduledAt"
          }
        }
      },
      "ServicePackage": {
        "type": "object",
        "required": [
          "price"
        ],
        "properties": {
          "name": {
            "description": "Package name. Defaults to Basic, Standard or Premium by position.",
            "type": "string",
            "maxLength": 120
          },
          "description": {
            "description": "What the package includes.",
            "type": "string",
            "maxLength": 500
          },
          "price": {
            "description": "Price in Indian rupees, for example 4999. A package without a positive price is skipped.",
            "type": "number",
            "exclusiveMinimum": 0
          },
          "delivery_days": {
            "description": "Days to deliver. Defaults to 1.",
            "type": "integer",
            "minimum": 1
          },
          "revisions": {
            "description": "Revisions included. -1 means unlimited.",
            "type": "integer",
            "minimum": -1
          },
          "features": {
            "description": "Short feature lines, up to 20.",
            "type": "array",
            "maxItems": 20,
            "items": {
              "type": "string",
              "maxLength": 200
            }
          }
        }
      },
      "ServiceFaq": {
        "type": "object",
        "required": [
          "q",
          "a"
        ],
        "properties": {
          "q": {
            "description": "The question.",
            "type": "string",
            "maxLength": 200
          },
          "a": {
            "description": "The answer.",
            "type": "string",
            "maxLength": 1000
          }
        }
      },
      "CreateServiceRequest": {
        "type": "object",
        "required": [
          "title",
          "body",
          "category_id"
        ],
        "properties": {
          "title": {
            "description": "The service title (plain text).",
            "type": "string"
          },
          "body": {
            "description": "The full description as HTML.",
            "type": "string"
          },
          "category_id": {
            "description": "A category id from GET /service-categories.",
            "type": "integer"
          },
          "summary": {
            "description": "A short plain text summary shown on cards.",
            "type": "string",
            "maxLength": 300
          },
          "service_mode": {
            "description": "How you deliver. Unless it is online, a location is required.",
            "type": "string",
            "enum": [
              "online",
              "in_person",
              "both"
            ],
            "default": "both"
          },
          "country_code": {
            "description": "ISO 3166-1 alpha-2 country, for example IN. Required unless service_mode is online.",
            "type": "string"
          },
          "postal_code": {
            "description": "Postal code, valid for the country. Required unless service_mode is online.",
            "type": "string"
          },
          "state_id": {
            "description": "From GET /geo?level=states. At least a state (or a district or city) is required unless service_mode is online.",
            "type": "integer"
          },
          "district_id": {
            "description": "From GET /geo?level=districts. If you send a district, also send a city.",
            "type": "integer"
          },
          "city_id": {
            "description": "From GET /geo?level=cities.",
            "type": "integer"
          },
          "area": {
            "description": "Neighbourhood or area, free text.",
            "type": "string",
            "maxLength": 120
          },
          "packages": {
            "description": "Up to 3 priced packages.",
            "type": "array",
            "maxItems": 3,
            "items": {
              "$ref": "#/components/schemas/ServicePackage"
            }
          },
          "faqs": {
            "description": "Up to 20 questions and answers.",
            "type": "array",
            "maxItems": 20,
            "items": {
              "$ref": "#/components/schemas/ServiceFaq"
            }
          },
          "tags": {
            "description": "Topic tags, without the leading #. Example: [\"water\", \"home\"].",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "community_id": {
            "description": "Post inside this community. Use an id from GET /communities/postable. You must be an editor (or above) of it.",
            "type": "integer"
          },
          "community": {
            "description": "Alternative to community_id: the community slug. It is resolved to its id.",
            "type": "string"
          },
          "featured_image": {
            "$ref": "#/components/schemas/ImageUrl"
          },
          "gallery": {
            "description": "Extra images. Each is a /storage/... path from POST /media or an https:// image URL.",
            "type": "array",
            "maxItems": 12,
            "items": {
              "$ref": "#/components/schemas/ImageUrl"
            }
          },
          "scheduled_at": {
            "$ref": "#/components/schemas/ScheduledAt"
          }
        }
      },
      "CreateJobRequest": {
        "type": "object",
        "required": [
          "title",
          "body",
          "employment_type",
          "work_mode",
          "experience_level"
        ],
        "properties": {
          "title": {
            "description": "The job title (plain text).",
            "type": "string"
          },
          "body": {
            "description": "The job description as HTML.",
            "type": "string"
          },
          "employment_type": {
            "description": "One of employment_types from GET /job-options, for example full_time.",
            "type": "string"
          },
          "work_mode": {
            "description": "One of work_modes from GET /job-options, for example remote. Location fields are ignored when it is remote.",
            "type": "string"
          },
          "experience_level": {
            "description": "One of experience_levels from GET /job-options, for example mid.",
            "type": "string"
          },
          "openings": {
            "description": "Number of openings.",
            "type": "integer",
            "minimum": 1,
            "maximum": 999
          },
          "salary_min": {
            "description": "Lowest salary in currency, per salary_period.",
            "type": "number"
          },
          "salary_max": {
            "description": "Highest salary in currency, per salary_period.",
            "type": "number"
          },
          "salary_period": {
            "description": "One of salary_periods from GET /job-options, for example yearly.",
            "type": "string"
          },
          "currency": {
            "description": "Three letter currency code.",
            "type": "string",
            "pattern": "^[A-Z]{3}$",
            "default": "INR"
          },
          "application_deadline": {
            "description": "Last day to apply, YYYY-MM-DD.",
            "type": "string",
            "format": "date"
          },
          "summary": {
            "description": "A short plain text summary shown on cards.",
            "type": "string",
            "maxLength": 300
          },
          "country_code": {
            "description": "ISO 3166-1 alpha-2 country. Ignored when work_mode is remote.",
            "type": "string"
          },
          "state_id": {
            "description": "From GET /geo. Ignored when work_mode is remote.",
            "type": "integer"
          },
          "district_id": {
            "description": "From GET /geo. Ignored when work_mode is remote.",
            "type": "integer"
          },
          "city_id": {
            "description": "From GET /geo. Ignored when work_mode is remote.",
            "type": "integer"
          },
          "area": {
            "description": "Neighbourhood or area, free text. Ignored when work_mode is remote.",
            "type": "string"
          },
          "featured_image": {
            "$ref": "#/components/schemas/ImageUrl"
          },
          "tags": {
            "description": "Topic tags, without the leading #. Example: [\"water\", \"home\"].",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "community_id": {
            "description": "Post inside this community. Use an id from GET /communities/postable. You must be an editor (or above) of it.",
            "type": "integer"
          },
          "community": {
            "description": "Alternative to community_id: the community slug. It is resolved to its id.",
            "type": "string"
          },
          "scheduled_at": {
            "$ref": "#/components/schemas/ScheduledAt"
          }
        }
      },
      "CreatedResponse": {
        "type": "object",
        "required": [
          "ok",
          "id",
          "url",
          "web_url"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "id": {
            "description": "The new item id.",
            "type": "integer"
          },
          "slug": {
            "description": "The URL slug.",
            "type": "string"
          },
          "url": {
            "description": "Root-relative URL of the item.",
            "type": "string"
          },
          "web_url": {
            "description": "Full URL to open or share.",
            "type": "string",
            "format": "uri"
          },
          "status": {
            "description": "Present only when scheduled_at was sent.",
            "type": "string",
            "enum": [
              "scheduled"
            ]
          },
          "scheduled_at": {
            "description": "Present only when scheduled: when it goes live, in UTC.",
            "type": "string",
            "format": "date-time"
          },
          "item": {
            "description": "The card the website and app show for this item. Its fields may grow over time.",
            "type": "object",
            "additionalProperties": true
          },
          "request_id": {
            "description": "The same value as the X-Request-Id header.",
            "type": "string"
          }
        }
      },
      "ScheduledCommunityResponse": {
        "type": "object",
        "required": [
          "ok",
          "status",
          "type",
          "id",
          "scheduled_at"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "status": {
            "type": "string",
            "const": "scheduled"
          },
          "type": {
            "type": "string",
            "const": "community"
          },
          "id": {
            "description": "The scheduled-creation id. Use it with the /scheduled endpoints.",
            "type": "integer"
          },
          "name": {
            "description": "The community name that will be created.",
            "type": "string"
          },
          "scheduled_at": {
            "type": "string",
            "format": "date-time"
          },
          "request_id": {
            "description": "The same value as the X-Request-Id header.",
            "type": "string"
          }
        }
      },
      "MediaJsonRequest": {
        "type": "object",
        "required": [
          "image_base64"
        ],
        "properties": {
          "image_base64": {
            "description": "The image as raw base64 or a data: URI (data:image/png;base64,...). PNG, JPEG, GIF or WebP, up to 8 MB before conversion.",
            "type": "string"
          },
          "filename": {
            "description": "A file name such as cover.png. Used to name the stored file.",
            "type": "string"
          },
          "context": {
            "$ref": "#/components/schemas/MediaContext"
          },
          "community": {
            "description": "Optional community slug to file the image under.",
            "type": "string"
          }
        }
      },
      "MediaMultipartRequest": {
        "type": "object",
        "required": [
          "file"
        ],
        "properties": {
          "file": {
            "description": "The image file.",
            "type": "string",
            "contentMediaType": "application/octet-stream"
          },
          "context": {
            "$ref": "#/components/schemas/MediaContext"
          },
          "community": {
            "description": "Optional community slug to file the image under.",
            "type": "string"
          }
        }
      },
      "MediaContext": {
        "description": "What the image is for.",
        "type": "string",
        "enum": [
          "post",
          "question",
          "poll",
          "mcq",
          "community",
          "service",
          "job",
          "misc"
        ],
        "default": "post"
      },
      "Media": {
        "type": "object",
        "required": [
          "id",
          "url"
        ],
        "properties": {
          "id": {
            "type": "integer"
          },
          "context": {
            "$ref": "#/components/schemas/MediaContext"
          },
          "community_id": {
            "type": [
              "integer",
              "null"
            ]
          },
          "url": {
            "description": "Root-relative /storage/... path. Use it as featured_image or in gallery.",
            "type": "string"
          },
          "disk_path": {
            "type": "string"
          },
          "original_name": {
            "type": "string"
          },
          "extension": {
            "description": "webp after conversion.",
            "type": "string"
          },
          "mime_type": {
            "type": "string"
          },
          "size_bytes": {
            "type": "integer"
          },
          "created_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "updated_at": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "MediaResponse": {
        "type": "object",
        "required": [
          "ok",
          "data",
          "web_url"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "data": {
            "$ref": "#/components/schemas/Media"
          },
          "web_url": {
            "description": "Full URL of the stored image.",
            "type": "string",
            "format": "uri"
          },
          "request_id": {
            "description": "The same value as the X-Request-Id header.",
            "type": "string"
          }
        }
      },
      "ScheduledType": {
        "description": "In paths, job and job_post both mean a job. Lists report jobs as job_post.",
        "type": "string",
        "enum": [
          "post",
          "question",
          "poll",
          "mcq",
          "service",
          "job",
          "job_post",
          "community"
        ]
      },
      "ScheduledItem": {
        "type": "object",
        "required": [
          "type",
          "id",
          "scheduled_at"
        ],
        "properties": {
          "type": {
            "$ref": "#/components/schemas/ScheduledType"
          },
          "id": {
            "description": "For a community this is the scheduled-creation id.",
            "type": "integer"
          },
          "title": {
            "description": "The title, or the name of a community.",
            "type": "string"
          },
          "slug": {
            "description": "Empty for a community that is not created yet.",
            "type": "string"
          },
          "url": {
            "description": "Root-relative URL. null for a community that is not created yet.",
            "type": [
              "string",
              "null"
            ]
          },
          "edit_url": {
            "description": "Where to edit it on the website. null for a community that is not created yet.",
            "type": [
              "string",
              "null"
            ]
          },
          "scheduled_at": {
            "description": "When it goes live, in UTC.",
            "type": "string",
            "format": "date-time"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "ScheduledListResponse": {
        "type": "object",
        "required": [
          "ok",
          "items"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "items": {
            "description": "Pending items, soonest first.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ScheduledItem"
            }
          },
          "request_id": {
            "description": "The same value as the X-Request-Id header.",
            "type": "string"
          }
        }
      },
      "RescheduleRequest": {
        "type": "object",
        "required": [
          "scheduled_at"
        ],
        "properties": {
          "scheduled_at": {
            "$ref": "#/components/schemas/ScheduledAt"
          }
        }
      },
      "RescheduleResponse": {
        "type": "object",
        "required": [
          "ok",
          "item"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "item": {
            "$ref": "#/components/schemas/ScheduledItem"
          },
          "request_id": {
            "description": "The same value as the X-Request-Id header.",
            "type": "string"
          }
        }
      },
      "PublishNowResponse": {
        "type": "object",
        "required": [
          "ok",
          "status",
          "url"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "status": {
            "type": "string",
            "const": "published"
          },
          "id": {
            "description": "Only for a community: the id of the community just created.",
            "type": "integer"
          },
          "slug": {
            "description": "Only for a community: its slug.",
            "type": "string"
          },
          "url": {
            "description": "Root-relative URL where the item now lives.",
            "type": "string"
          },
          "web_url": {
            "description": "Full URL to open or share.",
            "type": "string",
            "format": "uri"
          },
          "request_id": {
            "description": "The same value as the X-Request-Id header.",
            "type": "string"
          }
        }
      },
      "CancelResponse": {
        "type": "object",
        "required": [
          "ok",
          "deleted"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "deleted": {
            "type": "boolean",
            "const": true
          },
          "request_id": {
            "description": "The same value as the X-Request-Id header.",
            "type": "string"
          }
        }
      },
      "PostableCommunity": {
        "type": "object",
        "required": [
          "id",
          "slug",
          "name",
          "role"
        ],
        "properties": {
          "id": {
            "description": "Use as community_id.",
            "type": "integer"
          },
          "slug": {
            "description": "Use as community.",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "verified": {
            "description": "The community verified badge, or null.",
            "type": [
              "string",
              "null"
            ]
          },
          "icon": {
            "description": "Icon path, or null.",
            "type": [
              "string",
              "null"
            ]
          },
          "role": {
            "description": "Your role. Editors and above may post.",
            "type": "string",
            "enum": [
              "editor",
              "admin",
              "creator"
            ]
          }
        }
      },
      "PostableCommunitiesResponse": {
        "type": "object",
        "required": [
          "ok",
          "items"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "items": {
            "description": "Up to 200 communities, by name.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PostableCommunity"
            }
          },
          "next_offset": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          },
          "request_id": {
            "description": "The same value as the X-Request-Id header.",
            "type": "string"
          }
        }
      },
      "ServiceSubcategory": {
        "type": "object",
        "required": [
          "id",
          "name",
          "slug"
        ],
        "properties": {
          "id": {
            "description": "Use as category_id.",
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "count": {
            "description": "Published services in it.",
            "type": "integer"
          }
        }
      },
      "ServiceCategory": {
        "type": "object",
        "required": [
          "id",
          "name",
          "slug",
          "children"
        ],
        "properties": {
          "id": {
            "description": "A top level group. Prefer a child id as category_id.",
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "icon": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "count": {
            "description": "Published services in the group and its children.",
            "type": "integer"
          },
          "children": {
            "description": "The categories inside this group.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ServiceSubcategory"
            }
          }
        }
      },
      "ServiceCategoriesResponse": {
        "type": "object",
        "required": [
          "ok",
          "categories"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "categories": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ServiceCategory"
            }
          },
          "request_id": {
            "description": "The same value as the X-Request-Id header.",
            "type": "string"
          }
        }
      },
      "JobOptionsResponse": {
        "type": "object",
        "required": [
          "ok",
          "employment_types",
          "work_modes",
          "experience_levels",
          "salary_periods"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "employment_types": {
            "description": "Allowed employment_type values.",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "work_modes": {
            "description": "Allowed work_mode values.",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "experience_levels": {
            "description": "Allowed experience_level values.",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "salary_periods": {
            "description": "Allowed salary_period values.",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "request_id": {
            "description": "The same value as the X-Request-Id header.",
            "type": "string"
          }
        }
      },
      "GeoPlace": {
        "type": "object",
        "properties": {
          "id": {
            "description": "States, districts and cities: use as state_id, district_id or city_id.",
            "type": "integer"
          },
          "code": {
            "description": "Countries only: the ISO code to use as country_code.",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "district_id": {
            "description": "Cities only.",
            "type": [
              "integer",
              "null"
            ]
          },
          "postal_regex": {
            "description": "Countries only: the postal code pattern, when known.",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": true
      },
      "GeoResponse": {
        "type": "object",
        "required": [
          "ok",
          "items"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "items": {
            "description": "Places at the requested level.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GeoPlace"
            }
          },
          "default": {
            "type": "string",
            "description": "Countries only: the suggested default country code."
          },
          "request_id": {
            "description": "The same value as the X-Request-Id header.",
            "type": "string"
          }
        }
      },
      "CommunityIconsResponse": {
        "type": "object",
        "required": [
          "ok",
          "items"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "items": {
            "description": "Paths such as /avatars/... Use one as icon_url.",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "request_id": {
            "description": "The same value as the X-Request-Id header.",
            "type": "string"
          }
        }
      }
    },
    "securitySchemes": {
      "bearerAuth": {
        "description": "Authorization: Bearer und_sk_... Your personal API key from Settings > API keys (und_sk_ followed by 49 letters and digits).",
        "type": "http",
        "scheme": "bearer"
      },
      "apiKeyHeader": {
        "description": "The same key in an X-API-Key header, for tools that cannot set Authorization.",
        "name": "X-API-Key",
        "in": "header",
        "type": "apiKey"
      }
    }
  }
}
