Armazenamento
curl --request POST \
--url https://upload.lazydata.com.br/storage \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-LazyData-Upload-Signature: <x-lazydata-upload-signature>' \
--data '{}'import requests
url = "https://upload.lazydata.com.br/storage"
payload = {}
headers = {
"X-LazyData-Upload-Signature": "<x-lazydata-upload-signature>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-LazyData-Upload-Signature': '<x-lazydata-upload-signature>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({})
};
fetch('https://upload.lazydata.com.br/storage', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://upload.lazydata.com.br/storage",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-LazyData-Upload-Signature: <x-lazydata-upload-signature>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://upload.lazydata.com.br/storage"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-LazyData-Upload-Signature", "<x-lazydata-upload-signature>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://upload.lazydata.com.br/storage")
.header("X-LazyData-Upload-Signature", "<x-lazydata-upload-signature>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://upload.lazydata.com.br/storage")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-LazyData-Upload-Signature"] = '<x-lazydata-upload-signature>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{
"code": 200,
"message": "Arquivo enviado.",
"result": {
"id": "9fcb573b-7f62-4774-978b-07e89dfef5f2",
"type": "file",
"name": "contrato.pdf",
"parent_id": "54d8a266-4e21-4a9a-9c15-b4b93bc11c6e",
"extension": "pdf",
"content_type": "application/pdf",
"size": 24576,
"status": "uploaded",
"uploaded_at": "2026-06-22T12:00:00+00:00",
"created_at": "2026-06-22T11:59:40+00:00",
"updated_at": "2026-06-22T12:00:00+00:00"
}
}
{
"code": 400,
"message": "O arquivo enviado não corresponde ao arquivo assinado."
}
{
"code": 401,
"message": "Assinatura de upload ausente ou inválida."
}
{
"code": 403,
"message": "O arquivo excede o espaço disponível no armazenamento."
}
{
"code": 404,
"message": "Arquivo não localizado ou já enviado."
}
{
"code": 409,
"message": "Este arquivo não está disponível para upload."
}
{
"code": 413,
"message": "O arquivo deve ter no máximo 1 GB."
}
Upload de arquivos
Armazenamento
Envie arquivos para o armazenamento da conta usando uma assinatura temporária de upload.
POST
https://upload.lazydata.com.br
/
storage
Armazenamento
curl --request POST \
--url https://upload.lazydata.com.br/storage \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-LazyData-Upload-Signature: <x-lazydata-upload-signature>' \
--data '{}'import requests
url = "https://upload.lazydata.com.br/storage"
payload = {}
headers = {
"X-LazyData-Upload-Signature": "<x-lazydata-upload-signature>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-LazyData-Upload-Signature': '<x-lazydata-upload-signature>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({})
};
fetch('https://upload.lazydata.com.br/storage', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://upload.lazydata.com.br/storage",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-LazyData-Upload-Signature: <x-lazydata-upload-signature>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://upload.lazydata.com.br/storage"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-LazyData-Upload-Signature", "<x-lazydata-upload-signature>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://upload.lazydata.com.br/storage")
.header("X-LazyData-Upload-Signature", "<x-lazydata-upload-signature>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://upload.lazydata.com.br/storage")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-LazyData-Upload-Signature"] = '<x-lazydata-upload-signature>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{
"code": 200,
"message": "Arquivo enviado.",
"result": {
"id": "9fcb573b-7f62-4774-978b-07e89dfef5f2",
"type": "file",
"name": "contrato.pdf",
"parent_id": "54d8a266-4e21-4a9a-9c15-b4b93bc11c6e",
"extension": "pdf",
"content_type": "application/pdf",
"size": 24576,
"status": "uploaded",
"uploaded_at": "2026-06-22T12:00:00+00:00",
"created_at": "2026-06-22T11:59:40+00:00",
"updated_at": "2026-06-22T12:00:00+00:00"
}
}
{
"code": 400,
"message": "O arquivo enviado não corresponde ao arquivo assinado."
}
{
"code": 401,
"message": "Assinatura de upload ausente ou inválida."
}
{
"code": 403,
"message": "O arquivo excede o espaço disponível no armazenamento."
}
{
"code": 404,
"message": "Arquivo não localizado ou já enviado."
}
{
"code": 409,
"message": "Este arquivo não está disponível para upload."
}
{
"code": 413,
"message": "O arquivo deve ter no máximo 1 GB."
}
Envia um arquivo para o armazenamento da conta usando o serviço de upload da Lazy Data.
Este endpoint não usa a URL base da API principal. A chamada deve ser feita para:
Estrutura da resposta
Estrutura de
https://upload.lazydata.com.br/storage
Esta requisição não usa
Authorization: Bearer. A autenticação do upload é feita pelo header X-LazyData-Upload-Signature, retornado na etapa de preparação do upload.Fluxo
1
Solicite a assinatura
Informe o nome do arquivo e a pasta de destino para receber
upload_url, signature, signature_expires_at, max_size e os metadados iniciais do arquivo.2
Envie o arquivo
Faça
POST para upload_url, enviando o arquivo em multipart/form-data e a assinatura no header X-LazyData-Upload-Signature.3
Receba o registro do arquivo
Após o envio, a API salva o arquivo no armazenamento e retorna os metadados finais do item.
4
Use o arquivo no storage
Depois de enviado, o arquivo pode ser listado, baixado, renomeado ou excluído conforme as permissões da conta.
Requisição
string
required
Assinatura temporária de upload retornada na preparação do envio para armazenamento.
file
required
Arquivo enviado em
multipart/form-data. O nome do campo deve ser exatamente file.O arquivo enviado precisa ter o mesmo nome usado para gerar a assinatura. Se o nome for diferente, o upload será recusado.
Exemplo com cURL
curl --request POST \
--url "https://upload.lazydata.com.br/storage" \
--header "X-LazyData-Upload-Signature: <assinatura_de_upload>" \
--form "file=@./contrato.pdf"
Exemplo com JavaScript
const formData = new FormData();
formData.append("file", file, file.name);
const response = await fetch("https://upload.lazydata.com.br/storage", {
method: "POST",
headers: {
"X-LazyData-Upload-Signature": uploadSignature
},
body: formData
});
const data = await response.json();
console.log(data);
Não defina manualmente o header
Content-Type ao usar FormData no navegador. O próprio navegador adiciona o boundary correto do multipart/form-data.Formatos aceitos
O armazenamento aceita diferentes tipos de arquivo, desde que o upload respeite o tamanho máximo, a assinatura gerada e os limites de espaço da conta. O tipo MIME é normalizado a partir do arquivo enviado. Quando o navegador enviaapplication/octet-stream, a API tenta inferir o tipo com base no nome do arquivo.
Limites
| Item | Regra |
|---|---|
| Tamanho máximo por arquivo | Até 1024 MB. |
| Campo do arquivo | Deve ser file. |
| Assinatura | Deve estar ativa e corresponder ao arquivo preparado. |
| Nome do arquivo | Deve ser o mesmo usado na preparação do upload. |
| Espaço disponível | O arquivo precisa caber no limite de armazenamento da conta. |
| Nome duplicado | Não é permitido manter dois arquivos com o mesmo nome na mesma pasta. |
Respostas
{
"code": 200,
"message": "Arquivo enviado.",
"result": {
"id": "9fcb573b-7f62-4774-978b-07e89dfef5f2",
"type": "file",
"name": "contrato.pdf",
"parent_id": "54d8a266-4e21-4a9a-9c15-b4b93bc11c6e",
"extension": "pdf",
"content_type": "application/pdf",
"size": 24576,
"status": "uploaded",
"uploaded_at": "2026-06-22T12:00:00+00:00",
"created_at": "2026-06-22T11:59:40+00:00",
"updated_at": "2026-06-22T12:00:00+00:00"
}
}
{
"code": 400,
"message": "O arquivo enviado não corresponde ao arquivo assinado."
}
{
"code": 401,
"message": "Assinatura de upload ausente ou inválida."
}
{
"code": 403,
"message": "O arquivo excede o espaço disponível no armazenamento."
}
{
"code": 404,
"message": "Arquivo não localizado ou já enviado."
}
{
"code": 409,
"message": "Este arquivo não está disponível para upload."
}
{
"code": 413,
"message": "O arquivo deve ter no máximo 1 GB."
}
Estrutura da resposta 200
integer
required
Código da resposta.
200 indica que o arquivo foi recebido e salvo no armazenamento.string
required
Mensagem descritiva da operação.
object
required
Metadados finais do arquivo armazenado.
Estrutura de result
| Campo | Tipo | Descrição |
|---|---|---|
id | string | Identificador do arquivo no armazenamento. |
type | string | Tipo do item. Para este endpoint, retorna file. |
name | string | Nome do arquivo armazenado. |
parent_id | string/null | Identificador da pasta onde o arquivo foi salvo. Quando null, o arquivo foi salvo na raiz. |
extension | string/null | Extensão identificada a partir do nome do arquivo. |
content_type | string | Tipo MIME identificado para o arquivo. |
size | integer | Tamanho final do arquivo em bytes. |
status | string | Status atual do arquivo. Após upload bem-sucedido, retorna uploaded. |
uploaded_at | string | Data de upload em ISO 8601. |
created_at | string | Data de criação do registro do arquivo em ISO 8601. |
updated_at | string | Data da última atualização do registro em ISO 8601. |
Status do arquivo
| Status | Descrição |
|---|---|
waiting_upload | Registro criado e aguardando o envio do arquivo. |
receiving_upload | Upload em andamento. |
uploaded | Arquivo recebido e salvo com sucesso. |
failed | O upload falhou ou foi recusado. |
Erros comuns
| Status HTTP | Motivo |
|---|---|
400 | Arquivo vazio, nome divergente ou payload inválido. |
401 | Assinatura ausente, inválida ou expirada. |
403 | Armazenamento desabilitado, limite excedido ou espaço insuficiente. |
404 | Arquivo vinculado à assinatura não foi localizado ou já foi enviado. |
409 | O arquivo não está disponível para upload no momento. |
413 | Arquivo acima do limite permitido. |
500 | Falha inesperada ao receber ou salvar o arquivo. |
Regras importantes
- Use sempre
https://upload.lazydata.com.br/storage. - A assinatura é temporária e deve ser usada apenas para o arquivo preparado.
- O upload deve ser feito com
multipart/form-data. - O campo do arquivo deve se chamar
file. - O nome do arquivo precisa ser igual ao informado na etapa de assinatura.
- O arquivo é contabilizado no espaço de armazenamento da conta após o upload.
- Se o upload falhar, gere uma nova assinatura antes de tentar novamente.
- Para enviar para uma pasta específica, informe a pasta na etapa de preparação da assinatura.

