Aller au contenu
Kintsu

API

Avec l’API de Kintsu, vos propres logiciels travaillent avec les données de votre organisation.

Un propriétaire ou un administrateur crée une clé API dans les paramètres de l’organisation, sous Clés API. Envoyez-la avec chaque requête :

curl https://app.kintsu.be/api/v1/whoami \
  -H "Authorization: Bearer <key>"

La description OpenAPI liste chaque endpoint, pour les outils qui en génèrent un client.

Platform

GET/whoami

The organization, the key and its rights

Shows who the key works for. Every valid key may call it.

Réponse (200)

{
  "type": "object",
  "properties": {
    "organization": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "name": {
          "type": "string"
        },
        "slug": {
          "type": "string"
        }
      },
      "required": [
        "id",
        "name",
        "slug"
      ],
      "additionalProperties": false
    },
    "key": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "name": {
          "type": "string"
        }
      },
      "required": [
        "id",
        "name"
      ],
      "additionalProperties": false
    },
    "permissions": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "array",
        "items": {
          "type": "string"
        }
      }
    }
  },
  "required": [
    "organization",
    "key",
    "permissions"
  ],
  "additionalProperties": false
}

Sites

GET/sites

The sites of the company

Needs the right `site.read`.

Réponse (200)

{
  "type": "object",
  "properties": {
    "sites": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "address": {
            "type": "string"
          },
          "languages": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "slug",
          "name",
          "status",
          "address",
          "languages"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "sites"
  ],
  "additionalProperties": false
}

GET/sites/{site}/collections

The collections of a site, with their fields

Needs the right `site.read`.

Paramètres
NomOùObligatoire
sitepathOui

Réponse (200)

{
  "type": "object",
  "properties": {
    "collections": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "singular": {
            "type": "string"
          },
          "instructions": {
            "type": "string"
          },
          "publishOnSave": {
            "type": "boolean"
          },
          "items": {
            "type": "number"
          },
          "fields": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "type": {
                  "type": "string"
                },
                "label": {},
                "required": {
                  "type": "boolean"
                },
                "localized": {
                  "type": "boolean"
                },
                "options": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "collection": {
                  "type": "string"
                }
              },
              "required": [
                "name",
                "type",
                "label",
                "required",
                "localized"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "slug",
          "name",
          "singular",
          "publishOnSave",
          "items",
          "fields"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "collections"
  ],
  "additionalProperties": false
}

GET/sites/{site}/collections/{collection}/items

The items of a collection, a page at a time

Filter with `filter` (JSON: `[{"field":"type","op":"eq","value":"huis"}]`, ops eq, ne, in, contains, gt, lt, set; field `$slug` for the slug), or on `externalId`. Sort on a field, `$rank`, `$updated` or `$created`, with `-` in front for descending. At most 100 per page; `next` is the cursor of the next page. Needs the right `site.read`.

Paramètres
NomOùObligatoire
sitepathOui
collectionpathOui
statusqueryNon
localequeryNon
filterqueryNon
sortqueryNon
externalIdqueryNon
updatedSincequeryNon
limitqueryNon
cursorqueryNon

Réponse (200)

{
  "type": "object",
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "key": {
            "type": "string",
            "description": "collection/slug"
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "published",
              "bin"
            ]
          },
          "changed": {
            "type": "boolean",
            "description": "The draft differs from what is online."
          },
          "externalId": {
            "type": [
              "string",
              "null"
            ]
          },
          "slug": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "string"
            }
          },
          "values": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {},
            "description": "By field name, in the language asked."
          },
          "online": {
            "anyOf": [
              {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {}
              },
              {
                "type": "null"
              }
            ]
          },
          "version": {
            "type": "number"
          },
          "updatedAt": {
            "type": "string"
          },
          "publishedAt": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "key",
          "status",
          "changed",
          "externalId",
          "slug",
          "values",
          "version",
          "updatedAt",
          "publishedAt"
        ],
        "additionalProperties": false
      }
    },
    "next": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "items",
    "next"
  ],
  "additionalProperties": false
}

POST/sites/{site}/collections/{collection}/items

Adds an item, as a draft or online at once

Within the items of the plan. With `publish: true` it goes online right away; a collection that publishes on save does so anyway. Needs the right `content.edit`.

Paramètres
NomOùObligatoire
sitepathOui
collectionpathOui
idempotency-keyheaderNon

Corps de la requête

{
  "type": "object",
  "properties": {
    "values": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {},
      "description": "By field name. Rich text as { \"markdown\": \"…\" }; an image { \"asset\": \"<id>\" } or { \"url\": \"https://…\" }; a reference collection/slug; a link \"/contact\" or \"https://…\"."
    },
    "slug": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          }
        }
      ]
    },
    "locale": {
      "description": "The language of the values; the main one by default.",
      "type": "string"
    },
    "publish": {
      "description": "Put it online right away (needs content.publish).",
      "type": "boolean"
    },
    "externalId": {
      "description": "The key of the item in your system, unique per collection.",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "required": [
    "values"
  ]
}

