Creates a route from a name and one route input, and answers 201 with the route. The line is matched or planned in the background: poll GET /custom-routes/{id}/ until route_status is ready.
A Login with Cyclemate access token, or a signed-in rider’s session token. Every route belongs to a rider: your app acts for the rider who connected it, and the route is theirs. Your app reaches only the routes it created: a route the rider made in our apps, or through another app, answers 404.
Authorization: Bearer ACCESS_TOKEN
An API key on its own is rejected, as are anonymous requests. To create routes as your organisation, sign up for a Cyclemate account and connect your app to it with Login with Cyclemate.
Riders and apps acting for them may make 60 requests a minute; a request that routes between stops counts once per hop. Every rider may create 10 routes in any 24 hours, counted across our apps and every connected app: the eleventh answers 429 with code: "daily_limit" and the seconds until a slot frees.
2 to 25 stops as { location: [longitude, latitude], name? }, all in one city. We plan the safest cycling route between them, one leg per hop, and name each stop as given.
Your own line, 1 to 24 legs of { geometry, end_name?, hidden? }. geometry is a GeoJSON LineString; each leg starts within 25 m of the previous leg’s end. The whole route is at most 10,000 coordinates and 200 km and must start and end in the same city. hidden: true marks a shaping point that is not shown as a stop (fixed routes only). Pass start_name for the start.
The link slug: 3 to 60 lowercase letters, digits and hyphens. Route and product names are reserved. Generated from the name when omitted. A taken alias answers 409.
public, unlisted (anyone with the link) or private (hosts only). A route your app creates is unlisted unless you say otherwise, so it stays off the rider’s profile until they choose to share it.
dynamic or fixed. A dynamic route is re-planned between its stops as roads change, so it has no hidden shaping points; geometry and a hidden leg require fixed.
The page theme. Keys: headerFont, headerFlair, headerColor (#rrggbb), headerLayout, backgroundColor, backgroundTexture, animation, stickers (up to 12 of { id, position: { x, y } }). Every value must be one the app offers; an unknown one answers 400 naming it.
ISO 8601. Setting it makes the route a group ride. end_time (after it; derived from the route’s duration when omitted), max_rsvps (0 to 1000) and rsvp_questions are accepted only with a start time.
Up to 20 of { prompt, required, type?, options? }; type is text or choice, and a choice question lists options as { label, limit? }. Ids are generated when omitted and must be sent back unchanged on edit.
distance_m, duration_s, polyline (precision 5), geometry (a GeoJSON LineString; omitted in lists) and stops: the start then every stop in order, each { name, location }, with hidden: true on a shaping point that is not shown as a stop.
pending while we match the line to the road network (a fixed route) or plan it between the stops (a dynamic route), ready once turn-by-turn steps and the safety summary are stored, unavailable when the line could not be matched or no route exists between the stops. A pending route is already viewable and rideable; poll every few seconds.
Each { id, url, status, cover }. status is pending until our image check has run, then approved. Hosts see every image with its status; everyone else sees approved images only.
Send start_time (and optionally end_time, max_rsvps and rsvp_questions). The route becomes a group ride with its own page under /group-rides/, riders can RSVP, and end_time is derived from the route’s duration when you leave it out.
Invalid body or query: the message names the field. code is invalid_body, or for a route input outside_coverage (the route starts outside the cities we cover), cross_city (its stops span two cities) or no_route (no cycling route exists between two stops).
No route with that id that you may see. A private route you do not host, a route you may read but not edit, and a route your app did not create all answer 404, never 403.
{ "error": "Custom route not found", "code": "not_found" }
{ "error": "Internal server error", "code": "internal_error" }
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Cyclemate","colors":{"primary":"#537AEF","light":"#7B9EF4","dark":"#3D5ECC"},"logo":{"light":"https://mintcdn.com/cyclemate/0-MogKEn8FZNgFLp/logo/light.svg?fit=max\u0026auto=format\u0026n=0-MogKEn8FZNgFLp\u0026q=85\u0026s=11a7d1f41156617a1354abcf0b08ab6d","dark":"https://mintcdn.com/cyclemate/0-MogKEn8FZNgFLp/logo/dark.svg?fit=max\u0026auto=format\u0026n=0-MogKEn8FZNgFLp\u0026q=85\u0026s=308278b64102e275f839e60574cee2e6"},"favicon":"https://mintcdn.com/cyclemate/AzVQ1vqplzLFQex5/favicon.png?fit=max\u0026auto=format\u0026n=AzVQ1vqplzLFQex5\u0026q=85\u0026s=ce23a1f00c1f79fefeec2355f73872d5","api":{"playground":{"display":"none"}},"navbar":{"primary":{"type":"button","label":"Go to Cyclemate","href":"https://cyclemate.club"}},"seo":{"metatags":{"charset":"UTF-8","viewport":"width=device-width, initial-scale=1.0","description":"Cyclemate API reference: safe turn-by-turn cycling directions and multi-modal bike-share routing.","keywords":"bike navigation, bike directions, gbfs api, custom routes, group rides, bike routing api","author":"Cyclemate","robots":"index, follow","googlebot":"index, follow","referrer":"origin","rating":"general","language":"en","copyright":"Copyright 2026"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"cyclemate","hasAudioNarration":false,"actualSubdomain":"cyclemate","customDomains":["docs.cyclemate.club"],"gitSource":{"type":"github","owner":"gocyclemate","repo":"cyclemate","deployBranch":"production","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ade703f62312816aa7f07d7","collectionId":"62778c04-213b-4ea1-9b42-4b64fae72a62","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ade703f62312816aa7f07d7"},"entitlements":{},"buildId":"6ade703f62312816aa7f07d7","clientVersion":"0.0.3966","searchFilterCounts":[{"language":"default","tag":"API reference","count":22},{"language":"default","tag":"Custom routes","count":8},{"language":"default","tag":"Routing","count":6},{"language":"default","tag":"Contributions","count":4},{"language":"default","tag":"Getting started","count":3},{"language":"default","tag":"AI assistants","count":1},{"language":"default","tag":"Changelog","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"/* arabic */\n@font-face {\n font-family: 'Fustat';\n font-style: normal;\n font-weight: 700;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/fustat/v4/NaPEcZ_aHO9Iy5thRNqze7YGY9HGCKMXdr65tFo_.woff2) format('woff2');\n unicode-range: U+0600-06FF, U+0750-077F, U+0870-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC7, U+10EC9-10EEE, U+10EF0-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Fustat';\n font-style: normal;\n font-weight: 700;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/fustat/v4/NaPEcZ_aHO9Iy5thRNqze7YGY9HGCKMXdrW5tFo_.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Fustat';\n font-style: normal;\n font-weight: 700;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/fustat/v4/NaPEcZ_aHO9Iy5thRNqze7YGY9HGCKMXdru5tA.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n:root{--cm-rail:rgb(0 0 0 / 0.09);--cm-rail-dot:#537aef;--cm-rail-halo:#ffffff;--cm-tag-fg:#4b5563;--cm-tag-bg:rgb(107 114 128 / 0.12);--cm-tag-border:rgb(0 0 0 / 0.06)}.dark{--cm-rail:rgb(255 255 255 / 0.12);--cm-rail-dot:#7b9ef4;--cm-rail-halo:#0f1115;--cm-tag-fg:#cbd5e1;--cm-tag-bg:rgb(148 163 184 / 0.16);--cm-tag-border:rgb(255 255 255 / 0.08)}.update-container{padding-top:2.25rem;padding-bottom:2.25rem}.update-container+.update-container{border-top:1px solid var(--cm-rail)}@media (min-width:1024px){.update-container+.update-container{border-top:0}.update-container::before{content:'';position:absolute;left:172px;top:0;bottom:0;width:1px;background:var(--cm-rail)}.update-container::after{content:'';position:absolute;left:167.5px;top:2.7rem;width:10px;height:10px;border-radius:9999px;background:var(--cm-rail-dot);box-shadow:0 0 0 4px var(--cm-rail-halo)}.update-container:first-of-type::before{top:2.7rem}.update-container:last-of-type::before{bottom:auto;height:2.7rem}}.update-container div.cursor-pointer{font-size:.9375rem;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:.01em;padding:.25rem .5rem;margin-top:.35rem}.update-container div.flex-wrap,.update-container div.max-w-\\[160px\\]{margin-top:.6rem}.update-container div.max-w-\\[160px\\]{font-size:.8125rem;line-height:1.35}.update-container span.inline-block.rounded-lg{padding:.1rem .5rem;border:1px solid var(--cm-tag-border);border-radius:9999px;background:var(--cm-tag-bg);color:var(--cm-tag-fg);font-size:.75rem;font-weight:600;letter-spacing:.01em;white-space:nowrap}.update-container>div.flex-1 h3{margin-top:0;font-size:1.0625rem;letter-spacing:-.011em}"}],"page":{"pagePath":"api-reference/custom-routes/create-route","slug":"/api-reference/custom-routes/create-route","pageMetadata":{"title":"Create a route","api":"POST /custom-routes/","description":"Create a custom route or group ride and receive it back","href":"/api-reference/custom-routes/create-route"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Create a custom route or group ride and receive it back\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,..._provideComponents(),...props.components},{Accordion,CodeBlock,Heading,ParamField,ResponseField}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!ParamField)_missingMdxReference(`ParamField`,true);if(!ResponseField)_missingMdxReference(`ResponseField`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`overview`,children:`Overview`}),`\n`,_jsxs(_components.p,{children:[`Creates a route from a name and one route input, and answers `,_jsx(_components.code,{children:`201`}),` with the route. The line is matched or planned in the background: poll `,_jsx(_components.a,{href:`/api-reference/custom-routes/get-route`,children:_jsx(_components.code,{children:`GET /custom-routes/{id}/`})}),` until `,_jsx(_components.code,{children:`route_status`}),` is `,_jsx(_components.code,{children:`ready`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`authentication`,children:`Authentication`}),`\n`,_jsxs(_components.p,{children:[`A `,_jsx(_components.a,{href:`/api-reference/oauth`,children:`Login with Cyclemate`}),` access token, or a signed-in rider’s session token. Every route belongs to a rider: your app acts for the rider who connected it, and the route is theirs. Your app reaches only the routes it created: a route the rider made in our apps, or through another app, answers `,_jsx(_components.code,{children:`404`}),`.`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Authorization: Bearer ACCESS_TOKEN`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`An API key on its own is rejected, as are anonymous requests. To create routes as your organisation, sign up for a Cyclemate account and connect your app to it with Login with Cyclemate.`}),`\n`,_jsx(Heading,{level:`3`,id:`rate-limits`,children:`Rate limits`}),`\n`,_jsxs(_components.p,{children:[`Riders and apps acting for them may make `,_jsx(_components.strong,{children:`60 requests a minute`}),`; a request that routes between `,_jsx(_components.code,{children:`stops`}),` counts once per hop. Every rider may create `,_jsx(_components.strong,{children:`10 routes in any 24 hours`}),`, counted across our apps and every connected app: the eleventh answers `,_jsx(_components.code,{children:`429`}),` with `,_jsx(_components.code,{children:`code: \"daily_limit\"`}),` and the seconds until a slot frees.`]}),`\n`,_jsx(Heading,{level:`2`,id:`request-body`,children:`Request body`}),`\n`,_jsx(ParamField,{body:`name`,type:`string`,required:true,id:`param-name`,children:_jsx(_components.p,{children:`1 to 120 characters.`})}),`\n`,_jsxs(_components.p,{children:[`One of `,_jsx(_components.code,{children:`stops`}),`, `,_jsx(_components.code,{children:`legs`}),` or `,_jsx(_components.code,{children:`geometry`}),` is required:`]}),`\n`,_jsx(ParamField,{body:`stops`,type:`array`,id:`param-stops`,children:_jsxs(_components.p,{children:[`2 to 25 stops as `,_jsx(_components.code,{children:`{ location: [longitude, latitude], name? }`}),`, all in one city. We plan the safest cycling route between them, one leg per hop, and name each stop as given.`]})}),`\n`,_jsx(ParamField,{body:`legs`,type:`array`,id:`param-legs`,children:_jsxs(_components.p,{children:[`Your own line, 1 to 24 legs of `,_jsx(_components.code,{children:`{ geometry, end_name?, hidden? }`}),`. `,_jsx(_components.code,{children:`geometry`}),` is a GeoJSON LineString; each leg starts within 25 m of the previous leg’s end. The whole route is at most 10,000 coordinates and 200 km and must start and end in the same city. `,_jsx(_components.code,{children:`hidden: true`}),` marks a shaping point that is not shown as a stop (fixed routes only). Pass `,_jsx(_components.code,{children:`start_name`}),` for the start.`]})}),`\n`,_jsx(ParamField,{body:`geometry`,type:`object`,id:`param-geometry`,children:_jsxs(_components.p,{children:[`A single GeoJSON LineString, the same as one leg. Fixed routes only. `,_jsx(_components.code,{children:`start_name`}),` and `,_jsx(_components.code,{children:`end_name`}),` name its ends.`]})}),`\n`,_jsxs(Accordion,{title:`Optional parameters`,id:`optional-parameters`,children:[_jsx(ParamField,{body:`description`,type:`string`,id:`param-description`,children:_jsx(_components.p,{children:`Up to 4,000 characters.`})}),_jsx(ParamField,{body:`emoji`,type:`string`,default:`🚴`,id:`param-emoji`,children:_jsx(_components.p,{children:`One emoji.`})}),_jsx(ParamField,{body:`alias`,type:`string`,id:`param-alias`,children:_jsxs(_components.p,{children:[`The link slug: 3 to 60 lowercase letters, digits and hyphens. Route and product names are reserved. Generated from the name when omitted. A taken alias answers `,_jsx(_components.code,{children:`409`}),`.`]})}),_jsx(ParamField,{body:`privacy`,type:`string`,default:`unlisted`,id:`param-privacy`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`public`}),`, `,_jsx(_components.code,{children:`unlisted`}),` (anyone with the link) or `,_jsx(_components.code,{children:`private`}),` (hosts only). A route your app creates is `,_jsx(_components.code,{children:`unlisted`}),` unless you say otherwise, so it stays off the rider’s profile until they choose to share it.`]})}),_jsx(ParamField,{body:`route_mode`,type:`string`,default:`dynamic`,id:`param-route-mode`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`dynamic`}),` or `,_jsx(_components.code,{children:`fixed`}),`. A dynamic route is re-planned between its stops as roads change, so it has no hidden shaping points; `,_jsx(_components.code,{children:`geometry`}),` and a hidden leg require `,_jsx(_components.code,{children:`fixed`}),`.`]})}),_jsx(ParamField,{body:`theme`,type:`object`,id:`param-theme`,children:_jsxs(_components.p,{children:[`The page theme. Keys: `,_jsx(_components.code,{children:`headerFont`}),`, `,_jsx(_components.code,{children:`headerFlair`}),`, `,_jsx(_components.code,{children:`headerColor`}),` (`,_jsx(_components.code,{children:`#rrggbb`}),`), `,_jsx(_components.code,{children:`headerLayout`}),`, `,_jsx(_components.code,{children:`backgroundColor`}),`, `,_jsx(_components.code,{children:`backgroundTexture`}),`, `,_jsx(_components.code,{children:`animation`}),`, `,_jsx(_components.code,{children:`stickers`}),` (up to 12 of `,_jsx(_components.code,{children:`{ id, position: { x, y } }`}),`). Every value must be one the app offers; an unknown one answers `,_jsx(_components.code,{children:`400`}),` naming it.`]})}),_jsx(ParamField,{body:`categories`,type:`string[]`,id:`param-categories`,children:_jsxs(_components.p,{children:[`Up to 10 category slugs, for example `,_jsx(_components.code,{children:`coffee`}),`, `,_jsx(_components.code,{children:`park`}),`, `,_jsx(_components.code,{children:`live-music`}),`.`]})}),_jsx(ParamField,{body:`start_time`,type:`string`,id:`param-start-time`,children:_jsxs(_components.p,{children:[`ISO 8601. Setting it makes the route a group ride. `,_jsx(_components.code,{children:`end_time`}),` (after it; derived from the route’s duration when omitted), `,_jsx(_components.code,{children:`max_rsvps`}),` (0 to 1000) and `,_jsx(_components.code,{children:`rsvp_questions`}),` are accepted only with a start time.`]})}),_jsx(ParamField,{body:`rsvp_questions`,type:`array`,id:`param-rsvp-questions`,children:_jsxs(_components.p,{children:[`Up to 20 of `,_jsx(_components.code,{children:`{ prompt, required, type?, options? }`}),`; `,_jsx(_components.code,{children:`type`}),` is `,_jsx(_components.code,{children:`text`}),` or `,_jsx(_components.code,{children:`choice`}),`, and a choice question lists `,_jsx(_components.code,{children:`options`}),` as `,_jsx(_components.code,{children:`{ label, limit? }`}),`. Ids are generated when omitted and must be sent back unchanged on edit.`]})}),_jsx(ParamField,{body:`show_elevation`,type:`boolean`,default:`true`,id:`param-show-elevation`,children:_jsxs(_components.p,{children:[`With `,_jsx(_components.code,{children:`show_safety_colors`}),`, `,_jsx(_components.code,{children:`show_why_this_route`}),` and `,_jsx(_components.code,{children:`show_street_by_street`}),`: which sections the route’s page shows.`]})}),_jsx(ParamField,{body:`start_name`,type:`string`,id:`param-start-name`,children:_jsxs(_components.p,{children:[`With `,_jsx(_components.code,{children:`legs`}),` or `,_jsx(_components.code,{children:`geometry`}),`: the name of the start. With `,_jsx(_components.code,{children:`stops`}),`, name the stops instead.`]})}),_jsx(ParamField,{body:`end_name`,type:`string`,id:`param-end-name`,children:_jsxs(_components.p,{children:[`With `,_jsx(_components.code,{children:`geometry`}),`: the name of the end.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`response-body`,children:`Response body`}),`\n`,_jsx(ResponseField,{name:`id`,type:`string`,id:`param-id`,children:_jsxs(_components.p,{children:[`The route’s id, a UUID string. Pass it as `,_jsx(_components.code,{children:`event_id`}),` to `,_jsx(_components.a,{href:`/api-reference/routing/multimodal`,children:_jsx(_components.code,{children:`POST /multi-modal/v2/`})}),` to ride it.`]})}),`\n`,_jsx(ResponseField,{name:`alias`,type:`string`,id:`param-alias-1`,children:_jsx(_components.p,{children:`The route’s link slug, chosen or generated from the name.`})}),`\n`,_jsx(ResponseField,{name:`url`,type:`string`,id:`param-url`,children:_jsx(_components.p,{children:`The route’s page on cyclemate.club.`})}),`\n`,_jsx(ResponseField,{name:`name`,type:`string`,id:`param-name-1`}),`\n`,_jsx(ResponseField,{name:`description`,type:`string`,id:`param-description-1`}),`\n`,_jsx(ResponseField,{name:`emoji`,type:`string`,id:`param-emoji-1`}),`\n`,_jsx(ResponseField,{name:`privacy`,type:`string`,id:`param-privacy-1`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`public`}),`, `,_jsx(_components.code,{children:`unlisted`}),` or `,_jsx(_components.code,{children:`private`}),`.`]})}),`\n`,_jsx(ResponseField,{name:`route_mode`,type:`string`,id:`param-route-mode-1`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`dynamic`}),` (we re-plan the line between the stops as roads change) or `,_jsx(_components.code,{children:`fixed`}),` (the line is kept as given).`]})}),`\n`,_jsx(ResponseField,{name:`theme`,type:`object`,id:`param-theme-1`,children:_jsx(_components.p,{children:`The page theme, when one is set. The same object you send.`})}),`\n`,_jsx(ResponseField,{name:`categories`,type:`array`,id:`param-categories-1`,children:_jsxs(_components.p,{children:[`Each `,_jsx(_components.code,{children:`{ slug, name, emoji }`}),`.`]})}),`\n`,_jsx(ResponseField,{name:`start_time`,type:`string`,id:`param-start-time-1`,children:_jsxs(_components.p,{children:[`Present on a group ride, with `,_jsx(_components.code,{children:`end_time`}),`, and `,_jsx(_components.code,{children:`max_rsvps`}),` and `,_jsx(_components.code,{children:`rsvp_questions`}),` when set.`]})}),`\n`,_jsx(ResponseField,{name:`show_elevation`,type:`boolean`,id:`param-show-elevation-1`,children:_jsxs(_components.p,{children:[`With `,_jsx(_components.code,{children:`show_safety_colors`}),`, `,_jsx(_components.code,{children:`show_why_this_route`}),` and `,_jsx(_components.code,{children:`show_street_by_street`}),`: which sections the page shows.`]})}),`\n`,_jsx(ResponseField,{name:`city`,type:`string`,id:`param-city`,children:_jsxs(_components.p,{children:[`The city the route is in: `,_jsx(_components.code,{children:`london`}),`, `,_jsx(_components.code,{children:`new_york_city`}),`, `,_jsx(_components.code,{children:`los_angeles`}),` or `,_jsx(_components.code,{children:`bay_area`}),`.`]})}),`\n`,_jsx(ResponseField,{name:`host`,type:`object`,id:`param-host`,children:_jsxs(_components.p,{children:[`The rider who created the route: `,_jsx(_components.code,{children:`{ name, slug, image_url }`}),`. `,_jsx(_components.code,{children:`null`}),` once that rider has deleted their account.`]})}),`\n`,_jsx(ResponseField,{name:`route`,type:`object`,id:`param-route`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`distance_m`}),`, `,_jsx(_components.code,{children:`duration_s`}),`, `,_jsx(_components.code,{children:`polyline`}),` (precision 5), `,_jsx(_components.code,{children:`geometry`}),` (a GeoJSON LineString; omitted in lists) and `,_jsx(_components.code,{children:`stops`}),`: the start then every stop in order, each `,_jsx(_components.code,{children:`{ name, location }`}),`, with `,_jsx(_components.code,{children:`hidden: true`}),` on a shaping point that is not shown as a stop.`]})}),`\n`,_jsx(ResponseField,{name:`route_status`,type:`string`,id:`param-route-status`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`pending`}),` while we match the line to the road network (a fixed route) or plan it between the stops (a dynamic route), `,_jsx(_components.code,{children:`ready`}),` once turn-by-turn steps and the safety summary are stored, `,_jsx(_components.code,{children:`unavailable`}),` when the line could not be matched or no route exists between the stops. A pending route is already viewable and rideable; poll every few seconds.`]})}),`\n`,_jsx(ResponseField,{name:`images`,type:`array`,id:`param-images`,children:_jsxs(_components.p,{children:[`Each `,_jsx(_components.code,{children:`{ id, url, status, cover }`}),`. `,_jsx(_components.code,{children:`status`}),` is `,_jsx(_components.code,{children:`pending`}),` until our image check has run, then `,_jsx(_components.code,{children:`approved`}),`. Hosts see every image with its status; everyone else sees approved images only.`]})}),`\n`,_jsx(ResponseField,{name:`created_at`,type:`string`,id:`param-created-at`}),`\n`,_jsx(ResponseField,{name:`updated_at`,type:`string`,id:`param-updated-at`}),`\n`,`\n`,`\n`,_jsx(Heading,{level:`2`,id:`variants`,children:`Variants`}),`\n`,_jsx(Heading,{level:`3`,id:`a-group-ride`,children:`A group ride`}),`\n`,_jsxs(_components.p,{children:[`Send `,_jsx(_components.code,{children:`start_time`}),` (and optionally `,_jsx(_components.code,{children:`end_time`}),`, `,_jsx(_components.code,{children:`max_rsvps`}),` and `,_jsx(_components.code,{children:`rsvp_questions`}),`). The route becomes a group ride with its own page under `,_jsx(_components.code,{children:`/group-rides/`}),`, riders can RSVP, and `,_jsx(_components.code,{children:`end_time`}),` is derived from the route’s duration when you leave it out.`]}),`\n`,_jsx(Heading,{level:`2`,id:`error-responses`,children:`Error responses`}),`\n`,_jsxs(_components.p,{children:[`Every error body is `,_jsx(_components.code,{children:`{ \"error\", \"code\" }`}),`; `,_jsx(_components.code,{children:`error`}),` is a sentence, `,_jsx(_components.code,{children:`code`}),` is stable.`]}),`\n`,_jsx(Heading,{level:`3`,id:`400-bad-request`,children:`400 Bad request`}),`\n`,_jsxs(_components.p,{children:[`Invalid body or query: the message names the field. `,_jsx(_components.code,{children:`code`}),` is `,_jsx(_components.code,{children:`invalid_body`}),`, or for a route input `,_jsx(_components.code,{children:`outside_coverage`}),` (the route starts outside the cities we cover), `,_jsx(_components.code,{children:`cross_city`}),` (its stops span two cities) or `,_jsx(_components.code,{children:`no_route`}),` (no cycling route exists between two stops).`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"unknown field: colour\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"invalid_body\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`401-unauthorized`,children:`401 Unauthorized`}),`\n`,_jsx(_components.p,{children:`Missing or invalid credentials, or an anonymous caller.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Missing user credentials\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`404-not-found`,children:`404 Not found`}),`\n`,_jsxs(_components.p,{children:[`No route with that id that you may see. A private route you do not host, a route you may read but not edit, and a route your app did not create all answer `,_jsx(_components.code,{children:`404`}),`, never `,_jsx(_components.code,{children:`403`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Custom route not found\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"not_found\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`405-method-not-allowed`,children:`405 Method not allowed`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Method not allowed\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"method_not_allowed\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`409-conflict`,children:`409 Conflict`}),`\n`,_jsx(_components.p,{children:`The alias you chose is already taken, by another route or by a rider’s profile link.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"That alias is already taken\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"alias_taken\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`429-too-many-requests`,children:`429 Too many requests`}),`\n`,_jsxs(_components.p,{children:[`The burst limit, with a `,_jsx(_components.code,{children:`Retry-After`}),` header; or the daily creation cap, which adds `,_jsx(_components.code,{children:`code: \"daily_limit\"`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Daily limit of 10 custom routes reached\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"daily_limit\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"retry_after_seconds\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`3600`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`500-internal-server-error`,children:`500 Internal server error`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Internal server error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"internal_error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`]})})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Create a route","api":"POST /custom-routes/","description":"Create a custom route or group ride and receive it back","href":"/api-reference/custom-routes/create-route"}}},"mdxSourceWithNoJs":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,..._provideComponents(),...props.components},{Accordion,CodeBlock,Heading,ParamField,RequestExample,ResponseExample,ResponseField}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!ParamField)_missingMdxReference(`ParamField`,true);if(!RequestExample)_missingMdxReference(`RequestExample`,true);if(!ResponseExample)_missingMdxReference(`ResponseExample`,true);if(!ResponseField)_missingMdxReference(`ResponseField`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`overview`,children:`Overview`}),`\n`,_jsxs(_components.p,{children:[`Creates a route from a name and one route input, and answers `,_jsx(_components.code,{children:`201`}),` with the route. The line is matched or planned in the background: poll `,_jsx(_components.a,{href:`/api-reference/custom-routes/get-route`,children:_jsx(_components.code,{children:`GET /custom-routes/{id}/`})}),` until `,_jsx(_components.code,{children:`route_status`}),` is `,_jsx(_components.code,{children:`ready`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`authentication`,children:`Authentication`}),`\n`,_jsxs(_components.p,{children:[`A `,_jsx(_components.a,{href:`/api-reference/oauth`,children:`Login with Cyclemate`}),` access token, or a signed-in rider’s session token. Every route belongs to a rider: your app acts for the rider who connected it, and the route is theirs. Your app reaches only the routes it created: a route the rider made in our apps, or through another app, answers `,_jsx(_components.code,{children:`404`}),`.`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Authorization: Bearer ACCESS_TOKEN`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`An API key on its own is rejected, as are anonymous requests. To create routes as your organisation, sign up for a Cyclemate account and connect your app to it with Login with Cyclemate.`}),`\n`,_jsx(Heading,{level:`3`,id:`rate-limits`,children:`Rate limits`}),`\n`,_jsxs(_components.p,{children:[`Riders and apps acting for them may make `,_jsx(_components.strong,{children:`60 requests a minute`}),`; a request that routes between `,_jsx(_components.code,{children:`stops`}),` counts once per hop. Every rider may create `,_jsx(_components.strong,{children:`10 routes in any 24 hours`}),`, counted across our apps and every connected app: the eleventh answers `,_jsx(_components.code,{children:`429`}),` with `,_jsx(_components.code,{children:`code: \"daily_limit\"`}),` and the seconds until a slot frees.`]}),`\n`,_jsx(Heading,{level:`2`,id:`request-body`,children:`Request body`}),`\n`,_jsx(ParamField,{body:`name`,type:`string`,required:true,id:`param-name`,children:_jsx(_components.p,{children:`1 to 120 characters.`})}),`\n`,_jsxs(_components.p,{children:[`One of `,_jsx(_components.code,{children:`stops`}),`, `,_jsx(_components.code,{children:`legs`}),` or `,_jsx(_components.code,{children:`geometry`}),` is required:`]}),`\n`,_jsx(ParamField,{body:`stops`,type:`array`,id:`param-stops`,children:_jsxs(_components.p,{children:[`2 to 25 stops as `,_jsx(_components.code,{children:`{ location: [longitude, latitude], name? }`}),`, all in one city. We plan the safest cycling route between them, one leg per hop, and name each stop as given.`]})}),`\n`,_jsx(ParamField,{body:`legs`,type:`array`,id:`param-legs`,children:_jsxs(_components.p,{children:[`Your own line, 1 to 24 legs of `,_jsx(_components.code,{children:`{ geometry, end_name?, hidden? }`}),`. `,_jsx(_components.code,{children:`geometry`}),` is a GeoJSON LineString; each leg starts within 25 m of the previous leg’s end. The whole route is at most 10,000 coordinates and 200 km and must start and end in the same city. `,_jsx(_components.code,{children:`hidden: true`}),` marks a shaping point that is not shown as a stop (fixed routes only). Pass `,_jsx(_components.code,{children:`start_name`}),` for the start.`]})}),`\n`,_jsx(ParamField,{body:`geometry`,type:`object`,id:`param-geometry`,children:_jsxs(_components.p,{children:[`A single GeoJSON LineString, the same as one leg. Fixed routes only. `,_jsx(_components.code,{children:`start_name`}),` and `,_jsx(_components.code,{children:`end_name`}),` name its ends.`]})}),`\n`,_jsxs(Accordion,{title:`Optional parameters`,id:`optional-parameters`,children:[_jsx(ParamField,{body:`description`,type:`string`,id:`param-description`,children:_jsx(_components.p,{children:`Up to 4,000 characters.`})}),_jsx(ParamField,{body:`emoji`,type:`string`,default:`🚴`,id:`param-emoji`,children:_jsx(_components.p,{children:`One emoji.`})}),_jsx(ParamField,{body:`alias`,type:`string`,id:`param-alias`,children:_jsxs(_components.p,{children:[`The link slug: 3 to 60 lowercase letters, digits and hyphens. Route and product names are reserved. Generated from the name when omitted. A taken alias answers `,_jsx(_components.code,{children:`409`}),`.`]})}),_jsx(ParamField,{body:`privacy`,type:`string`,default:`unlisted`,id:`param-privacy`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`public`}),`, `,_jsx(_components.code,{children:`unlisted`}),` (anyone with the link) or `,_jsx(_components.code,{children:`private`}),` (hosts only). A route your app creates is `,_jsx(_components.code,{children:`unlisted`}),` unless you say otherwise, so it stays off the rider’s profile until they choose to share it.`]})}),_jsx(ParamField,{body:`route_mode`,type:`string`,default:`dynamic`,id:`param-route-mode`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`dynamic`}),` or `,_jsx(_components.code,{children:`fixed`}),`. A dynamic route is re-planned between its stops as roads change, so it has no hidden shaping points; `,_jsx(_components.code,{children:`geometry`}),` and a hidden leg require `,_jsx(_components.code,{children:`fixed`}),`.`]})}),_jsx(ParamField,{body:`theme`,type:`object`,id:`param-theme`,children:_jsxs(_components.p,{children:[`The page theme. Keys: `,_jsx(_components.code,{children:`headerFont`}),`, `,_jsx(_components.code,{children:`headerFlair`}),`, `,_jsx(_components.code,{children:`headerColor`}),` (`,_jsx(_components.code,{children:`#rrggbb`}),`), `,_jsx(_components.code,{children:`headerLayout`}),`, `,_jsx(_components.code,{children:`backgroundColor`}),`, `,_jsx(_components.code,{children:`backgroundTexture`}),`, `,_jsx(_components.code,{children:`animation`}),`, `,_jsx(_components.code,{children:`stickers`}),` (up to 12 of `,_jsx(_components.code,{children:`{ id, position: { x, y } }`}),`). Every value must be one the app offers; an unknown one answers `,_jsx(_components.code,{children:`400`}),` naming it.`]})}),_jsx(ParamField,{body:`categories`,type:`string[]`,id:`param-categories`,children:_jsxs(_components.p,{children:[`Up to 10 category slugs, for example `,_jsx(_components.code,{children:`coffee`}),`, `,_jsx(_components.code,{children:`park`}),`, `,_jsx(_components.code,{children:`live-music`}),`.`]})}),_jsx(ParamField,{body:`start_time`,type:`string`,id:`param-start-time`,children:_jsxs(_components.p,{children:[`ISO 8601. Setting it makes the route a group ride. `,_jsx(_components.code,{children:`end_time`}),` (after it; derived from the route’s duration when omitted), `,_jsx(_components.code,{children:`max_rsvps`}),` (0 to 1000) and `,_jsx(_components.code,{children:`rsvp_questions`}),` are accepted only with a start time.`]})}),_jsx(ParamField,{body:`rsvp_questions`,type:`array`,id:`param-rsvp-questions`,children:_jsxs(_components.p,{children:[`Up to 20 of `,_jsx(_components.code,{children:`{ prompt, required, type?, options? }`}),`; `,_jsx(_components.code,{children:`type`}),` is `,_jsx(_components.code,{children:`text`}),` or `,_jsx(_components.code,{children:`choice`}),`, and a choice question lists `,_jsx(_components.code,{children:`options`}),` as `,_jsx(_components.code,{children:`{ label, limit? }`}),`. Ids are generated when omitted and must be sent back unchanged on edit.`]})}),_jsx(ParamField,{body:`show_elevation`,type:`boolean`,default:`true`,id:`param-show-elevation`,children:_jsxs(_components.p,{children:[`With `,_jsx(_components.code,{children:`show_safety_colors`}),`, `,_jsx(_components.code,{children:`show_why_this_route`}),` and `,_jsx(_components.code,{children:`show_street_by_street`}),`: which sections the route’s page shows.`]})}),_jsx(ParamField,{body:`start_name`,type:`string`,id:`param-start-name`,children:_jsxs(_components.p,{children:[`With `,_jsx(_components.code,{children:`legs`}),` or `,_jsx(_components.code,{children:`geometry`}),`: the name of the start. With `,_jsx(_components.code,{children:`stops`}),`, name the stops instead.`]})}),_jsx(ParamField,{body:`end_name`,type:`string`,id:`param-end-name`,children:_jsxs(_components.p,{children:[`With `,_jsx(_components.code,{children:`geometry`}),`: the name of the end.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`response-body`,children:`Response body`}),`\n`,_jsx(ResponseField,{name:`id`,type:`string`,id:`param-id`,children:_jsxs(_components.p,{children:[`The route’s id, a UUID string. Pass it as `,_jsx(_components.code,{children:`event_id`}),` to `,_jsx(_components.a,{href:`/api-reference/routing/multimodal`,children:_jsx(_components.code,{children:`POST /multi-modal/v2/`})}),` to ride it.`]})}),`\n`,_jsx(ResponseField,{name:`alias`,type:`string`,id:`param-alias-1`,children:_jsx(_components.p,{children:`The route’s link slug, chosen or generated from the name.`})}),`\n`,_jsx(ResponseField,{name:`url`,type:`string`,id:`param-url`,children:_jsx(_components.p,{children:`The route’s page on cyclemate.club.`})}),`\n`,_jsx(ResponseField,{name:`name`,type:`string`,id:`param-name-1`}),`\n`,_jsx(ResponseField,{name:`description`,type:`string`,id:`param-description-1`}),`\n`,_jsx(ResponseField,{name:`emoji`,type:`string`,id:`param-emoji-1`}),`\n`,_jsx(ResponseField,{name:`privacy`,type:`string`,id:`param-privacy-1`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`public`}),`, `,_jsx(_components.code,{children:`unlisted`}),` or `,_jsx(_components.code,{children:`private`}),`.`]})}),`\n`,_jsx(ResponseField,{name:`route_mode`,type:`string`,id:`param-route-mode-1`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`dynamic`}),` (we re-plan the line between the stops as roads change) or `,_jsx(_components.code,{children:`fixed`}),` (the line is kept as given).`]})}),`\n`,_jsx(ResponseField,{name:`theme`,type:`object`,id:`param-theme-1`,children:_jsx(_components.p,{children:`The page theme, when one is set. The same object you send.`})}),`\n`,_jsx(ResponseField,{name:`categories`,type:`array`,id:`param-categories-1`,children:_jsxs(_components.p,{children:[`Each `,_jsx(_components.code,{children:`{ slug, name, emoji }`}),`.`]})}),`\n`,_jsx(ResponseField,{name:`start_time`,type:`string`,id:`param-start-time-1`,children:_jsxs(_components.p,{children:[`Present on a group ride, with `,_jsx(_components.code,{children:`end_time`}),`, and `,_jsx(_components.code,{children:`max_rsvps`}),` and `,_jsx(_components.code,{children:`rsvp_questions`}),` when set.`]})}),`\n`,_jsx(ResponseField,{name:`show_elevation`,type:`boolean`,id:`param-show-elevation-1`,children:_jsxs(_components.p,{children:[`With `,_jsx(_components.code,{children:`show_safety_colors`}),`, `,_jsx(_components.code,{children:`show_why_this_route`}),` and `,_jsx(_components.code,{children:`show_street_by_street`}),`: which sections the page shows.`]})}),`\n`,_jsx(ResponseField,{name:`city`,type:`string`,id:`param-city`,children:_jsxs(_components.p,{children:[`The city the route is in: `,_jsx(_components.code,{children:`london`}),`, `,_jsx(_components.code,{children:`new_york_city`}),`, `,_jsx(_components.code,{children:`los_angeles`}),` or `,_jsx(_components.code,{children:`bay_area`}),`.`]})}),`\n`,_jsx(ResponseField,{name:`host`,type:`object`,id:`param-host`,children:_jsxs(_components.p,{children:[`The rider who created the route: `,_jsx(_components.code,{children:`{ name, slug, image_url }`}),`. `,_jsx(_components.code,{children:`null`}),` once that rider has deleted their account.`]})}),`\n`,_jsx(ResponseField,{name:`route`,type:`object`,id:`param-route`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`distance_m`}),`, `,_jsx(_components.code,{children:`duration_s`}),`, `,_jsx(_components.code,{children:`polyline`}),` (precision 5), `,_jsx(_components.code,{children:`geometry`}),` (a GeoJSON LineString; omitted in lists) and `,_jsx(_components.code,{children:`stops`}),`: the start then every stop in order, each `,_jsx(_components.code,{children:`{ name, location }`}),`, with `,_jsx(_components.code,{children:`hidden: true`}),` on a shaping point that is not shown as a stop.`]})}),`\n`,_jsx(ResponseField,{name:`route_status`,type:`string`,id:`param-route-status`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`pending`}),` while we match the line to the road network (a fixed route) or plan it between the stops (a dynamic route), `,_jsx(_components.code,{children:`ready`}),` once turn-by-turn steps and the safety summary are stored, `,_jsx(_components.code,{children:`unavailable`}),` when the line could not be matched or no route exists between the stops. A pending route is already viewable and rideable; poll every few seconds.`]})}),`\n`,_jsx(ResponseField,{name:`images`,type:`array`,id:`param-images`,children:_jsxs(_components.p,{children:[`Each `,_jsx(_components.code,{children:`{ id, url, status, cover }`}),`. `,_jsx(_components.code,{children:`status`}),` is `,_jsx(_components.code,{children:`pending`}),` until our image check has run, then `,_jsx(_components.code,{children:`approved`}),`. Hosts see every image with its status; everyone else sees approved images only.`]})}),`\n`,_jsx(ResponseField,{name:`created_at`,type:`string`,id:`param-created-at`}),`\n`,_jsx(ResponseField,{name:`updated_at`,type:`string`,id:`param-updated-at`}),`\n`,_jsxs(RequestExample,{children:[_jsx(CodeBlock,{filename:`cURL`,numberOfLines:`14`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`14`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'https://api.cyclemate.club/custom-routes/'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Authorization: Bearer ACCESS_TOKEN'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Content-Type: application/json'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"name\": \"Culver City coffee loop\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"description\": \"An easy Sunday loop with a stop at the bakery.\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"emoji\": \"☕\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"categories\": [\"coffee\"],`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"stops\": [`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` { \"location\": [-118.37753, 34.02795], \"name\": \"Home\" },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` { \"location\": [-118.37866, 34.02727], \"name\": \"Bakery\" },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` { \"location\": [-118.37675, 34.02727], \"name\": \"Park\" }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` }'`})}),`\n`]})})}),_jsx(CodeBlock,{filename:`With your own line`,numberOfLines:`10`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`10`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'https://api.cyclemate.club/custom-routes/'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Authorization: Bearer ACCESS_TOKEN'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Content-Type: application/json'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"name\": \"Canal towpath\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"route_mode\": \"fixed\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"start_name\": \"Angel\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"end_name\": \"Victoria Park\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"geometry\": { \"type\": \"LineString\", \"coordinates\": [[-0.1057, 51.5322], [-0.1021, 51.5341], [-0.0557, 51.5360]] }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` }'`})}),`\n`]})})})]}),`\n`,_jsx(ResponseExample,{children:_jsx(CodeBlock,{filename:`Response`,numberOfLines:`32`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`32`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"78360cf7-0f4a-48f1-91ca-25e83db44aff\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"alias\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"culver-city-coffee-loop-1792536692813\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"url\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"https://cyclemate.club/explore/los-angeles/routes/culver-city-coffee-loop-1792536692813\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"name\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Culver City coffee loop\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"description\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"An easy Sunday loop with a stop at the bakery.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"emoji\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"☕\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"privacy\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"public\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"route_mode\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"dynamic\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"categories\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"slug\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"coffee\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"name\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Coffee\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"emoji\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"☕\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"show_elevation\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"show_safety_colors\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"show_why_this_route\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"show_street_by_street\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"city\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"los_angeles\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"host\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"name\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Tom\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"slug\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"tom\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"image_url\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`null`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"route\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"distance_m\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`833.5`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"duration_s\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`200`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"polyline\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"ycunEbsoqUMu@EU??M?YH{Er…\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"geometry\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"LineString\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"coordinates\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [[`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`-118.377621`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`34.028292`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`], [`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`-118.37735`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`34.028364`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`], `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"…\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`] },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"stops\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"name\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Home\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"location\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`-118.377621`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`34.028292`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`] },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"name\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Bakery\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"location\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`-118.378755`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`34.027277`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`] },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"name\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Park\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"location\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`-118.37675`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`34.02727`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`] }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"route_status\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"pending\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"images\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"created_at\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2026-10-20T22:51:32.816+00:00\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"updated_at\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2026-10-20T22:51:32.816+00:00\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})})}),`\n`,_jsx(Heading,{level:`2`,id:`variants`,children:`Variants`}),`\n`,_jsx(Heading,{level:`3`,id:`a-group-ride`,children:`A group ride`}),`\n`,_jsxs(_components.p,{children:[`Send `,_jsx(_components.code,{children:`start_time`}),` (and optionally `,_jsx(_components.code,{children:`end_time`}),`, `,_jsx(_components.code,{children:`max_rsvps`}),` and `,_jsx(_components.code,{children:`rsvp_questions`}),`). The route becomes a group ride with its own page under `,_jsx(_components.code,{children:`/group-rides/`}),`, riders can RSVP, and `,_jsx(_components.code,{children:`end_time`}),` is derived from the route’s duration when you leave it out.`]}),`\n`,_jsx(Heading,{level:`2`,id:`error-responses`,children:`Error responses`}),`\n`,_jsxs(_components.p,{children:[`Every error body is `,_jsx(_components.code,{children:`{ \"error\", \"code\" }`}),`; `,_jsx(_components.code,{children:`error`}),` is a sentence, `,_jsx(_components.code,{children:`code`}),` is stable.`]}),`\n`,_jsx(Heading,{level:`3`,id:`400-bad-request`,children:`400 Bad request`}),`\n`,_jsxs(_components.p,{children:[`Invalid body or query: the message names the field. `,_jsx(_components.code,{children:`code`}),` is `,_jsx(_components.code,{children:`invalid_body`}),`, or for a route input `,_jsx(_components.code,{children:`outside_coverage`}),` (the route starts outside the cities we cover), `,_jsx(_components.code,{children:`cross_city`}),` (its stops span two cities) or `,_jsx(_components.code,{children:`no_route`}),` (no cycling route exists between two stops).`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"unknown field: colour\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"invalid_body\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`401-unauthorized`,children:`401 Unauthorized`}),`\n`,_jsx(_components.p,{children:`Missing or invalid credentials, or an anonymous caller.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Missing user credentials\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`404-not-found`,children:`404 Not found`}),`\n`,_jsxs(_components.p,{children:[`No route with that id that you may see. A private route you do not host, a route you may read but not edit, and a route your app did not create all answer `,_jsx(_components.code,{children:`404`}),`, never `,_jsx(_components.code,{children:`403`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Custom route not found\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"not_found\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`405-method-not-allowed`,children:`405 Method not allowed`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Method not allowed\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"method_not_allowed\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`409-conflict`,children:`409 Conflict`}),`\n`,_jsx(_components.p,{children:`The alias you chose is already taken, by another route or by a rider’s profile link.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"That alias is already taken\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"alias_taken\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`429-too-many-requests`,children:`429 Too many requests`}),`\n`,_jsxs(_components.p,{children:[`The burst limit, with a `,_jsx(_components.code,{children:`Retry-After`}),` header; or the daily creation cap, which adds `,_jsx(_components.code,{children:`code: \"daily_limit\"`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Daily limit of 10 custom routes reached\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"daily_limit\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"retry_after_seconds\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`3600`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`500-internal-server-error`,children:`500 Internal server error`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Internal server error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"internal_error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`]})})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Create a route","api":"POST /custom-routes/","description":"Create a custom route or group ride and receive it back","href":"/api-reference/custom-routes/create-route"}}}},"mdxExtracts":{"tableOfContents":[{"title":"Overview","slug":"overview","depth":2,"children":[{"title":"Authentication","slug":"authentication","depth":3,"children":[]},{"title":"Rate limits","slug":"rate-limits","depth":3,"children":[]}]},{"title":"Request body","slug":"request-body","depth":2,"children":[]},{"title":"Response body","slug":"response-body","depth":2,"children":[]},{"title":"Variants","slug":"variants","depth":2,"children":[{"title":"A group ride","slug":"a-group-ride","depth":3,"children":[]}]},{"title":"Error responses","slug":"error-responses","depth":2,"children":[{"title":"400 Bad request","slug":"400-bad-request","depth":3,"children":[]},{"title":"401 Unauthorized","slug":"401-unauthorized","depth":3,"children":[]},{"title":"404 Not found","slug":"404-not-found","depth":3,"children":[]},{"title":"405 Method not allowed","slug":"405-method-not-allowed","depth":3,"children":[]},{"title":"409 Conflict","slug":"409-conflict","depth":3,"children":[]},{"title":"429 Too many requests","slug":"429-too-many-requests","depth":3,"children":[]},{"title":"500 Internal server error","slug":"500-internal-server-error","depth":3,"children":[]}]}],"codeExamples":{"request":{"type":"RequestExample","children":[{"filename":"cURL","html":"\u003cpre class=\"shiki shiki-themes github-light-default dark-plus\" style=\"background-color:#ffffff;--shiki-dark-bg:#0B0C0E;color:#1f2328;--shiki-dark:#D4D4D4\" language=\"shellscript\">\u003ccode language=\"shellscript\" numberOfLines=\"14\">\u003cspan class=\"line\">\u003cspan style=\"color:#953800;--shiki-dark:#DCDCAA\">curl\u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\"> -X\u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> POST\u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> 'https://api.cyclemate.club/custom-routes/'\u003c/span>\u003cspan style=\"color:#CF222E;--shiki-dark:#D7BA7D\"> \\\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\"> -H\u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> 'Authorization: Bearer ACCESS_TOKEN'\u003c/span>\u003cspan style=\"color:#CF222E;--shiki-dark:#D7BA7D\"> \\\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\"> -H\u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> 'Content-Type: application/json'\u003c/span>\u003cspan style=\"color:#CF222E;--shiki-dark:#D7BA7D\"> \\\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\"> -d\u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> '{\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> \"name\": \"Culver City coffee loop\",\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> \"description\": \"An easy Sunday loop with a stop at the bakery.\",\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> \"emoji\": \"☕\",\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> \"categories\": [\"coffee\"],\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> \"stops\": [\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> { \"location\": [-118.37753, 34.02795], \"name\": \"Home\" },\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> { \"location\": [-118.37866, 34.02727], \"name\": \"Bakery\" },\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> { \"location\": [-118.37675, 34.02727], \"name\": \"Park\" }\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> ]\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> }'\u003c/span>\u003c/span>\n\u003c/code>\u003c/pre>"},{"filename":"With your own line","html":"\u003cpre class=\"shiki shiki-themes github-light-default dark-plus\" style=\"background-color:#ffffff;--shiki-dark-bg:#0B0C0E;color:#1f2328;--shiki-dark:#D4D4D4\" language=\"shellscript\">\u003ccode language=\"shellscript\" numberOfLines=\"10\">\u003cspan class=\"line\">\u003cspan style=\"color:#953800;--shiki-dark:#DCDCAA\">curl\u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\"> -X\u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> POST\u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> 'https://api.cyclemate.club/custom-routes/'\u003c/span>\u003cspan style=\"color:#CF222E;--shiki-dark:#D7BA7D\"> \\\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\"> -H\u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> 'Authorization: Bearer ACCESS_TOKEN'\u003c/span>\u003cspan style=\"color:#CF222E;--shiki-dark:#D7BA7D\"> \\\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\"> -H\u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> 'Content-Type: application/json'\u003c/span>\u003cspan style=\"color:#CF222E;--shiki-dark:#D7BA7D\"> \\\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\"> -d\u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> '{\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> \"name\": \"Canal towpath\",\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> \"route_mode\": \"fixed\",\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> \"start_name\": \"Angel\",\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> \"end_name\": \"Victoria Park\",\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> \"geometry\": { \"type\": \"LineString\", \"coordinates\": [[-0.1057, 51.5322], [-0.1021, 51.5341], [-0.0557, 51.5360]] }\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> }'\u003c/span>\u003c/span>\n\u003c/code>\u003c/pre>"}],"attributes":[]},"response":{"type":"ResponseExample","children":[{"filename":"Response","html":"\u003cpre class=\"shiki shiki-themes github-light-default dark-plus\" style=\"background-color:#ffffff;--shiki-dark-bg:#0B0C0E;color:#1f2328;--shiki-dark:#D4D4D4\" language=\"json\">\u003ccode language=\"json\" numberOfLines=\"32\">\u003cspan class=\"line\">\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">{\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"id\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"78360cf7-0f4a-48f1-91ca-25e83db44aff\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"alias\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"culver-city-coffee-loop-1792536692813\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"url\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"https://cyclemate.club/explore/los-angeles/routes/culver-city-coffee-loop-1792536692813\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"name\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"Culver City coffee loop\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"description\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"An easy Sunday loop with a stop at the bakery.\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"emoji\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"☕\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"privacy\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"public\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"route_mode\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"dynamic\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"categories\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: [{ \u003c/span>\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\">\"slug\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"coffee\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">, \u003c/span>\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\">\"name\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"Coffee\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">, \u003c/span>\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\">\"emoji\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"☕\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\"> }],\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"show_elevation\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\">true\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"show_safety_colors\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\">true\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"show_why_this_route\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\">true\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"show_street_by_street\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\">true\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"city\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"los_angeles\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"host\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: { \u003c/span>\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\">\"name\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"Tom\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">, \u003c/span>\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\">\"slug\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"tom\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">, \u003c/span>\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\">\"image_url\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\">null\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\"> },\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"route\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: {\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"distance_m\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#B5CEA8\">833.5\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"duration_s\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#B5CEA8\">200\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"polyline\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"ycunEbsoqUMu@EU??M?YH{Er…\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"geometry\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: { \u003c/span>\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\">\"type\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"LineString\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">, \u003c/span>\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\">\"coordinates\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: [[\u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#B5CEA8\">-118.377621\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">, \u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#B5CEA8\">34.028292\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">], [\u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#B5CEA8\">-118.37735\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">, \u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#B5CEA8\">34.028364\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">], \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"…\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">] },\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"stops\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: [\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\"> { \u003c/span>\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\">\"name\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"Home\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">, \u003c/span>\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\">\"location\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: [\u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#B5CEA8\">-118.377621\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">, \u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#B5CEA8\">34.028292\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">] },\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\"> { \u003c/span>\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\">\"name\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"Bakery\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">, \u003c/span>\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\">\"location\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: [\u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#B5CEA8\">-118.378755\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">, \u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#B5CEA8\">34.027277\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">] },\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\"> { \u003c/span>\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\">\"name\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"Park\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">, \u003c/span>\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\">\"location\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: [\u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#B5CEA8\">-118.37675\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">, \u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#B5CEA8\">34.02727\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">] }\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\"> ]\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\"> },\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"route_status\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"pending\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"images\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: [],\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"created_at\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"2026-10-20T22:51:32.816+00:00\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"updated_at\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"2026-10-20T22:51:32.816+00:00\"\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">}\u003c/span>\u003c/span>\n\u003c/code>\u003c/pre>"}],"attributes":[]}},"endpoint":{"title":"Create a route","path":"/custom-routes/","method":"post","request":{"security":[],"parameters":{"query":{},"header":{},"cookie":{},"path":{}},"body":{"application/json":{"schemaArray":[{"type":"object","properties":{"name":[{"type":"string","description":"1 to 120 characters.","required":true}],"stops":[{"type":"array","items":[{"type":"object","properties":{}}],"description":"2 to 25 stops as `{ location: [longitude, latitude], name? }` , all in one city. We plan the safest cycling route between them, one leg per hop, and name each stop as given."}],"legs":[{"type":"array","items":[{"type":"object","properties":{}}],"description":"Your own line, 1 to 24 legs of `{ geometry, end_name?, hidden? }` . `geometry` is a GeoJSON LineString; each leg starts within 25 m of the previous leg’s end. The whole route is at most 10,000 coordinates and 200 km and must start and end in the same city. `hidden: true` marks a shaping point that is not shown as a stop (fixed routes only). Pass `start_name` for the start."}],"geometry":[{"type":"object","properties":{},"description":"A single GeoJSON LineString, the same as one leg. Fixed routes only. `start_name` and `end_name` name its ends."}]}}],"examples":{"example":{"value":{"name":"\u003cstring>","stops":[{}],"legs":[{}],"geometry":{}}}}}}},"response":{"200":{"application/json":{"schemaArray":[{"type":"object","properties":{"id":[{"type":"string","description":"The route’s id, a UUID string. Pass it as `event_id` to `POST /multi-modal/v2/` to ride it."}],"alias":[{"type":"string","description":"The route’s link slug, chosen or generated from the name."}],"url":[{"type":"string","description":"The route’s page on cyclemate.club."}],"name":[{"type":"string"}],"description":[{"type":"string"}],"emoji":[{"type":"string"}],"privacy":[{"type":"string","description":"`public` , `unlisted` or `private` ."}],"route_mode":[{"type":"string","description":"`dynamic` (we re-plan the line between the stops as roads change) or `fixed` (the line is kept as given)."}],"theme":[{"type":"object","properties":{},"description":"The page theme, when one is set. The same object you send."}],"categories":[{"type":"array","items":[{"type":"object","properties":{}}],"description":"Each `{ slug, name, emoji }` ."}],"start_time":[{"type":"string","description":"Present on a group ride, with `end_time` , and `max_rsvps` and `rsvp_questions` when set."}],"show_elevation":[{"type":"boolean","description":"With `show_safety_colors` , `show_why_this_route` and `show_street_by_street` : which sections the page shows."}],"city":[{"type":"string","description":"The city the route is in: `london` , `new_york_city` , `los_angeles` or `bay_area` ."}],"host":[{"type":"object","properties":{},"description":"The rider who created the route: `{ name, slug, image_url }` . `null` once that rider has deleted their account."}],"route":[{"type":"object","properties":{},"description":"`distance_m` , `duration_s` , `polyline` (precision 5), `geometry` (a GeoJSON LineString; omitted in lists) and `stops` : the start then every stop in order, each `{ name, location }` , with `hidden: true` on a shaping point that is not shown as a stop."}],"route_status":[{"type":"string","description":"`pending` while we match the line to the road network (a fixed route) or plan it between the stops (a dynamic route), `ready` once turn-by-turn steps and the safety summary are stored, `unavailable` when the line could not be matched or no route exists between the stops. A pending route is already viewable and rideable; poll every few seconds."}],"images":[{"type":"array","items":[{"type":"object","properties":{}}],"description":"Each `{ id, url, status, cover }` . `status` is `pending` until our image check has run, then `approved` . Hosts see every image with its status; everyone else sees approved images only."}],"created_at":[{"type":"string"}],"updated_at":[{"type":"string"}]}}],"examples":{"example":{"value":{"id":"\u003cstring>","alias":"\u003cstring>","url":"\u003cstring>","name":"\u003cstring>","description":"\u003cstring>","emoji":"\u003cstring>","privacy":"\u003cstring>","route_mode":"\u003cstring>","theme":{},"categories":[{}],"start_time":"\u003cstring>","show_elevation":true,"city":"\u003cstring>","host":{},"route":{},"route_status":"\u003cstring>","images":[{}],"created_at":"\u003cstring>","updated_at":"\u003cstring>"}}}}}},"deprecated":false}},"jsLinks":[],"subdomain":"cyclemate","siteName":"Cyclemate","title":"Create a route - Cyclemate","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-25T21:10:30.687Z","originalFileLocation":"api-reference/custom-routes/create-route.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Create a custom route or group ride and receive it back\">\u003cmeta data-mint-head name=\"keywords\" content=\"bike navigation, bike directions, gbfs api, custom routes, group rides, bike routing api\">\u003cmeta data-mint-head name=\"application-name\" content=\"Cyclemate\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003cmeta data-mint-head name=\"robots\" content=\"index, follow\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/cyclemate/vUWyMovfjsDjW2Ce/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/cyclemate/vUWyMovfjsDjW2Ce/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/cyclemate/vUWyMovfjsDjW2Ce/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/cyclemate/vUWyMovfjsDjW2Ce/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/cyclemate/vUWyMovfjsDjW2Ce/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/cyclemate/vUWyMovfjsDjW2Ce/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/cyclemate/vUWyMovfjsDjW2Ce/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/cyclemate/vUWyMovfjsDjW2Ce/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/cyclemate/vUWyMovfjsDjW2Ce/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Create a route - Cyclemate\">\u003cmeta data-mint-head property=\"og:description\" content=\"Create a custom route or group ride and receive it back\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Cyclemate\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.cyclemate.club/api-reference/custom-routes/create-route\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://cyclemate.mintlify.app/_mintlify/api/og/v2?division=Custom+routes\u0026amp;title=Create+a+route\u0026amp;description=Create+a+custom+route+or+group+ride+and+receive+it+back\u0026amp;theme=a4f32318662735c779c2d71d\u0026amp;signature=a9bc8b09d86915b3c1502903827e0e62d4d69f71485233ea067d9619787871d8\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Create a route - Cyclemate\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Create a custom route or group ride and receive it back\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://cyclemate.mintlify.app/_mintlify/api/og/v2?division=Custom+routes\u0026amp;title=Create+a+route\u0026amp;description=Create+a+custom+route+or+group+ride+and+receive+it+back\u0026amp;theme=a4f32318662735c779c2d71d\u0026amp;signature=a9bc8b09d86915b3c1502903827e0e62d4d69f71485233ea067d9619787871d8\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/cyclemate/vUWyMovfjsDjW2Ce/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Cyclemate\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#537AEF\">\u003cmeta data-mint-head name=\"charset\" content=\"UTF-8\">\u003cmeta data-mint-head name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\u003cmeta data-mint-head name=\"author\" content=\"Cyclemate\">\u003cmeta data-mint-head name=\"googlebot\" content=\"index, follow\">\u003cmeta data-mint-head name=\"referrer\" content=\"origin\">\u003cmeta data-mint-head name=\"rating\" content=\"general\">\u003cmeta data-mint-head name=\"language\" content=\"en\">\u003cmeta data-mint-head name=\"copyright\" content=\"Copyright 2026\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.cyclemate.club/api-reference/custom-routes/create-route\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/custom-routes/create-route.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.cyclemate.club/#organization\",\"name\":\"Cyclemate\",\"url\":\"https://docs.cyclemate.club\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/cyclemate/0-MogKEn8FZNgFLp/logo/light.svg?fit=max\u0026auto=format\u0026n=0-MogKEn8FZNgFLp\u0026q=85\u0026s=11a7d1f41156617a1354abcf0b08ab6d\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.cyclemate.club#website\",\"name\":\"Cyclemate\",\"url\":\"https://docs.cyclemate.club\",\"publisher\":{\"@id\":\"https://docs.cyclemate.club/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.cyclemate.club/api-reference/custom-routes/create-route#webpage\",\"url\":\"https://docs.cyclemate.club/api-reference/custom-routes/create-route\",\"name\":\"Create a route\",\"description\":\"Create a custom route or group ride and receive it back\",\"dateModified\":\"2026-10-25T21:10:30.687Z\",\"isPartOf\":{\"@id\":\"https://docs.cyclemate.club#website\"},\"breadcrumb\":{\"@id\":\"https://docs.cyclemate.club/api-reference/custom-routes/create-route#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.cyclemate.club/api-reference/custom-routes/create-route#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Custom routes\",\"item\":\"https://docs.cyclemate.club/api-reference/custom-routes/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create a route\",\"item\":\"https://docs.cyclemate.club/api-reference/custom-routes/create-route\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.cyclemate.club/api-reference/custom-routes/create-route#apireference\",\"headline\":\"Create a route\",\"name\":\"Create a route\",\"description\":\"Create a custom route or group ride and receive it back\",\"url\":\"https://docs.cyclemate.club/api-reference/custom-routes/create-route\",\"mainEntityOfPage\":{\"@id\":\"https://docs.cyclemate.club/api-reference/custom-routes/create-route#webpage\"},\"dateModified\":\"2026-10-25T21:10:30.687Z\",\"publisher\":{\"@id\":\"https://docs.cyclemate.club/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.cyclemate.club#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Cyclemate\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Cyclemate","nav":{"global":null,"tabs":[{"tab":"API reference","groups":[{"group":"Getting started","pages":[{"title":"Cyclemate for Developers","href":"/api-reference/introduction"},{"title":"Login with Cyclemate","href":"/api-reference/oauth"},{"title":"API versioning","href":"/api-reference/versioning"}]},{"group":"Routing","pages":[{"title":"Safe cycling directions","sidebarTitle":"Introduction","href":"/api-reference/routing/overview"},{"title":"Get multiple directions","api":"POST /multi-modal/v2/","href":"/api-reference/routing/multimodal"},{"title":"Get directions","api":"POST /directions/v2/","href":"/api-reference/routing/directions"},{"title":"Explain a route","api":"POST /explain-supersafe/","href":"/api-reference/routing/explain-supersafe"},{"title":"Embeds","href":"/api-reference/routing/embed"},{"title":"Deep link to routing","href":"/api-reference/routing/deep-links"}]},{"group":"Custom routes","pages":[{"title":"Custom routes","sidebarTitle":"Introduction","description":"Create, read, edit and delete custom routes and group rides, and attach images to them","href":"/api-reference/custom-routes/overview"},{"title":"Create a route","api":"POST /custom-routes/","href":"/api-reference/custom-routes/create-route"},{"title":"Get a route","api":"GET /custom-routes/{id}/","description":"Read one custom route, with its line, stops, status and images","href":"/api-reference/custom-routes/get-route"},{"title":"List your routes","api":"GET /custom-routes/","href":"/api-reference/custom-routes/list-routes"},{"title":"Update a route","api":"PATCH /custom-routes/{id}/","href":"/api-reference/custom-routes/update-route"},{"title":"Delete a route","api":"DELETE /custom-routes/{id}/","href":"/api-reference/custom-routes/delete-route"},{"title":"Upload an image","api":"POST /custom-routes/{id}/images/","href":"/api-reference/custom-routes/upload-image"},{"title":"Delete an image","api":"DELETE /custom-routes/{id}/images/{image_id}/","href":"/api-reference/custom-routes/delete-image"}]},{"group":"AI assistants","pages":[{"title":"Connect Cyclemate to Claude","href":"/api-reference/assistants/connect-claude"}]},{"group":"Contributions","pages":[{"title":"Contribute road data to Cyclemate","sidebarTitle":"Introduction","href":"/api-reference/reports/overview"},{"title":"Submit a report","api":"POST /reports/","href":"/api-reference/reports/submit-report"},{"title":"Get report status","api":"GET /reports/{id}/","href":"/api-reference/reports/get-report"},{"title":"Submit data feed","href":"/api-reference/reports/submit-data-feed"}]}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog"}]}]},"title":"Create a route - Cyclemate","buildId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","deploymentId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","dynamics":["c2aa737661","2b790eda92","b0f84f53ff"],"chunks":["OpenApiReferenceProvider-DKJwRUt2.js","utils-CWD_VS3u.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-oFjciODD.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-C76WsxC3.js","snippetPresets-DvPMxpX_.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-CuNQfndH.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BVFpVUoF.js","shallow-t59Jg5Kr.js","getApiPlaygroundDisplay-C_JZ4amX.js","CodeSnippet-CLRDnx_h.js","CodeSnippets-C2myU4kc.js","Page-7TwLLapg.js","getPastedJson-B-JaVXw7.js","icon-BA-iDhH3.js","MethodPill-D4qZABFp.js","DuplicateIcon-THIDKO1O.js","createIcon-CYYJwgFd.js","DynamicMarkdown-UGQuxDKp.js","SectionHeading-jYELb23h.js","axios-vUo_bRtp.js"]}