{"info":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","description":"<html><head></head><body><h1 id=\"radmin-api\">Radmin API</h1>\n<p>A hands-on Postman collection for testing radmin's JSON API across development, staging, and production. Open the shared collection in Postman, select the right environment, add your own radmin credentials, create a token, then run the examples.</p>\n<blockquote>\n<p>Production writes are real writes. Check <code>DS-METRO-ID</code> before creating events, importing queue items, approving queue work, or flushing queues.</p>\n</blockquote>\n<h2 id=\"🚀-fast-start\">🚀 Fast Start</h2>\n<ol>\n<li>Open the shared <code>Radmin API</code> collection in Postman.</li>\n<li>Select the environment you want to test against: <code>Radmin API Development</code>, <code>Radmin API Staging</code>, or <code>Radmin API Production</code>.</li>\n<li>Fill these environment variables in your selected Postman environment:<ul>\n<li><code>api_email</code>: the same email address you use for radmin.</li>\n<li><code>api_password</code>: the same password you use for radmin.</li>\n<li><code>metro_id</code>: the active metro/property id for the request context.</li>\n</ul>\n</li>\n<li>Run <code>Authentication / Create Token</code>.</li>\n<li>The token response stores <code>jwt</code> and <code>user_id</code> in your selected environment.</li>\n<li>Run the API examples. Requests that operate in a metro send <code>DS-METRO-ID: {{metro_id}}</code>.</li>\n</ol>\n<h2 id=\"🌎-environments\">🌎 Environments</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Environment</th>\n<th><code>radmin_url</code></th>\n<th>Use for</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Development</td>\n<td><code>https://radmin.dothebay.baw</code></td>\n<td>Local development and Docker/Caddy testing.</td>\n</tr>\n<tr>\n<td>Staging</td>\n<td><code>https://stadmin.dostuffmedia.com</code></td>\n<td>Pre-production smoke testing before deploy.</td>\n</tr>\n<tr>\n<td>Production</td>\n<td><code>https://radmin.dostuffmedia.com</code></td>\n<td>Real radmin data. Use deliberately.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Each user should store their own <code>api_email</code> and <code>api_password</code> in their Postman environment. The production environment is safe to use for testing reads, but write requests create or update real radmin data.</p>\n<h2 id=\"🗂️-collections\">🗂️ Collections</h2>\n<p>Collections let radmin build reusable groups of events, venues, artists, tastemakers, and curated picks for apps and pages. Use them when you need to create or update the sets of content that a frontend experience will display.</p>\n<p>Use the <a href=\"#collections\">Collections folder</a> for the concrete requests. A collection group owns an ordered list of collections. Collections can be automatic (<code>all_events</code>, <code>venue</code>, <code>promo_user</code>, <code>tastemaker</code>, <code>band</code>, <code>query</code>) or <code>curated</code>. Curated collection items are managed through <code>collection_items_attributes</code> on collection create/update payloads; there is no standalone collection-item endpoint in this API collection.</p>\n<h2 id=\"🔐-auth\">🔐 Auth</h2>\n<ul>\n<li><code>POST /api/tokens</code> uses radmin email/password validation and returns the existing radmin JWT shape.</li>\n<li>The collection sends <code>Authorization: Bearer {{jwt}}</code> automatically after token creation.</li>\n<li>Metro context belongs in <code>DS-METRO-ID</code>, not request bodies.</li>\n<li>Missing or invalid bearer tokens return JSON <code>401</code>.</li>\n</ul>\n<h2 id=\"📄-pagination\">📄 Pagination</h2>\n<ul>\n<li>Most CRUD list endpoints accept <code>page</code> and <code>per_page</code>. Collection group endpoints currently return arrays because they follow the existing radmin-v2 collection API shape.</li>\n<li>Default page size is 50; maximum is 100.</li>\n<li>Normal CRUD list responses include <code>current_page</code>, <code>per_page</code>, <code>total_pages</code>, and <code>total_count</code>.</li>\n<li>Pending and duplicate queue responses skip expensive total counts and return <code>current_page</code>, <code>per_page</code>, and <code>next_page</code>.</li>\n</ul>\n<h2 id=\"🎟️-events-and-queues\">🎟️ Events And Queues</h2>\n<p>Radmin has two event creation paths: direct event CRUD for approved events, and event imports for review queues. Pick the path that matches the workflow you are automating.</p>\n<h3 id=\"✅-create-approved-events\">✅ Create Approved Events</h3>\n<p>Use <code>POST /api/events</code> when the event is ready to go live. This is normal CRUD creation and creates an approved event directly in radmin.</p>\n<h3 id=\"🔎-preview-duplicate-handling\">🔎 Preview Duplicate Handling</h3>\n<p>Use <code>POST /api/event_dupe_checks</code> as a dry run before importing scraped or external data. It accepts event-shaped data, creates nothing, and returns the duplicate gate result radmin would use: ignored event, obvious duplicate, obvious repeating duplicate, obvious ongoing duplicate, pending replacement, or potential duplicate.</p>\n<h3 id=\"🧾-import-events-for-review\">🧾 Import Events For Review</h3>\n<p>Use <code>POST /api/event_imports</code> when you want radmin to create unapproved review work. With no <code>queue</code> value, or with <code>queue: \"auto\"</code>, radmin behaves like the scraper importer: obvious duplicates are skipped, normal candidates enter pending review, and potential duplicates enter duplicate review.</p>\n<h3 id=\"📥-force-pending-review\">📥 Force Pending Review</h3>\n<p>Set <code>queue: \"pending\"</code> on <code>POST /api/event_imports</code> to force a normal pending queue item. This does not create <code>EventDupe</code> records because normal pending review does not need comparison targets.</p>\n<h3 id=\"🧬-force-duplicate-review\">🧬 Force Duplicate Review</h3>\n<p>Set <code>queue: \"duplicate\"</code> on <code>POST /api/event_imports</code> to create a duplicate queue item. If you pass <code>potential_dupe_id</code> or <code>potential_dupe_ids</code>, radmin uses those approved events as comparison targets. If you omit them, radmin generates potential dupes from the posted event using its scraper duplicate logic. If no approved comparison event can be found, the request is rejected instead of creating broken duplicate state.</p>\n<h3 id=\"📚-review-queue-items\">📚 Review Queue Items</h3>\n<p>Use <code>GET /api/event_queues/pending</code> to list unapproved non-duplicate pending events. Use <code>GET /api/event_queues/duplicates</code> to list unapproved duplicate-review events and their comparison matches. Queue list responses are paginated and intentionally avoid total counts because these queues can be slow. Follow <code>pagination.next_page</code> until it is empty.</p>\n<h3 id=\"🔒-approve-or-flush-queues\">🔒 Approve Or Flush Queues</h3>\n<p>Queue approval and flush endpoints use the same Redis locks as radmin. If a flush is already running, list and flush requests return HTTP <code>423</code> with <code>error: queue_locked</code>. Treat that as \"try again later,\" not as a failed import.</p>\n<h2 id=\"🧪-common-workflows\">🧪 Common Workflows</h2>\n<ul>\n<li>Grant Event Editor access: list roles with <code>GET /api/roles</code>, find or create the user with the Users requests, then create a user permission with <code>POST /api/users/:user_id/permissions</code>. Event Editor is role id <code>8</code>.</li>\n<li>Add an artist: use <code>POST /api/artists</code>. You can include <code>cover_image_url</code> to pull the image by URL.</li>\n<li>Add an approved event with images: use <code>POST /api/events</code> with <code>venue_id</code>, <code>category_id</code>, optional <code>band_ids</code>, and image URLs such as <code>cover_image_url</code>, <code>poster_image_url</code>, or <code>share_image_url</code>.</li>\n</ul>\n<h2 id=\"🛡️-rate-limits\">🛡️ Rate Limits</h2>\n<ul>\n<li><code>/api/tokens</code> is throttled by IP.</li>\n<li>API resource routes are throttled by SHA256 fingerprint of the raw <code>Authorization</code> header.</li>\n<li>Default limits are 5,000 requests per 5 minutes and 300 write requests per 5 minutes per auth header. That write limit is roughly one write per second per token.</li>\n<li>Throttled responses return HTTP <code>429</code> with <code>{ \"error\": \"rate_limited\" }</code> plus <code>Retry-After</code>, <code>X-RateLimit-Limit</code>, <code>X-RateLimit-Remaining</code>, and <code>X-RateLimit-Reset</code> headers.</li>\n</ul>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"Radmin API","slug":"radmin-api"}],"owner":"2966202","collectionId":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","publishedId":"2sBXwtr9qX","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2026-06-17T18:41:49.000Z"},"item":[{"name":"Agent Instructions","item":[],"id":"e598acf7-8ddf-4538-8968-cbc3a77afd06","description":"<h1 id=\"radmin-api-agent-instructions\">Radmin API Agent Instructions</h1>\n<p>Use these instructions when an agent is working with the Radmin JSON API from any HTTP client, script, integration, or shared API collection.</p>\n<h2 id=\"goal\">Goal</h2>\n<p>Use the Radmin API to inspect, create, or update radmin data through documented JSON endpoints. Prefer API requests over browser automation when the API covers the workflow.</p>\n<h2 id=\"connection-setup\">Connection Setup</h2>\n<ul>\n<li>Choose the correct environment before making requests:<ul>\n<li>Development: <code>https://radmin.dothebay.baw</code></li>\n<li>Staging: <code>https://stadmin.dostuffmedia.com</code></li>\n<li>Production: <code>https://radmin.dostuffmedia.com</code></li>\n</ul>\n</li>\n<li>Authenticate with the same email address and password used to log in to radmin.</li>\n<li>Send metro context with the <code>DS-METRO-ID</code> header. Do not put <code>metro_id</code> in request bodies unless an endpoint specifically documents it.</li>\n<li>Use <code>Content-Type: application/json</code> for JSON requests.</li>\n</ul>\n<h2 id=\"authentication\">Authentication</h2>\n<ol>\n<li><code>POST /api/tokens</code> with <code>email</code> and <code>password</code>.</li>\n<li>Read the returned JWT token.</li>\n<li>Send API requests with <code>Authorization: Bearer &lt;token&gt;</code>.</li>\n<li>If a request returns <code>401</code>, request a fresh token before retrying.</li>\n</ol>\n<h2 id=\"production-safety\">Production Safety</h2>\n<p>Production writes are real. Before running create, update, approve, import, or flush requests:</p>\n<ul>\n<li>Confirm the base URL is intentional.</li>\n<li>Confirm <code>DS-METRO-ID</code> is the correct active metro/property.</li>\n<li>Prefer read requests first when discovering IDs.</li>\n<li>Do not approve or flush queues unless the operator explicitly asks for it.</li>\n</ul>\n<h2 id=\"common-workflows\">Common Workflows</h2>\n<p>Grant Event Editor access:</p>\n<ol>\n<li>List roles with <code>GET /api/roles</code>.</li>\n<li>Find or create the user with the Users API.</li>\n<li>List the user's existing permissions.</li>\n<li>Create a permission with <code>POST /api/users/:user_id/permissions</code>.</li>\n<li>Event Editor is role id <code>8</code>.</li>\n</ol>\n<p>Create an artist with an image:</p>\n<ol>\n<li>Use <code>POST /api/artists</code>.</li>\n<li>Include <code>cover_image_url</code> when the image should be pulled by URL.</li>\n<li>Store the returned artist id for event <code>band_ids</code>.</li>\n</ol>\n<p>Create an approved event with images:</p>\n<ol>\n<li>Find or create the venue.</li>\n<li>Find or create artists and pass their ids in <code>band_ids</code>.</li>\n<li>Use <code>POST /api/events</code> with <code>venue_id</code>, <code>category_id</code>, dates, and times.</li>\n<li>Include <code>cover_image_url</code>, <code>poster_image_url</code>, or <code>share_image_url</code> when image URLs are available.</li>\n</ol>\n<p>Import events for review:</p>\n<ul>\n<li>Use <code>POST /api/event_dupe_checks</code> first when you want to preview how radmin will classify duplicate or pending work.</li>\n<li>Use <code>POST /api/event_imports</code> for unapproved queue work.</li>\n<li>Use <code>queue: \"auto\"</code> unless the operator explicitly wants pending or duplicate review forced.</li>\n</ul>\n<h2 id=\"response-handling\">Response Handling</h2>\n<ul>\n<li>Store returned resource ids for later requests.</li>\n<li>Treat <code>401</code> as an auth/token problem.</li>\n<li>Treat <code>423</code> with <code>queue_locked</code> as \"try again later.\"</li>\n<li>Treat <code>429</code> with <code>rate_limited</code> as a real throttle. Read <code>Retry-After</code> before retrying, and use <code>X-RateLimit-Limit</code>, <code>X-RateLimit-Remaining</code>, and <code>X-RateLimit-Reset</code> when reporting or scheduling retries.</li>\n</ul>\n<h2 id=\"reporting-back\">Reporting Back</h2>\n<p>When reporting results, include:</p>\n<ul>\n<li>Environment/base URL used.</li>\n<li>Metro id sent in <code>DS-METRO-ID</code>.</li>\n<li>Endpoint paths called.</li>\n<li>Created or updated resource ids.</li>\n<li>Any API warnings or errors, especially duplicate, queue-lock, or rate-limit responses.</li>\n</ul>\n","_postman_id":"e598acf7-8ddf-4538-8968-cbc3a77afd06","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}}},{"name":"Authentication","item":[{"name":"Create Token","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if (pm.response.code === 201) {","  var json = pm.response.json();","  pm.environment.set('jwt', json.token);","  pm.environment.set('user_id', json.user.id);","  if (json.user.preferences && json.user.preferences.length) {","    pm.environment.set('user_preference_id', json.user.preferences[0].id);","  }","}"],"id":"8423f737-b510-417a-8f62-e78f4b5b6948"}}],"id":"f4e5bbb3-a87d-4b53-9585-2aaafe0920a2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"email\": \"{{api_email}}\",\n  \"password\": \"{{api_password}}\"\n}"},"url":"{{radmin_url}}/api/tokens","description":"<p>Endpoint: <code>POST /api/tokens</code></p>\n<p>Authenticates a radmin user by email address with the usual Devise password validation and returns a JWT for API requests. Metro context for API requests comes from the <code>DS-METRO-ID</code> header, not this token body.</p>\n","urlObject":{"path":["api","tokens"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"f4e5bbb3-a87d-4b53-9585-2aaafe0920a2"}],"id":"f004f480-5ad4-4a20-9909-d9243aa3f254","_postman_id":"f004f480-5ad4-4a20-9909-d9243aa3f254","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}}},{"name":"Metros","item":[{"name":"List Metros","id":"3342d42a-f2a2-4e43-97c6-3d68f102ebd0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/metros","description":"<p>Returns active metros available through radmin API auth.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","metros"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"3342d42a-f2a2-4e43-97c6-3d68f102ebd0"},{"name":"Get Metro","id":"4a074ec0-434b-47dd-8a09-81ab69bbebde","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/metros/{{metro_id}}","description":"<p>Returns one active metro when the authenticated user has access.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","metros","{{metro_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"4a074ec0-434b-47dd-8a09-81ab69bbebde"}],"id":"1a48efb9-5b8e-469b-a0b4-011168b05766","_postman_id":"1a48efb9-5b8e-469b-a0b4-011168b05766","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}}},{"name":"Roles","item":[{"name":"List Roles","id":"6b08c716-f146-4eb4-8a92-1af9928a03f2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/roles","description":"<p>Returns roles the authenticated user can assign for the active metro. Event Editor is role id <code>8</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","roles"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"6b08c716-f146-4eb4-8a92-1af9928a03f2"}],"id":"6de54083-9c3a-44f2-b7c9-1907038cbcc4","_postman_id":"6de54083-9c3a-44f2-b7c9-1907038cbcc4","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}}},{"name":"Users","item":[{"name":"Find User By Email","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if (pm.response.code === 200) {","  var json = pm.response.json();","  if (json.user) {","    pm.environment.set('user_id', json.user.id);","    if (json.user.preferences && json.user.preferences.length) {","      pm.environment.set('user_preference_id', json.user.preferences[0].id);","    }","  }","}"],"id":"e5b551e9-5add-4f86-995c-8a4d74a02fa8"}}],"id":"2c34bdf0-e93b-43d5-a9fc-acc778a3bd28","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/users?email={{user_email}}","description":"<p>Looks up one user by exact email for the requested metro context. Returns <code>user: null</code> when no user exists.</p>\n<p>User responses include <code>preferences</code>, an array of the user's network preference records. Each preference includes <code>id</code>, <code>subdomain_id</code>, <code>subdomain</code>, <code>metro_id</code>, profile name, email preference flags, enabled/vip flags, activity timestamps, and created/updated timestamps. Use the preference <code>id</code> when updating an existing preference through <code>preferences_attributes</code> on <code>PUT /api/users/:id</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","users"],"host":["{{radmin_url}}"],"query":[{"key":"email","value":"{{user_email}}"}],"variable":[]}},"response":[],"_postman_id":"2c34bdf0-e93b-43d5-a9fc-acc778a3bd28"},{"name":"Get User","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if (pm.response.code === 200) {","  var json = pm.response.json();","  if (json.user && json.user.preferences && json.user.preferences.length) {","    pm.environment.set('user_preference_id', json.user.preferences[0].id);","  }","}"],"id":"4febcd1c-e989-4ba4-bd4e-6dd4ba272772"}}],"id":"1707d750-4c7c-4f49-887e-a964f4b8589c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/users/{{user_id}}","description":"<p>Returns one user with permissions scoped to the requested metro.</p>\n<p>User responses include <code>preferences</code>, an array of the user's network preference records. Each preference includes <code>id</code>, <code>subdomain_id</code>, <code>subdomain</code>, <code>metro_id</code>, profile name, email preference flags, enabled/vip flags, activity timestamps, and created/updated timestamps. Use the preference <code>id</code> when updating an existing preference through <code>preferences_attributes</code> on <code>PUT /api/users/:id</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","users","{{user_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"1707d750-4c7c-4f49-887e-a964f4b8589c"},{"name":"List User Voted Events","id":"877960ef-9341-4acf-ab4f-d463476a0505","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/users/{{user_id}}/events","description":"<p>Endpoint: <code>GET /api/users/:id/events</code></p>\n<p>Returns approved active-metro events that the user has voted on. This is intentionally separate from <code>/api/events?user_id=...</code> so voted events do not conflict with event creator ownership.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","users","{{user_id}}","events"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"877960ef-9341-4acf-ab4f-d463476a0505"},{"name":"Create User","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if ([200, 201].includes(pm.response.code)) {","  var json = pm.response.json();","  pm.environment.set('user_id', json.user.id);","  if (json.user.preferences && json.user.preferences.length) {","    pm.environment.set('user_preference_id', json.user.preferences[0].id);","  }","}"],"id":"b2e3d9a3-6297-462e-a23b-9347b9093df3"}}],"id":"82310b73-3386-4dce-b0ed-be8485ce6d20","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"user\": {\n    \"name\": \"Radmin API Test\",\n    \"display_name\": \"Radmin API Test\",\n    \"email\": \"{{user_email}}\",\n    \"password\": \"temporary-password-123\"\n  }\n}"},"url":"{{radmin_url}}/api/users","description":"<p>Creates a user when absent. If the email already exists, returns the existing user with <code>created: false</code> and ensures the active metro preference exists. The response includes <code>preferences</code>; Postman stores the first preference id as <code>user_preference_id</code> when present.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","users"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"82310b73-3386-4dce-b0ed-be8485ce6d20"},{"name":"Update User","id":"f6f458aa-7d8b-45fd-8f21-9ff3a336d906","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"user\": {\n    \"display_name\": \"Radmin API Test Updated\",\n    \"preferences_attributes\": [\n      {\n        \"id\": \"{{user_preference_id}}\",\n        \"mail_list\": true,\n        \"send_band_emails\": false,\n        \"auto_event_redirect\": false,\n        \"profile_name\": \"radmin-api-test\"\n      }\n    ]\n  }\n}"},"url":"{{radmin_url}}/api/users/{{user_id}}","description":"<p>Updates supported user fields for the requested metro context.</p>\n<p>To update an existing user preference, send Rails-style nested attributes under <code>user.preferences_attributes</code>. The API accepts either an array of preference attribute hashes or the classic indexed hash shape (<code>\"0\"</code>, <code>\"1\"</code>, etc.). Include the preference <code>id</code> from <code>GET /api/users/:id</code> or <code>GET /api/users?email=...</code>; without an <code>id</code>, Rails treats the nested attributes as a new preference. Supported nested preference fields are <code>subdomain_id</code>, <code>profile_name</code>, <code>mail_list</code>, <code>send_band_emails</code>, and <code>auto_event_redirect</code>. <code>profile_name</code> is the user's vanity/profile slug for that property. The API attaches the active metro from <code>DS-METRO-ID</code> while validating preference profile-name uniqueness.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","users","{{user_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"f6f458aa-7d8b-45fd-8f21-9ff3a336d906"}],"id":"46bb6f48-387f-4cf9-a6ca-12e16b9908d3","description":"<h1 id=\"users\">Users</h1>\n<p>User API responses include the user's active network preferences in <code>user.preferences</code>. Preferences are the per-property/subdomain settings that drive things like profile vanity, mail-list membership, event redirect behavior, and email notification flags.</p>\n<p>The create-user endpoint returns an existing user when the email is already present and also ensures the active metro preference exists. Use <code>GET /api/users/:id</code> or <code>GET /api/users?email=...</code> to capture a preference <code>id</code>, then send nested <code>preferences_attributes</code> to <code>PUT /api/users/:id</code> when updating preference fields.</p>\n<p>For nested preference updates, Rails accepts either an array of preference hashes or the classic indexed hash shape. Include the nested preference <code>id</code> when changing an existing preference. If the <code>id</code> is omitted, Rails treats the nested attributes as a new preference record. The API attaches the active metro from <code>DS-METRO-ID</code>, so clients should not send <code>metro_id</code> directly.</p>\n","_postman_id":"46bb6f48-387f-4cf9-a6ca-12e16b9908d3","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}}},{"name":"Permissions","item":[{"name":"List User Permissions","id":"bd4d877c-bb1f-4afc-8304-874bbd0fed6e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/users/{{user_id}}/permissions","description":"<p>Lists permissions for a user on the requested metro.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","users","{{user_id}}","permissions"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"bd4d877c-bb1f-4afc-8304-874bbd0fed6e"},{"name":"Create User Permission","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if ([200, 201].includes(pm.response.code)) {","  var json = pm.response.json();","  pm.environment.set('permission_id', json.permission.id);","}"],"id":"1820571d-b9c3-4b5e-81a6-b4e9ac23cb20"}}],"id":"359f36ce-d302-4c4f-bf1a-026185b0f727","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"permission\": {\n    \"role_id\": \"{{event_editor_role_id}}\"\n  }\n}"},"url":"{{radmin_url}}/api/users/{{user_id}}/permissions","description":"<p>Creates a metro-scoped permission for a user. Use role id <code>8</code> to grant Event Editor.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","users","{{user_id}}","permissions"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"359f36ce-d302-4c4f-bf1a-026185b0f727"},{"name":"Delete User Permission","id":"b59ffd45-0e0b-4cbf-aafe-51be67168c5c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/users/{{user_id}}/permissions/{{permission_id}}","description":"<p>Deletes one permission by id. Delete the permission with role id <code>8</code> to remove Event Editor.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","users","{{user_id}}","permissions","{{permission_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"b59ffd45-0e0b-4cbf-aafe-51be67168c5c"}],"id":"5c3dc71f-587f-43ab-9612-eb3233491357","_postman_id":"5c3dc71f-587f-43ab-9612-eb3233491357","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}}},{"name":"Venues","item":[{"name":"List Venues","id":"843601e6-17d4-4910-91be-de0426096834","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/venues","description":"<p>Endpoint: <code>GET /api/venues</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","venues"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"843601e6-17d4-4910-91be-de0426096834"},{"name":"Get Venue","id":"5df07ea7-1d58-4faa-9e66-4bfb2d705d0f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/venues/{{venue_id}}","description":"<p>Endpoint: <code>GET /api/venues/:id</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","venues","{{venue_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"5df07ea7-1d58-4faa-9e66-4bfb2d705d0f"},{"name":"List Venue Events","id":"df0fc140-f7aa-4dea-8afe-c71dd5a74dcb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/venues/{{venue_id}}/events","description":"<p>Endpoint: <code>GET /api/venues/:id/events</code></p>\n<p>Returns approved active-metro events for the selected venue. Equivalent to <code>GET /api/events?venue_id={{venue_id}}</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","venues","{{venue_id}}","events"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"df0fc140-f7aa-4dea-8afe-c71dd5a74dcb"},{"name":"Create Venue","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if ([200, 201].includes(pm.response.code)) {","  pm.environment.set('venue_id', pm.response.json().venue.id);","}"],"id":"628e3c4a-f674-4ab1-8b6c-8cc496858f1c"}}],"id":"f7f5aff6-531b-43d0-815f-7a1b4df2fc0e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"venue\": {\n    \"title\": \"Radmin API Venue\",\n    \"address\": \"123 Test St\",\n    \"city\": \"Austin\",\n    \"state\": \"TX\",\n    \"zip\": \"78701\"\n  }\n}"},"url":"{{radmin_url}}/api/venues","description":"<p>Endpoint: <code>POST /api/venues</code></p>\n<p>Creates a venue in the active metro. To attach a cover image, pass <code>cover_image_url</code> in JSON or use multipart <code>venue[cover_image][picture]</code>. <code>venue[image_logs_attributes]</code> is optional metadata.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","venues"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"f7f5aff6-531b-43d0-815f-7a1b4df2fc0e"},{"name":"Create Venue With Image URL","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if ([200, 201].includes(pm.response.code)) {","  pm.environment.set('venue_id', pm.response.json().venue.id);","}"],"id":"71baac14-d7f3-4f1a-a2b3-fc2900f930e4"}}],"id":"ac9380b3-4fde-43e0-98fc-d7688b50ea82","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"venue\": {\n    \"title\": \"Radmin API Venue With Image\",\n    \"address\": \"123 Test St\",\n    \"city\": \"Austin\",\n    \"state\": \"TX\",\n    \"zip\": \"78701\",\n    \"cover_image_url\": \"https://example.com/venue-cover.jpg\"\n  }\n}"},"url":"{{radmin_url}}/api/venues","description":"<p>Endpoint: <code>POST /api/venues</code></p>\n<p>Creates a venue and pulls the cover image by URL through CarrierWave. Equivalent nested form field: <code>venue[cover_image][remote_picture_url]</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","venues"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"ac9380b3-4fde-43e0-98fc-d7688b50ea82"},{"name":"Update Venue","id":"88c6e3b1-e33b-4288-bd0b-30cbd5f46329","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"venue\": {\n    \"phone\": \"512-555-0100\"\n  }\n}"},"url":"{{radmin_url}}/api/venues/{{venue_id}}","description":"<p>Endpoint: <code>PUT /api/venues/:id</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","venues","{{venue_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"88c6e3b1-e33b-4288-bd0b-30cbd5f46329"},{"name":"Update Venue With Image URL","id":"cc4d3663-68ce-4b0a-9fad-afbcfc2ed61c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"venue\": {\n    \"cover_image_url\": \"https://example.com/updated-venue-cover.jpg\"\n  }\n}"},"url":"{{radmin_url}}/api/venues/{{venue_id}}","description":"<p>Endpoint: <code>PUT /api/venues/:id</code></p>\n<p>Replaces the venue cover image by URL. Multipart <code>venue[cover_image][picture]</code> is also supported; <code>venue[image_logs_attributes]</code> is optional metadata.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","venues","{{venue_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"cc4d3663-68ce-4b0a-9fad-afbcfc2ed61c"}],"id":"126ce743-ddb0-4033-a970-943d4cda9205","_postman_id":"126ce743-ddb0-4033-a970-943d4cda9205","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}}},{"name":"Artists","item":[{"name":"List Artists","id":"cc8cf4ae-a853-451b-91f0-7df9382ea6ab","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/artists","description":"<p>Endpoint: <code>GET /api/artists</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","artists"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"cc8cf4ae-a853-451b-91f0-7df9382ea6ab"},{"name":"Get Artist","id":"2978fc3e-e926-4fe0-ac6e-2fea8cbd6360","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/artists/{{artist_id}}","description":"<p>Endpoint: <code>GET /api/artists/:id</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","artists","{{artist_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"2978fc3e-e926-4fe0-ac6e-2fea8cbd6360"},{"name":"Create Artist","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if ([200, 201].includes(pm.response.code)) {","  pm.environment.set('artist_id', pm.response.json().artist.id);","}"],"id":"6a881f32-eec3-480b-96f0-72ff855a5a02"}}],"id":"c287cd36-ffce-45a2-9149-8d145a26368b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"artist\": {\n    \"title\": \"Radmin API Artist\"\n  }\n}"},"url":"{{radmin_url}}/api/artists","description":"<p>Endpoint: <code>POST /api/artists</code></p>\n<p>Creates an artist. To attach a cover image, pass <code>cover_image_url</code> in JSON or use multipart <code>artist[cover_image][picture]</code> / <code>band[cover_image][picture]</code>. <code>image_logs_attributes</code> is optional metadata.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","artists"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"c287cd36-ffce-45a2-9149-8d145a26368b"},{"name":"Create Artist With Image URL","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if ([200, 201].includes(pm.response.code)) {","  pm.environment.set('artist_id', pm.response.json().artist.id);","}"],"id":"34daf244-a4de-46da-af30-21eae221a82c"}}],"id":"84b176ce-8525-4be9-acb3-9840baad8b86","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"artist\": {\n    \"title\": \"Radmin API Artist With Image\",\n    \"cover_image_url\": \"https://example.com/artist-cover.jpg\"\n  }\n}"},"url":"{{radmin_url}}/api/artists","description":"<p>Endpoint: <code>POST /api/artists</code></p>\n<p>Creates an artist and pulls the cover image by URL through CarrierWave. Equivalent nested form field: <code>artist[cover_image][remote_picture_url]</code> or <code>band[cover_image][remote_picture_url]</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","artists"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"84b176ce-8525-4be9-acb3-9840baad8b86"},{"name":"Update Artist","id":"300047d3-9fd9-460c-aacc-acdff72184d5","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"artist\": {\n    \"hometown\": \"Austin, TX\"\n  }\n}"},"url":"{{radmin_url}}/api/artists/{{artist_id}}","description":"<p>Endpoint: <code>PUT /api/artists/:id</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","artists","{{artist_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"300047d3-9fd9-460c-aacc-acdff72184d5"},{"name":"Update Artist With Image URL","id":"7a52e9f4-f578-4b11-a2fc-e1dc779febd2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"artist\": {\n    \"cover_image_url\": \"https://example.com/updated-artist-cover.jpg\"\n  }\n}"},"url":"{{radmin_url}}/api/artists/{{artist_id}}","description":"<p>Endpoint: <code>PUT /api/artists/:id</code></p>\n<p>Replaces the artist cover image by URL. Multipart <code>artist[cover_image][picture]</code> or <code>band[cover_image][picture]</code> is also supported; <code>image_logs_attributes</code> is optional metadata.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","artists","{{artist_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"7a52e9f4-f578-4b11-a2fc-e1dc779febd2"}],"id":"49d53ad2-9111-450d-ac2e-b603c91bd407","_postman_id":"49d53ad2-9111-450d-ac2e-b603c91bd407","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}}},{"name":"Pages","item":[{"name":"List Pages","id":"df81b0d1-8079-4867-a692-b3b349b78036","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/pages","description":"<p>Endpoint: <code>GET /api/pages</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","pages"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"df81b0d1-8079-4867-a692-b3b349b78036"},{"name":"Get Page","id":"3ab1fb1e-13ef-4500-8782-443ec3b60561","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/pages/{{page_id}}","description":"<p>Endpoint: <code>GET /api/pages/:id</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","pages","{{page_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"3ab1fb1e-13ef-4500-8782-443ec3b60561"},{"name":"Create Page","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if ([200, 201].includes(pm.response.code)) {","  pm.environment.set('page_id', pm.response.json().page.id);","}"],"id":"ef84f1d4-a8b3-4a2a-aebd-4a305bab22b7"}}],"id":"e0eccf46-c964-43e5-a791-b4fc79c25bff","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"page\": {\n    \"title\": \"Radmin API Page\",\n    \"uri\": \"radmin-api-page\",\n    \"content\": \"Created through the radmin API.\",\n    \"custom_css\": \".radmin-api-page { color: #222; }\",\n    \"custom_js\": \"console.log('Radmin API page');\"\n  }\n}"},"url":"{{radmin_url}}/api/pages","description":"<p>Endpoint: <code>POST /api/pages</code></p>\n<p>Creates a page in the active metro. Supports <code>title</code>, <code>uri</code>, <code>content</code>, <code>custom_css</code>, and <code>custom_js</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","pages"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"e0eccf46-c964-43e5-a791-b4fc79c25bff"},{"name":"Update Page","id":"065f302b-0991-4fc8-afcb-17b4132aaf23","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"page\": {\n    \"content\": \"Updated through the radmin API.\",\n    \"custom_css\": \".radmin-api-page { color: #444; }\",\n    \"custom_js\": \"console.log('Updated Radmin API page');\"\n  }\n}"},"url":"{{radmin_url}}/api/pages/{{page_id}}","description":"<p>Endpoint: <code>PUT /api/pages/:id</code></p>\n<p>Updates page content and optional custom code fields. Supported custom code fields are <code>custom_css</code> and <code>custom_js</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","pages","{{page_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"065f302b-0991-4fc8-afcb-17b4132aaf23"},{"name":"Delete Page","id":"72c9df61-4230-42fa-abbd-15ba3dc5e31c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/pages/{{page_id}}","description":"<p>Endpoint: <code>DELETE /api/pages/:id</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","pages","{{page_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"72c9df61-4230-42fa-abbd-15ba3dc5e31c"}],"id":"d4cacaf7-1616-4588-9bd8-8bab491ee4b2","_postman_id":"d4cacaf7-1616-4588-9bd8-8bab491ee4b2","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}}},{"name":"Categories","item":[{"name":"List Categories","id":"f3383398-f7d6-4ab7-a4e6-26e4b68cb17d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/categories","description":"<p>Endpoint: <code>GET /api/categories</code></p>\n<p>Lists categories for the active metro. Optional filters: <code>kind=event|events|venue|venues</code>, <code>conference_id</code>, <code>query</code>, and <code>title</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","categories"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"f3383398-f7d6-4ab7-a4e6-26e4b68cb17d"},{"name":"List Event Categories","id":"95f76db5-2bdb-4dc2-8408-fe9801fa841a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/categories?kind=events","description":"<p>Endpoint: <code>GET /api/categories?kind=events</code></p>\n<p>Lists event categories for the active metro.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","categories"],"host":["{{radmin_url}}"],"query":[{"key":"kind","value":"events"}],"variable":[]}},"response":[],"_postman_id":"95f76db5-2bdb-4dc2-8408-fe9801fa841a"},{"name":"List Venue Categories","id":"5ec70109-1ae6-4e2e-a4c3-2a7a408073f7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/categories?kind=venues","description":"<p>Endpoint: <code>GET /api/categories?kind=venues</code></p>\n<p>Lists venue categories for the active metro.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","categories"],"host":["{{radmin_url}}"],"query":[{"key":"kind","value":"venues"}],"variable":[]}},"response":[],"_postman_id":"5ec70109-1ae6-4e2e-a4c3-2a7a408073f7"},{"name":"Get Category","id":"418fd37a-6884-48a0-8ef8-656e1c3cf2a8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/categories/{{category_id}}","description":"<p>Endpoint: <code>GET /api/categories/:id</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","categories","{{category_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"418fd37a-6884-48a0-8ef8-656e1c3cf2a8"},{"name":"Create Event Category","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if ([200, 201].includes(pm.response.code)) {","  var category = pm.response.json().category;","  pm.environment.set('category_id', category.id);","  pm.environment.set('event_category_id', category.id);","}"],"id":"21600058-c2fc-4e80-b4f4-945dc746a804"}}],"id":"e685e9d4-5da7-4d15-ae79-15166f32f7b3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"category\": {\n    \"title\": \"Radmin API Event Category\",\n    \"for_venue\": false,\n    \"is_hidden\": false\n  }\n}"},"url":"{{radmin_url}}/api/categories","description":"<p>Endpoint: <code>POST /api/categories</code></p>\n<p>Creates an event category in the active metro. Use <code>for_venue: false</code> for event categories.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","categories"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"e685e9d4-5da7-4d15-ae79-15166f32f7b3"},{"name":"Create Venue Category","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if ([200, 201].includes(pm.response.code)) {","  var category = pm.response.json().category;","  pm.environment.set('category_id', category.id);","  pm.environment.set('venue_category_id', category.id);","}"],"id":"3094f13f-13f5-43eb-a6a2-b8b557f54ac4"}}],"id":"03061d14-4346-4b7d-beba-995ab453172b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"category\": {\n    \"title\": \"Radmin API Venue Category\",\n    \"for_venue\": true,\n    \"is_hidden\": false\n  }\n}"},"url":"{{radmin_url}}/api/categories","description":"<p>Endpoint: <code>POST /api/categories</code></p>\n<p>Creates a venue category in the active metro. Use <code>for_venue: true</code> for venue categories.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","categories"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"03061d14-4346-4b7d-beba-995ab453172b"},{"name":"Update Category","id":"877c642b-f46f-4127-afcc-969602173a06","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"category\": {\n    \"title\": \"Updated Radmin API Category\",\n    \"is_hidden\": false\n  }\n}"},"url":"{{radmin_url}}/api/categories/{{category_id}}","description":"<p>Endpoint: <code>PUT /api/categories/:id</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","categories","{{category_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"877c642b-f46f-4127-afcc-969602173a06"},{"name":"Delete Category","id":"e343e1e9-9373-416c-a067-375a1912b2e8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/categories/{{category_id}}","description":"<p>Endpoint: <code>DELETE /api/categories/:id</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","categories","{{category_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"e343e1e9-9373-416c-a067-375a1912b2e8"}],"id":"2ce12e9f-2abf-45f4-a602-d92e6d4e5ea9","_postman_id":"2ce12e9f-2abf-45f4-a602-d92e6d4e5ea9","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}}},{"name":"URL Redirects","item":[{"name":"List URL Redirects","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if (pm.response.code === 200) {","  var redirects = pm.response.json().url_redirects || [];","  if (redirects.length) {","    pm.environment.set('url_redirect_id', redirects[0].id);","  }","}"],"id":"95cd8120-f931-4d30-bf5b-e3a1b8ca8e7a"}}],"id":"4709c501-fb29-4cd6-9fdc-077ed99c0d4b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/url_redirects","description":"<p>Endpoint: <code>GET /api/url_redirects</code></p>\n<p>Lists URL redirects for the active metro. Requires a superuser token.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","url_redirects"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"4709c501-fb29-4cd6-9fdc-077ed99c0d4b"},{"name":"Get URL Redirect","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if (pm.response.code === 200) {","  pm.environment.set('url_redirect_id', pm.response.json().url_redirect.id);","}"],"id":"92dc08f7-e8b3-46a8-a63a-5bcb89ff8069"}}],"id":"c2afb77d-1a41-4d31-a3af-46e71f140e4d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/url_redirects/{{url_redirect_id}}","description":"<p>Endpoint: <code>GET /api/url_redirects/:id</code></p>\n<p>Returns one active-metro URL redirect.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","url_redirects","{{url_redirect_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"c2afb77d-1a41-4d31-a3af-46e71f140e4d"},{"name":"Create URL Redirect","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if ([200, 201].includes(pm.response.code)) {","  pm.environment.set('url_redirect_id', pm.response.json().url_redirect.id);","}"],"id":"6a1f4a42-5cb6-4f65-bb38-23c123c9167c"}}],"id":"c4b229e8-065a-4b96-97aa-c2ee81b8ca67","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"url_redirect\": {\n    \"origin\": \"https://example.com/old-path\",\n    \"destination\": \"https://example.com/new-path\",\n    \"status_code\": 301\n  }\n}"},"url":"{{radmin_url}}/api/url_redirects","description":"<p>Endpoint: <code>POST /api/url_redirects</code></p>\n<p>Creates an unpublished URL redirect for the active metro. <code>origin</code> and <code>destination</code> must be URL-shaped values. <code>origin</code> is unique within the active metro. The API ignores <code>live</code>; publish through <code>POST /api/url_redirects/:id/publish</code> or <code>POST /api/url_redirects/publish</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","url_redirects"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"c4b229e8-065a-4b96-97aa-c2ee81b8ca67"},{"name":"Update URL Redirect","id":"ac7e679e-be02-4c3d-816a-b6a259d8eca3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"url_redirect\": {\n    \"destination\": \"https://example.com/updated-path\",\n    \"status_code\": 302\n  }\n}"},"url":"{{radmin_url}}/api/url_redirects/{{url_redirect_id}}","description":"<p>Endpoint: <code>PUT /api/url_redirects/:id</code></p>\n<p>Updates an active-metro URL redirect. If the redirect is already live, changing <code>origin</code> or <code>destination</code> refreshes the Redis cache through the existing model callback.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","url_redirects","{{url_redirect_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"ac7e679e-be02-4c3d-816a-b6a259d8eca3"},{"name":"Publish URL Redirect","id":"1d0ad96d-29db-44b2-a1b8-309de454e616","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/url_redirects/{{url_redirect_id}}/publish","description":"<p>Endpoint: <code>POST /api/url_redirects/:id/publish</code></p>\n<p>Publishes one redirect by writing its Redis key and marking the record <code>live</code> when the write succeeds.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","url_redirects","{{url_redirect_id}}","publish"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"1d0ad96d-29db-44b2-a1b8-309de454e616"},{"name":"Publish All URL Redirects","id":"478f7d2e-2d66-4bd6-96e8-4741dc050671","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/url_redirects/publish","description":"<p>Endpoint: <code>POST /api/url_redirects/publish</code></p>\n<p>Publishes all unpublished URL redirects for the active metro.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","url_redirects","publish"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"478f7d2e-2d66-4bd6-96e8-4741dc050671"},{"name":"Delete URL Redirect","id":"1c659841-0fe9-4361-bf70-0ea1b93919db","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/url_redirects/{{url_redirect_id}}","description":"<p>Endpoint: <code>DELETE /api/url_redirects/:id</code></p>\n<p>Deletes one active-metro URL redirect. Existing model callbacks remove the Redis key.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","url_redirects","{{url_redirect_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"1c659841-0fe9-4361-bf70-0ea1b93919db"}],"id":"c7ae3230-0e4c-46af-bcbb-887bb31b62f9","description":"<h1 id=\"url-redirects\">URL Redirects</h1>\n<p>URL redirects are superuser-only and scoped to the active metro from <code>DS-METRO-ID</code>. Create or update the database record first, then publish it so radmin writes the Redis redirect entry and marks the record <code>live</code>. The API does not accept <code>live</code> on create/update; use the publish endpoints instead.</p>\n<p>The normal lifecycle is:</p>\n<ol>\n<li>Create a redirect with <code>POST /api/url_redirects</code>. This stores <code>origin</code>, <code>destination</code>, and <code>status_code</code> in the database with <code>live: false</code>.</li>\n<li>Review or update it while unpublished with <code>GET /api/url_redirects/:id</code> and <code>PUT /api/url_redirects/:id</code>.</li>\n<li>Publish one redirect with <code>POST /api/url_redirects/:id/publish</code>, or publish all unpublished redirects for the active metro with <code>POST /api/url_redirects/publish</code>.</li>\n<li>After publish succeeds, radmin stores the Redis key <code>url-redirect:&lt;metro-domain&gt;:&lt;origin&gt;</code> pointing at <code>destination</code> and marks the record <code>live: true</code>.</li>\n</ol>\n<p>When a live redirect's <code>origin</code> or <code>destination</code> changes, the existing model callback removes the old Redis key and writes the new one. Deleting a redirect removes its Redis key. <code>origin</code> must be unique within a metro. The same origin can exist in another metro, but a duplicate origin for the same <code>DS-METRO-ID</code> returns <code>422</code>.</p>\n","_postman_id":"c7ae3230-0e4c-46af-bcbb-887bb31b62f9","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}}},{"name":"Collections","item":[{"name":"List Collection Groups","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if (pm.response.code === 200) {","  var groups = pm.response.json() || [];","  if (groups.length) {","    pm.environment.set('collection_group_id', groups[0].id);","  }","}"],"id":"c2bb1178-9ceb-42cc-bb1c-cacc745d4c57"}}],"id":"a21d6493-4064-4d22-892b-d736d5a41f8c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/collection_groups","description":"<p>Endpoint: <code>GET /api/collection_groups</code></p>\n<p>Returns collection groups and their nested collections for the active metro context.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","collection_groups"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"a21d6493-4064-4d22-892b-d736d5a41f8c"},{"name":"Get Collection Group","id":"3becd2ec-93fe-4907-a79a-6c46e7a0890a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/collection_groups/{{collection_group_id}}","description":"<p>Endpoint: <code>GET /api/collection_groups/:id</code></p>\n<p>Returns one collection group with nested collections.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","collection_groups","{{collection_group_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"3becd2ec-93fe-4907-a79a-6c46e7a0890a"},{"name":"Create Collection Group","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if ([200, 201].includes(pm.response.code)) {","  pm.environment.set('collection_group_id', pm.response.json().collection_group.id);","}"],"id":"26e369ce-94eb-40ad-9373-7d63c6021c97"}}],"id":"df7fa143-924e-4d66-b258-edd313312665","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"collection_group\": {\n    \"title\": \"Radmin API Collection Group\",\n    \"slug\": \"radmin-api-collection-group\",\n    \"key\": \"radmin-api-group\",\n    \"layout\": \"carousel\",\n    \"active\": true\n  }\n}"},"url":"{{radmin_url}}/api/collection_groups","description":"<p>Endpoint: <code>POST /api/collection_groups</code></p>\n<p>Creates a collection group in the active metro. <code>metro_id</code> is set from <code>DS-METRO-ID</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","collection_groups"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"df7fa143-924e-4d66-b258-edd313312665"},{"name":"Update Collection Group","id":"c37ade87-9c9a-4e8f-a435-d892fa915223","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"collection_group\": {\n    \"title\": \"Updated Radmin API Collection Group\",\n    \"layout\": \"vertical\",\n    \"active\": true\n  }\n}"},"url":"{{radmin_url}}/api/collection_groups/{{collection_group_id}}","description":"<p>Endpoint: <code>PUT /api/collection_groups/:id</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","collection_groups","{{collection_group_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"c37ade87-9c9a-4e8f-a435-d892fa915223"},{"name":"Reorder Group Collections","id":"c90dfeba-3298-42b5-8426-a028b8bcf8c1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"collection_ids\": [\"{{collection_id}}\"]\n}"},"url":"{{radmin_url}}/api/collection_groups/{{collection_group_id}}/positions","description":"<p>Endpoint: <code>POST /api/collection_groups/:id/positions</code></p>\n<p>Reorders collections inside a group. Send <code>collection_ids</code> in the desired order.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","collection_groups","{{collection_group_id}}","positions"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"c90dfeba-3298-42b5-8426-a028b8bcf8c1"},{"name":"List Collections In Group","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if (pm.response.code === 200) {","  var collections = pm.response.json() || [];","  if (collections.length) {","    pm.environment.set('collection_id', collections[0].id);","  }","}"],"id":"aa3c2bda-08d1-4cef-b1cf-ea16703c616d"}}],"id":"db2e6dbb-7d64-42b1-bd54-1e9e36644fbd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/collection_groups/{{collection_group_id}}/collections","description":"<p>Endpoint: <code>GET /api/collection_groups/:collection_group_id/collections</code></p>\n<p>Lists collections nested under a collection group.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","collection_groups","{{collection_group_id}}","collections"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"db2e6dbb-7d64-42b1-bd54-1e9e36644fbd"},{"name":"Get Collection","id":"5ea98a02-b4da-4a41-bee2-84394a7d09df","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/collection_groups/{{collection_group_id}}/collections/{{collection_id}}","description":"<p>Endpoint: <code>GET /api/collection_groups/:collection_group_id/collections/:id</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","collection_groups","{{collection_group_id}}","collections","{{collection_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"5ea98a02-b4da-4a41-bee2-84394a7d09df"},{"name":"Create All Events Collection","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if ([200, 201].includes(pm.response.code)) {","  pm.environment.set('collection_id', pm.response.json().collection.id);","}"],"id":"e2cb105b-911b-48c5-b8e0-bd22457cf112"}}],"id":"bb5d2138-7ba6-4af5-9077-734f36755202","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"collection\": {\n    \"title\": \"Radmin API All Events\",\n    \"slug\": \"radmin-api-all-events\",\n    \"key\": \"radmin-api-all-events\",\n    \"content_type\": \"all_events\",\n    \"layout\": \"carousel\",\n    \"active\": true,\n    \"query_config\": {\n      \"limit\": 10,\n      \"sort\": {\n        \"field\": \"popularity\",\n        \"direction\": \"desc\"\n      },\n      \"date_range\": {\n        \"type\": \"none\"\n      }\n    }\n  }\n}"},"url":"{{radmin_url}}/api/collection_groups/{{collection_group_id}}/collections","description":"<p>Endpoint: <code>POST /api/collection_groups/:collection_group_id/collections</code></p>\n<p>Creates an automatic all-events collection. <code>position</code> and <code>metro_id</code> are set by radmin.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","collection_groups","{{collection_group_id}}","collections"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"bb5d2138-7ba6-4af5-9077-734f36755202"},{"name":"Create Curated Collection","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if ([200, 201].includes(pm.response.code)) {","  pm.environment.set('collection_id', pm.response.json().collection.id);","}"],"id":"9a4b09e1-15b9-42bc-9d20-98461659e228"}}],"id":"437bd244-fc72-446d-b0ce-6829384ec57d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"collection\": {\n    \"title\": \"Radmin API Curated Collection\",\n    \"slug\": \"radmin-api-curated-collection\",\n    \"key\": \"radmin-api-curated\",\n    \"content_type\": \"curated\",\n    \"layout\": \"carousel\",\n    \"active\": true,\n    \"collection_items_attributes\": [\n      {\n        \"target_type\": \"Event\",\n        \"target_id\": \"{{event_id}}\",\n        \"position\": 1,\n        \"_destroy\": false\n      }\n    ]\n  }\n}"},"url":"{{radmin_url}}/api/collection_groups/{{collection_group_id}}/collections","description":"<p>Endpoint: <code>POST /api/collection_groups/:collection_group_id/collections</code></p>\n<p>Creates a curated collection. Curated items are passed as <code>collection_items_attributes</code> with <code>target_type</code>, <code>target_id</code>, <code>position</code>, and optional <code>_destroy</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","collection_groups","{{collection_group_id}}","collections"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"437bd244-fc72-446d-b0ce-6829384ec57d"},{"name":"Update Collection","id":"c5e1171a-c740-4d73-9664-823dcd15ae17","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"collection\": {\n    \"title\": \"Updated Radmin API Collection\",\n    \"layout\": \"grid\",\n    \"active\": true\n  }\n}"},"url":"{{radmin_url}}/api/collection_groups/{{collection_group_id}}/collections/{{collection_id}}","description":"<p>Endpoint: <code>PUT /api/collection_groups/:collection_group_id/collections/:id</code></p>\n<p>Updates a nested collection. For curated collections, send <code>collection_items_attributes</code> to add, reorder, revive, or remove curated items.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","collection_groups","{{collection_group_id}}","collections","{{collection_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"c5e1171a-c740-4d73-9664-823dcd15ae17"},{"name":"Delete Collection","id":"4ff1282d-aa82-489a-ab2a-ebc269bee547","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/collection_groups/{{collection_group_id}}/collections/{{collection_id}}","description":"<p>Endpoint: <code>DELETE /api/collection_groups/:collection_group_id/collections/:id</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","collection_groups","{{collection_group_id}}","collections","{{collection_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"4ff1282d-aa82-489a-ab2a-ebc269bee547"},{"name":"Delete Collection Group","id":"be0b81a0-52e9-4ee5-a0dc-18bae6439717","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/collection_groups/{{collection_group_id}}","description":"<p>Endpoint: <code>DELETE /api/collection_groups/:id</code></p>\n<p>Deletes a collection group and its nested collections.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","collection_groups","{{collection_group_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"be0b81a0-52e9-4ee5-a0dc-18bae6439717"}],"id":"90cc6c5d-edfc-4037-8f5b-55a82faac3a1","description":"<h1 id=\"🗂️-collections\">🗂️ Collections</h1>\n<p>Collections are the radmin-managed configuration that powers radmin-v2 collection groups and DoXYZ runtime collection responses.</p>\n<h2 id=\"how-the-pieces-fit\">How The Pieces Fit</h2>\n<ul>\n<li>A <code>collection_group</code> is the top-level container. It has a <code>key</code>, display metadata, and an ordered list of nested collections.</li>\n<li>A <code>collection</code> describes one lane of content inside the group. It controls title, slug, key, layout, active state, content type, identity IDs, and query config.</li>\n<li>Radmin writes the configuration. DoXYZ reads active groups by <code>key</code>, preloads active collections in <code>position</code> order, builds an Elasticsearch <code>_msearch</code> request, and merges the returned hits back into a group/collections/items response.</li>\n<li>The ES runtime currently targets indexes such as <code>events_search_v1</code>, <code>venues_v1</code>, <code>bands_v1</code>, and <code>users_v1</code>, depending on the collection type or curated target type.</li>\n</ul>\n<h2 id=\"collection-types\">Collection Types</h2>\n<ul>\n<li><code>all_events</code>: event-backed collection using query config filters and sorting.</li>\n<li><code>venue</code>: event-backed collection filtered to <code>venue.id</code>.</li>\n<li><code>band</code>: event-backed collection filtered through nested <code>bands.id</code>.</li>\n<li><code>promo_user</code>: event-backed collection filtered by <code>promo_user_ids</code>.</li>\n<li><code>tastemaker</code>: event-backed collection filtered by <code>tastemaker_ids</code>.</li>\n<li><code>query</code>: raw ES query JSON stored in <code>query_json</code>.</li>\n<li><code>curated</code>: explicit ordered items. Send <code>collection_items_attributes</code> with <code>target_type</code>, <code>target_id</code>, <code>position</code>, and optional <code>_destroy</code>.</li>\n</ul>\n<h2 id=\"practical-notes\">Practical Notes</h2>\n<ul>\n<li><code>DS-METRO-ID</code> supplies metro context; do not put <code>metro_id</code> in request bodies.</li>\n<li>Radmin sets collection group and collection <code>metro_id</code> from the active property.</li>\n<li>Radmin sets a new collection position to the end of its group.</li>\n<li>Use <code>POST /api/collection_groups/:id/positions</code> to reorder collections inside a group.</li>\n<li>There is no standalone collection-item controller in this Postman collection. Manage curated items through collection create/update payloads.</li>\n</ul>\n","_postman_id":"90cc6c5d-edfc-4037-8f5b-55a82faac3a1","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}}},{"name":"Events","item":[{"name":"List Events","id":"e6cdd06c-98fd-41e8-9887-e2fa23c90cff","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/events","description":"<p>Endpoint: <code>GET /api/events</code></p>\n<p>Lists approved events for the active metro. Optional filters: <code>venue_id</code>, <code>scraper_id</code>, and <code>artist_id</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","events"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"e6cdd06c-98fd-41e8-9887-e2fa23c90cff"},{"name":"List Events By Venue","id":"e35e931a-c229-455f-854f-6ea408cbd8f6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/events?venue_id={{venue_id}}","description":"<p>Endpoint: <code>GET /api/events?venue_id=:venue_id</code></p>\n<p>Lists approved active-metro events for a venue. Equivalent nested route: <code>GET /api/venues/:id/events</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","events"],"host":["{{radmin_url}}"],"query":[{"key":"venue_id","value":"{{venue_id}}"}],"variable":[]}},"response":[],"_postman_id":"e35e931a-c229-455f-854f-6ea408cbd8f6"},{"name":"List Events By Scraper","id":"c31294af-acd9-4b80-a3f7-c210fbc924df","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/events?scraper_id={{scraper_id}}","description":"<p>Endpoint: <code>GET /api/events?scraper_id=:scraper_id</code></p>\n<p>Lists approved active-metro events created from scrapes associated with the scraper.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","events"],"host":["{{radmin_url}}"],"query":[{"key":"scraper_id","value":"{{scraper_id}}"}],"variable":[]}},"response":[],"_postman_id":"c31294af-acd9-4b80-a3f7-c210fbc924df"},{"name":"List Events By Artist","id":"e28e4da6-2ea5-42a7-aed9-82d03b1e6ceb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/events?artist_id={{artist_id}}","description":"<p>Endpoint: <code>GET /api/events?artist_id=:artist_id</code></p>\n<p>Lists approved active-metro events whose lineup includes the artist/band id.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","events"],"host":["{{radmin_url}}"],"query":[{"key":"artist_id","value":"{{artist_id}}"}],"variable":[]}},"response":[],"_postman_id":"e28e4da6-2ea5-42a7-aed9-82d03b1e6ceb"},{"name":"Get Event","id":"b83cc57a-1caf-4ae9-8e1c-51a43c3c9b11","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/events/{{event_id}}","description":"<p>Endpoint: <code>GET /api/events/:id</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","events","{{event_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"b83cc57a-1caf-4ae9-8e1c-51a43c3c9b11"},{"name":"Vote On Event For User","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if ([200, 201].includes(pm.response.code)) {","  pm.environment.set('vote_id', pm.response.json().vote.id);","}"],"id":"f581653e-8771-40a0-8066-7efb18beb0d1"}}],"id":"b730af90-3334-4aec-b628-97ed787dc043","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"user_id\": \"{{user_id}}\"\n}"},"url":"{{radmin_url}}/api/events/{{event_id}}/votes","description":"<p>Endpoint: <code>POST /api/events/:event_id/votes</code></p>\n<p>Creates a vote on the active-metro event for a specific user id. Body accepts either top-level <code>user_id</code> or nested <code>vote.user_id</code>. Response includes <code>created: true</code> with HTTP 201 for a new vote, or <code>created: false</code> with HTTP 200 when the user already voted on the event.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","events","{{event_id}}","votes"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"b730af90-3334-4aec-b628-97ed787dc043"},{"name":"Create Event","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if ([200, 201].includes(pm.response.code)) {","  pm.environment.set('event_id', pm.response.json().event.id);","}"],"id":"306240fd-d91b-4be6-8941-1f366283cad7"}}],"id":"1137e037-5b3d-4419-93ce-4e80194a6c8e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event\": {\n    \"title\": \"Radmin API Event\",\n    \"permalink\": \"radmin-api-event\",\n    \"presented_by\": \"DoStuff\",\n    \"begin_date\": \"2026-06-01\",\n    \"begin_time\": \"2026-06-01T20:00:00Z\",\n    \"end_date\": \"2026-06-01\",\n    \"end_time\": \"2026-06-01T23:00:00Z\",\n    \"venue_id\": \"{{venue_id}}\",\n    \"category_id\": \"{{event_category_id}}\",\n    \"band_ids\": [\"{{artist_id}}\"],\n    \"description\": \"Created through the radmin API.\",\n    \"keywords\": \"api, test\",\n    \"event_setting_attributes\": {\n      \"event_type\": \"single_day\",\n      \"show_in_main_listings\": true,\n      \"free_event\": false,\n      \"disable_alerts\": false,\n      \"vanity\": \"radmin-api-event\"\n    }\n  }\n}"},"url":"{{radmin_url}}/api/events","description":"<p>Endpoint: <code>POST /api/events</code></p>\n<p>Creates an approved event in the active metro. Required event fields mirror the radmin form: <code>title</code>, <code>venue_id</code>, <code>category_id</code>, <code>begin_date</code>, <code>begin_time</code>, and <code>event_setting_attributes.event_type</code>. Use <code>band_ids</code> to create the event lineup. Vanity URLs are managed through the has-one event setting: JSON clients can send <code>event.event_setting_attributes.vanity</code>; form or multipart clients can send <code>event[event_setting_attributes][vanity]</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","events"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"1137e037-5b3d-4419-93ce-4e80194a6c8e"},{"name":"Create Event With Image URLs","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if ([200, 201].includes(pm.response.code)) {","  pm.environment.set('event_id', pm.response.json().event.id);","}"],"id":"33de3ca3-ad4d-4d8b-98b1-cd8b15f3affa"}}],"id":"c97f7ec6-60ee-443a-96bf-ba4ceb441301","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event\": {\n    \"title\": \"Radmin API Remote Image Event\",\n    \"permalink\": \"radmin-api-remote-image-event\",\n    \"begin_date\": \"2026-06-01\",\n    \"begin_time\": \"2026-06-01T20:00:00Z\",\n    \"venue_id\": \"{{venue_id}}\",\n    \"category_id\": \"{{event_category_id}}\",\n    \"band_ids\": [\"{{artist_id}}\"],\n    \"cover_image_url\": \"https://example.com/cover.jpg\",\n    \"poster_image_url\": \"https://example.com/poster.jpg\",\n    \"share_image_url\": \"https://example.com/share.jpg\",\n    \"event_setting_attributes\": {\n      \"event_type\": \"single_day\",\n      \"show_in_main_listings\": true\n    }\n  }\n}"},"url":"{{radmin_url}}/api/events","description":"<p>Endpoint: <code>POST /api/events</code></p>\n<p>Creates an event and pulls images by URL through CarrierWave. Use <code>cover_image_url</code>, <code>poster_image_url</code>, and <code>share_image_url</code>; the API maps those to nested <code>remote_picture_url</code> image params.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","events"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"c97f7ec6-60ee-443a-96bf-ba4ceb441301"},{"name":"Create Event With Multipart Images","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if ([200, 201].includes(pm.response.code)) {","  pm.environment.set('event_id', pm.response.json().event.id);","}"],"id":"98c61ecd-acac-4ee6-a860-18034a080866"}}],"id":"0071fb5d-ec64-4baf-99d1-83e693de6633","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"body":{"mode":"formdata","formdata":[{"key":"event[title]","value":"Radmin API Image Event","type":"text"},{"key":"event[permalink]","value":"radmin-api-image-event","type":"text"},{"key":"event[begin_date]","value":"2026-06-01","type":"text"},{"key":"event[begin_time(4i)]","value":"20","type":"text"},{"key":"event[begin_time(5i)]","value":"00","type":"text"},{"key":"event[venue_id]","value":"{{venue_id}}","type":"text"},{"key":"event[category_id]","value":"{{event_category_id}}","type":"text"},{"key":"event[event_setting_attributes][event_type]","value":"single_day","type":"text"},{"key":"event[event_setting_attributes][show_in_main_listings]","value":"1","type":"text"},{"key":"event[event_setting_attributes][vanity]","value":"radmin-api-image-event","type":"text"},{"key":"event[cover_image][picture]","type":"file","value":""},{"key":"event[poster_image][picture]","type":"file","value":""},{"key":"event[share_image][picture]","type":"file","value":""},{"key":"event[image_logs_attributes][0][info]","value":"Source and usage permission for the cover image.","type":"text"},{"key":"event[image_logs_attributes][0][image_type]","value":"cover_image","type":"text"},{"key":"event[image_logs_attributes][0][user_id]","value":"{{user_id}}","type":"text"},{"key":"event[image_logs_attributes][0][app]","value":"Radmin","type":"text"},{"key":"event[image_logs_attributes][1][info]","value":"Source and usage permission for the poster image.","type":"text"},{"key":"event[image_logs_attributes][1][image_type]","value":"poster_image","type":"text"},{"key":"event[image_logs_attributes][1][user_id]","value":"{{user_id}}","type":"text"},{"key":"event[image_logs_attributes][1][app]","value":"Radmin","type":"text"},{"key":"event[image_logs_attributes][2][info]","value":"Source and usage permission for the share image.","type":"text"},{"key":"event[image_logs_attributes][2][image_type]","value":"share_image","type":"text"},{"key":"event[image_logs_attributes][2][user_id]","value":"{{user_id}}","type":"text"},{"key":"event[image_logs_attributes][2][app]","value":"Radmin","type":"text"},{"key":"gigs[band_id][]","value":"{{artist_id}}","type":"text"}]},"url":"{{radmin_url}}/api/events","description":"<p>Endpoint: <code>POST /api/events</code></p>\n<p>Multipart example for uploading event images with the same field names used by the radmin event form. Use <code>event[cover_image][picture]</code>, <code>event[poster_image][picture]</code>, or <code>event[share_image][picture]</code>. The matching <code>event[image_logs_attributes]</code> source fields are optional metadata; omit them when you do not need image logs. URL-based uploads can also use nested <code>event[cover_image][remote_picture_url]</code>, <code>event[poster_image][remote_picture_url]</code>, or <code>event[share_image][remote_picture_url]</code>. Vanity URLs use <code>event[event_setting_attributes][vanity]</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","events"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"0071fb5d-ec64-4baf-99d1-83e693de6633"},{"name":"Update Event","id":"6535d50c-6465-483b-b9ac-9d60a391cfd5","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event\": {\n    \"description\": \"Updated through the radmin API.\",\n    \"category_id\": \"{{event_category_id}}\",\n    \"band_ids\": [\"{{artist_id}}\"],\n    \"event_setting_attributes\": {\n      \"vanity\": \"radmin-api-event-updated\"\n    }\n  }\n}"},"url":"{{radmin_url}}/api/events/{{event_id}}","description":"<p>Endpoint: <code>PUT /api/events/:id</code></p>\n<p>Partial updates are supported. Include <code>band_ids</code> only when replacing the event lineup; omitting it leaves existing gigs unchanged. To update an event vanity URL, send nested <code>event_setting_attributes.vanity</code> in JSON or <code>event[event_setting_attributes][vanity]</code> in form/multipart requests. The API updates the existing has-one event setting when the nested <code>id</code> is omitted.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","events","{{event_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"6535d50c-6465-483b-b9ac-9d60a391cfd5"},{"name":"Update Event With Image URLs","id":"df8eb5e5-8379-4038-82dd-1566f6142b10","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event\": {\n    \"cover_image_url\": \"https://example.com/updated-cover.jpg\",\n    \"poster_image_url\": \"https://example.com/updated-poster.jpg\",\n    \"share_image_url\": \"https://example.com/updated-share.jpg\"\n  }\n}"},"url":"{{radmin_url}}/api/events/{{event_id}}","description":"<p>Endpoint: <code>PUT /api/events/:id</code></p>\n<p>Replaces event images by URL through CarrierWave. Any omitted image field is left unchanged.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","events","{{event_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"df8eb5e5-8379-4038-82dd-1566f6142b10"},{"name":"Update Event With Multipart Images","id":"33820a2c-10bc-44b6-a163-5cc25555ce01","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"body":{"mode":"formdata","formdata":[{"key":"event[cover_image][picture]","type":"file","value":""},{"key":"event[poster_image][picture]","type":"file","value":""},{"key":"event[share_image][picture]","type":"file","value":""},{"key":"event[image_logs_attributes][0][info]","value":"Updated source and usage permission for the cover image.","type":"text"},{"key":"event[image_logs_attributes][0][image_type]","value":"cover_image","type":"text"},{"key":"event[image_logs_attributes][0][user_id]","value":"{{user_id}}","type":"text"},{"key":"event[image_logs_attributes][0][app]","value":"Radmin","type":"text"},{"key":"event[image_logs_attributes][1][info]","value":"Updated source and usage permission for the poster image.","type":"text"},{"key":"event[image_logs_attributes][1][image_type]","value":"poster_image","type":"text"},{"key":"event[image_logs_attributes][1][user_id]","value":"{{user_id}}","type":"text"},{"key":"event[image_logs_attributes][1][app]","value":"Radmin","type":"text"},{"key":"event[image_logs_attributes][2][info]","value":"Updated source and usage permission for the share image.","type":"text"},{"key":"event[image_logs_attributes][2][image_type]","value":"share_image","type":"text"},{"key":"event[image_logs_attributes][2][user_id]","value":"{{user_id}}","type":"text"},{"key":"event[image_logs_attributes][2][app]","value":"Radmin","type":"text"}]},"url":"{{radmin_url}}/api/events/{{event_id}}","description":"<p>Endpoint: <code>PUT /api/events/:id</code></p>\n<p>Replaces event images with multipart uploads. Use the same <code>event[cover_image][picture]</code>, <code>event[poster_image][picture]</code>, and <code>event[share_image][picture]</code> fields as create. The matching <code>event[image_logs_attributes]</code> source fields are optional metadata; omit them when you do not need image logs.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","events","{{event_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"33820a2c-10bc-44b6-a163-5cc25555ce01"},{"name":"Check Event Duplicates","id":"d3c9a7d3-e9e7-47cc-af97-f42488ed7082","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event\": {\n    \"title\": \"Radmin API Pending Import\",\n    \"begin_date\": \"2026-06-01\",\n    \"begin_time\": \"2026-06-01T20:00:00Z\",\n    \"venue_id\": \"{{venue_id}}\",\n    \"category_id\": \"{{event_category_id}}\",\n    \"band_ids\": [],\n    \"event_setting\": {\n      \"event_type\": \"single_day\"\n    }\n  }\n}"},"url":"{{radmin_url}}/api/event_dupe_checks","description":"<p>Endpoint: <code>POST /api/event_dupe_checks</code></p>\n<p>Runs radmin's duplicate checks without creating an event. The response reports ignored, obvious duplicate, obvious repeating duplicate, obvious ongoing duplicate, pending replacement, and potential duplicate outcomes. Use <code>potential_dupes</code> from this response as explicit <code>potential_dupe_ids</code> when importing directly to the duplicate queue.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","event_dupe_checks"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"d3c9a7d3-e9e7-47cc-af97-f42488ed7082"},{"name":"Import Event To Pending Queue","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if ([200, 201].includes(pm.response.code)) {","  var json = pm.response.json();","  if (json.event) {","    pm.environment.set('pending_event_id', json.event.id);","  }","}"],"id":"ea956ab4-2dc2-45a8-9f8f-a4d48fe1503b"}}],"id":"a0a7aae1-45de-475f-9cbd-ac423fb71418","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"queue\": \"pending\",\n  \"event\": {\n    \"title\": \"Radmin API Pending Import\",\n    \"permalink\": \"radmin-api-pending-import\",\n    \"begin_date\": \"2026-06-01\",\n    \"begin_time\": \"2026-06-01T20:00:00Z\",\n    \"venue_id\": \"{{venue_id}}\",\n    \"category_id\": \"{{event_category_id}}\",\n    \"band_ids\": [],\n    \"description\": \"Imported directly into pending review.\",\n    \"cover_image_url\": \"https://example.com/cover.jpg\",\n    \"poster_image_url\": \"https://example.com/poster.jpg\",\n    \"event_setting\": {\n      \"event_type\": \"single_day\",\n      \"show_in_main_listings\": true\n    }\n  }\n}"},"url":"{{radmin_url}}/api/event_imports","description":"<p>Endpoint: <code>POST /api/event_imports</code></p>\n<p>Creates an unapproved event for pending or duplicate review. With no <code>queue</code> value, or with <code>queue: \"auto\"</code>, the API uses the scraper-style duplicate detector: the event lands in the normal pending queue when no approved potential duplicate is found and lands in the duplicate queue when the detector finds an approved event with the same metro, begin date, and venue. Use <code>queue: \"pending\"</code> to place the event directly in pending review. Use <code>queue: \"duplicate\"</code> to place it in duplicate review; pass <code>potential_dupe_id</code> / <code>potential_dupe_ids</code> when the caller already knows the approved matches, or omit them and radmin will generate matches from the posted event. Metro context comes from <code>DS-METRO-ID</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","event_imports"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"a0a7aae1-45de-475f-9cbd-ac423fb71418"},{"name":"Import Event To Duplicate Queue","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if ([200, 201].includes(pm.response.code)) {","  var json = pm.response.json();","  if (json.event) {","    pm.environment.set('pending_event_id', json.event.id);","  }","}"],"id":"9d439958-6259-4ef8-a6d4-353abb3fb9a4"}}],"id":"2d33374a-b3be-494f-9a8d-e8cdd8627bf1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"queue\": \"duplicate\",\n  \"potential_dupe_id\": \"{{event_id}}\",\n  \"event\": {\n    \"title\": \"Radmin API Duplicate Import\",\n    \"permalink\": \"radmin-api-duplicate-import\",\n    \"begin_date\": \"2026-06-01\",\n    \"begin_time\": \"2026-06-01T20:00:00Z\",\n    \"venue_id\": \"{{venue_id}}\",\n    \"category_id\": \"{{event_category_id}}\",\n    \"band_ids\": [],\n    \"description\": \"Imported directly into duplicate review.\",\n    \"event_setting\": {\n      \"event_type\": \"single_day\",\n      \"show_in_main_listings\": true\n    }\n  }\n}"},"url":"{{radmin_url}}/api/event_imports","description":"<p>Endpoint: <code>POST /api/event_imports</code></p>\n<p>Direct duplicate placement. If <code>potential_dupe_id</code> or <code>potential_dupe_ids</code> are present, they must point at approved events in the active metro. If omitted, radmin computes potential dupes from the posted event using the same potential-dupe logic as scraper imports. The API creates the <code>EventDupe</code> records used by the duplicate review UI.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","event_imports"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"2d33374a-b3be-494f-9a8d-e8cdd8627bf1"},{"name":"List Pending Queue","event":[{"listen":"test","script":{"type":"text/javascript","exec":["if (pm.response.code === 200) {","  var events = pm.response.json().events || [];","  if (events.length) {","    pm.environment.set('pending_event_id', events[0].id);","  }","}"],"id":"1f99b8d3-af41-4d0d-8aa3-869abd1eeafc"}}],"id":"e9ec9783-7fd5-4389-a980-d96452a897de","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/event_queues/pending","description":"<p>Endpoint: <code>GET /api/event_queues/pending</code></p>\n<p>Lists unapproved non-duplicate pending events for the active metro. If a pending flush is already running, returns HTTP <code>423</code> with <code>error: queue_locked</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","event_queues","pending"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"e9ec9783-7fd5-4389-a980-d96452a897de"},{"name":"List Duplicate Queue","id":"47762d8b-0120-4828-975e-be7e59c3fc2f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/event_queues/duplicates","description":"<p>Endpoint: <code>GET /api/event_queues/duplicates</code></p>\n<p>Lists unapproved pending events that duplicate detection marked as possible duplicates. Responses include the pending event plus likely approved matches. If a duplicate flush is already running, returns HTTP <code>423</code> with <code>error: queue_locked</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","event_queues","duplicates"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"47762d8b-0120-4828-975e-be7e59c3fc2f"},{"name":"Approve Queue Event","id":"2bc3d020-5ea8-427c-b7d6-6175f46033e6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event_id\": \"{{pending_event_id}}\"\n}"},"url":"{{radmin_url}}/api/event_queues/approve","description":"<p>Endpoint: <code>POST /api/event_queues/approve</code></p>\n<p>Approves one pending event. Send <code>event_id</code> for a single event or <code>event_ids</code> for a batch.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","event_queues","approve"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"2bc3d020-5ea8-427c-b7d6-6175f46033e6"},{"name":"Update Event From Pending","id":"d860ac06-80e8-46e8-8e4b-1bf8b44924e7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event_id\": \"{{event_id}}\",\n  \"pending_event_id\": \"{{pending_event_id}}\"\n}"},"url":"{{radmin_url}}/api/event_queues/update_from_pending","description":"<p>Endpoint: <code>POST /api/event_queues/update_from_pending</code></p>\n<p>Applies a pending duplicate event onto an approved event using the same model method as the browser duplicate queue.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","event_queues","update_from_pending"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"d860ac06-80e8-46e8-8e4b-1bf8b44924e7"},{"name":"Flush Pending Queue","id":"397e66cc-7842-48ae-bb22-b361ff5d2c49","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/event_queues/flush_pending","description":"<p>Endpoint: <code>POST /api/event_queues/flush_pending</code></p>\n<p>Queues the existing background flush for all pending non-duplicate events in the active metro. If a pending flush is already running, returns HTTP <code>423</code> with <code>error: queue_locked</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","event_queues","flush_pending"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"397e66cc-7842-48ae-bb22-b361ff5d2c49"},{"name":"Flush Pending Queue Subset","id":"729af1b7-323d-4505-b76c-8937ab7385f6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event_ids\": [\"{{pending_event_id}}\"]\n}"},"url":"{{radmin_url}}/api/event_queues/flush_pending_subset","description":"<p>Endpoint: <code>POST /api/event_queues/flush_pending_subset</code></p>\n<p>Queues the existing background flush for selected pending non-duplicate events. If a pending flush is already running, returns HTTP <code>423</code> with <code>error: queue_locked</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","event_queues","flush_pending_subset"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"729af1b7-323d-4505-b76c-8937ab7385f6"},{"name":"Flush Duplicate Queue","id":"38416820-e696-4474-986a-8525d048e943","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/event_queues/flush_duplicates","description":"<p>Endpoint: <code>POST /api/event_queues/flush_duplicates</code></p>\n<p>Queues the existing background flush for all pending duplicate events in the active metro. If a duplicate flush is already running, returns HTTP <code>423</code> with <code>error: queue_locked</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","event_queues","flush_duplicates"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"38416820-e696-4474-986a-8525d048e943"},{"name":"Flush Duplicate Queue Subset","id":"ee0c0d68-f916-4cb2-a5c5-6d110779bc46","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event_ids\": [\"{{pending_event_id}}\"]\n}"},"url":"{{radmin_url}}/api/event_queues/flush_duplicates_subset","description":"<p>Endpoint: <code>POST /api/event_queues/flush_duplicates_subset</code></p>\n<p>Queues the existing background flush for selected pending duplicate events. If a duplicate flush is already running, returns HTTP <code>423</code> with <code>error: queue_locked</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","event_queues","flush_duplicates_subset"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"ee0c0d68-f916-4cb2-a5c5-6d110779bc46"},{"name":"Delete Event","id":"b2ad6259-fdbd-42cc-8c91-a6a0fcf2dc8e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"DS-METRO-ID","value":"{{metro_id}}"}],"url":"{{radmin_url}}/api/events/{{event_id}}","description":"<p>Endpoint: <code>DELETE /api/events/:id</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}},"urlObject":{"path":["api","events","{{event_id}}"],"host":["{{radmin_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"b2ad6259-fdbd-42cc-8c91-a6a0fcf2dc8e"}],"id":"0fbb4ecf-36da-4ea9-a7a4-c9dd9754a21c","_postman_id":"0fbb4ecf-36da-4ea9-a7a4-c9dd9754a21c","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]},"isInherited":true,"source":{"_postman_id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","id":"d76f92ef-619e-4b9d-94fa-b6f3e152161c","name":"Radmin API","type":"collection"}}}],"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{jwt}}"}]}}}