Réponse (201)

{
  "type": "object",
  "properties": {
    "item": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "key": {
          "type": "string",
          "description": "collection/slug"
        },
        "status": {
          "type": "string",
          "enum": [
            "draft",
            "published",
            "bin"
          ]
        },
        "changed": {
          "type": "boolean",
          "description": "The draft differs from what is online."
        },
        "externalId": {
          "type": [
            "string",
            "null"
          ]
        },
        "slug": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          }
        },
        "values": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {},
          "description": "By field name, in the language asked."
        },
        "online": {
          "anyOf": [
            {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {}
            },
            {
              "type": "null"
            }
          ]
        },
        "version": {
          "type": "number"
        },
        "updatedAt": {
          "type": "string"
        },
        "publishedAt": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "id",
        "key",
        "status",
        "changed",
        "externalId",
        "slug",
        "values",
        "version",
        "updatedAt",
        "publishedAt"
      ],
      "additionalProperties": false
    },
    "published": {
      "type": "boolean"
    },
    "repeated": {
      "type": "boolean"
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "path",
          "message"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "item",
    "published",
    "warnings"
  ],
  "additionalProperties": false
}

GET/sites/{site}/collections/{collection}/items/{item}

One item: its draft, and what is online when that differs

Needs the right `site.read`.

Paramètres
NomOùObligatoire
sitepathOui
collectionpathOui
itempathOui
localequeryNon

Réponse (200)

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "key": {
      "type": "string",
      "description": "collection/slug"
    },
    "status": {
      "type": "string",
      "enum": [
        "draft",
        "published",
        "bin"
      ]
    },
    "changed": {
      "type": "boolean",
      "description": "The draft differs from what is online."
    },
    "externalId": {
      "type": [
        "string",
        "null"
      ]
    },
    "slug": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    },
    "values": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {},
      "description": "By field name, in the language asked."
    },
    "online": {
      "anyOf": [
        {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {}
        },
        {
          "type": "null"
        }
      ]
    },
    "version": {
      "type": "number"
    },
    "updatedAt": {
      "type": "string"
    },
    "publishedAt": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "id",
    "key",
    "status",
    "changed",
    "externalId",
    "slug",
    "values",
    "version",
    "updatedAt",
    "publishedAt"
  ],
  "additionalProperties": false
}

PATCH/sites/{site}/collections/{collection}/items/{item}

Changes an item, as a draft or online at once

Needs the right `content.edit`.

Paramètres
NomOùObligatoire
sitepathOui
collectionpathOui
itempathOui
idempotency-keyheaderNon

Corps de la requête

{
  "type": "object",
  "properties": {
    "values": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {},
      "description": "By field name. Rich text as { \"markdown\": \"…\" }; an image { \"asset\": \"<id>\" } or { \"url\": \"https://…\" }; a reference collection/slug; a link \"/contact\" or \"https://…\"."
    },
    "slug": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          }
        }
      ]
    },
    "locale": {
      "description": "The language of the values; the main one by default.",
      "type": "string"
    },
    "publish": {
      "description": "Put it online right away (needs content.publish).",
      "type": "boolean"
    }
  }
}

Réponse (200)

{
  "type": "object",
  "properties": {
    "item": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "key": {
          "type": "string",
          "description": "collection/slug"
        },
        "status": {
          "type": "string",
          "enum": [
            "draft",
            "published",
            "bin"
          ]
        },
        "changed": {
          "type": "boolean",
          "description": "The draft differs from what is online."
        },
        "externalId": {
          "type": [
            "string",
            "null"
          ]
        },
        "slug": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          }
        },
        "values": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {},
          "description": "By field name, in the language asked."
        },
        "online": {
          "anyOf": [
            {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {}
            },
            {
              "type": "null"
            }
          ]
        },
        "version": {
          "type": "number"
        },
        "updatedAt": {
          "type": "string"
        },
        "publishedAt": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "id",
        "key",
        "status",
        "changed",
        "externalId",
        "slug",
        "values",
        "version",
        "updatedAt",
        "publishedAt"
      ],
      "additionalProperties": false
    },
    "published": {
      "type": "boolean"
    },
    "repeated": {
      "type": "boolean"
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "path",
          "message"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "item",
    "published",
    "warnings"
  ],
  "additionalProperties": false
}

DELETE/sites/{site}/collections/{collection}/items/{item}

Moves an item to the bin, and with publish=true off the site at once

Needs the right `content.edit`.

Paramètres
NomOùObligatoire
sitepathOui
collectionpathOui
itempathOui
publishqueryNon
idempotency-keyheaderNon

POST/sites/{site}/collections/{collection}/items/upsert

Adds or changes up to 100 items by their externalId, all or nothing

An item with an externalId that exists in the collection is changed, the others are added. In one transaction; with `publish: true` they go online in one publication. Send the same Idempotency-Key again after a timeout. Needs the right `content.edit`.

