documentation/dsls/DSL-AshJsonApi.Domain.md

<!--
This file was generated by Spark. Do not edit it by hand.
-->
# DSL: AshJsonApi.Domain

The entrypoint for adding JSON:API behavior to an Ash domain


## json_api
Global configuration for JSON:API


### Nested DSLs
 * [open_api](#json_api-open_api)
 * [routes](#json_api-routes)
   * base_route
     * get
     * index
     * post
     * patch
     * delete
     * related
     * relationship
     * post_to_relationship
     * patch_relationship
     * delete_from_relationship
     * route
   * get
   * index
   * post
   * patch
   * delete
   * related
   * relationship
   * post_to_relationship
   * patch_relationship
   * delete_from_relationship
   * route


### Examples
```
json_api do
  prefix "/json_api"
  log_errors? true
end

```




### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`router`](#json_api-router){: #json_api-router } | `atom` |  | The router that you created for this Domain. Used by test helpers to send requests |
| [`show_raised_errors?`](#json_api-show_raised_errors?){: #json_api-show_raised_errors? } | `boolean` | `false` | For security purposes, if an error is *raised* then Ash simply shows a generic error. If you want to show those errors, set this to true. |
| [`prefix`](#json_api-prefix){: #json_api-prefix } | `String.t` |  | The route prefix at which you are serving the JSON:API |
| [`serve_schema?`](#json_api-serve_schema?){: #json_api-serve_schema? } | `boolean` | `false` | Whether or not create a /schema route that serves the JSON schema of your API |
| [`authorize?`](#json_api-authorize?){: #json_api-authorize? } | `boolean` | `true` | Whether or not to perform authorization on requests. |
| [`log_errors?`](#json_api-log_errors?){: #json_api-log_errors? } | `boolean` | `true` | Whether or not to log any errors produced |
| [`include_nil_values?`](#json_api-include_nil_values?){: #json_api-include_nil_values? } | `boolean` | `true` | Whether or not to include properties for values that are nil in the JSON output |


## json_api.open_api
OpenAPI configurations



### Examples
```
json_api do
  ...
  open_api do
    tag "Users"
    group_by :api
  end
end

```




### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`tag`](#json_api-open_api-tag){: #json_api-open_api-tag } | `String.t` |  | Tag to be used when used by :group_by |
| [`group_by`](#json_api-open_api-group_by){: #json_api-open_api-group_by } | `:domain \| :resource` | `:resource` | Group by :domain or :resource |




## json_api.routes
Configure the routes that will be exposed via the JSON:API

### Nested DSLs
 * [base_route](#json_api-routes-base_route)
   * get
   * index
   * post
   * patch
   * delete
   * related
   * relationship
   * post_to_relationship
   * patch_relationship
   * delete_from_relationship
   * route
 * [get](#json_api-routes-get)
 * [index](#json_api-routes-index)
 * [post](#json_api-routes-post)
 * [patch](#json_api-routes-patch)
 * [delete](#json_api-routes-delete)
 * [related](#json_api-routes-related)
 * [relationship](#json_api-routes-relationship)
 * [post_to_relationship](#json_api-routes-post_to_relationship)
 * [patch_relationship](#json_api-routes-patch_relationship)
 * [delete_from_relationship](#json_api-routes-delete_from_relationship)
 * [route](#json_api-routes-route)


### Examples
```
routes do
  base "/posts"

  get :read
  get :me, route: "/me"
  index :read
  post :confirm_name, route: "/confirm_name"
  patch :update
  related :comments, :read
  relationship :comments, :read
  post_to_relationship :comments
  patch_relationship :comments
  delete_from_relationship :comments
end

```




## json_api.routes.base_route
```elixir
base_route route, resource \\ nil
```


Sets a prefix for a list of contained routes


### Nested DSLs
 * [get](#json_api-routes-base_route-get)
 * [index](#json_api-routes-base_route-index)
 * [post](#json_api-routes-base_route-post)
 * [patch](#json_api-routes-base_route-patch)
 * [delete](#json_api-routes-base_route-delete)
 * [related](#json_api-routes-base_route-related)
 * [relationship](#json_api-routes-base_route-relationship)
 * [post_to_relationship](#json_api-routes-base_route-post_to_relationship)
 * [patch_relationship](#json_api-routes-base_route-patch_relationship)
 * [delete_from_relationship](#json_api-routes-base_route-delete_from_relationship)
 * [route](#json_api-routes-base_route-route)


### Examples
```
base_route "/posts" do
  index :read
  get :read
end

base_route "/comments" do
  index :read
end

```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`route`](#json_api-routes-base_route-route){: #json_api-routes-base_route-route .spark-required} | `String.t` |  | The route prefix to use for contained routes |
| [`resource`](#json_api-routes-base_route-resource){: #json_api-routes-base_route-resource } | `module` |  | The resource that the contained routes will use by default |



## json_api.routes.base_route.get
```elixir
get resource \\ nil, action
```


A GET route to retrieve a single record



### Examples
```
get :read
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-base_route-get-resource){: #json_api-routes-base_route-get-resource } | `module` |  | The resource that the route's action is defined on |
| [`action`](#json_api-routes-base_route-get-action){: #json_api-routes-base_route-get-action .spark-required} | `atom` |  | The action to call when this route is hit |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`route`](#json_api-routes-base_route-get-route){: #json_api-routes-base_route-get-route } | `String.t` | `"/:id"` | The path of the route |
| [`default_fields`](#json_api-routes-base_route-get-default_fields){: #json_api-routes-base_route-get-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-base_route-get-primary?){: #json_api-routes-base_route-get-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-base_route-get-metadata){: #json_api-routes-base_route-get-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-base_route-get-modify_conn){: #json_api-routes-base_route-get-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`name`](#json_api-routes-base_route-get-name){: #json_api-routes-base_route-get-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-base_route-get-derive_sort?){: #json_api-routes-base_route-get-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-base_route-get-derive_filter?){: #json_api-routes-base_route-get-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.base_route.index
```elixir
index resource \\ nil, action
```


A GET route to retrieve a list of records



### Examples
```
index :read
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-base_route-index-resource){: #json_api-routes-base_route-index-resource } | `module` |  | The resource that the route's action is defined on |
| [`action`](#json_api-routes-base_route-index-action){: #json_api-routes-base_route-index-action .spark-required} | `atom` |  | The action to call when this route is hit |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`paginate?`](#json_api-routes-base_route-index-paginate?){: #json_api-routes-base_route-index-paginate? } | `boolean` | `true` |  |
| [`route`](#json_api-routes-base_route-index-route){: #json_api-routes-base_route-index-route } | `String.t` | `"/"` | The path of the route |
| [`default_fields`](#json_api-routes-base_route-index-default_fields){: #json_api-routes-base_route-index-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-base_route-index-primary?){: #json_api-routes-base_route-index-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-base_route-index-metadata){: #json_api-routes-base_route-index-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-base_route-index-modify_conn){: #json_api-routes-base_route-index-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`name`](#json_api-routes-base_route-index-name){: #json_api-routes-base_route-index-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-base_route-index-derive_sort?){: #json_api-routes-base_route-index-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-base_route-index-derive_filter?){: #json_api-routes-base_route-index-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.base_route.post
```elixir
post resource \\ nil, action
```


A POST route to create a record



### Examples
```
post :create
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-base_route-post-resource){: #json_api-routes-base_route-post-resource } | `module` |  | The resource that the route's action is defined on |
| [`action`](#json_api-routes-base_route-post-action){: #json_api-routes-base_route-post-action .spark-required} | `atom` |  | The action to call when this route is hit |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`route`](#json_api-routes-base_route-post-route){: #json_api-routes-base_route-post-route } | `String.t` | `"/"` | The path of the route |
| [`default_fields`](#json_api-routes-base_route-post-default_fields){: #json_api-routes-base_route-post-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-base_route-post-primary?){: #json_api-routes-base_route-post-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-base_route-post-metadata){: #json_api-routes-base_route-post-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-base_route-post-modify_conn){: #json_api-routes-base_route-post-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`query_params`](#json_api-routes-base_route-post-query_params){: #json_api-routes-base_route-post-query_params } | `list(atom)` | `[]` | A list of action inputs to accept as query parameters. |
| [`name`](#json_api-routes-base_route-post-name){: #json_api-routes-base_route-post-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-base_route-post-derive_sort?){: #json_api-routes-base_route-post-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-base_route-post-derive_filter?){: #json_api-routes-base_route-post-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |
| [`relationship_arguments`](#json_api-routes-base_route-post-relationship_arguments){: #json_api-routes-base_route-post-relationship_arguments } | `list(atom \| {:id, atom})` | `[]` | Arguments to be used to edit relationships. See the [relationships guide](/documentation/topics/relationships.md) for more. |
| [`upsert?`](#json_api-routes-base_route-post-upsert?){: #json_api-routes-base_route-post-upsert? } | `boolean` | `false` | Whether or not to use the `upsert?: true` option when calling `Ash.create/2`. |
| [`upsert_identity`](#json_api-routes-base_route-post-upsert_identity){: #json_api-routes-base_route-post-upsert_identity } | `atom` | `false` | Which identity to use for the upsert |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.base_route.patch
```elixir
patch resource \\ nil, action
```


A PATCH route to update a record



### Examples
```
patch :update
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-base_route-patch-resource){: #json_api-routes-base_route-patch-resource } | `module` |  | The resource that the route's action is defined on |
| [`action`](#json_api-routes-base_route-patch-action){: #json_api-routes-base_route-patch-action .spark-required} | `atom` |  | The action to call when this route is hit |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`relationship_arguments`](#json_api-routes-base_route-patch-relationship_arguments){: #json_api-routes-base_route-patch-relationship_arguments } | `any` | `[]` | Arguments to be used to edit relationships. See the [relationships guide](/documentation/topics/relationships.md) for more. |
| [`read_action`](#json_api-routes-base_route-patch-read_action){: #json_api-routes-base_route-patch-read_action } | `atom` |  | The read action to use to look the record up before updating |
| [`route`](#json_api-routes-base_route-patch-route){: #json_api-routes-base_route-patch-route } | `String.t` | `"/:id"` | The path of the route |
| [`default_fields`](#json_api-routes-base_route-patch-default_fields){: #json_api-routes-base_route-patch-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-base_route-patch-primary?){: #json_api-routes-base_route-patch-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-base_route-patch-metadata){: #json_api-routes-base_route-patch-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-base_route-patch-modify_conn){: #json_api-routes-base_route-patch-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`query_params`](#json_api-routes-base_route-patch-query_params){: #json_api-routes-base_route-patch-query_params } | `list(atom)` | `[]` | A list of action inputs to accept as query parameters. |
| [`name`](#json_api-routes-base_route-patch-name){: #json_api-routes-base_route-patch-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-base_route-patch-derive_sort?){: #json_api-routes-base_route-patch-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-base_route-patch-derive_filter?){: #json_api-routes-base_route-patch-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.base_route.delete
```elixir
delete resource \\ nil, action
```


A DELETE route to destroy a record



### Examples
```
delete :destroy
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-base_route-delete-resource){: #json_api-routes-base_route-delete-resource } | `module` |  | The resource that the route's action is defined on |
| [`action`](#json_api-routes-base_route-delete-action){: #json_api-routes-base_route-delete-action .spark-required} | `atom` |  | The action to call when this route is hit |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`read_action`](#json_api-routes-base_route-delete-read_action){: #json_api-routes-base_route-delete-read_action } | `atom` |  | The read action to use to look the record up before updating |
| [`route`](#json_api-routes-base_route-delete-route){: #json_api-routes-base_route-delete-route } | `String.t` | `"/:id"` | The path of the route |
| [`default_fields`](#json_api-routes-base_route-delete-default_fields){: #json_api-routes-base_route-delete-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-base_route-delete-primary?){: #json_api-routes-base_route-delete-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-base_route-delete-metadata){: #json_api-routes-base_route-delete-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-base_route-delete-modify_conn){: #json_api-routes-base_route-delete-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`query_params`](#json_api-routes-base_route-delete-query_params){: #json_api-routes-base_route-delete-query_params } | `list(atom)` | `[]` | A list of action inputs to accept as query parameters. |
| [`name`](#json_api-routes-base_route-delete-name){: #json_api-routes-base_route-delete-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-base_route-delete-derive_sort?){: #json_api-routes-base_route-delete-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-base_route-delete-derive_filter?){: #json_api-routes-base_route-delete-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.base_route.related
```elixir
related resource \\ nil, relationship, action
```


A GET route to read the related resources of a relationship



### Examples
```
related :comments, :read
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-base_route-related-resource){: #json_api-routes-base_route-related-resource } | `module` |  | The resource that the route's action is defined on |
| [`relationship`](#json_api-routes-base_route-related-relationship){: #json_api-routes-base_route-related-relationship .spark-required} | `atom` |  |  |
| [`action`](#json_api-routes-base_route-related-action){: #json_api-routes-base_route-related-action .spark-required} | `atom` |  | The action to call when this route is hit |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`route`](#json_api-routes-base_route-related-route){: #json_api-routes-base_route-related-route } | `String.t` |  | The path of the route - Defaults to /:id/[relationship_name] |
| [`default_fields`](#json_api-routes-base_route-related-default_fields){: #json_api-routes-base_route-related-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-base_route-related-primary?){: #json_api-routes-base_route-related-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-base_route-related-metadata){: #json_api-routes-base_route-related-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-base_route-related-modify_conn){: #json_api-routes-base_route-related-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`query_params`](#json_api-routes-base_route-related-query_params){: #json_api-routes-base_route-related-query_params } | `list(atom)` | `[]` | A list of action inputs to accept as query parameters. |
| [`name`](#json_api-routes-base_route-related-name){: #json_api-routes-base_route-related-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-base_route-related-derive_sort?){: #json_api-routes-base_route-related-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-base_route-related-derive_filter?){: #json_api-routes-base_route-related-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.base_route.relationship
```elixir
relationship resource \\ nil, relationship, action
```


A READ route to read the relationship, returns resource identifiers.



### Examples
```
relationship :comments, :read
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-base_route-relationship-resource){: #json_api-routes-base_route-relationship-resource } | `module` |  | The resource that the route's action is defined on |
| [`relationship`](#json_api-routes-base_route-relationship-relationship){: #json_api-routes-base_route-relationship-relationship .spark-required} | `atom` |  |  |
| [`action`](#json_api-routes-base_route-relationship-action){: #json_api-routes-base_route-relationship-action .spark-required} | `atom` |  | The action to call when this route is hit |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`route`](#json_api-routes-base_route-relationship-route){: #json_api-routes-base_route-relationship-route } | `String.t` |  | The path of the route -  Defaults to /:id/relationships/[relationship_name] |
| [`default_fields`](#json_api-routes-base_route-relationship-default_fields){: #json_api-routes-base_route-relationship-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-base_route-relationship-primary?){: #json_api-routes-base_route-relationship-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-base_route-relationship-metadata){: #json_api-routes-base_route-relationship-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-base_route-relationship-modify_conn){: #json_api-routes-base_route-relationship-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`query_params`](#json_api-routes-base_route-relationship-query_params){: #json_api-routes-base_route-relationship-query_params } | `list(atom)` | `[]` | A list of action inputs to accept as query parameters. |
| [`name`](#json_api-routes-base_route-relationship-name){: #json_api-routes-base_route-relationship-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-base_route-relationship-derive_sort?){: #json_api-routes-base_route-relationship-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-base_route-relationship-derive_filter?){: #json_api-routes-base_route-relationship-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.base_route.post_to_relationship
```elixir
post_to_relationship resource \\ nil, relationship
```


A POST route to create related entities using resource identifiers



### Examples
```
post_to_relationship :comments
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-base_route-post_to_relationship-resource){: #json_api-routes-base_route-post_to_relationship-resource } | `module` |  | The resource that the route's action is defined on |
| [`relationship`](#json_api-routes-base_route-post_to_relationship-relationship){: #json_api-routes-base_route-post_to_relationship-relationship .spark-required} | `atom` |  |  |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`route`](#json_api-routes-base_route-post_to_relationship-route){: #json_api-routes-base_route-post_to_relationship-route } | `String.t` |  | The path of the route -  Defaults to /:id/relationships/[relationship_name] |
| [`default_fields`](#json_api-routes-base_route-post_to_relationship-default_fields){: #json_api-routes-base_route-post_to_relationship-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-base_route-post_to_relationship-primary?){: #json_api-routes-base_route-post_to_relationship-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-base_route-post_to_relationship-metadata){: #json_api-routes-base_route-post_to_relationship-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-base_route-post_to_relationship-modify_conn){: #json_api-routes-base_route-post_to_relationship-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`query_params`](#json_api-routes-base_route-post_to_relationship-query_params){: #json_api-routes-base_route-post_to_relationship-query_params } | `list(atom)` | `[]` | A list of action inputs to accept as query parameters. |
| [`name`](#json_api-routes-base_route-post_to_relationship-name){: #json_api-routes-base_route-post_to_relationship-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-base_route-post_to_relationship-derive_sort?){: #json_api-routes-base_route-post_to_relationship-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-base_route-post_to_relationship-derive_filter?){: #json_api-routes-base_route-post_to_relationship-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.base_route.patch_relationship
```elixir
patch_relationship resource \\ nil, relationship
```


A PATCH route to update a relationship using resource identifiers



### Examples
```
patch_relationship :comments
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-base_route-patch_relationship-resource){: #json_api-routes-base_route-patch_relationship-resource } | `module` |  | The resource that the route's action is defined on |
| [`relationship`](#json_api-routes-base_route-patch_relationship-relationship){: #json_api-routes-base_route-patch_relationship-relationship .spark-required} | `atom` |  |  |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`route`](#json_api-routes-base_route-patch_relationship-route){: #json_api-routes-base_route-patch_relationship-route } | `String.t` |  | The path of the route -  Defaults to /:id/relationships/[relationship_name] |
| [`default_fields`](#json_api-routes-base_route-patch_relationship-default_fields){: #json_api-routes-base_route-patch_relationship-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-base_route-patch_relationship-primary?){: #json_api-routes-base_route-patch_relationship-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-base_route-patch_relationship-metadata){: #json_api-routes-base_route-patch_relationship-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-base_route-patch_relationship-modify_conn){: #json_api-routes-base_route-patch_relationship-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`query_params`](#json_api-routes-base_route-patch_relationship-query_params){: #json_api-routes-base_route-patch_relationship-query_params } | `list(atom)` | `[]` | A list of action inputs to accept as query parameters. |
| [`name`](#json_api-routes-base_route-patch_relationship-name){: #json_api-routes-base_route-patch_relationship-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-base_route-patch_relationship-derive_sort?){: #json_api-routes-base_route-patch_relationship-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-base_route-patch_relationship-derive_filter?){: #json_api-routes-base_route-patch_relationship-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.base_route.delete_from_relationship
```elixir
delete_from_relationship resource \\ nil, relationship
```


A DELETE route to remove related entities using resource identifiers



### Examples
```
delete_from_relationship :comments
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-base_route-delete_from_relationship-resource){: #json_api-routes-base_route-delete_from_relationship-resource } | `module` |  | The resource that the route's action is defined on |
| [`relationship`](#json_api-routes-base_route-delete_from_relationship-relationship){: #json_api-routes-base_route-delete_from_relationship-relationship .spark-required} | `atom` |  |  |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`route`](#json_api-routes-base_route-delete_from_relationship-route){: #json_api-routes-base_route-delete_from_relationship-route } | `String.t` |  | The path of the route -  Defaults to /:id/relationships/[relationship_name] |
| [`default_fields`](#json_api-routes-base_route-delete_from_relationship-default_fields){: #json_api-routes-base_route-delete_from_relationship-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-base_route-delete_from_relationship-primary?){: #json_api-routes-base_route-delete_from_relationship-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-base_route-delete_from_relationship-metadata){: #json_api-routes-base_route-delete_from_relationship-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-base_route-delete_from_relationship-modify_conn){: #json_api-routes-base_route-delete_from_relationship-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`query_params`](#json_api-routes-base_route-delete_from_relationship-query_params){: #json_api-routes-base_route-delete_from_relationship-query_params } | `list(atom)` | `[]` | A list of action inputs to accept as query parameters. |
| [`name`](#json_api-routes-base_route-delete_from_relationship-name){: #json_api-routes-base_route-delete_from_relationship-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-base_route-delete_from_relationship-derive_sort?){: #json_api-routes-base_route-delete_from_relationship-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-base_route-delete_from_relationship-derive_filter?){: #json_api-routes-base_route-delete_from_relationship-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.base_route.route
```elixir
route resource \\ nil, method, route, action
```


A route for a generic action.



### Examples
```
route :get, "say_hi/:name", :say_hello
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-base_route-route-resource){: #json_api-routes-base_route-route-resource } | `module` |  | The resource that the route's action is defined on |
| [`method`](#json_api-routes-base_route-route-method){: #json_api-routes-base_route-route-method .spark-required} | `atom` |  | The HTTP method for the route, e.g `:get`, or `:post` |
| [`route`](#json_api-routes-base_route-route-route){: #json_api-routes-base_route-route-route .spark-required} | `String.t` |  | The path of the route |
| [`action`](#json_api-routes-base_route-route-action){: #json_api-routes-base_route-route-action .spark-required} | `atom` |  | The action to call when this route is hit |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`wrap_in_result?`](#json_api-routes-base_route-route-wrap_in_result?){: #json_api-routes-base_route-route-wrap_in_result? } | `boolean` | `false` | Whether or not the action result should be wrapped in `{result: <result>}` |
| [`default_fields`](#json_api-routes-base_route-route-default_fields){: #json_api-routes-base_route-route-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-base_route-route-primary?){: #json_api-routes-base_route-route-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-base_route-route-metadata){: #json_api-routes-base_route-route-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-base_route-route-modify_conn){: #json_api-routes-base_route-route-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`query_params`](#json_api-routes-base_route-route-query_params){: #json_api-routes-base_route-route-query_params } | `list(atom)` | `[]` | A list of action inputs to accept as query parameters. |
| [`name`](#json_api-routes-base_route-route-name){: #json_api-routes-base_route-route-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-base_route-route-derive_sort?){: #json_api-routes-base_route-route-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-base_route-route-derive_filter?){: #json_api-routes-base_route-route-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`




### Introspection

Target: `AshJsonApi.Domain.BaseRoute`

## json_api.routes.get
```elixir
get resource, action
```


A GET route to retrieve a single record



### Examples
```
get :read
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-get-resource){: #json_api-routes-get-resource } | `module` |  | The resource that the route's action is defined on |
| [`action`](#json_api-routes-get-action){: #json_api-routes-get-action .spark-required} | `atom` |  | The action to call when this route is hit |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`route`](#json_api-routes-get-route){: #json_api-routes-get-route } | `String.t` | `"/:id"` | The path of the route |
| [`default_fields`](#json_api-routes-get-default_fields){: #json_api-routes-get-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-get-primary?){: #json_api-routes-get-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-get-metadata){: #json_api-routes-get-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-get-modify_conn){: #json_api-routes-get-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`name`](#json_api-routes-get-name){: #json_api-routes-get-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-get-derive_sort?){: #json_api-routes-get-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-get-derive_filter?){: #json_api-routes-get-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.index
```elixir
index resource, action
```


A GET route to retrieve a list of records



### Examples
```
index :read
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-index-resource){: #json_api-routes-index-resource } | `module` |  | The resource that the route's action is defined on |
| [`action`](#json_api-routes-index-action){: #json_api-routes-index-action .spark-required} | `atom` |  | The action to call when this route is hit |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`paginate?`](#json_api-routes-index-paginate?){: #json_api-routes-index-paginate? } | `boolean` | `true` |  |
| [`route`](#json_api-routes-index-route){: #json_api-routes-index-route } | `String.t` | `"/"` | The path of the route |
| [`default_fields`](#json_api-routes-index-default_fields){: #json_api-routes-index-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-index-primary?){: #json_api-routes-index-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-index-metadata){: #json_api-routes-index-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-index-modify_conn){: #json_api-routes-index-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`name`](#json_api-routes-index-name){: #json_api-routes-index-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-index-derive_sort?){: #json_api-routes-index-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-index-derive_filter?){: #json_api-routes-index-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.post
```elixir
post resource, action
```


A POST route to create a record



### Examples
```
post :create
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-post-resource){: #json_api-routes-post-resource } | `module` |  | The resource that the route's action is defined on |
| [`action`](#json_api-routes-post-action){: #json_api-routes-post-action .spark-required} | `atom` |  | The action to call when this route is hit |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`route`](#json_api-routes-post-route){: #json_api-routes-post-route } | `String.t` | `"/"` | The path of the route |
| [`default_fields`](#json_api-routes-post-default_fields){: #json_api-routes-post-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-post-primary?){: #json_api-routes-post-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-post-metadata){: #json_api-routes-post-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-post-modify_conn){: #json_api-routes-post-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`query_params`](#json_api-routes-post-query_params){: #json_api-routes-post-query_params } | `list(atom)` | `[]` | A list of action inputs to accept as query parameters. |
| [`name`](#json_api-routes-post-name){: #json_api-routes-post-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-post-derive_sort?){: #json_api-routes-post-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-post-derive_filter?){: #json_api-routes-post-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |
| [`relationship_arguments`](#json_api-routes-post-relationship_arguments){: #json_api-routes-post-relationship_arguments } | `list(atom \| {:id, atom})` | `[]` | Arguments to be used to edit relationships. See the [relationships guide](/documentation/topics/relationships.md) for more. |
| [`upsert?`](#json_api-routes-post-upsert?){: #json_api-routes-post-upsert? } | `boolean` | `false` | Whether or not to use the `upsert?: true` option when calling `Ash.create/2`. |
| [`upsert_identity`](#json_api-routes-post-upsert_identity){: #json_api-routes-post-upsert_identity } | `atom` | `false` | Which identity to use for the upsert |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.patch
```elixir
patch resource, action
```


A PATCH route to update a record



### Examples
```
patch :update
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-patch-resource){: #json_api-routes-patch-resource } | `module` |  | The resource that the route's action is defined on |
| [`action`](#json_api-routes-patch-action){: #json_api-routes-patch-action .spark-required} | `atom` |  | The action to call when this route is hit |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`relationship_arguments`](#json_api-routes-patch-relationship_arguments){: #json_api-routes-patch-relationship_arguments } | `any` | `[]` | Arguments to be used to edit relationships. See the [relationships guide](/documentation/topics/relationships.md) for more. |
| [`read_action`](#json_api-routes-patch-read_action){: #json_api-routes-patch-read_action } | `atom` |  | The read action to use to look the record up before updating |
| [`route`](#json_api-routes-patch-route){: #json_api-routes-patch-route } | `String.t` | `"/:id"` | The path of the route |
| [`default_fields`](#json_api-routes-patch-default_fields){: #json_api-routes-patch-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-patch-primary?){: #json_api-routes-patch-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-patch-metadata){: #json_api-routes-patch-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-patch-modify_conn){: #json_api-routes-patch-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`query_params`](#json_api-routes-patch-query_params){: #json_api-routes-patch-query_params } | `list(atom)` | `[]` | A list of action inputs to accept as query parameters. |
| [`name`](#json_api-routes-patch-name){: #json_api-routes-patch-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-patch-derive_sort?){: #json_api-routes-patch-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-patch-derive_filter?){: #json_api-routes-patch-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.delete
```elixir
delete resource, action
```


A DELETE route to destroy a record



### Examples
```
delete :destroy
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-delete-resource){: #json_api-routes-delete-resource } | `module` |  | The resource that the route's action is defined on |
| [`action`](#json_api-routes-delete-action){: #json_api-routes-delete-action .spark-required} | `atom` |  | The action to call when this route is hit |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`read_action`](#json_api-routes-delete-read_action){: #json_api-routes-delete-read_action } | `atom` |  | The read action to use to look the record up before updating |
| [`route`](#json_api-routes-delete-route){: #json_api-routes-delete-route } | `String.t` | `"/:id"` | The path of the route |
| [`default_fields`](#json_api-routes-delete-default_fields){: #json_api-routes-delete-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-delete-primary?){: #json_api-routes-delete-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-delete-metadata){: #json_api-routes-delete-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-delete-modify_conn){: #json_api-routes-delete-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`query_params`](#json_api-routes-delete-query_params){: #json_api-routes-delete-query_params } | `list(atom)` | `[]` | A list of action inputs to accept as query parameters. |
| [`name`](#json_api-routes-delete-name){: #json_api-routes-delete-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-delete-derive_sort?){: #json_api-routes-delete-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-delete-derive_filter?){: #json_api-routes-delete-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.related
```elixir
related resource, relationship, action
```


A GET route to read the related resources of a relationship



### Examples
```
related :comments, :read
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-related-resource){: #json_api-routes-related-resource } | `module` |  | The resource that the route's action is defined on |
| [`relationship`](#json_api-routes-related-relationship){: #json_api-routes-related-relationship .spark-required} | `atom` |  |  |
| [`action`](#json_api-routes-related-action){: #json_api-routes-related-action .spark-required} | `atom` |  | The action to call when this route is hit |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`route`](#json_api-routes-related-route){: #json_api-routes-related-route } | `String.t` |  | The path of the route - Defaults to /:id/[relationship_name] |
| [`default_fields`](#json_api-routes-related-default_fields){: #json_api-routes-related-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-related-primary?){: #json_api-routes-related-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-related-metadata){: #json_api-routes-related-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-related-modify_conn){: #json_api-routes-related-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`query_params`](#json_api-routes-related-query_params){: #json_api-routes-related-query_params } | `list(atom)` | `[]` | A list of action inputs to accept as query parameters. |
| [`name`](#json_api-routes-related-name){: #json_api-routes-related-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-related-derive_sort?){: #json_api-routes-related-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-related-derive_filter?){: #json_api-routes-related-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.relationship
```elixir
relationship resource, relationship, action
```


A READ route to read the relationship, returns resource identifiers.



### Examples
```
relationship :comments, :read
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-relationship-resource){: #json_api-routes-relationship-resource } | `module` |  | The resource that the route's action is defined on |
| [`relationship`](#json_api-routes-relationship-relationship){: #json_api-routes-relationship-relationship .spark-required} | `atom` |  |  |
| [`action`](#json_api-routes-relationship-action){: #json_api-routes-relationship-action .spark-required} | `atom` |  | The action to call when this route is hit |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`route`](#json_api-routes-relationship-route){: #json_api-routes-relationship-route } | `String.t` |  | The path of the route -  Defaults to /:id/relationships/[relationship_name] |
| [`default_fields`](#json_api-routes-relationship-default_fields){: #json_api-routes-relationship-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-relationship-primary?){: #json_api-routes-relationship-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-relationship-metadata){: #json_api-routes-relationship-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-relationship-modify_conn){: #json_api-routes-relationship-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`query_params`](#json_api-routes-relationship-query_params){: #json_api-routes-relationship-query_params } | `list(atom)` | `[]` | A list of action inputs to accept as query parameters. |
| [`name`](#json_api-routes-relationship-name){: #json_api-routes-relationship-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-relationship-derive_sort?){: #json_api-routes-relationship-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-relationship-derive_filter?){: #json_api-routes-relationship-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.post_to_relationship
```elixir
post_to_relationship resource, relationship
```


A POST route to create related entities using resource identifiers



### Examples
```
post_to_relationship :comments
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-post_to_relationship-resource){: #json_api-routes-post_to_relationship-resource } | `module` |  | The resource that the route's action is defined on |
| [`relationship`](#json_api-routes-post_to_relationship-relationship){: #json_api-routes-post_to_relationship-relationship .spark-required} | `atom` |  |  |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`route`](#json_api-routes-post_to_relationship-route){: #json_api-routes-post_to_relationship-route } | `String.t` |  | The path of the route -  Defaults to /:id/relationships/[relationship_name] |
| [`default_fields`](#json_api-routes-post_to_relationship-default_fields){: #json_api-routes-post_to_relationship-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-post_to_relationship-primary?){: #json_api-routes-post_to_relationship-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-post_to_relationship-metadata){: #json_api-routes-post_to_relationship-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-post_to_relationship-modify_conn){: #json_api-routes-post_to_relationship-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`query_params`](#json_api-routes-post_to_relationship-query_params){: #json_api-routes-post_to_relationship-query_params } | `list(atom)` | `[]` | A list of action inputs to accept as query parameters. |
| [`name`](#json_api-routes-post_to_relationship-name){: #json_api-routes-post_to_relationship-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-post_to_relationship-derive_sort?){: #json_api-routes-post_to_relationship-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-post_to_relationship-derive_filter?){: #json_api-routes-post_to_relationship-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.patch_relationship
```elixir
patch_relationship resource, relationship
```


A PATCH route to update a relationship using resource identifiers



### Examples
```
patch_relationship :comments
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-patch_relationship-resource){: #json_api-routes-patch_relationship-resource } | `module` |  | The resource that the route's action is defined on |
| [`relationship`](#json_api-routes-patch_relationship-relationship){: #json_api-routes-patch_relationship-relationship .spark-required} | `atom` |  |  |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`route`](#json_api-routes-patch_relationship-route){: #json_api-routes-patch_relationship-route } | `String.t` |  | The path of the route -  Defaults to /:id/relationships/[relationship_name] |
| [`default_fields`](#json_api-routes-patch_relationship-default_fields){: #json_api-routes-patch_relationship-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-patch_relationship-primary?){: #json_api-routes-patch_relationship-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-patch_relationship-metadata){: #json_api-routes-patch_relationship-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-patch_relationship-modify_conn){: #json_api-routes-patch_relationship-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`query_params`](#json_api-routes-patch_relationship-query_params){: #json_api-routes-patch_relationship-query_params } | `list(atom)` | `[]` | A list of action inputs to accept as query parameters. |
| [`name`](#json_api-routes-patch_relationship-name){: #json_api-routes-patch_relationship-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-patch_relationship-derive_sort?){: #json_api-routes-patch_relationship-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-patch_relationship-derive_filter?){: #json_api-routes-patch_relationship-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.delete_from_relationship
```elixir
delete_from_relationship resource, relationship
```


A DELETE route to remove related entities using resource identifiers



### Examples
```
delete_from_relationship :comments
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-delete_from_relationship-resource){: #json_api-routes-delete_from_relationship-resource } | `module` |  | The resource that the route's action is defined on |
| [`relationship`](#json_api-routes-delete_from_relationship-relationship){: #json_api-routes-delete_from_relationship-relationship .spark-required} | `atom` |  |  |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`route`](#json_api-routes-delete_from_relationship-route){: #json_api-routes-delete_from_relationship-route } | `String.t` |  | The path of the route -  Defaults to /:id/relationships/[relationship_name] |
| [`default_fields`](#json_api-routes-delete_from_relationship-default_fields){: #json_api-routes-delete_from_relationship-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-delete_from_relationship-primary?){: #json_api-routes-delete_from_relationship-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-delete_from_relationship-metadata){: #json_api-routes-delete_from_relationship-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-delete_from_relationship-modify_conn){: #json_api-routes-delete_from_relationship-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`query_params`](#json_api-routes-delete_from_relationship-query_params){: #json_api-routes-delete_from_relationship-query_params } | `list(atom)` | `[]` | A list of action inputs to accept as query parameters. |
| [`name`](#json_api-routes-delete_from_relationship-name){: #json_api-routes-delete_from_relationship-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-delete_from_relationship-derive_sort?){: #json_api-routes-delete_from_relationship-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-delete_from_relationship-derive_filter?){: #json_api-routes-delete_from_relationship-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`

## json_api.routes.route
```elixir
route resource, method, route, action
```


A route for a generic action.



### Examples
```
route :get, "say_hi/:name", :say_hello
```



### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`resource`](#json_api-routes-route-resource){: #json_api-routes-route-resource } | `module` |  | The resource that the route's action is defined on |
| [`method`](#json_api-routes-route-method){: #json_api-routes-route-method .spark-required} | `atom` |  | The HTTP method for the route, e.g `:get`, or `:post` |
| [`route`](#json_api-routes-route-route){: #json_api-routes-route-route .spark-required} | `String.t` |  | The path of the route |
| [`action`](#json_api-routes-route-action){: #json_api-routes-route-action .spark-required} | `atom` |  | The action to call when this route is hit |
### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`wrap_in_result?`](#json_api-routes-route-wrap_in_result?){: #json_api-routes-route-wrap_in_result? } | `boolean` | `false` | Whether or not the action result should be wrapped in `{result: <result>}` |
| [`default_fields`](#json_api-routes-route-default_fields){: #json_api-routes-route-default_fields } | `list(atom)` |  | A list of fields to be shown in the attributes of the called route |
| [`primary?`](#json_api-routes-route-primary?){: #json_api-routes-route-primary? } | `boolean` | `false` | Whether or not this is the route that should be linked to by default when rendering links to this type of route |
| [`metadata`](#json_api-routes-route-metadata){: #json_api-routes-route-metadata } | `(any, any, any -> any)` |  | A function to generate arbitrary top-level metadata for the JSON:API response |
| [`modify_conn`](#json_api-routes-route-modify_conn){: #json_api-routes-route-modify_conn } | `(any, any, any, any -> any)` |  | A function to modify the conn before responding. Used for things like setting headers based on the response. Takes `conn, subject, result, request` |
| [`query_params`](#json_api-routes-route-query_params){: #json_api-routes-route-query_params } | `list(atom)` | `[]` | A list of action inputs to accept as query parameters. |
| [`name`](#json_api-routes-route-name){: #json_api-routes-route-name } | `String.t` |  | A globally unique name for this route, to be used when generating docs and open api specifications |
| [`derive_sort?`](#json_api-routes-route-derive_sort?){: #json_api-routes-route-derive_sort? } | `boolean` | `true` | Whether or not to derive a sort parameter based on the sortable fields of the resource |
| [`derive_filter?`](#json_api-routes-route-derive_filter?){: #json_api-routes-route-derive_filter? } | `boolean` | `true` | Whether or not to derive a filter parameter based on the sortable fields of the resource |





### Introspection

Target: `AshJsonApi.Resource.Route`







<style type="text/css">.spark-required::after { content: "*"; color: red !important; }</style>