Move lists between scopes

Move lists to another schema sync scope, assign lists that no scope manages to a scope, or release lists from their scope. See moving lists between scopes.

POST https://api.jsonpad.io/sync-schema/move

Example

cURL
1234567curl https://api.jsonpad.io/sync-schema/move?dryRun=true \ -H "Content-Type: application/json" \ -H "x-api-token: <YOUR TOKEN>" \ -d '{ "lists": ["recipes", "ratings"], "scope": "cookbook-app" }'

Parameters

  • optional
    dryRunbooleanhttps://api.jsonpad.io/sync-schema/move?dryRun=trueReturn the plan without changing anything. The response says whether a real move would be refused, in blockedBy.

Request headers

  • required
    x-api-tokenstringYour API token. The token needs the sync-schema permission, and permission to update each list it moves.

Request body

Either lists or fromScope is required, but not both.

  • optional
    listsstring[]["recipes", "ratings"]The lists to move, by id or path name. 1-100 lists.
  • optional
    fromScopestring"recipe-app"Move every list this scope manages, e.g. to rename the scope. If the scope doesn't manage any lists, nothing changes, and the response has a warning.
  • required
    scopestring | null"cookbook-app"The scope to move the lists to, or null to release them from their scope. 1-50 letters, numbers, hyphens and underscores.

Response body

200 OK
{
moveId: "2a5d9f7e-3c1b-4e8a-9f0d-6b7c8d9e0f1a"
dryRun: false
applied: true
scope: "cookbook-app"
summary: {
move: 1
assign: 1
release: 0
noChange: 0
error: 0
}
changes: [
0: {
list: "recipes"
listId: "1bbd0b1e-4b3a-4c52-8f2a-0b8b0a2b5d0e"
action: "move"
from: "recipe-app"
to: "cookbook-app"
indexes: 2
fields: {
tags: {
from: [
0: "recipe-app"
]
to: [
0: "cookbook-app"
]
}
}
}
1: {
list: "ratings"
listId: "7c2e4a6b-8d0f-4b1c-9e3a-5f6d7e8a9b0c"
action: "assign"
from: null
to: "cookbook-app"
fields: {
tags: {
from: [
]
to: [
0: "cookbook-app"
]
}
}
}
]
warnings: [
]
blockedBy: null
}
  • moveIdstringIdentifies this move in the attachments of the list-updated events it logs.
  • appliedbooleanWhether the changes were made. Always false in a dry run.
  • changesobject[]

    One entry for each list. action is move (from one scope to another), assign (a list no scope managed), release, no-change (the list is already in that scope) or error. from and to are the list's scope before and after.

    indexes is how many of the list's indexes the scope manages, which move (or are released) with it. An assigned list's indexes aren't managed by the scope until a sync declares them. fields shows the list's tags changing, as the scope's tag moves with the list.

    warnings and errors are included when there are any. A list can't be moved if it doesn't exist, if it can't be updated (e.g. it's readonly or locked), if it has no path name (it can only be released), or if adding the scope's tag would give it too many tags.

  • warningsstring[]Warnings about the move as a whole, e.g. that fromScope doesn't manage any lists.
  • blockedByobject | nullWhy the move wasn't applied (or, in a dry run, wouldn't be): SCHEMA_SYNC_PLAN_HAS_ERRORS.
422 Unprocessable Entity

A move is all or nothing: if any list can't be moved, nothing is changed. The response has the usual error name, code and message, as well as the whole plan described above. The JS SDK's moveLists returns the plan rather than throwing, so check applied.

Response headers

No response headers

2026-09-15