You can publish to Ur Next Door (https://urnextdoor.com) for me through the Ur Next Door API. ABOUT THE API - Base URL: https://urnextdoor.com/api/v1 (always the apex domain, never a community subdomain). - Read https://docs.urnextdoor.com/llms.txt before your first call. The contract is https://urnextdoor.com/api/v1/openapi.json; trust it over your memory. - Send JSON with "Content-Type: application/json". The body of a post, question, poll, MCQ, community, service or job is HTML (p, h2 to h4, strong, em, a, ul, ol, li, blockquote, code, pre, img with an https or /storage src, YouTube embeds). Titles are plain text. - Every request acts as me, with exactly my permissions on the website. MY KEY - My API key is in the environment variable UND_API_KEY. Send it only as the header "Authorization: Bearer $UND_API_KEY" and let the shell or runtime expand the variable. - Never print, echo, log or paste the key. Never write it into a file, a URL, a commit or your reply. To check it is set, test that the variable is not empty without showing its value. - If a request answers 401, stop and tell me. Do not look for other keys. BEFORE YOU WRITE ANYTHING 1. Call GET /me once to confirm the key works and to see my plan and the key's scopes. If a scope you need is missing, tell me which one. 2. Use the lookups instead of guessing: GET /communities/postable (community_id or community slug), GET /service-categories (category_id), GET /job-options (employment_type, work_mode, experience_level, salary_period), GET /geo (country codes and state, district and city ids), GET /community-icons (icon_url). Never invent an id or an allowed value. 3. Show me a short preview (type, title, community, and the schedule time in my time zone and in UTC) and wait for my yes before you publish anything public, unless I have told you to publish without asking. IMAGES - Upload first with POST /media, as JSON {"image_base64": "...", "filename": "cover.png", "context": "post"} or as multipart with a "file" field. PNG, JPEG, GIF or WebP, up to 8 MB. It is stored as WebP and must end at 2 MB or less, so resize large images first. - Build a large base64 body in a file and send the file. Never put megabytes of base64 on a command line. - Then pass the returned data.url (a /storage/... path) as featured_image, or in gallery (up to 12). Jobs take featured_image only. CREATING - Send a new Idempotency-Key header (a fresh UUID) on every POST and DELETE. If a request fails with a network error or a 500, retry once with the SAME key and the SAME body, so nothing is created twice. - To schedule, add "scheduled_at" in UTC ending in Z, for example 2026-10-20T09:30:00Z, at least 5 minutes and at most 180 days ahead. Convert from my time zone carefully and tell me both times. - Manage scheduled items with GET /scheduled, POST /scheduled/{type}/{id}/reschedule, POST /scheduled/{type}/{id}/publish and DELETE /scheduled/{type}/{id}. Ask me before you cancel anything: cancelling deletes the item. WHEN SOMETHING FAILS - 422 validation_failed: read the "errors" object, fix only the fields it names, and try again. - 429 rate_limited or quota_exceeded: wait the number of seconds in the Retry-After header before any retry. For quota_exceeded, stop, call GET /usage, and tell me what is left today and that it resets at 00:00 UTC. - 403 insufficient_scope: tell me which scope the key needs. 403 forbidden: I am not allowed to do that (for example I am not an editor of that community). - 409 conflict: the name is taken or the item is no longer scheduled. Tell me and suggest a fix. - Anything else: show me the status, the "code", the "error" message and the "request_id". WHEN YOU ARE DONE - Give me the web_url of everything you created, the time and id of anything you scheduled, and a list of anything that failed with its error code.