{
"error": "Unauthorized",
"error_description": "You are not authorized to use this endpoint."
}
Derivations
Create a derivation rule
Create a new derivation rule. Requires an admin grant on attribute_derivations, and the rule is owned by
your own company. A user token whose user is a Narrative global admin is accepted without the grant; an app
token always needs it.
The rule’s transformation is validated before the rule can exist: the source and target attributes must exist and
be viewable — and the target must additionally grant your company map, since the rule produces values for it —
every expression must parse and type-check against the source attribute’s shape, the result must match the target
attribute’s declared type, every function must resolve. Each failure returns a 400 with a descriptive message.
A rule that closes a cycle in the derivation graph is created anyway; the cycle comes back as a warning on the
response.
POST
/
derivations
Create a derivation rule
curl --request POST \ --url https://api-dev.narrative.io/derivations \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "name": "raw_email_to_sha256", "description": "Hashes the raw email address with SHA-256.", "source_attribute_id": 123, "target_attribute_id": 123, "company_id": 123, "mapping": { "type": "object_mapping", "property_mappings": [ { "expression": "<string>", "path": "<string>" } ] }, "lossy": true, "imprecise": true, "collaborators": { "use": { "type": "none" } }, "fidelity_note": "Hashing is one-way, so the original address cannot be recovered.", "cost": 1, "active": true}'
{
"error": "Unauthorized",
"error_description": "You are not authorized to use this endpoint."
}
Authorizations
Authorization
string
header
required
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Body of POST /derivations.
name
string
required
Name of the derivation rule, unique within the owning company.
Maximum string length: 256
Example:
"raw_email_to_sha256"
description
string
required
What the rule does, for whoever is deciding whether to accept derived data.
Maximum string length: 2048
Example:
"Hashes the raw email address with SHA-256."
source_attribute_id
integer<int64>
required
The attribute the rule reads from through $source.
target_attribute_id
integer<int64>
required
The attribute whose value the rule produces. Must differ from source_attribute_id.
company_id
integer<int64>
required
The company that owns the rule. Must be the caller's company.
mapping
object
required
The transformation that produces the target attribute's value from the source attribute's value. Expressions
reference the source attribute's shape through $source — for a rule from raw_email to sha256_hashed_email,
the value property maps to SHA2(NORMALIZE_EMAIL($source.value), 256).
The shape mirrors mapping expressions, except cached_mapping is not allowed: a cached mapping reads values out
of a stored dataset, so there would be nothing to substitute a $source reference into.
Expressions may use the current date or time (CURRENT_DATE, CURRENT_TIMESTAMP, …): the expression runs when a
query resolves the rule, so a rule like birthdate → age in years is correct as of each query that uses it. Enum
constraints and validation expressions on the target attribute do not restrict the transformation, exactly as
they do not restrict a dataset mapping.
Option 1
Option 2
Show child attributes
lossy
boolean
required
The transformation loses information, e.g. hashing.
imprecise
boolean
required
The transformation is approximate, e.g. bucketing an age into a range.
collaborators
object
Which companies, besides the one that owns the rule, may have the rule applied to their data. A rule grants a
single thing, so there is one use dimension. Only Narrative can share a rule broadly — with all companies or
with everyone outside an exclusion set.
Show child attributes
Example:
{ "use": { "type": "none" } }
fidelity_note
string
Explains the lossy and imprecise flags to whoever is deciding whether to accept derived data.
Maximum string length: 2048
Example:
"Hashing is one-way, so the original address cannot be recovered."
cost
integer
default:1
Breaks ties when more than one rule reaches the same target attribute — cheapest first. Resolution over multi-step
paths sums the cost of every rule on a path and prefers the cheapest total.
Required range: x >= 1
active
boolean
default:true
Inactive rules are never applied.
Response
Created
id
integer<int64>
required
Unique identifier of the derivation rule.
Example:
42
name
string
required
Name of the derivation rule, unique within the owning company.
Maximum string length: 256
Example:
"raw_email_to_sha256"
description
string
required
What the rule does, for whoever is deciding whether to accept derived data.
Maximum string length: 2048
Example:
"Hashes the raw email address with SHA-256."
source_attribute_id
integer<int64>
required
target_attribute_id
integer<int64>
required
company_id
integer<int64>
required
collaborators
object
required
Which companies, besides the one that owns the rule, may have the rule applied to their data. A rule grants a
single thing, so there is one use dimension. Only Narrative can share a rule broadly — with all companies or
with everyone outside an exclusion set.
Show child attributes
Example:
{ "use": { "type": "none" } }
mapping
object
required
The transformation that produces the target attribute's value from the source attribute's value. Expressions
reference the source attribute's shape through $source — for a rule from raw_email to sha256_hashed_email,
the value property maps to SHA2(NORMALIZE_EMAIL($source.value), 256).
The shape mirrors mapping expressions, except cached_mapping is not allowed: a cached mapping reads values out
of a stored dataset, so there would be nothing to substitute a $source reference into.
Expressions may use the current date or time (CURRENT_DATE, CURRENT_TIMESTAMP, …): the expression runs when a
query resolves the rule, so a rule like birthdate → age in years is correct as of each query that uses it. Enum
constraints and validation expressions on the target attribute do not restrict the transformation, exactly as
they do not restrict a dataset mapping.
Option 1
Option 2
Show child attributes
lossy
boolean
required
imprecise
boolean
required
fidelity_note
string | null
required
Explains the lossy and imprecise flags to whoever is deciding whether to accept derived data. null when
the rule has no note.
Maximum string length: 2048
cost
integer
default:1
required
Breaks ties when more than one rule reaches the same target attribute — cheapest first. Resolution over multi-step
paths sums the cost of every rule on a path and prefers the cheapest total.
Required range: x >= 1
active
boolean
required
created_at
string<date-time>
required
created_by
integer<int64>
required
Id of the user who created the rule.
updated_at
string<date-time>
required
updated_by
integer<int64>
required
Id of the user who last updated the rule.
warnings
object[]
required
Populated on create and update responses; empty on reads.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Narrative I/O Knowledge Base","colors":{"primary":"#1438F5","light":"#F4F7FB","dark":"#010A28"},"logo":{"light":"https://mintcdn.com/narrative-07c7a1f7/ia6SQX79O4nc7uYf/logo/banner.png?fit=max\u0026auto=format\u0026n=ia6SQX79O4nc7uYf\u0026q=85\u0026s=99860b25011c79366624a87d1f648861","dark":"https://mintcdn.com/narrative-07c7a1f7/ia6SQX79O4nc7uYf/logo/banner-dark.png?fit=max\u0026auto=format\u0026n=ia6SQX79O4nc7uYf\u0026q=85\u0026s=604f9688855cf1123b9eddfc8a5bf0e5"},"favicon":"https://mintcdn.com/narrative-07c7a1f7/DaYE2y2_p0IkASZU/favicon.svg?fit=max\u0026auto=format\u0026n=DaYE2y2_p0IkASZU\u0026q=85\u0026s=9961047bdb2aaf9298577e1c3e624c24","navbar":{"links":[{"href":"mailto:[email protected]","label":"Support"}],"primary":{"type":"button","label":"Open Narrative","href":"https://app.narrative.io"}},"footer":{"socials":{"github":"https://github.com/narrative-io","linkedin":"https://linkedin.com/company/narrative-io"}},"seo":{"indexing":"navigable"},"integrations":{"fathom":{"siteId":"WELVPSSZ"},"ga4":{"measurementId":"G-27FP7EFNFW"},"cookies":{}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"Release Notes","icon":"clock-rotate-left","href":"/release-notes"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"narrative-07c7a1f7","hasAudioNarration":false,"actualSubdomain":"narrative-07c7a1f7","customDomains":["docs.narrative.io"],"gitSource":{"type":"github","owner":"narrative-io","repo":"mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af852f7f47e66462e347525","clientVersion":"0.0.4143","searchFilterCounts":[{"language":"default","tag":"API Documentation","count":230},{"language":"default","tag":"Connectors","count":112},{"language":"default","tag":"Reference","count":112},{"language":"default","tag":"All connectors","count":110},{"language":"default","tag":"Architecture Reference","count":77},{"language":"default","tag":"Agent Conversations","count":64},{"language":"default","tag":"Concepts","count":62},{"language":"default","tag":"Guides","count":58},{"language":"default","tag":"Errors","count":55},{"language":"default","tag":"API reference","count":43}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"[email protected]","showHelpButton":true}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","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":"rbac-expansion","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":"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":"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":"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":"full-page-search","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":"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":"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":"turbopuffer-dual-write","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},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","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}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/derivations/create-a-derivation-rule","slug":"/api-reference/derivations/create-a-derivation-rule","pageMetadata":{"title":"Create a derivation rule","description":"Create a new derivation rule. Requires an `admin` grant on `attribute_derivations`, and the rule is owned by\nyour own company. A user token whose user is a Narrative global admin is accepted without the grant; an app\ntoken always needs it.\n\nThe rule's transformation is validated before the rule can exist: the source and target attributes must exist and\nbe viewable — and the target must additionally grant your company `map`, since the rule produces values for it —\nevery expression must parse and type-check against the source attribute's shape, the result must match the target\nattribute's declared type, every function must resolve. Each failure returns a 400 with a descriptive message.\n\nA rule that closes a cycle in the derivation graph is created anyway; the cycle comes back as a warning on the\nresponse.","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /derivations","href":"/api-reference/derivations/create-a-derivation-rule","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Create a new derivation rule. Requires an \", _jsx(_components.code, {\n children: \"admin\"\n }), \" grant on \", _jsx(_components.code, {\n children: \"attribute_derivations\"\n }), \", and the rule is owned by\\nyour own company. A user token whose user is a Narrative global admin is accepted without the grant; an app\\ntoken always needs it.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The rule’s transformation is validated before the rule can exist: the source and target attributes must exist and\\nbe viewable — and the target must additionally grant your company \", _jsx(_components.code, {\n children: \"map\"\n }), \", since the rule produces values for it —\\nevery expression must parse and type-check against the source attribute’s shape, the result must match the target\\nattribute’s declared type, every function must resolve. Each failure returns a 400 with a descriptive message.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"A rule that closes a cycle in the derivation graph is created anyway; the cycle comes back as a warning on the\\nresponse.\"\n })]\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}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Create a derivation rule","description":"Create a new derivation rule. Requires an `admin` grant on `attribute_derivations`, and the rule is owned by\nyour own company. A user token whose user is a Narrative global admin is accepted without the grant; an app\ntoken always needs it.\n\nThe rule's transformation is validated before the rule can exist: the source and target attributes must exist and\nbe viewable — and the target must additionally grant your company `map`, since the rule produces values for it —\nevery expression must parse and type-check against the source attribute's shape, the result must match the target\nattribute's declared type, every function must resolve. Each failure returns a 400 with a descriptive message.\n\nA rule that closes a cycle in the derivation graph is created anyway; the cycle comes back as a warning on the\nresponse.","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /derivations","href":"/api-reference/derivations/create-a-derivation-rule","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/narrative-07c7a1f7/d5d45b2d00effc8b/secure-privacy.js"],"openApiReferenceData":{"operation":{"summary":"Create a derivation rule","description":"Create a new derivation rule. Requires an `admin` grant on `attribute_derivations`, and the rule is owned by\nyour own company. A user token whose user is a Narrative global admin is accepted without the grant; an app\ntoken always needs it.\n\nThe rule's transformation is validated before the rule can exist: the source and target attributes must exist and\nbe viewable — and the target must additionally grant your company `map`, since the rule produces values for it —\nevery expression must parse and type-check against the source attribute's shape, the result must match the target\nattribute's declared type, every function must resolve. Each failure returns a 400 with a descriptive message.\n\nA rule that closes a cycle in the derivation graph is created anyway; the cycle comes back as a warning on the\nresponse.","tags":["Derivations"],"security":["9a02effd-5ac4-42bf-8cf1-12bac6869de6"],"requestBody":"678a1ebb-cbfd-4eb2-aade-2755be15b004","responses":{"201":"e05404ed-06cd-4ae4-8510-7dfe29efdf65","400":"f71b9830-855d-47ef-b4aa-5efdeac87b09","403":"66142eec-45d4-438f-8099-63cb46db62a0","409":"9647f5fa-a6ce-4ea7-9a25-3f7c691cbde7"},"method":"post","type":"path","servers":["da33ef7e-c9ea-466d-b7d1-c2d3c2623ccd","49d111d4-7e28-4629-8677-904ae5faace8"],"path":"/derivations","baseUrlOptions":["https://api-dev.narrative.io","https://api.narrative.io"],"title":"Create a derivation rule","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Body of `POST /derivations`.","additionalProperties":true,"required":["name","description","source_attribute_id","target_attribute_id","company_id","mapping","lossy","imprecise"],"properties":{"name":{"type":"string","maxLength":256,"description":"Name of the derivation rule, unique within the owning company.","example":"raw_email_to_sha256","isRequired":true,"uniqueKey":"name","typeLabel":"string"},"description":{"type":"string","maxLength":2048,"description":"What the rule does, for whoever is deciding whether to accept derived data.","example":"Hashes the raw email address with SHA-256.","isRequired":true,"uniqueKey":"description","typeLabel":"string"},"source_attribute_id":{"type":"integer","format":"int64","description":"The attribute the rule reads from through `$source`.","isRequired":true,"uniqueKey":"source_attribute_id","typeLabel":"integer\u003cint64>"},"target_attribute_id":{"type":"integer","format":"int64","description":"The attribute whose value the rule produces. Must differ from `source_attribute_id`.","isRequired":true,"uniqueKey":"target_attribute_id","typeLabel":"integer\u003cint64>"},"company_id":{"type":"integer","format":"int64","description":"The company that owns the rule. Must be the caller's company.","isRequired":true,"uniqueKey":"company_id","typeLabel":"integer\u003cint64>"},"mapping":{"oneOf":[{"type":"object","description":"The transformation that produces the target attribute's value from the source attribute's value. Expressions\nreference the source attribute's shape through `$source` — for a rule from `raw_email` to `sha256_hashed_email`,\nthe `value` property maps to `SHA2(NORMALIZE_EMAIL($source.value), 256)`.\n\nThe shape mirrors mapping expressions, except `cached_mapping` is not allowed: a cached mapping reads values out\nof a stored dataset, so there would be nothing to substitute a `$source` reference into.\n\nExpressions may use the current date or time (`CURRENT_DATE`, `CURRENT_TIMESTAMP`, …): the expression runs when a\nquery resolves the rule, so a rule like birthdate → age in years is correct as of each query that uses it. Enum\nconstraints and validation expressions on the target attribute do not restrict the transformation, exactly as\nthey do not restrict a dataset mapping.","required":["type","property_mappings"],"properties":{"type":{"type":"string","description":"A mapping from a dataset to an attribute with a type of `object`.","enum":["object_mapping"],"isRequired":true,"uniqueKey":"mapping.oneOf.0.type","typeLabel":"enum\u003cstring>"},"property_mappings":{"type":"array","description":"`property_mappings` define how a value for each property of the target attribute is constructed from a row of the source dataset.\n\nA mapping must be provided for each of the target attribute's _required_ properties.","items":{"type":"object","properties":{"expression":{"type":"string","description":"A raw SQL expression which produces a value from the source dataset for the target primitive attribute type.\n\nE.g. for a source dataset with the following type definition:\n\n```\n{\n \"type\": \"object\",\n \"properties\": {\n \"firstName\": {\n \"type\": \"string\"\n },\n \"lastName\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"lastName\"\n ]\n}\n```\n\n\nValid expressions include:\n\n- Lower casing the first name:\n\n```sql\nlower(firstName)\n```\n\n- Constructing a \"full name\" from the first and last name:\n\n```sql\nconcat_ws(' ', coalesce(firstName, ''), lastName)\n```\n\n- Taking the first initial of the first name if is not null:\n\n```sql\ncase when firstName is not null and char_length(firstName) > 0 then substr(firstName, 1) else null end\n```","uniqueKey":"mapping.oneOf.0.property_mappings.items.[INDEX].expression","typeLabel":"string"},"path":{"type":"string","description":"A string indicating which property of the target attribute the expression is producing a value for.\n\nE.g. for an attribute with the following type definition;\n\n```\n{\n \"type\": \"object\",\n \"properties\": {\n \"latitude\": {\n \"type\": \"double\"\n },\n \"longitude\": {\n \"type\": \"double\"\n },\n \"location_accuracy\": {\n \"type\": \"object\",\n \"properties\": {\n \"horizontal\": {\n \"type\": \"double\"\n },\n \"vertical\": {\n \"type\": \"double\"\n }\n }\n }\n },\n \"required\": [\n \"latitude\",\n \"longitude\"\n ]\n}\n```\n\nThe possible paths are:\n\n- `latitude`\n- `longitude`\n- `location_accuracy.horizontal`\n- `location_accuracy.vertical`","uniqueKey":"mapping.oneOf.0.property_mappings.items.[INDEX].path","typeLabel":"string"}},"uniqueKey":"mapping.oneOf.0.property_mappings.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"mapping.oneOf.0.property_mappings","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"mapping.oneOf.0","typeLabel":"object"},{"type":"object","description":"The transformation that produces the target attribute's value from the source attribute's value. Expressions\nreference the source attribute's shape through `$source` — for a rule from `raw_email` to `sha256_hashed_email`,\nthe `value` property maps to `SHA2(NORMALIZE_EMAIL($source.value), 256)`.\n\nThe shape mirrors mapping expressions, except `cached_mapping` is not allowed: a cached mapping reads values out\nof a stored dataset, so there would be nothing to substitute a `$source` reference into.\n\nExpressions may use the current date or time (`CURRENT_DATE`, `CURRENT_TIMESTAMP`, …): the expression runs when a\nquery resolves the rule, so a rule like birthdate → age in years is correct as of each query that uses it. Enum\nconstraints and validation expressions on the target attribute do not restrict the transformation, exactly as\nthey do not restrict a dataset mapping.","required":["type","expression"],"properties":{"type":{"type":"string","description":"A mapping from a dataset to an attribute with a primitive type, i.e. one of `array`, `boolean`, `double`, `long`, `string`, or `timestamptz`.","enum":["value_mapping"],"isRequired":true,"uniqueKey":"mapping.oneOf.1.type","typeLabel":"enum\u003cstring>"},"expression":{"type":"string","description":"A raw SQL expression which produces a value from the source dataset for the target primitive attribute type.\n\nE.g. for a source dataset with the following type definition:\n\n```\n{\n \"type\": \"object\",\n \"properties\": {\n \"firstName\": {\n \"type\": \"string\"\n },\n \"lastName\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"lastName\"\n ]\n}\n```\n\n\nValid expressions include:\n\n- Lower casing the first name:\n\n```sql\nlower(firstName)\n```\n\n- Constructing a \"full name\" from the first and last name:\n\n```sql\nconcat_ws(' ', coalesce(firstName, ''), lastName)\n```\n\n- Taking the first initial of the first name if is not null:\n\n```sql\ncase when firstName is not null and char_length(firstName) > 0 then substr(firstName, 1) else null end\n```","isRequired":true,"uniqueKey":"mapping.oneOf.1.expression","typeLabel":"string"}},"isRequired":true,"uniqueKey":"mapping.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"mapping","typeLabel":"object"},"lossy":{"type":"boolean","description":"The transformation loses information, e.g. hashing.","isRequired":true,"uniqueKey":"lossy","typeLabel":"boolean"},"imprecise":{"type":"boolean","description":"The transformation is approximate, e.g. bucketing an age into a range.","isRequired":true,"uniqueKey":"imprecise","typeLabel":"boolean"},"collaborators":{"type":"object","description":"Which companies, besides the one that owns the rule, may have the rule applied to their data. A rule grants a\nsingle thing, so there is one `use` dimension. Only Narrative can share a rule broadly — with `all` companies or\nwith everyone outside an `exclusion` set.","required":["use"],"properties":{"use":{"oneOf":[{"type":"object","description":"Which companies a grant applies to.","required":["type"],"properties":{"type":{"type":"string","enum":["none"],"isRequired":true,"uniqueKey":"collaborators.use.oneOf.0.type","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"collaborators.use.oneOf.0","typeLabel":"object"},{"type":"object","description":"Which companies a grant applies to.","required":["type"],"properties":{"type":{"type":"string","enum":["all"],"isRequired":true,"uniqueKey":"collaborators.use.oneOf.1.type","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"collaborators.use.oneOf.1","typeLabel":"object"},{"type":"object","description":"Which companies a grant applies to.","required":["type","company_ids"],"properties":{"type":{"type":"string","enum":["inclusion"],"isRequired":true,"uniqueKey":"collaborators.use.oneOf.2.type","typeLabel":"enum\u003cstring>"},"company_ids":{"type":"array","minItems":1,"items":{"type":"integer","format":"int64","minimum":1,"description":"Company ID","uniqueKey":"collaborators.use.oneOf.2.company_ids.items.[INDEX]","typeLabel":"integer\u003cint64>"},"isRequired":true,"uniqueKey":"collaborators.use.oneOf.2.company_ids","typeLabel":"integer\u003cint64>[]"}},"isRequired":true,"uniqueKey":"collaborators.use.oneOf.2","typeLabel":"object"},{"type":"object","description":"Which companies a grant applies to.","required":["type","company_ids"],"properties":{"type":{"type":"string","enum":["exclusion"],"isRequired":true,"uniqueKey":"collaborators.use.oneOf.3.type","typeLabel":"enum\u003cstring>"},"company_ids":{"type":"array","minItems":1,"items":{"type":"integer","format":"int64","minimum":1,"description":"Company ID","uniqueKey":"collaborators.use.oneOf.3.company_ids.items.[INDEX]","typeLabel":"integer\u003cint64>"},"isRequired":true,"uniqueKey":"collaborators.use.oneOf.3.company_ids","typeLabel":"integer\u003cint64>[]"}},"isRequired":true,"uniqueKey":"collaborators.use.oneOf.3","typeLabel":"object"}],"isRequired":true,"uniqueKey":"collaborators.use","typeLabel":"object"}},"example":{"use":{"type":"none"}},"uniqueKey":"collaborators","typeLabel":"object"},"fidelity_note":{"type":"string","maxLength":2048,"description":"Explains the `lossy` and `imprecise` flags to whoever is deciding whether to accept derived data.","example":"Hashing is one-way, so the original address cannot be recovered.","uniqueKey":"fidelity_note","typeLabel":"string"},"cost":{"type":"integer","minimum":1,"default":1,"description":"Breaks ties when more than one rule reaches the same target attribute — cheapest first. Resolution over multi-step\npaths sums the cost of every rule on a path and prefers the cheapest total.","uniqueKey":"cost","typeLabel":"integer"},"active":{"type":"boolean","default":true,"description":"Inactive rules are never applied.","uniqueKey":"active","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"name":"raw_email_to_sha256","description":"Hashes the raw email address with SHA-256.","source_attribute_id":123,"target_attribute_id":123,"company_id":123,"mapping":{"type":"object_mapping","property_mappings":[{"expression":"\u003cstring>","path":"\u003cstring>"}]},"lossy":true,"imprecise":true,"collaborators":{"use":{"type":"none"}},"fidelity_note":"Hashing is one-way, so the original address cannot be recovered.","cost":1,"active":true}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"e05404ed-06cd-4ae4-8510-7dfe29efdf65":{"description":"Created","content":{"application/json":{"schema":{"type":"object","required":["id","name","description","source_attribute_id","target_attribute_id","company_id","collaborators","mapping","lossy","imprecise","fidelity_note","cost","active","created_at","created_by","updated_at","updated_by","warnings"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier of the derivation rule.","example":42,"isRequired":true,"uniqueKey":"id","typeLabel":"integer\u003cint64>"},"name":{"type":"string","maxLength":256,"description":"Name of the derivation rule, unique within the owning company.","example":"raw_email_to_sha256","isRequired":true,"uniqueKey":"name","typeLabel":"string"},"description":{"type":"string","maxLength":2048,"description":"What the rule does, for whoever is deciding whether to accept derived data.","example":"Hashes the raw email address with SHA-256.","isRequired":true,"uniqueKey":"description","typeLabel":"string"},"source_attribute_id":{"type":"integer","format":"int64","isRequired":true,"uniqueKey":"source_attribute_id","typeLabel":"integer\u003cint64>"},"target_attribute_id":{"type":"integer","format":"int64","isRequired":true,"uniqueKey":"target_attribute_id","typeLabel":"integer\u003cint64>"},"company_id":{"type":"integer","format":"int64","isRequired":true,"uniqueKey":"company_id","typeLabel":"integer\u003cint64>"},"collaborators":{"type":"object","description":"Which companies, besides the one that owns the rule, may have the rule applied to their data. A rule grants a\nsingle thing, so there is one `use` dimension. Only Narrative can share a rule broadly — with `all` companies or\nwith everyone outside an `exclusion` set.","required":["use"],"properties":{"use":{"oneOf":[{"type":"object","description":"Which companies a grant applies to.","required":["type"],"properties":{"type":{"type":"string","enum":["none"],"isRequired":true,"uniqueKey":"collaborators.use.oneOf.0.type","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"collaborators.use.oneOf.0","typeLabel":"object"},{"type":"object","description":"Which companies a grant applies to.","required":["type"],"properties":{"type":{"type":"string","enum":["all"],"isRequired":true,"uniqueKey":"collaborators.use.oneOf.1.type","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"collaborators.use.oneOf.1","typeLabel":"object"},{"type":"object","description":"Which companies a grant applies to.","required":["type","company_ids"],"properties":{"type":{"type":"string","enum":["inclusion"],"isRequired":true,"uniqueKey":"collaborators.use.oneOf.2.type","typeLabel":"enum\u003cstring>"},"company_ids":{"type":"array","minItems":1,"items":{"type":"integer","format":"int64","minimum":1,"description":"Company ID","uniqueKey":"collaborators.use.oneOf.2.company_ids.items.[INDEX]","typeLabel":"integer\u003cint64>"},"isRequired":true,"uniqueKey":"collaborators.use.oneOf.2.company_ids","typeLabel":"integer\u003cint64>[]"}},"isRequired":true,"uniqueKey":"collaborators.use.oneOf.2","typeLabel":"object"},{"type":"object","description":"Which companies a grant applies to.","required":["type","company_ids"],"properties":{"type":{"type":"string","enum":["exclusion"],"isRequired":true,"uniqueKey":"collaborators.use.oneOf.3.type","typeLabel":"enum\u003cstring>"},"company_ids":{"type":"array","minItems":1,"items":{"type":"integer","format":"int64","minimum":1,"description":"Company ID","uniqueKey":"collaborators.use.oneOf.3.company_ids.items.[INDEX]","typeLabel":"integer\u003cint64>"},"isRequired":true,"uniqueKey":"collaborators.use.oneOf.3.company_ids","typeLabel":"integer\u003cint64>[]"}},"isRequired":true,"uniqueKey":"collaborators.use.oneOf.3","typeLabel":"object"}],"isRequired":true,"uniqueKey":"collaborators.use","typeLabel":"object"}},"example":{"use":{"type":"none"}},"isRequired":true,"uniqueKey":"collaborators","typeLabel":"object"},"mapping":{"oneOf":[{"type":"object","description":"The transformation that produces the target attribute's value from the source attribute's value. Expressions\nreference the source attribute's shape through `$source` — for a rule from `raw_email` to `sha256_hashed_email`,\nthe `value` property maps to `SHA2(NORMALIZE_EMAIL($source.value), 256)`.\n\nThe shape mirrors mapping expressions, except `cached_mapping` is not allowed: a cached mapping reads values out\nof a stored dataset, so there would be nothing to substitute a `$source` reference into.\n\nExpressions may use the current date or time (`CURRENT_DATE`, `CURRENT_TIMESTAMP`, …): the expression runs when a\nquery resolves the rule, so a rule like birthdate → age in years is correct as of each query that uses it. Enum\nconstraints and validation expressions on the target attribute do not restrict the transformation, exactly as\nthey do not restrict a dataset mapping.","required":["type","property_mappings"],"properties":{"type":{"type":"string","description":"A mapping from a dataset to an attribute with a type of `object`.","enum":["object_mapping"],"isRequired":true,"uniqueKey":"mapping.oneOf.0.type","typeLabel":"enum\u003cstring>"},"property_mappings":{"type":"array","description":"`property_mappings` define how a value for each property of the target attribute is constructed from a row of the source dataset.\n\nA mapping must be provided for each of the target attribute's _required_ properties.","items":{"type":"object","properties":{"expression":{"type":"string","description":"A raw SQL expression which produces a value from the source dataset for the target primitive attribute type.\n\nE.g. for a source dataset with the following type definition:\n\n```\n{\n \"type\": \"object\",\n \"properties\": {\n \"firstName\": {\n \"type\": \"string\"\n },\n \"lastName\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"lastName\"\n ]\n}\n```\n\n\nValid expressions include:\n\n- Lower casing the first name:\n\n```sql\nlower(firstName)\n```\n\n- Constructing a \"full name\" from the first and last name:\n\n```sql\nconcat_ws(' ', coalesce(firstName, ''), lastName)\n```\n\n- Taking the first initial of the first name if is not null:\n\n```sql\ncase when firstName is not null and char_length(firstName) > 0 then substr(firstName, 1) else null end\n```","uniqueKey":"mapping.oneOf.0.property_mappings.items.[INDEX].expression","typeLabel":"string"},"path":{"type":"string","description":"A string indicating which property of the target attribute the expression is producing a value for.\n\nE.g. for an attribute with the following type definition;\n\n```\n{\n \"type\": \"object\",\n \"properties\": {\n \"latitude\": {\n \"type\": \"double\"\n },\n \"longitude\": {\n \"type\": \"double\"\n },\n \"location_accuracy\": {\n \"type\": \"object\",\n \"properties\": {\n \"horizontal\": {\n \"type\": \"double\"\n },\n \"vertical\": {\n \"type\": \"double\"\n }\n }\n }\n },\n \"required\": [\n \"latitude\",\n \"longitude\"\n ]\n}\n```\n\nThe possible paths are:\n\n- `latitude`\n- `longitude`\n- `location_accuracy.horizontal`\n- `location_accuracy.vertical`","uniqueKey":"mapping.oneOf.0.property_mappings.items.[INDEX].path","typeLabel":"string"}},"uniqueKey":"mapping.oneOf.0.property_mappings.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"mapping.oneOf.0.property_mappings","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"mapping.oneOf.0","typeLabel":"object"},{"type":"object","description":"The transformation that produces the target attribute's value from the source attribute's value. Expressions\nreference the source attribute's shape through `$source` — for a rule from `raw_email` to `sha256_hashed_email`,\nthe `value` property maps to `SHA2(NORMALIZE_EMAIL($source.value), 256)`.\n\nThe shape mirrors mapping expressions, except `cached_mapping` is not allowed: a cached mapping reads values out\nof a stored dataset, so there would be nothing to substitute a `$source` reference into.\n\nExpressions may use the current date or time (`CURRENT_DATE`, `CURRENT_TIMESTAMP`, …): the expression runs when a\nquery resolves the rule, so a rule like birthdate → age in years is correct as of each query that uses it. Enum\nconstraints and validation expressions on the target attribute do not restrict the transformation, exactly as\nthey do not restrict a dataset mapping.","required":["type","expression"],"properties":{"type":{"type":"string","description":"A mapping from a dataset to an attribute with a primitive type, i.e. one of `array`, `boolean`, `double`, `long`, `string`, or `timestamptz`.","enum":["value_mapping"],"isRequired":true,"uniqueKey":"mapping.oneOf.1.type","typeLabel":"enum\u003cstring>"},"expression":{"type":"string","description":"A raw SQL expression which produces a value from the source dataset for the target primitive attribute type.\n\nE.g. for a source dataset with the following type definition:\n\n```\n{\n \"type\": \"object\",\n \"properties\": {\n \"firstName\": {\n \"type\": \"string\"\n },\n \"lastName\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"lastName\"\n ]\n}\n```\n\n\nValid expressions include:\n\n- Lower casing the first name:\n\n```sql\nlower(firstName)\n```\n\n- Constructing a \"full name\" from the first and last name:\n\n```sql\nconcat_ws(' ', coalesce(firstName, ''), lastName)\n```\n\n- Taking the first initial of the first name if is not null:\n\n```sql\ncase when firstName is not null and char_length(firstName) > 0 then substr(firstName, 1) else null end\n```","isRequired":true,"uniqueKey":"mapping.oneOf.1.expression","typeLabel":"string"}},"isRequired":true,"uniqueKey":"mapping.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"mapping","typeLabel":"object"},"lossy":{"type":"boolean","isRequired":true,"uniqueKey":"lossy","typeLabel":"boolean"},"imprecise":{"type":"boolean","isRequired":true,"uniqueKey":"imprecise","typeLabel":"boolean"},"fidelity_note":{"oneOf":[{"type":"string","maxLength":2048,"description":"Explains the `lossy` and `imprecise` flags to whoever is deciding whether to accept derived data. `null` when\nthe rule has no note.","isRequired":true,"uniqueKey":"fidelity_note.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":2048,"description":"Explains the `lossy` and `imprecise` flags to whoever is deciding whether to accept derived data. `null` when\nthe rule has no note.","isRequired":true,"uniqueKey":"fidelity_note.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"fidelity_note","typeLabel":"string | null"},"cost":{"type":"integer","minimum":1,"default":1,"description":"Breaks ties when more than one rule reaches the same target attribute — cheapest first. Resolution over multi-step\npaths sums the cost of every rule on a path and prefers the cheapest total.","isRequired":true,"uniqueKey":"cost","typeLabel":"integer"},"active":{"type":"boolean","isRequired":true,"uniqueKey":"active","typeLabel":"boolean"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"created_by":{"type":"integer","format":"int64","description":"Id of the user who created the rule.","isRequired":true,"uniqueKey":"created_by","typeLabel":"integer\u003cint64>"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"updated_at","typeLabel":"string\u003cdate-time>"},"updated_by":{"type":"integer","format":"int64","description":"Id of the user who last updated the rule.","isRequired":true,"uniqueKey":"updated_by","typeLabel":"integer\u003cint64>"},"warnings":{"type":"array","description":"Populated on create and update responses; empty on reads.","items":{"type":"object","description":"A condition worth knowing about that did not stop the rule from being written. Returned on create and update\nresponses; list and get responses do not compute warnings.","required":["type","cycle"],"properties":{"type":{"type":"string","enum":["cyclic_derivation"],"isRequired":true,"uniqueKey":"warnings.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"cycle":{"type":"array","description":"The rule closes a cycle in the derivation graph. Lists the attribute ids visited in order, starting from the\nrule's source attribute; the closing step back to the first id is implied. Cycle detection is bounded: only\ncycles of up to 6 attributes are reported, and at most 10 come back.","minItems":1,"items":{"type":"integer","format":"int64","uniqueKey":"warnings.items.[INDEX].cycle.items.[INDEX]","typeLabel":"integer\u003cint64>"},"isRequired":true,"uniqueKey":"warnings.items.[INDEX].cycle","typeLabel":"integer\u003cint64>[]"}},"uniqueKey":"warnings.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"warnings","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":42,"name":"raw_email_to_sha256","description":"Hashes the raw email address with SHA-256.","source_attribute_id":123,"target_attribute_id":123,"company_id":123,"collaborators":{"use":{"type":"none"}},"mapping":{"type":"object_mapping","property_mappings":[{"expression":"\u003cstring>","path":"\u003cstring>"}]},"lossy":true,"imprecise":true,"fidelity_note":"\u003cstring>","cost":1,"active":true,"created_at":"2023-11-07T05:31:56Z","created_by":123,"updated_at":"2023-11-07T05:31:56Z","updated_by":123,"warnings":[{"type":"cyclic_derivation","cycle":[123]}]}}},"exampleType":"generated"}},"exampleType":"generated"},"f71b9830-855d-47ef-b4aa-5efdeac87b09":{"description":"The rule is invalid — see the error message for the specific validation failure.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"66142eec-45d4-438f-8099-63cb46db62a0":{"description":"The request is not allowed with the token sent, or no valid token was sent.","content":{"application/json":{"schema":{"type":"object","required":["error","error_description"],"properties":{"error":{"type":"string","example":"Unauthorized","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"error_description":{"type":"string","example":"You are not authorized to use this endpoint.","isRequired":true,"uniqueKey":"error_description","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"Unauthorized","error_description":"You are not authorized to use this endpoint."}}},"exampleType":"generated"}},"exampleType":"generated"},"9647f5fa-a6ce-4ea7-9a25-3f7c691cbde7":{"description":"Another of the company's rules already uses the same name, or already covers the same source and target\nattributes.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}}},"security":{"9a02effd-5ac4-42bf-8cf1-12bac6869de6":{"BearerAuth":{"type":"http","scheme":"bearer","scopes":[],"schemeName":"BearerAuth"}}},"servers":{"da33ef7e-c9ea-466d-b7d1-c2d3c2623ccd":{"url":"https://api-dev.narrative.io"},"49d111d4-7e28-4629-8677-904ae5faace8":{"url":"https://api.narrative.io"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","scopes":[],"schemeName":"BearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Bearer authentication header of the form `Bearer \u003ctoken>`, where `\u003ctoken>` is your auth token.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"BearerAuth","name":"Authorization"}],"title":"BearerAuth"}]},"originalFileLocation":"https://docs-cdn.narrative.io/api-reference/main/openapi.json"},"subdomain":"narrative-07c7a1f7","siteName":"Narrative I/O Knowledge Base","title":"Create a derivation rule - Narrative I/O Knowledge Base","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-12T18:20:54.466Z","originalFileLocation":"api-reference/derivations/create-a-derivation-rule.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 new derivation rule. Requires an admin grant on attribute_derivations, and the rule is owned by your own company. A user token whose user is a Narrative global admin is accepted without the grant; an app token always needs it. The rule\u0026#x27;s transformation is validated before the rule can exist: the source and target attributes must exist and be viewable — and the target must additionally grant your company map, since the rule produces values for it — every expression must parse and type-check against the source attribute\u0026#x27;s shape, the result must match the target attribute\u0026#x27;s declared type, every function must resolve. Each failure returns a 400 with a descriptive message. A rule that closes a cycle in the derivation graph is created anyway; the cycle comes back as a warning on the response.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Narrative I/O Knowledge Base\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/narrative-07c7a1f7/OOk68seBU2ePTAv6/_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/narrative-07c7a1f7/OOk68seBU2ePTAv6/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/narrative-07c7a1f7/OOk68seBU2ePTAv6/_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/narrative-07c7a1f7/OOk68seBU2ePTAv6/_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/narrative-07c7a1f7/OOk68seBU2ePTAv6/_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/narrative-07c7a1f7/OOk68seBU2ePTAv6/_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/narrative-07c7a1f7/OOk68seBU2ePTAv6/_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/narrative-07c7a1f7/OOk68seBU2ePTAv6/_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/narrative-07c7a1f7/OOk68seBU2ePTAv6/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Create a derivation rule - Narrative I/O Knowledge Base\">\u003cmeta data-mint-head property=\"og:description\" content=\"Create a new derivation rule. Requires an admin grant on attribute_derivations, and the rule is owned by your own company. A user token whose user is a Narrative global admin is accepted without the grant; an app token always needs it. The rule\u0026#x27;s transformation is validated before the rule can exist: the source and target attributes must exist and be viewable — and the target must additionally grant your company map, since the rule produces values for it — every expression must parse and type-check against the source attribute\u0026#x27;s shape, the result must match the target attribute\u0026#x27;s declared type, every function must resolve. Each failure returns a 400 with a descriptive message. A rule that closes a cycle in the derivation graph is created anyway; the cycle comes back as a warning on the response.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Narrative I/O Knowledge Base\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.narrative.io/api-reference/derivations/create-a-derivation-rule\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://narrative-07c7a1f7.mintlify.site/_mintlify/api/og/v2?division=Derivations\u0026amp;title=Create+a+derivation+rule\u0026amp;description=Create+a+new+derivation+rule.+Requires+an+%60admin%60+grant+on+%60attribute_derivations%60%2C+and+the+rule+is+owned+by%0Ayour+own+company.+A+user+token+whose+user+is+a+Narr\u0026amp;theme=ea22b67648b2d3a364e0af75\u0026amp;signature=0ac5e6844bba29b393310ebd0ab3ffabb1b50ebb3f133e1b4e730a942aa0c3ad\">\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 derivation rule - Narrative I/O Knowledge Base\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Create a new derivation rule. Requires an admin grant on attribute_derivations, and the rule is owned by your own company. A user token whose user is a Narrative global admin is accepted without the grant; an app token always needs it. The rule\u0026#x27;s transformation is validated before the rule can exist: the source and target attributes must exist and be viewable — and the target must additionally grant your company map, since the rule produces values for it — every expression must parse and type-check against the source attribute\u0026#x27;s shape, the result must match the target attribute\u0026#x27;s declared type, every function must resolve. Each failure returns a 400 with a descriptive message. A rule that closes a cycle in the derivation graph is created anyway; the cycle comes back as a warning on the response.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://narrative-07c7a1f7.mintlify.site/_mintlify/api/og/v2?division=Derivations\u0026amp;title=Create+a+derivation+rule\u0026amp;description=Create+a+new+derivation+rule.+Requires+an+%60admin%60+grant+on+%60attribute_derivations%60%2C+and+the+rule+is+owned+by%0Ayour+own+company.+A+user+token+whose+user+is+a+Narr\u0026amp;theme=ea22b67648b2d3a364e0af75\u0026amp;signature=0ac5e6844bba29b393310ebd0ab3ffabb1b50ebb3f133e1b4e730a942aa0c3ad\">\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/narrative-07c7a1f7/OOk68seBU2ePTAv6/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Narrative I/O Knowledge Base\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#1438F5\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.narrative.io/api-reference/derivations/create-a-derivation-rule\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/derivations/create-a-derivation-rule.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.narrative.io/#organization\",\"name\":\"Narrative I/O Knowledge Base\",\"url\":\"https://docs.narrative.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/narrative-07c7a1f7/ia6SQX79O4nc7uYf/logo/banner.png?fit=max\u0026auto=format\u0026n=ia6SQX79O4nc7uYf\u0026q=85\u0026s=99860b25011c79366624a87d1f648861\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.narrative.io#website\",\"name\":\"Narrative I/O Knowledge Base\",\"url\":\"https://docs.narrative.io\",\"publisher\":{\"@id\":\"https://docs.narrative.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.narrative.io/api-reference/derivations/create-a-derivation-rule#webpage\",\"url\":\"https://docs.narrative.io/api-reference/derivations/create-a-derivation-rule\",\"name\":\"Create a derivation rule\",\"description\":\"Create a new derivation rule. Requires an admin grant on attribute_derivations, and the rule is owned by your own company. A user token whose user is a Narrative global admin is accepted without the grant; an app token always needs it. The rule's transformation is validated before the rule can exist: the source and target attributes must exist and be viewable — and the target must additionally grant your company map, since the rule produces values for it — every expression must parse and type-check against the source attribute's shape, the result must match the target attribute's declared type, every function must resolve. Each failure returns a 400 with a descriptive message. A rule that closes a cycle in the derivation graph is created anyway; the cycle comes back as a warning on the response.\",\"dateModified\":\"2026-11-12T18:20:54.466Z\",\"isPartOf\":{\"@id\":\"https://docs.narrative.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.narrative.io/api-reference/derivations/create-a-derivation-rule#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.narrative.io/api-reference/derivations/create-a-derivation-rule#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Derivations\",\"item\":\"https://docs.narrative.io/api-reference/derivations/get-derivation-rules\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create a derivation rule\",\"item\":\"https://docs.narrative.io/api-reference/derivations/create-a-derivation-rule\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.narrative.io/api-reference/derivations/create-a-derivation-rule#apireference\",\"headline\":\"Create a derivation rule\",\"name\":\"Create a derivation rule\",\"description\":\"Create a new derivation rule. Requires an admin grant on attribute_derivations, and the rule is owned by your own company. A user token whose user is a Narrative global admin is accepted without the grant; an app token always needs it. The rule's transformation is validated before the rule can exist: the source and target attributes must exist and be viewable — and the target must additionally grant your company map, since the rule produces values for it — every expression must parse and type-check against the source attribute's shape, the result must match the target attribute's declared type, every function must resolve. Each failure returns a 400 with a descriptive message. A rule that closes a cycle in the derivation graph is created anyway; the cycle comes back as a warning on the response.\",\"url\":\"https://docs.narrative.io/api-reference/derivations/create-a-derivation-rule\",\"mainEntityOfPage\":{\"@id\":\"https://docs.narrative.io/api-reference/derivations/create-a-derivation-rule#webpage\"},\"dateModified\":\"2026-11-12T18:20:54.466Z\",\"publisher\":{\"@id\":\"https://docs.narrative.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.narrative.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Narrative I/O Knowledge Base\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Narrative I/O Knowledge Base\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/derivations/create-a-derivation-rule.md","siteName":"Narrative I/O Knowledge Base","nav":{"global":{"anchors":[{"anchor":"Release Notes","icon":"clock-rotate-left","href":"/release-notes"}]},"tabs":[{"tab":"Getting Started","pages":[{"title":"Getting Started","href":"/getting-started/create-account"}]},{"tab":"Concepts","pages":[{"title":"Concepts","href":"/concepts"}]},{"tab":"Guides","pages":[{"title":"Guides","href":"/guides"}]},{"tab":"Cookbooks","pages":[{"title":"Cookbooks","href":"/cookbooks"}]},{"tab":"Reference","pages":[{"title":"Reference","href":"/reference"}]},{"tab":"Connectors","pages":[{"title":"Connectors","href":"/reference/connectors"}]},{"tab":"NQL","pages":[{"title":"NQL","href":"/nql"}]},{"tab":"API Documentation","groups":[{"group":"Overview","pages":[{"title":"REST API","href":"/api-reference/introduction"}]},{"group":"Access Rules","pages":[{"title":"Get an Access Rule by id (V2)","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /v2/access-rules/{access_rule_id}","href":"/api-reference/access-rules/get-an-access-rule-by-id-v2"},{"title":"Update an Access Rule by id (V2)","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /v2/access-rules/{access_rule_id}","href":"/api-reference/access-rules/update-an-access-rule-by-id-v2"},{"title":"Delete an access rule","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /v2/access-rules/{access_rule_id}","href":"/api-reference/access-rules/delete-an-access-rule"},{"title":"Get the query policy of an Access Rule","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /v2/access-rules/{access_rule_id}/query-policy","href":"/api-reference/access-rules/get-the-query-policy-of-an-access-rule"},{"title":"Set the query policy of an Access Rule","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /v2/access-rules/{access_rule_id}/query-policy","href":"/api-reference/access-rules/set-the-query-policy-of-an-access-rule"},{"title":"Remove the query policy of an Access Rule","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /v2/access-rules/{access_rule_id}/query-policy","href":"/api-reference/access-rules/remove-the-query-policy-of-an-access-rule"},{"title":"Get an Access Rule by name (V2)","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /v2/access-rules/{company_slug}/{access_rule_name}","href":"/api-reference/access-rules/get-an-access-rule-by-name-v2"},{"title":"Get all accessible Access Rules (V2)","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /v2/access-rules","href":"/api-reference/access-rules/get-all-accessible-access-rules-v2"},{"title":"Create a new Access Rule","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /v2/access-rules","href":"/api-reference/access-rules/create-a-new-access-rule"}]},{"group":"Access Tokens","pages":[{"title":"List Access Tokens","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /access-tokens/tokens","href":"/api-reference/access-tokens/list-access-tokens"},{"title":"Create Access Token","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /access-tokens/tokens","href":"/api-reference/access-tokens/create-access-token"},{"title":"Get Access Token","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /access-tokens/tokens/{access_token_id}","href":"/api-reference/access-tokens/get-access-token"},{"title":"Update Access Token","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /access-tokens/tokens/{access_token_id}","href":"/api-reference/access-tokens/update-access-token"},{"title":"Delete Access Token","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /access-tokens/tokens/{access_token_id}","href":"/api-reference/access-tokens/delete-access-token"},{"title":"Rotate Access Token","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /access-tokens/tokens/{access_token_id}/rotate","href":"/api-reference/access-tokens/rotate-access-token"}]},{"group":"Agent Conversations","pages":[{"title":"List the calling user's agent conversations","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /agents/conversations","href":"/api-reference/agent-conversations/list-the-calling-users-agent-conversations"},{"title":"Create an agent conversation","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /agents/conversations","href":"/api-reference/agent-conversations/create-an-agent-conversation"},{"title":"Get an agent conversation","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /agents/conversations/{id}","href":"/api-reference/agent-conversations/get-an-agent-conversation"},{"title":"List conversation messages (delta read by version cursor)","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /agents/conversations/{id}/messages","href":"/api-reference/agent-conversations/list-conversation-messages-delta-read-by-version-cursor"},{"title":"Start a new run on the conversation","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /agents/conversations/{id}/runs","href":"/api-reference/agent-conversations/start-a-new-run-on-the-conversation"},{"title":"Stop waiting on a handle","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /agents/conversations/{id}/waitables/{handle}/cancel","href":"/api-reference/agent-conversations/stop-waiting-on-a-handle"},{"title":"Get a run's current state","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /agents/runs/{id}","href":"/api-reference/agent-conversations/get-a-runs-current-state"}]},{"group":"App API","pages":[{"title":"Delivery Commands","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /v1/app/commands/delivery","href":"/api-reference/app-api/delivery-commands"},{"title":"Delivery Files","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /v1/app/commands/delivery/{delivery_id}/files","href":"/api-reference/app-api/delivery-files"},{"title":"Download file","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /v1/app/commands/delivery/{delivery_id}/download/{filename}","href":"/api-reference/app-api/download-file"}]},{"group":"App Invites","pages":[{"title":"List App Invites","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /app-invites","href":"/api-reference/app-invites/list-app-invites"},{"title":"Create App Invite","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /app-invites","href":"/api-reference/app-invites/create-app-invite"},{"title":"Get App Invite","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /app-invites/{id}","href":"/api-reference/app-invites/get-app-invite"},{"title":"Archive App Invite","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /app-invites/{id}","href":"/api-reference/app-invites/archive-app-invite"},{"title":"Activate App Invite","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /app-invites/{id}/activate","href":"/api-reference/app-invites/activate-app-invite"},{"title":"Get App Invite By Code","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /app-invites/codes/{code}","href":"/api-reference/app-invites/get-app-invite-by-code"}]},{"group":"Apps","pages":[{"title":"Lists apps","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /apps","href":"/api-reference/apps/lists-apps"},{"title":"Publish app event","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /apps/events","href":"/api-reference/apps/publish-app-event"},{"title":"List installed app interfaces","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /apps/installed/interfaces","href":"/api-reference/apps/list-installed-app-interfaces"},{"title":"List app interfaces","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /apps/{app_id}/interfaces","href":"/api-reference/apps/list-app-interfaces"},{"title":"Get an app interface","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /apps/{app_id}/interfaces/{interface_id}","href":"/api-reference/apps/get-an-app-interface"},{"title":"Lists profiles","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /apps/{app_slug}/profiles","href":"/api-reference/apps/lists-profiles"},{"title":"Get an app's v1 manifest","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /apps/{app_slug}/manifest","href":"/api-reference/apps/get-an-apps-v1-manifest"},{"title":"List Apps","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /v2/apps","href":"/api-reference/apps/list-apps"},{"title":"Create App","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /v2/apps","href":"/api-reference/apps/create-app"},{"title":"Get App","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /v2/apps/{slug}","href":"/api-reference/apps/get-app"},{"title":"Archive App","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /v2/apps/{slug}","href":"/api-reference/apps/archive-app"},{"title":"Replace App Manifest","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /v2/apps/{slug}/manifest","href":"/api-reference/apps/replace-app-manifest"},{"title":"Patch App Manifest","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json patch /v2/apps/{slug}/manifest","href":"/api-reference/apps/patch-app-manifest"},{"title":"Replace App Collaborators","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /v2/apps/{slug}/collaborators","href":"/api-reference/apps/replace-app-collaborators"},{"title":"Generate App Credentials","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /v2/apps/{slug}/credentials/generate","href":"/api-reference/apps/generate-app-credentials"}]},{"group":"Attributes","pages":[{"title":"Get attributes","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /attributes","href":"/api-reference/attributes/get-attributes"},{"title":"Create an attribute","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /attributes","href":"/api-reference/attributes/create-an-attribute"},{"title":"Get an attribute","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /attributes/{attribute_name_or_id}","href":"/api-reference/attributes/get-an-attribute"},{"title":"Update an attribute","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /attributes/{attribute_name_or_id}","href":"/api-reference/attributes/update-an-attribute"},{"title":"Delete an attribute","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /attributes/{attribute_name_or_id}","href":"/api-reference/attributes/delete-an-attribute"},{"title":"Get attribute references.","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /attributes/{attribute_name_or_id}/references","href":"/api-reference/attributes/get-attribute-references"},{"title":"Get the derivation graph around an attribute.","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /attributes/{attribute_name_or_id}/derivation-graph","href":"/api-reference/attributes/get-the-derivation-graph-around-an-attribute"}]},{"group":"Auth","pages":[{"title":"Request or refresh an OAuth token","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /oauth/token","href":"/api-reference/auth/request-or-refresh-an-oauth-token"}]},{"group":"Authentication","pages":[{"title":"Sign in with a Stytch B2B session token","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /authentication/b2b/login","href":"/api-reference/authentication/sign-in-with-a-stytch-b2b-session-token"},{"title":"Register with a Stytch B2B session token","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /authentication/b2b/register","href":"/api-reference/authentication/register-with-a-stytch-b2b-session-token"},{"title":"Check whether a Stytch B2B member is registered on Narrative","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /authentication/b2b/registration-status","href":"/api-reference/authentication/check-whether-a-stytch-b2b-member-is-registered-on-narrative"},{"title":"Exchange a user token for one scoped to another company","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /authentication/exchange-token","href":"/api-reference/authentication/exchange-a-user-token-for-one-scoped-to-another-company"},{"title":"Sign in with a Stytch session token","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /authentication/login","href":"/api-reference/authentication/sign-in-with-a-stytch-session-token"},{"title":"Register with a Stytch session token","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /authentication/register","href":"/api-reference/authentication/register-with-a-stytch-session-token"},{"title":"Check whether a Stytch Magic Links or OAuth user is registered on Narrative","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /authentication/registration-status","href":"/api-reference/authentication/check-whether-a-stytch-magic-links-or-oauth-user-is-registered-on-narrative"}]},{"group":"Billings","pages":[{"title":"Get dataset storage billing","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /admin/billings/dataset-storage-billing","href":"/api-reference/billings/get-dataset-storage-billing"},{"title":"Get dataset storage billing for company","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /billings/dataset-storage-billing","href":"/api-reference/billings/get-dataset-storage-billing-for-company"}]},{"group":"Companies","pages":[{"title":"Lists Company Domains","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /companies/{company_id}/domains","href":"/api-reference/companies/lists-company-domains"},{"title":"Get a presigned URL to upload company logo","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /admin/companies/logo-upload-url","href":"/api-reference/companies/get-a-presigned-url-to-upload-company-logo"}]},{"group":"Company","pages":[{"title":"Get a company","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /companies/{company_id}","href":"/api-reference/company/get-a-company"},{"title":"Get a company","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /company/{company_id}","href":"/api-reference/company/get-a-company-1"},{"title":"Update a company","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /company/{company_id}","href":"/api-reference/company/update-a-company"},{"title":"Delete (archive) a company","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /company/{company_id}","href":"/api-reference/company/delete-archive-a-company"},{"title":"Clear the company's default compute pool for a data plane","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /company/{company_id}/data-planes/{data_plane_id}/default-compute-pool","href":"/api-reference/company/clear-the-companys-default-compute-pool-for-a-data-plane"},{"title":"Set the company's default compute pool for a data plane","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /company/{company_id}/data-planes/{data_plane_id}/default-compute-pool/{compute_pool_id}","href":"/api-reference/company/set-the-companys-default-compute-pool-for-a-data-plane"},{"title":"Update a user","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /users/{user_id}","href":"/api-reference/company/update-a-user"}]},{"group":"Company Marketing Information","pages":[{"title":"Returns the company and user associated with the token","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /company-info/whoami","href":"/api-reference/company-marketing-information/returns-the-company-and-user-associated-with-the-token"},{"title":"Get marketing details on a company","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /company-info/{company_id}","href":"/api-reference/company-marketing-information/get-marketing-details-on-a-company"}]},{"group":"Compute Pools","pages":[{"title":"List compute pools","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /data-planes/{data_plane_id}/compute-pools","href":"/api-reference/compute-pools/list-compute-pools"},{"title":"Create a compute pool","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /data-planes/{data_plane_id}/compute-pools","href":"/api-reference/compute-pools/create-a-compute-pool"},{"title":"Get a compute pool by ID","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /data-planes/{data_plane_id}/compute-pools/{compute_pool_id}","href":"/api-reference/compute-pools/get-a-compute-pool-by-id"},{"title":"Update a compute pool","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /data-planes/{data_plane_id}/compute-pools/{compute_pool_id}","href":"/api-reference/compute-pools/update-a-compute-pool"},{"title":"Archive a compute pool","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /data-planes/{data_plane_id}/compute-pools/{compute_pool_id}","href":"/api-reference/compute-pools/archive-a-compute-pool"}]},{"group":"Connections","pages":[{"title":"List connections","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /v2/connections","href":"/api-reference/connections/list-connections"},{"title":"Create a connection","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /v2/connections","href":"/api-reference/connections/create-a-connection"},{"title":"Get a connection","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /v2/connections/{connection_id}","href":"/api-reference/connections/get-a-connection"},{"title":"Archive a connection","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /v2/connections/{connection_id}","href":"/api-reference/connections/archive-a-connection"}]},{"group":"Data Planes","pages":[{"title":"List data planes","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /data-planes","href":"/api-reference/data-planes/list-data-planes"},{"title":"Create a data plane","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /data-planes","href":"/api-reference/data-planes/create-a-data-plane"},{"title":"Get a data plane by ID","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /data-planes/{data_plane_id}","href":"/api-reference/data-planes/get-a-data-plane-by-id"},{"title":"Archive a data plane","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /data-planes/{data_plane_id}","href":"/api-reference/data-planes/archive-a-data-plane"},{"title":"Update a data plane","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json patch /data-planes/{data_plane_id}","href":"/api-reference/data-planes/update-a-data-plane"},{"title":"Data plane heartbeat","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /data-planes/{data_plane_id}/heartbeat","href":"/api-reference/data-planes/data-plane-heartbeat"},{"title":"Trigger a health check","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /data-planes/{data_plane_id}/health-check","href":"/api-reference/data-planes/trigger-a-health-check"},{"title":"Replace the collaborators on a data plane","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /data-planes/{data_plane_id}/collaborators","href":"/api-reference/data-planes/replace-the-collaborators-on-a-data-plane"},{"title":"Add a collaborator to a data plane","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /data-planes/{data_plane_id}/collaborators/{collaborator_company_id}","href":"/api-reference/data-planes/add-a-collaborator-to-a-data-plane"},{"title":"Remove a collaborator from a data plane","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /data-planes/{data_plane_id}/collaborators/{collaborator_company_id}","href":"/api-reference/data-planes/remove-a-collaborator-from-a-data-plane"},{"title":"Set the default compute pool for a data plane","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /data-planes/{data_plane_id}/default-compute-pool/{compute_pool_id}","href":"/api-reference/data-planes/set-the-default-compute-pool-for-a-data-plane"},{"title":"Clear the default compute pool for a data plane","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /data-planes/{data_plane_id}/default-compute-pool","href":"/api-reference/data-planes/clear-the-default-compute-pool-for-a-data-plane"}]},{"group":"Dataset Configuration","pages":[{"title":"Preview snapshot expirations","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /datasets/{dataset_id}/retention-policy/preview","href":"/api-reference/dataset-configuration/preview-snapshot-expirations"},{"title":"Upsert retention policies for a dataset","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /datasets/{dataset_id}/retention-policy","href":"/api-reference/dataset-configuration/upsert-retention-policies-for-a-dataset"}]},{"group":"Dataset Files","pages":[{"title":"Files added","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /datasets/{dataset_id}/snapshots/{snapshot_id}/files-added","href":"/api-reference/dataset-files/files-added"},{"title":"Find snapshots","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /datasets/{dataset_id}/find-snapshots","href":"/api-reference/dataset-files/find-snapshots"},{"title":"Find files","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /datasets/{dataset_id}/find-files","href":"/api-reference/dataset-files/find-files"},{"title":"Issue file download url","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /datasets/{dataset_id}/snapshots/{snapshot_id}/files-added/{file_id}/download","href":"/api-reference/dataset-files/issue-file-download-url"}]},{"group":"Dataset Refresh","pages":[{"title":"Update the materialized view refresh configuration","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /datasets/{dataset_id}/refresh-schedule","href":"/api-reference/dataset-refresh/update-the-materialized-view-refresh-configuration"},{"title":"Create a refresh schedule for an existing materialized view","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /datasets/{dataset_id}/refresh-schedule","href":"/api-reference/dataset-refresh/create-a-refresh-schedule-for-an-existing-materialized-view"},{"title":"Archive the materialized view refresh configuration","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /datasets/{dataset_id}/refresh-schedule","href":"/api-reference/dataset-refresh/archive-the-materialized-view-refresh-configuration"},{"title":"Run a materialized view refresh now","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /datasets/{dataset_id}/refresh-materialized-view","href":"/api-reference/dataset-refresh/run-a-materialized-view-refresh-now"}]},{"group":"Dataset Samples","pages":[{"title":"Sample a dataset","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /datasets/{dataset_id}/sample","href":"/api-reference/dataset-samples/sample-a-dataset"},{"title":"Upload a sample","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /datasets/{dataset_id}/sample","href":"/api-reference/dataset-samples/upload-a-sample"},{"title":"Delete a sample","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /datasets/{dataset_id}/sample","href":"/api-reference/dataset-samples/delete-a-sample"},{"title":"Sample a dataset (Admin)","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /datasets/{dataset_id}/admin/sample","href":"/api-reference/dataset-samples/sample-a-dataset-admin"},{"title":"Request Dataset Sample","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /datasets/{dataset_id}/request-sample","href":"/api-reference/dataset-samples/request-dataset-sample"},{"title":"Sample a dataset and redact the sample","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /v2/datasets/{dataset_id}/request-sample","href":"/api-reference/dataset-samples/sample-a-dataset-and-redact-the-sample"},{"title":"Get a dataset's sample redaction","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /datasets/{dataset_id}/redaction","href":"/api-reference/dataset-samples/get-a-datasets-sample-redaction"},{"title":"Upload a dataset's sample redaction","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /datasets/{dataset_id}/redaction","href":"/api-reference/dataset-samples/upload-a-datasets-sample-redaction"},{"title":"Delete a dataset's sample redaction","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /datasets/{dataset_id}/redaction","href":"/api-reference/dataset-samples/delete-a-datasets-sample-redaction"},{"title":"Sample a dataset with its redaction applied","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /datasets/{dataset_id}/sample/redacted","href":"/api-reference/dataset-samples/sample-a-dataset-with-its-redaction-applied"},{"title":"Sampled Mappings","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /datasets/{dataset_id}/sample/mappings","href":"/api-reference/dataset-samples/sampled-mappings"}]},{"group":"Dataset Statistics","pages":[{"title":"Get Statistics Configuration","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /datasets/{dataset_id}/statistics-configuration","href":"/api-reference/dataset-statistics/get-statistics-configuration"},{"title":"Put Statistics Configuration","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /datasets/{dataset_id}/statistics-configuration","href":"/api-reference/dataset-statistics/put-statistics-configuration"},{"title":"Disable Statistics Configuration","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /datasets/{dataset_id}/statistics-configuration","href":"/api-reference/dataset-statistics/disable-statistics-configuration"}]},{"group":"Datasets","pages":[{"title":"Get datasets","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /datasets","href":"/api-reference/datasets/get-datasets"},{"title":"Create a dataset","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /datasets","href":"/api-reference/datasets/create-a-dataset"},{"title":"Get a dataset","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /datasets/{dataset_id}","href":"/api-reference/datasets/get-a-dataset"},{"title":"Update a dataset","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /datasets/{dataset_id}","href":"/api-reference/datasets/update-a-dataset"},{"title":"Delete a dataset","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /datasets/{dataset_id}","href":"/api-reference/datasets/delete-a-dataset"},{"title":"Activate a dataset","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /datasets/{dataset_id}/activate","href":"/api-reference/datasets/activate-a-dataset"},{"title":"Activate a dataset","deprecated":true,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /datasets/{dataset_id}/activate","href":"/api-reference/datasets/activate-a-dataset-1"},{"title":"Truncate a dataset","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /datasets/{dataset_id}/truncate","href":"/api-reference/datasets/truncate-a-dataset"},{"title":"Get admin info for a dataset","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /datasets/{dataset_id}/admin","href":"/api-reference/datasets/get-admin-info-for-a-dataset"},{"title":"Update a dataset's partition spec","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /datasets/{dataset_id}/admin/partition-spec","href":"/api-reference/datasets/update-a-datasets-partition-spec"},{"title":"Get dataset statistics","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /datasets/{dataset_id}/stats","href":"/api-reference/datasets/get-dataset-statistics"},{"title":"Get detailed statistics","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /datasets/{dataset_id}/column-stats","href":"/api-reference/datasets/get-detailed-statistics"},{"title":"Create or Update detailed statistics","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /datasets/{dataset_id}/column-stats","href":"/api-reference/datasets/create-or-update-detailed-statistics"},{"title":"Submit recalculation","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /datasets/{dataset_id}/column-stats/recalculate","href":"/api-reference/datasets/submit-recalculation"},{"title":"Ingest a file","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /datasets/{dataset_id}/upload","href":"/api-reference/datasets/ingest-a-file"},{"title":"Issue an ingestion token","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /datasets/{dataset_id}/upload/token","href":"/api-reference/datasets/issue-an-ingestion-token"},{"title":"List connector interfaces compatible with a dataset","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /datasets/{dataset_id}/interfaces","href":"/api-reference/datasets/list-connector-interfaces-compatible-with-a-dataset"}]},{"group":"Derivations","pages":[{"title":"Get derivation rules","description":"Return the derivation rules usable by your company — the ones it owns plus the ones shared with it through\ncollaborators — optionally filtered by source or target attribute.","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /derivations","href":"/api-reference/derivations/get-derivation-rules"},{"title":"Create a derivation rule","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /derivations","href":"/api-reference/derivations/create-a-derivation-rule"},{"title":"Get a derivation rule","description":"Return a single derivation rule. Only rules usable by your company — the ones it owns plus the ones shared with\nit through collaborators — can be fetched; anything else is a 404.","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /derivations/{derivation_id}","href":"/api-reference/derivations/get-a-derivation-rule"},{"title":"Delete a derivation rule","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /derivations/{derivation_id}","href":"/api-reference/derivations/delete-a-derivation-rule"},{"title":"Update a derivation rule","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json patch /derivations/{derivation_id}","href":"/api-reference/derivations/update-a-derivation-rule"}]},{"group":"Encryption Materials","pages":[{"title":"List encryption materials","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /encryption-materials","href":"/api-reference/encryption-materials/list-encryption-materials"},{"title":"Create an encryption material","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /encryption-materials","href":"/api-reference/encryption-materials/create-an-encryption-material"},{"title":"List decrypted encryption materials","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /encryption-materials/decrypted","href":"/api-reference/encryption-materials/list-decrypted-encryption-materials"},{"title":"Get an encryption material","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /encryption-materials/{encryption_material_id}","href":"/api-reference/encryption-materials/get-an-encryption-material"},{"title":"Update an encryption material","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /encryption-materials/{encryption_material_id}","href":"/api-reference/encryption-materials/update-an-encryption-material"},{"title":"Archive an encryption material","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /encryption-materials/{encryption_material_id}","href":"/api-reference/encryption-materials/archive-an-encryption-material"}]},{"group":"Installations","pages":[{"title":"List Installations","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /installations","href":"/api-reference/installations/list-installations"},{"title":"Create Installation","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /installations","href":"/api-reference/installations/create-installation"},{"title":"Whoami Installation","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /installations/whoami","href":"/api-reference/installations/whoami-installation"},{"title":"Get Installation","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /installations/{id}","href":"/api-reference/installations/get-installation"},{"title":"Delete Installation","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /installations/{id}","href":"/api-reference/installations/delete-installation"},{"title":"Create Installation Token","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /installations/{id}/token","href":"/api-reference/installations/create-installation-token"}]},{"group":"Jobs","pages":[{"title":"Get jobs","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /jobs","href":"/api-reference/jobs/get-jobs"},{"title":"Get a job","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /jobs/{job_id}","href":"/api-reference/jobs/get-a-job"},{"title":"Run a job","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /jobs/{job_id}/run","href":"/api-reference/jobs/run-a-job"},{"title":"Schedule a job","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /jobs/{job_id}/schedule","href":"/api-reference/jobs/schedule-a-job"},{"title":"Complete a job","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /jobs/{job_id}/complete","href":"/api-reference/jobs/complete-a-job"},{"title":"Fail a job","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /jobs/{job_id}/fail","href":"/api-reference/jobs/fail-a-job"},{"title":"Request cancellation of a job","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /jobs/{job_id}/request-cancellation","href":"/api-reference/jobs/request-cancellation-of-a-job"},{"title":"Cancel a job","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /jobs/{job_id}/cancel","href":"/api-reference/jobs/cancel-a-job"},{"title":"Reschedule a job","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /jobs/{job_id}/reschedule","href":"/api-reference/jobs/reschedule-a-job"}]},{"group":"Mappings","pages":[{"title":"Get mappings","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /mappings","href":"/api-reference/mappings/get-mappings"},{"title":"Get mapping","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /mappings/{mapping_id}","href":"/api-reference/mappings/get-mapping"},{"title":"Update a mapping","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /mappings/{mapping_id}","href":"/api-reference/mappings/update-a-mapping"},{"title":"Delete a mapping","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /mappings/{mapping_id}","href":"/api-reference/mappings/delete-a-mapping"},{"title":"Accept a mapping","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /mappings/{mapping_id}/accept","href":"/api-reference/mappings/accept-a-mapping"},{"title":"Get mappings for a company","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /mappings/companies/{company_id}","href":"/api-reference/mappings/get-mappings-for-a-company"},{"title":"Create a mapping","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /mappings/companies/{company_id}","href":"/api-reference/mappings/create-a-mapping"},{"title":"Get mapping preview","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /mappings/{mapping_id}/sample","href":"/api-reference/mappings/get-mapping-preview"},{"title":"Test Mapping","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /mappings/test","href":"/api-reference/mappings/test-mapping"}]},{"group":"MCP Connections","pages":[{"title":"List the calling user's external MCP connections","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /mcp-connections","href":"/api-reference/mcp-connections/list-the-calling-users-external-mcp-connections"},{"title":"Begin connecting an external MCP server","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /mcp-connections","href":"/api-reference/mcp-connections/begin-connecting-an-external-mcp-server"},{"title":"OAuth redirect target that receives the authorization code","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /mcp-connections/callback","href":"/api-reference/mcp-connections/oauth-redirect-target-that-receives-the-authorization-code"},{"title":"Finish connecting an external MCP server","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /mcp-connections/complete","href":"/api-reference/mcp-connections/finish-connecting-an-external-mcp-server"},{"title":"Get one of the calling user's MCP connections","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /mcp-connections/{id}","href":"/api-reference/mcp-connections/get-one-of-the-calling-users-mcp-connections"},{"title":"Delete one of the calling user's MCP connections","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /mcp-connections/{id}","href":"/api-reference/mcp-connections/delete-one-of-the-calling-users-mcp-connections"}]},{"group":"Model Inference","pages":[{"title":"Run model inference","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /model-inference/run","href":"/api-reference/model-inference/run-model-inference"}]},{"group":"Model Training","pages":[{"title":"Fine-tune a model","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /model-training/run","href":"/api-reference/model-training/fine-tune-a-model"},{"title":"Train a classifier","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /v1/model-training/train-classifier","href":"/api-reference/model-training/train-a-classifier"}]},{"group":"Models","pages":[{"title":"Get models","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /models","href":"/api-reference/models/get-models"},{"title":"Get a model","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /models/{model_id}","href":"/api-reference/models/get-a-model"},{"title":"Update a model","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /models/{model_id}","href":"/api-reference/models/update-a-model"},{"title":"Archive a model","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /models/{model_id}","href":"/api-reference/models/archive-a-model"}]},{"group":"NQL","pages":[{"title":"Validate an NQL statement","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /nql/validate","href":"/api-reference/nql/validate-an-nql-statement"},{"title":"Simulate an NQL query against access rules","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /v2/nql/simulate","href":"/api-reference/nql/simulate-an-nql-query-against-access-rules"},{"title":"Parse an NQL statement","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /nql/parse","href":"/api-reference/nql/parse-an-nql-statement"},{"title":"Check Name Availability","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /nql/name-availability","href":"/api-reference/nql/check-name-availability"},{"title":"Execute an NQL statement","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /v1/nql/execute","href":"/api-reference/nql/execute-an-nql-statement"},{"title":"Get a forecast job","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /nql/{job_id}","href":"/api-reference/nql/get-a-forecast-job"}]},{"group":"Permissions","pages":[{"title":"Create a permission","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /admin/permissions","href":"/api-reference/permissions/create-a-permission"}]},{"group":"Profiles","pages":[{"title":"Returns app profiles","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /installations/{installation_id}/profiles","href":"/api-reference/profiles/returns-app-profiles"},{"title":"Creates an app profile","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /installations/{installation_id}/profiles","href":"/api-reference/profiles/creates-an-app-profile"},{"title":"Returns profile with {profile_id}","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /installations/{installation_id}/profiles/{app_profile_id}","href":"/api-reference/profiles/returns-profile-with-"},{"title":"Updates an existing app profile","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /installations/{installation_id}/profiles/{app_profile_id}","href":"/api-reference/profiles/updates-an-existing-app-profile"},{"title":"Enables a profile","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /installations/{installation_id}/profiles/{app_profile_id}/enable","href":"/api-reference/profiles/enables-a-profile"},{"title":"Disables a profile","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /installations/{installation_id}/profiles/{app_profile_id}/disable","href":"/api-reference/profiles/disables-a-profile"},{"title":"Archives a profile","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /installations/{installation_id}/profiles/{app_profile_id}/archive","href":"/api-reference/profiles/archives-a-profile"}]},{"group":"Queries","pages":[{"title":"Get a query by id","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /v2/queries/{query_id}","href":"/api-reference/queries/get-a-query-by-id"},{"title":"Deletes a query","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /v2/queries/{query_id}","href":"/api-reference/queries/deletes-a-query"},{"title":"Get accessible queries","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /v2/queries","href":"/api-reference/queries/get-accessible-queries"},{"title":"Create a query","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /v2/queries","href":"/api-reference/queries/create-a-query"}]},{"group":"Resources","pages":[{"title":"Get buckets","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /resources/buckets","href":"/api-reference/resources/get-buckets"},{"title":"Create bucket","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /resources/buckets","href":"/api-reference/resources/create-bucket"},{"title":"Update access type","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /resources/update-access","href":"/api-reference/resources/update-access-type"}]},{"group":"Schema Inference","pages":[{"title":"Infer the dataset schema of a file passed by multipart file.","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /v2/inference","href":"/api-reference/schema-inference/infer-the-dataset-schema-of-a-file-passed-by-multipart-file"}]},{"group":"Uploads","pages":[{"title":"Upload a file","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /uploads/{upload_path}","href":"/api-reference/uploads/upload-a-file"}]},{"group":"Usage","pages":[{"title":"Create a usage event","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /usage","href":"/api-reference/usage/create-a-usage-event"}]},{"group":"Views","pages":[{"title":"Get a view by id","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /v2/views/{view_id}","href":"/api-reference/views/get-a-view-by-id"},{"title":"Updates a view","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json put /v2/views/{view_id}","href":"/api-reference/views/updates-a-view"},{"title":"Archives a view","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /v2/views/{view_id}","href":"/api-reference/views/archives-a-view"},{"title":"Get accessible views","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /v2/views","href":"/api-reference/views/get-accessible-views"},{"title":"Create a view","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /v2/views","href":"/api-reference/views/create-a-view"}]},{"group":"Webhooks","pages":[{"title":"List webhook subscriptions","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /webhooks","href":"/api-reference/webhooks/list-webhook-subscriptions"},{"title":"Create a webhook subscription","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /webhooks","href":"/api-reference/webhooks/create-a-webhook-subscription"},{"title":"Get a webhook subscription by ID","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /webhooks/{webhook_subscription_id}","href":"/api-reference/webhooks/get-a-webhook-subscription-by-id"},{"title":"Archive a webhook subscription","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /webhooks/{webhook_subscription_id}","href":"/api-reference/webhooks/archive-a-webhook-subscription"},{"title":"Event delivery","version":null,"deprecated":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json webhook webhookDelivery","href":"/api-reference/webhooks/event-delivery"}]},{"group":"Whoami","pages":[{"title":"Get a current user","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /whoami","href":"/api-reference/whoami/get-a-current-user"}]},{"group":"Workflows","pages":[{"title":"List workflows","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /workflows","href":"/api-reference/workflows/list-workflows"},{"title":"Create a workflow","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /workflows","href":"/api-reference/workflows/create-a-workflow"},{"title":"Get a workflow","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /workflows/{workflow_id}","href":"/api-reference/workflows/get-a-workflow"},{"title":"Archive a workflow","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /workflows/{workflow_id}","href":"/api-reference/workflows/archive-a-workflow"},{"title":"Trigger a workflow","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /workflows/{workflow_id}/trigger","href":"/api-reference/workflows/trigger-a-workflow"},{"title":"Schedule a workflow","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /workflows/{workflow_id}/schedule","href":"/api-reference/workflows/schedule-a-workflow"},{"title":"Remove a workflow schedule","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json delete /workflows/{workflow_id}/schedule","href":"/api-reference/workflows/remove-a-workflow-schedule"},{"title":"Cancel a workflow execution","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /workflows/{workflow_id}/cancel","href":"/api-reference/workflows/cancel-a-workflow-execution"},{"title":"List workflow runs","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json get /workflows/{workflow_id}/runs","href":"/api-reference/workflows/list-workflow-runs"},{"title":"Cancel a specific workflow run","deprecated":null,"version":null,"openapi":"https://docs-cdn.narrative.io/api-reference/main/openapi.json post /workflows/{workflow_id}/runs/{run_id}/cancel","href":"/api-reference/workflows/cancel-a-specific-workflow-run"}]}]}]},"basePath":"","title":"Create a derivation rule - Narrative I/O Knowledge Base","buildId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","deploymentId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DdEMm2kG.js","utils-BMo572L7.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-C-4m9KAx.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-DPLK2Oq9.js","snippetPresets-BKjfJMC9.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-DTsgtCEj.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C8vmhyQM.js","shallow-r9w8LQGS.js","getApiPlaygroundDisplay-DjPI64HQ.js","CodeSnippet-C8Bvhl16.js","CodeSnippets-BtWUwcMy.js","Page-BIYvYBgk.js","getPastedJson-Dcm_3Pgl.js","icon-BXwrTpjc.js","MethodPill-CcjfVmmy.js","DuplicateIcon-BuKIbXAQ.js","createIcon-DaL9yXsO.js","DynamicMarkdown-Co5nikxh.js","SectionHeading-P4UNTsMZ.js","axios-vUo_bRtp.js","Markdown-CEfymfIH.js","clsx-Dq9TQuNi.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-D2J8knkn.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BgZ2ThuU.js"]}