{"ok": true, "next": null, "rows": [{"id": "json_api:rowdeleteview", "page": "json_api", "ref": "rowdeleteview", "title": "Deleting a row", "content": "To delete a row, make a  POST  to  /<database>/<table>/<row-pks>/-/delete . This requires the  delete-row  permission. \n                 POST /<database>/<table>/<row-pks>/-/delete\nContent-Type: application/json\nAuthorization: Bearer dstok_<rest-of-token> \n                 <row-pks>  here is the  tilde-encoded  primary key value of the row to delete - or a comma-separated list of primary key values if the table has a composite primary key. \n                 If successful, this will return a  200  status code and a  {\"ok\": true}  response body. \n                 Any errors will return  {\"errors\": [\"... descriptive message ...\"], \"ok\": false} , and a  400  status code for a bad input or a  403  status code for an authentication or permission error.", "breadcrumbs": "[\"JSON API\", \"The JSON write API\"]", "references": "[]"}, {"id": "json_api:rowupdateview", "page": "json_api", "ref": "rowupdateview", "title": "Updating a row", "content": "To update a row, make a  POST  to  /<database>/<table>/<row-pks>/-/update . This requires the  update-row  permission. \n                 POST /<database>/<table>/<row-pks>/-/update\nContent-Type: application/json\nAuthorization: Bearer dstok_<rest-of-token> \n                 {\n    \"update\": {\n        \"text_column\": \"New text string\",\n        \"integer_column\": 3,\n        \"float_column\": 3.14\n    }\n} \n                 <row-pks>  here is the  tilde-encoded  primary key value of the row to update - or a comma-separated list of primary key values if the table has a composite primary key. \n                 You only need to pass the columns you want to update. Any other columns will be left unchanged. \n                 If successful, this will return a  200  status code and a  {\"ok\": true}  response body. \n                 Add  \"return\": true  to the request body to return the updated row: \n                 {\n    \"update\": {\n        \"title\": \"New title\"\n    },\n    \"return\": true\n} \n                 The returned JSON will look like this: \n                 {\n    \"ok\": true,\n    \"row\": {\n        \"id\": 1,\n        \"title\": \"New title\",\n        \"other_column\": \"Will be present here too\"\n    }\n} \n                 Any errors will return  {\"errors\": [\"... descriptive message ...\"], \"ok\": false} , and a  400  status code for a bad input or a  403  status code for an authentication or permission error. \n                 Pass  \"alter: true  to automatically add any missing columns to the table. This requires the  alter-table  permission.", "breadcrumbs": "[\"JSON API\", \"The JSON write API\"]", "references": "[]"}, {"id": "json_api:tablecreateview", "page": "json_api", "ref": "tablecreateview", "title": "Creating a table", "content": "To create a table, make a  POST  to  /<database>/-/create . This requires the  create-table  permission. \n                 POST /<database>/-/create\nContent-Type: application/json\nAuthorization: Bearer dstok_<rest-of-token> \n                 {\n    \"table\": \"name_of_new_table\",\n    \"columns\": [\n        {\n            \"name\": \"id\",\n            \"type\": \"integer\"\n        },\n        {\n            \"name\": \"title\",\n            \"type\": \"text\"\n        }\n    ],\n    \"pk\": \"id\"\n} \n                 The JSON here describes the table that will be created: \n                 \n                     \n                         table  is the name of the table to create. This field is required. \n                     \n                     \n                         columns  is a list of columns to create. Each column is a dictionary with  name  and  type  keys. \n                         \n                             \n                                 name  is the name of the column. This is required. \n                             \n                             \n                                 type  is the type of the column. This is optional - if not provided,  text  will be assumed. The valid types are  text ,  integer ,  float  and  blob . \n                             \n                         \n                     \n                     \n                         pk  is the primary key for the table. This is optional - if not provided, Datasette will create a SQLite table with a hidden  rowid  column. \n                         If the primary key is an integer column, it will be configured to automatically increment for each new record. \n                         If you set this to  id  without including an  id  column in the list of  columns , Datasette will create an auto-incrementing integer ID column for you. \n                     \n                     \n                         pks  can be used instead of  pk  to create a compound primary key. It should be a JSON list of column names to use in that primary key. \n                     \n                     \n                         ignore  can be set to  true  to ignore existing rows by primary key if the table already exists. \n                     \n                     \n                         replace  can be set to  true  to replace existing rows by primary key if the table already exists. This requires the  update-row  permission. \n                     \n                     \n                         alter  can be set to  true  if you want to automatically add any missing columns to the table. This requires the  alter-table  permission. \n                     \n                 \n                 If the table is successfully created this will return a  201  status code and the following response: \n                 {\n    \"ok\": true,\n    \"database\": \"data\",\n    \"table\": \"name_of_new_table\",\n    \"table_url\": \"http://127.0.0.1:8001/data/name_of_new_table\",\n    \"table_api_url\": \"http://127.0.0.1:8001/data/name_of_new_table.json\",\n    \"schema\": \"CREATE TABLE [name_of_new_table] (\\n   [id] INTEGER PRIMARY KEY,\\n   [title] TEXT\\n)\"\n}", "breadcrumbs": "[\"JSON API\", \"The JSON write API\"]", "references": "[]"}, {"id": "json_api:tablecreateview-example", "page": "json_api", "ref": "tablecreateview-example", "title": "Creating a table from example data", "content": "Instead of specifying  columns  directly you can instead pass a single example  row  or a list of  rows .\n                    Datasette will create a table with a schema that matches those rows and insert them for you: \n                 POST /<database>/-/create\nContent-Type: application/json\nAuthorization: Bearer dstok_<rest-of-token> \n                 {\n    \"table\": \"creatures\",\n    \"rows\": [\n        {\n            \"id\": 1,\n            \"name\": \"Tarantula\"\n        },\n        {\n            \"id\": 2,\n            \"name\": \"K\u0101k\u0101p\u014d\"\n        }\n    ],\n    \"pk\": \"id\"\n} \n                 Doing this requires both the  create-table  and  insert-row  permissions. \n                 The  201  response here will be similar to the  columns  form, but will also include the number of rows that were inserted as  row_count : \n                 {\n    \"ok\": true,\n    \"database\": \"data\",\n    \"table\": \"creatures\",\n    \"table_url\": \"http://127.0.0.1:8001/data/creatures\",\n    \"table_api_url\": \"http://127.0.0.1:8001/data/creatures.json\",\n    \"schema\": \"CREATE TABLE [creatures] (\\n   [id] INTEGER PRIMARY KEY,\\n   [name] TEXT\\n)\",\n    \"row_count\": 2\n} \n                 You can call the create endpoint multiple times for the same table provided you are specifying the table using the  rows  or  row  option. New rows will be inserted into the table each time. This means you can use this API if you are unsure if the relevant table has been created yet. \n                 If you pass a row to the create endpoint with a primary key that already exists you will get an error that looks like this: \n                 {\n    \"ok\": false,\n    \"errors\": [\n        \"UNIQUE constraint failed: creatures.id\"\n    ]\n} \n                 You can avoid this error by passing the same  \"ignore\": true  or  \"replace\": true  options to the create endpoint as you can to the  insert endpoint . \n                 To use the  \"replace\": true  option you will also need the  update-row  permission. \n                 Pass  \"alter\": true  to automatically add any missing columns to the existing table that are present in the rows you are submitting. This requires the  alter-table  permission.", "breadcrumbs": "[\"JSON API\", \"The JSON write API\"]", "references": "[]"}, {"id": "json_api:tabledropview", "page": "json_api", "ref": "tabledropview", "title": "Dropping tables", "content": "To drop a table, make a  POST  to  /<database>/<table>/-/drop . This requires the  drop-table  permission. \n                 POST /<database>/<table>/-/drop\nContent-Type: application/json\nAuthorization: Bearer dstok_<rest-of-token> \n                 Without a POST body this will return a status  200  with a note about how many rows will be deleted: \n                 {\n    \"ok\": true,\n    \"database\": \"<database>\",\n    \"table\": \"<table>\",\n    \"row_count\": 5,\n    \"message\": \"Pass \\\"confirm\\\": true to confirm\"\n} \n                 If you pass the following POST body: \n                 {\n    \"confirm\": true\n} \n                 Then the table will be dropped and a status  200  response of  {\"ok\": true}  will be returned. \n                 Any errors will return  {\"errors\": [\"... descriptive message ...\"], \"ok\": false} , and a  400  status code for a bad input or a  403  status code for an authentication or permission error.", "breadcrumbs": "[\"JSON API\", \"The JSON write API\"]", "references": "[]"}, {"id": "json_api:tableinsertview", "page": "json_api", "ref": "tableinsertview", "title": "Inserting rows", "content": "This requires the  insert-row  permission. \n                 A single row can be inserted using the  \"row\"  key: \n                 POST /<database>/<table>/-/insert\nContent-Type: application/json\nAuthorization: Bearer dstok_<rest-of-token> \n                 {\n    \"row\": {\n        \"column1\": \"value1\",\n        \"column2\": \"value2\"\n    }\n} \n                 If successful, this will return a  201  status code and the newly inserted row, for example: \n                 {\n    \"rows\": [\n        {\n            \"id\": 1,\n            \"column1\": \"value1\",\n            \"column2\": \"value2\"\n        }\n    ]\n} \n                 To insert multiple rows at a time, use the same API method but send a list of dictionaries as the  \"rows\"  key: \n                 POST /<database>/<table>/-/insert\nContent-Type: application/json\nAuthorization: Bearer dstok_<rest-of-token> \n                 {\n    \"rows\": [\n        {\n            \"column1\": \"value1\",\n            \"column2\": \"value2\"\n        },\n        {\n            \"column1\": \"value3\",\n            \"column2\": \"value4\"\n        }\n    ]\n} \n                 If successful, this will return a  201  status code and a  {\"ok\": true}  response body. \n                 The maximum number rows that can be submitted at once defaults to 100, but this can be changed using the  max_insert_rows  setting. \n                 To return the newly inserted rows, add the  \"return\": true  key to the request body: \n                 {\n    \"rows\": [\n        {\n            \"column1\": \"value1\",\n            \"column2\": \"value2\"\n        },\n        {\n            \"column1\": \"value3\",\n            \"column2\": \"value4\"\n        }\n    ],\n    \"return\": true\n} \n                 This will return the same  \"rows\"  key as the single row example above. There is a small performance penalty for using this option. \n                 If any of your rows have a primary key that is already in use, you will get an error and none of the rows will be inserted: \n                 {\n    \"ok\": false,\n    \"errors\": [\n        \"UNIQUE constraint failed: new_table.id\"\n    ]\n} \n                 Pass  \"ignore\": true  to ignore these errors and insert the other rows: \n                 {\n    \"rows\": [\n        {\n            \"id\": 1,\n            \"column1\": \"value1\",\n            \"column2\": \"value2\"\n        },\n        {\n            \"id\": 2,\n            \"column1\": \"value3\",\n            \"column2\": \"value4\"\n        }\n    ],\n    \"ignore\": true\n} \n                 Or you can pass  \"replace\": true  to replace any rows with conflicting primary keys with the new values. This requires the  update-row  permission. \n                 Pass  \"alter: true  to automatically add any missing columns to the table. This requires the  alter-table  permission.", "breadcrumbs": "[\"JSON API\", \"The JSON write API\"]", "references": "[]"}, {"id": "json_api:tablesetcolumntypeview", "page": "json_api", "ref": "tablesetcolumntypeview", "title": "Setting a column type", "content": "To set a column type for a table column, make a  POST  to  /<database>/<table>/-/set-column-type . This requires the  set-column-type  permission. \n                 POST /<database>/<table>/-/set-column-type\nContent-Type: application/json\nAuthorization: Bearer dstok_<rest-of-token> \n                 {\n    \"column\": \"title\",\n    \"column_type\": {\n        \"type\": \"email\"\n    }\n} \n                 This will return a  200  response like this: \n                 {\n    \"ok\": true,\n    \"database\": \"data\",\n    \"table\": \"posts\",\n    \"column\": \"title\",\n    \"column_type\": {\n        \"type\": \"email\",\n        \"config\": null\n    }\n} \n                 To provide column type configuration, include a  config  object: \n                 {\n    \"column\": \"title\",\n    \"column_type\": {\n        \"type\": \"url\",\n        \"config\": {\n            \"max_length\": 200\n        }\n    }\n} \n                 To clear an existing column type assignment, set  column_type  to  null : \n                 {\n    \"column\": \"title\",\n    \"column_type\": null\n} \n                 This API stores the assignment in Datasette's internal database, so it can be used with immutable databases as well as mutable ones. \n                 Any errors will return  {\"errors\": [\"... descriptive message ...\"], \"ok\": false} , and a  400  status code for a bad input or a  403  status code for an authentication or permission error.", "breadcrumbs": "[\"JSON API\", \"The JSON write API\"]", "references": "[]"}, {"id": "json_api:tableupsertview", "page": "json_api", "ref": "tableupsertview", "title": "Upserting rows", "content": "An upsert is an insert or update operation. If a row with a matching primary key already exists it will be updated - otherwise a new row will be inserted. \n                 The upsert API is mostly the same shape as the  insert API . It requires both the  insert-row  and  update-row  permissions. \n                 POST /<database>/<table>/-/upsert\nContent-Type: application/json\nAuthorization: Bearer dstok_<rest-of-token> \n                 {\n    \"rows\": [\n        {\n            \"id\": 1,\n            \"title\": \"Updated title for 1\",\n            \"description\": \"Updated description for 1\"\n        },\n        {\n            \"id\": 2,\n            \"description\": \"Updated description for 2\",\n        },\n        {\n            \"id\": 3,\n            \"title\": \"Item 3\",\n            \"description\": \"Description for 3\"\n        }\n    ]\n} \n                 Imagine a table with a primary key of  id  and which already has rows with  id  values of  1  and  2 . \n                 The above example will: \n                 \n                     \n                         Update the row with  id  of  1  to set both  title  and  description  to the new values \n                     \n                     \n                         Update the row with  id  of  2  to set  title  to the new value -  description  will be left unchanged \n                     \n                     \n                         Insert a new row with  id  of  3  and both  title  and  description  set to the new values \n                     \n                 \n                 Similar to  /-/insert , a  row  key with an object can be used instead of a  rows  array to upsert a single row. \n                 If successful, this will return a  200  status code and a  {\"ok\": true}  response body. \n                 Add  \"return\": true  to the request body to return full copies of the affected rows after they have been inserted or updated: \n                 {\n    \"rows\": [\n        {\n            \"id\": 1,\n            \"title\": \"Updated title for 1\",\n            \"description\": \"Updated description for 1\"\n        },\n        {\n            \"id\": 2,\n            \"description\": \"Updated description for 2\",\n        },\n        {\n            \"id\": 3,\n            \"title\": \"Item 3\",\n            \"description\": \"Description for 3\"\n        }\n    ],\n    \"return\": true\n} \n                 This will return the following: \n                 {\n    \"ok\": true,\n    \"rows\": [\n        {\n            \"id\": 1,\n            \"title\": \"Updated title for 1\",\n            \"description\": \"Updated description for 1\"\n        },\n        {\n            \"id\": 2,\n            \"title\": \"Item 2\",\n            \"description\": \"Updated description for 2\"\n        },\n        {\n            \"id\": 3,\n            \"title\": \"Item 3\",\n            \"description\": \"Description for 3\"\n        }\n    ]\n} \n                 When using upsert you must provide the primary key column (or columns if the table has a compound primary key) for every row, or you will get a  400  error: \n                 {\n    \"ok\": false,\n    \"errors\": [\n        \"Row 0 is missing primary key column(s): \\\"id\\\"\"\n    ]\n} \n                 If your table does not have an explicit primary key you should pass the SQLite  rowid  key instead. \n                 Pass  \"alter: true  to automatically add any missing columns to the table. This requires the  alter-table  permission.", "breadcrumbs": "[\"JSON API\", \"The JSON write API\"]", "references": "[]"}], "truncated": false}