GoliathDevelopersGet an API key
Reference/Spacesgenerated from the gateway manifest

saveSpaceTextFile

Save new text as the next version of a text file you can edit.

POST/api/v1/callWRITEidempotent · 24 hruns as the key's owner
View as Markdown

Save new text as the next version of a text file you can edit (earlier versions are kept and can be restored in the app). Pass baseVersionId (the versionId getSpaceTextContent returned) so a save over someone else's newer version is refused instead of overwriting it.

curl https://server.goliathdata.com/api/v1/call \
  -H "Authorization: Bearer $GOLIATH_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "operationId": "saveSpaceTextFile",
    "variables": {
      "input": {
        "itemId": "<itemId>",
        "content": "<String>"
      }
    }
  }'
import { GoliathClient } from '@goliath-data/sdk'

const goliath = new GoliathClient({
  apiKey: process.env.GOLIATH_API_KEY!,
  baseUrl: 'https://server.goliathdata.com',
})

const result = await goliath.spaces.saveSpaceTextFile(
  {
    input: {
      itemId: '<itemId>',
      content: '<String>'
    }
  },
  { idempotencyKey: crypto.randomUUID() },
)
const res = await fetch('https://server.goliathdata.com/api/v1/call', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.GOLIATH_API_KEY}`,
    'Content-Type': 'application/json',
    'Idempotency-Key': crypto.randomUUID(),
  },
  body: JSON.stringify({
    operationId: 'saveSpaceTextFile',
    variables: {
      input: {
        itemId: '<itemId>',
        content: '<String>'
      }
    }
  }),
})
const { data, errors } = await res.json()

Variables

The example sends only what the schema requires. Some operations also need one of several optional variables (one filter or another, say); the description above says which.

inputSaveSpaceTextFileInput!required
itemIdID!required
contentString!required
baseVersionIdID

The version the editor started from; a save over someone else's newer one is refused.

editSessionIdID

The open editor's session id. While the same person keeps saving from one session (saves no more than 10 minutes apart), each save replaces that session's version instead of adding one.

Response

What comes back under data: a list shows as one entry, and a value as its type.

response shape
{
  "data": {
    "spacesMutation": {
      "saveTextFile": {
        "id": "<ID>",
        "spaceId": "<ID>",
        "spaceName": "…",
        "parentId": "<ID>",
        "kind": "FOLDER",
        "name": "…",
        "description": "…",
        "fileType": "…",
        "sizeBytes": 0,
        "accessMode": "INHERIT",
        "systemLocked": true,
        "viewerRole": "VIEWER",
        "abilities": {
          "addChildren": true,
          "edit": true,
          "move": true,
          "trash": true,
          "share": true
        },
        "owner": {
          "id": "<ID>",
          "name": "…"
        },
        "createdBy": {
          "kind": "PERSON",
          "label": "…"
        },
        "childCount": 0,
        "shareCount": 0,
        "currentVersion": {
          "id": "<ID>",
          "versionNumber": 0
        },
        "path": [
          {
            "id": "<ID>",
            "name": "…"
          }
        ],
        "updatedAt": "2026-01-01T00:00:00.000Z",
        "trashedAt": "2026-01-01T00:00:00.000Z"
      }
    }
  }
}

Errors

Idempotency

Send an Idempotency-Key of 1 to 255 characters. A finished request retried with the same key replays its stored response, marked Idempotency-Replayed: true; one still in flight returns 409 idempotency_conflict. Keys expire after 24 hours. Write without fear →