Paramètres
NomOùObligatoire
sitepathOui
collectionpathOui
idempotency-keyheaderNon

Corps de la requête

{
  "type": "object",
  "properties": {
    "items": {
      "minItems": 1,
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "externalId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "values": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {},
            "description": "By field name. Rich text as { \"markdown\": \"…\" }; an image { \"asset\": \"<id>\" } or { \"url\": \"https://…\" }; a reference collection/slug; a link \"/contact\" or \"https://…\"."
          },
          "slug": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "string"
                }
              }
            ]
          }
        },
        "required": [
          "externalId",
          "values"
        ]
      }
    },
    "locale": {
      "type": "string"
    },
    "publish": {
      "type": "boolean"
    }
  },
  "required": [
    "items"
  ]
}

Réponse (201)

{
  "type": "object",
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "key": {
            "type": "string",
            "description": "collection/slug"
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "published",
              "bin"
            ]
          },
          "changed": {
            "type": "boolean",
            "description": "The draft differs from what is online."
          },
          "externalId": {
            "type": [
              "string",
              "null"
            ]
          },
          "slug": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "string"
            }
          },
          "values": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {},
            "description": "By field name, in the language asked."
          },
          "online": {
            "anyOf": [
              {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {}
              },
              {
                "type": "null"
              }
            ]
          },
          "version": {
            "type": "number"
          },
          "updatedAt": {
            "type": "string"
          },
          "publishedAt": {
            "type": [
              "string",
              "null"
            ]
          },
          "created": {
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "key",
          "status",
          "changed",
          "externalId",
          "slug",
          "values",
          "version",
          "updatedAt",
          "publishedAt",
          "created"
        ],
        "additionalProperties": false
      }
    },
    "published": {
      "type": "boolean"
    },
    "repeated": {
      "type": "boolean"
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "path",
          "message"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "items",
    "published",
    "warnings"
  ],
  "additionalProperties": false
}

POST/sites/{site}/publish

Puts the drafts online: everything the key may publish, one item, or one item offline

Without item: every draft the key may publish; design work in progress stays back, with the reason. Checked like in the editor: a link to what does not go along stops the publication. Needs the right `content.publish`.

Paramètres
NomOùObligatoire
sitepathOui
idempotency-keyheaderNon

Corps de la requête

{
  "type": "object",
  "properties": {
    "item": {
      "description": "Only this item.",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "unpublish": {
      "description": "Takes this item offline.",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  }
}

Réponse (201)

{
  "type": "object",
  "properties": {
    "release": {
      "type": [
        "number",
        "null"
      ]
    },
    "online": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "staysBack": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "path",
          "message"
        ],
        "additionalProperties": false
      }
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "path",
          "message"
        ],
        "additionalProperties": false
      }
    },
    "repeated": {
      "type": "boolean"
    }
  },
  "required": [
    "release",
    "online",
    "staysBack",
    "warnings"
  ],
  "additionalProperties": false
}

POST/sites/{site}/assets

Stores an image or a file, from an address or in base64

Either `url` (https, fetched by Kintsu), or `data` in base64 with `filename` and `contentType`, at most 25 MB. The same file twice is one asset. Use its id in an image value: `{ "asset": "<id>" }`. Needs the right `content.edit`.

Paramètres
NomOùObligatoire
sitepathOui

Corps de la requête

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "format": "uri"
    },
    "data": {
      "type": "string"
    },
    "filename": {
      "type": "string",
      "maxLength": 200
    },
    "contentType": {
      "type": "string",
      "maxLength": 100
    },
    "alt": {
      "description": "Per language.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string",
        "maxLength": 300
      }
    },
    "folder": {
      "type": "string",
      "maxLength": 100
    }
  }
}

Réponse (201)

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "kind": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "width": {
      "type": [
        "number",
        "null"
      ]
    },
    "height": {
      "type": [
        "number",
        "null"
      ]
    },
    "existing": {
      "type": "boolean"
    }
  },
  "required": [
    "id",
    "kind",
    "name",
    "width",
    "height"
  ],
  "additionalProperties": false
}

GET/sites/{site}/submissions

What visitors sent with the forms of a site, oldest first

Per form with `form`, from a moment with `since`, a page at a time with `next`. Such as to put them in a CRM. Needs the right `submission.read`.

Paramètres
NomOùObligatoire
sitepathOui
formqueryNon
sincequeryNon
limitqueryNon
cursorqueryNon

Réponse (200)

{
  "type": "object",
  "properties": {
    "submissions": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "form": {
            "type": "string"
          },
          "page": {
            "type": [
              "string",
              "null"
            ]
          },
          "locale": {
            "type": [
              "string",
              "null"
            ]
          },
          "data": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "string"
            }
          },
          "status": {
            "type": "string"
          },
          "createdAt": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "form",
          "page",
          "locale",
          "data",
          "status",
          "createdAt"
        ],
        "additionalProperties": false
      }
    },
    "next": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "submissions",
    "next"
  ],
  "additionalProperties": false
}