The Narrative Sports API uses API key authentication. All API requests (except health checks) require a valid API key passed as a Bearer token in the Authorization header.API keys are prefixed with sk-nr- and can be created and managed via the API Dashboard.
Keep your API key secure. Never expose it in client-side code or public repositories. The full key is only shown once at creation time and cannot be retrieved later.
The following endpoints do not require authentication:
Endpoint
Description
GET /v1/health
Health check
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Narrative Sports","colors":{"primary":"#1a1a1a","light":"#FFFFFF","dark":"#1a1a1a"},"logo":{"light":"https://mintcdn.com/narrativesports/vFVZH5QQ1ixolEbk/logo/light.png?fit=max\u0026auto=format\u0026n=vFVZH5QQ1ixolEbk\u0026q=85\u0026s=cce219b4abbc60216b849c6da610484d","dark":"https://mintcdn.com/narrativesports/vFVZH5QQ1ixolEbk/logo/dark.png?fit=max\u0026auto=format\u0026n=vFVZH5QQ1ixolEbk\u0026q=85\u0026s=493ec11a3c51c984270b92582224e7c5"},"favicon":"https://mintcdn.com/narrativesports/EXR3OOJVSaaCir2J/favicon.svg?fit=max\u0026auto=format\u0026n=EXR3OOJVSaaCir2J\u0026q=85\u0026s=d5d9647dda39d612dba46f3e556132aa","api":{"openapi":"openapi.json","playground":{"display":"simple"}},"navbar":{"links":[{"href":"mailto:[email protected]","label":"Support"}],"primary":{"type":"button","label":"Narrative","href":"https://narrative-sports.com"}},"footer":{"socials":{"x":"https://x.com/narrativevideo","github":"https://github.com/Narrative-Sports","linkedin":"https://www.linkedin.com/company/usenarrative"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"narrativesports","hasAudioNarration":false,"actualSubdomain":"narrativesports","customDomains":["docs.narrative-sports.com"],"gitSource":{"type":"github","owner":"sawhney17","repo":"narrativesports-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6a9dc9381837758e26aefc93","collectionId":"0dd93ca2-53be-4876-bcc5-d85f5aa79d0e","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6a9dc9381837758e26aefc93"},"entitlements":{},"buildId":"6a9dc9381837758e26aefc93","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"API Reference","count":26},{"language":"default","tag":"Getting Started","count":13},{"language":"default","tag":"Introduction","count":8},{"language":"default","tag":"Highlight Packages (Early Beta)","count":5},{"language":"default","tag":"Highlights","count":5},{"language":"default","tag":"Concepts","count":5},{"language":"default","tag":"Recaps","count":4},{"language":"default","tag":"Task Management","count":4},{"language":"default","tag":"Deprecated","count":3},{"language":"default","tag":"License Usage","count":2}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","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":"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":"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":"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":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","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},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"custom.css","content":""}],"page":{"pagePath":"authentication","slug":"/authentication","pageMetadata":{"title":"Authentication","description":"How to authenticate with the Narrative Sports API","href":"/authentication"},"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: \"How to authenticate with the Narrative Sports API\"\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`,em:`em`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`overview`,children:`Overview`}),`\n`,_jsxs(_components.p,{children:[`The Narrative Sports API uses `,_jsx(_components.strong,{children:`API key authentication`}),`. All API requests (except health checks) require a valid API key passed as a Bearer token in the `,_jsx(_components.code,{children:`Authorization`}),` header.`]}),`\n`,_jsxs(_components.p,{children:[`API keys are prefixed with `,_jsx(_components.code,{children:`sk-nr-`}),` and can be created and managed via the `,_jsx(_components.a,{href:`https://app.narrative-sports.com/api-dashboard`,children:`API Dashboard`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`making-authenticated-requests`,children:`Making Authenticated Requests`}),`\n`,_jsxs(_components.p,{children:[`Include your API key in the `,_jsx(_components.code,{children:`Authorization`}),` header:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,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:`6`,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.narrative-sports.com/v1/tasks/create-task\"`}),_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 sk-nr-your-api-key-here\"`}),_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:` \"sport\": \"soccer\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` }'`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`header-format`,children:`Header Format`}),`\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 \u003cYOUR_API_KEY>`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`2`,id:`api-key-format`,children:`API Key Format`}),`\n`,_jsx(_components.p,{children:`API keys follow this format:`}),`\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:`sk-nr-\u003c32 hex characters>`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`For example: `,_jsx(_components.code,{children:`sk-nr-a1b2c3d4e5f6...`})]}),`\n`,_jsxs(_components.p,{children:[`When listed in the dashboard, keys are displayed with a truncated prefix (e.g., `,_jsx(_components.code,{children:`sk-nr-a1b2****`}),`) for security.`]}),`\n`,_jsx(Heading,{level:`2`,id:`authenticated-endpoints`,children:`Authenticated Endpoints`}),`\n`,_jsx(_components.p,{children:`The following endpoints require API key authentication:`}),`\n`,_jsx(Heading,{level:`3`,id:`task-management`,children:`Task Management`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Method`}),_jsx(_components.th,{children:`Endpoint`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`POST`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/tasks/create-task`})}),_jsx(_components.td,{children:`Create a task, launch a worker, and receive the SRT URL in one call (recommended)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`GET`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/tasks/list-tasks`})}),_jsxs(_components.td,{children:[`List tasks with status/details (supports `,_jsx(_components.code,{children:`state`}),` filtering)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`GET`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/tasks/{task_id}/info`})}),_jsx(_components.td,{children:`Get detailed info for a single task`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`POST`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/tasks/{task_id}/extend-life`})}),_jsx(_components.td,{children:`Increase the maximum lifetime of an active task`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`POST`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/tasks/{task_id}/kill`})}),_jsx(_components.td,{children:`Stop a task and terminate its worker`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`GET`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/tasks/active-tasks`})}),_jsx(_components.td,{children:`Get all active (queued/running/stopping) tasks`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`GET`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/tasks/usage-stats`})}),_jsx(_components.td,{children:`Get usage statistics and daily time-series data`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`POST`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/tasks/warmup`})}),_jsxs(_components.td,{children:[_jsx(_components.em,{children:`Deprecated.`}),` Pre-start a worker instance for a sport`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`POST`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/tasks/assign-task`})}),_jsxs(_components.td,{children:[_jsx(_components.em,{children:`Deprecated.`}),` Assign work to a warmed-up instance`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`GET`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/tasks/{task_id}/status`})}),_jsxs(_components.td,{children:[_jsx(_components.em,{children:`Deprecated.`}),` Poll for task readiness status (warmup flow only)`]})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`highlights`,children:`Highlights`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Method`}),_jsx(_components.th,{children:`Endpoint`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`GET`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/highlights`})}),_jsx(_components.td,{children:`List all highlights with optional task_id filter`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`GET`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/highlights/{highlight_id}`})}),_jsx(_components.td,{children:`Get metadata for a single highlight`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`GET`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/highlights/{highlight_id}/signed-url`})}),_jsx(_components.td,{children:`Generate a time-limited download URL for a rendered highlight`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`POST`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/highlights/batch-signed-urls`})}),_jsx(_components.td,{children:`Generate signed URLs for multiple highlights in one request`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`POST`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/highlights/{highlight_id}/presigned-upload-url`})}),_jsx(_components.td,{children:`Generate a presigned PUT URL for overwriting a highlight video`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`POST`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/highlights/batch-project-thumbnails`})}),_jsx(_components.td,{children:`Generate signed URLs for multiple project thumbnails`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`highlight-packages`,children:`Highlight Packages`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Method`}),_jsx(_components.th,{children:`Endpoint`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`POST`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/highlight-packages`})}),_jsx(_components.td,{children:`Create a multi-game highlight package`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`GET`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/highlight-packages/{package_id}`})}),_jsx(_components.td,{children:`Get details of a highlight package`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`GET`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/highlight-packages`})}),_jsx(_components.td,{children:`List all highlight packages`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`DELETE`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/highlight-packages/{package_id}`})}),_jsx(_components.td,{children:`Delete a highlight package`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`PATCH`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/highlight-packages/{package_id}`})}),_jsx(_components.td,{children:`Rename a highlight package`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`recaps`,children:`Recaps`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Method`}),_jsx(_components.th,{children:`Endpoint`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`POST`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/recaps`})}),_jsx(_components.td,{children:`Create a single-game recap`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`GET`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/recaps/{recap_id}`})}),_jsx(_components.td,{children:`Get details of a game recap`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`GET`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/recaps`})}),_jsx(_components.td,{children:`List all game recaps`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`DELETE`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/recaps/{recap_id}`})}),_jsx(_components.td,{children:`Delete a game recap`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`upload`,children:`Upload`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Method`}),_jsx(_components.th,{children:`Endpoint`}),_jsx(_components.th,{children:`Description`})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`POST`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/upload/presigned-url`})}),_jsx(_components.td,{children:`Generate a presigned URL for uploading a video file to GCS`})]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`example-request`,children:`Example Request`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,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:`7`,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.narrative-sports.com/v1/tasks/create-task\"`}),_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 sk-nr-a1b2c3d4e5f67890abcdef1234567890\"`}),_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:` \"sport\": \"soccer\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"srt_zero_relative_smpte_timecode\": \"01:00:00:00\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` }'`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`error-responses`,children:`Error Responses`}),`\n`,_jsx(Heading,{level:`3`,id:`401-unauthorized`,children:`401 Unauthorized`}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Missing API key:`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,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:`3`,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:` \"detail\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Missing API key\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Invalid API key:`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,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:`3`,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:` \"detail\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Invalid API key\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Expired API key:`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,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:`3`,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:` \"detail\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"API key has expired\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`api-key-security`,children:`API Key Security`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Keep your API key secure. Never expose it in client-side code or public repositories. The full key is only shown once at creation time and cannot be retrieved later.`})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Best practices:`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Store API keys in environment variables`}),`\n`,_jsx(_components.li,{children:`Use server-side requests only`}),`\n`,_jsx(_components.li,{children:`Rotate keys periodically`}),`\n`,_jsx(_components.li,{children:`Use separate keys for development and production`}),`\n`,_jsx(_components.li,{children:`Set an expiration date on keys when possible`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`public-endpoints`,children:`Public Endpoints`}),`\n`,_jsx(_components.p,{children:`The following endpoints do not require authentication:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Endpoint`}),_jsx(_components.th,{children:`Description`})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`GET /v1/health`})}),_jsx(_components.td,{children:`Health check`})]})})]})]})}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":"Authentication","description":"How to authenticate with the Narrative Sports API","href":"/authentication"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Overview","slug":"overview","depth":2,"children":[]},{"title":"Making Authenticated Requests","slug":"making-authenticated-requests","depth":2,"children":[]},{"title":"Header Format","slug":"header-format","depth":2,"children":[]},{"title":"API Key Format","slug":"api-key-format","depth":2,"children":[]},{"title":"Authenticated Endpoints","slug":"authenticated-endpoints","depth":2,"children":[{"title":"Task Management","slug":"task-management","depth":3,"children":[]},{"title":"Highlights","slug":"highlights","depth":3,"children":[]},{"title":"Highlight Packages","slug":"highlight-packages","depth":3,"children":[]},{"title":"Recaps","slug":"recaps","depth":3,"children":[]},{"title":"Upload","slug":"upload","depth":3,"children":[]}]},{"title":"Example Request","slug":"example-request","depth":2,"children":[]},{"title":"Error Responses","slug":"error-responses","depth":2,"children":[{"title":"401 Unauthorized","slug":"401-unauthorized","depth":3,"children":[]}]},{"title":"API Key Security","slug":"api-key-security","depth":2,"children":[]},{"title":"Public Endpoints","slug":"public-endpoints","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"narrativesports","siteName":"Narrative Sports","title":"Authentication - Narrative Sports","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-06-30T05:34:42.531Z","originalFileLocation":"authentication.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=\"How to authenticate with the Narrative Sports API\">\u003cmeta data-mint-head name=\"application-name\" content=\"Narrative Sports\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/narrativesports/RCqu0h0FDoVTr51N/_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/narrativesports/RCqu0h0FDoVTr51N/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/narrativesports/RCqu0h0FDoVTr51N/_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/narrativesports/RCqu0h0FDoVTr51N/_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/narrativesports/RCqu0h0FDoVTr51N/_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/narrativesports/RCqu0h0FDoVTr51N/_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/narrativesports/RCqu0h0FDoVTr51N/_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/narrativesports/RCqu0h0FDoVTr51N/_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/narrativesports/RCqu0h0FDoVTr51N/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Authentication - Narrative Sports\">\u003cmeta data-mint-head property=\"og:description\" content=\"How to authenticate with the Narrative Sports API\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Narrative Sports\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.narrative-sports.com/authentication\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://narrativesports.mintlify.app/_mintlify/api/og/v2?division=Introduction\u0026amp;title=Authentication\u0026amp;description=How+to+authenticate+with+the+Narrative+Sports+API\u0026amp;theme=585a8363fd89349efb1b7ef9\u0026amp;signature=610d880b3520b67310c3cffeac916a0f5eaccc610f5a33971f6788d80c61eed9\">\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=\"Authentication - Narrative Sports\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How to authenticate with the Narrative Sports API\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://narrativesports.mintlify.app/_mintlify/api/og/v2?division=Introduction\u0026amp;title=Authentication\u0026amp;description=How+to+authenticate+with+the+Narrative+Sports+API\u0026amp;theme=585a8363fd89349efb1b7ef9\u0026amp;signature=610d880b3520b67310c3cffeac916a0f5eaccc610f5a33971f6788d80c61eed9\">\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/narrativesports/RCqu0h0FDoVTr51N/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Narrative Sports\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#1a1a1a\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.narrative-sports.com/authentication\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/authentication.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.narrative-sports.com/#organization\",\"name\":\"Narrative Sports\",\"url\":\"https://docs.narrative-sports.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/narrativesports/vFVZH5QQ1ixolEbk/logo/light.png?fit=max\u0026auto=format\u0026n=vFVZH5QQ1ixolEbk\u0026q=85\u0026s=cce219b4abbc60216b849c6da610484d\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.narrative-sports.com#website\",\"name\":\"Narrative Sports\",\"url\":\"https://docs.narrative-sports.com\",\"publisher\":{\"@id\":\"https://docs.narrative-sports.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.narrative-sports.com/authentication#webpage\",\"url\":\"https://docs.narrative-sports.com/authentication\",\"name\":\"Authentication\",\"description\":\"How to authenticate with the Narrative Sports API\",\"dateModified\":\"2026-06-30T05:34:42.531Z\",\"isPartOf\":{\"@id\":\"https://docs.narrative-sports.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.narrative-sports.com/authentication#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.narrative-sports.com/authentication#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Introduction\",\"item\":\"https://docs.narrative-sports.com/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Authentication\",\"item\":\"https://docs.narrative-sports.com/authentication\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.narrative-sports.com/authentication#article\",\"headline\":\"Authentication\",\"name\":\"Authentication\",\"description\":\"How to authenticate with the Narrative Sports API\",\"url\":\"https://docs.narrative-sports.com/authentication\",\"mainEntityOfPage\":{\"@id\":\"https://docs.narrative-sports.com/authentication#webpage\"},\"dateModified\":\"2026-06-30T05:34:42.531Z\",\"publisher\":{\"@id\":\"https://docs.narrative-sports.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.narrative-sports.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Narrative Sports\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Narrative Sports","nav":{"global":{"anchors":[]},"tabs":[{"tab":"Getting Started","groups":[{"group":"Introduction","pages":[{"title":"Welcome to Narrative Sports","href":"/introduction"},{"title":"Quickstart","href":"/quickstart"},{"title":"Webhooks Quickstart","href":"/webhooks-quickstart"},{"title":"Create Highlight Packages","href":"/highlight-package-quickstart"},{"title":"Create Game Recaps","href":"/game-recap-quickstart"},{"title":"Supported Languages","description":"Languages supported for audio processing and highlight detection","href":"/supported-languages"},{"title":"Authentication","href":"/authentication"},{"title":"No Highlights Detected","description":"Common reasons why Narrative may not produce highlights from your stream","href":"/no-highlights"}]},{"group":"Concepts","pages":[{"title":"Event Types","href":"/concepts/event-types"},{"title":"Multi-Fight Cards","href":"/concepts/multi-fight-cards"},{"title":"OTIO Format","href":"/concepts/otio-format"},{"title":"Video Input Requirements","href":"/concepts/video-input-requirements"},{"title":"Dashboard Integration","href":"/concepts/dashboard-integration"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/sports/introduction"}]}]},"title":"Authentication - Narrative Sports","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":[],"chunks":[]}