Extrair dados de uma certidão de casamento
POST /documents/marriage-certificate
O que faz: extrai todos os campos de uma certidão de casamento brasileira a partir de uma foto, um escaneamento ou um PDF.
Uma página: um inteiro teor, o texto completo do registro, é lido quando cabe em uma página, já que uma requisição leva uma imagem. Lemos apenas a primeira página do PDF.
Envie a imagem em uma URL pública (imageType: "url" com imageUrl) ou no corpo (imageType: "base64" com imageBase64). Teste com a certidão de exemplo hospedada, https://docsocr.com/samples/certidao-casamento-exemplo.jpg (dados fictícios).
Nosso padrão de imagem: 1344 a 2048 px no lado maior, onde todos os motores leem melhor. Uma imagem fora dele é recusada com 422, sem custo, a menos que resizeImage: true peça que a redimensionemos, pelo preço do redimensionamento; isso soma tempo à resposta.
O motor fast: "engine": "fast" o pede. Ele é tentado primeiro, e os motores padrão entram em seguida se ele não conseguir responder.
A resposta: os campos da certidão em data, o motor que respondeu (engine) e quanto a requisição custou (creditsCharged). Um valor que não pode estar certo, como um CPF cujos dígitos verificadores não conferem, vem como foi lido, com um aviso em warnings. Quando a imagem não é uma certidão de casamento, quando nada pode ser lido nela ou quando nenhum motor consegue responder, o status continua 201, com success: false, um errorCode e nada cobrado: DOCUMENT_NOT_RECOGNIZED (outro documento, ou uma imagem sem nada para ler) e IMAGE_NOT_PROCESSABLE pedem outra imagem; EXTRACTION_BUSY, EXTRACTION_TIMEOUT e EXTRACTION_UNAVAILABLE podem passar quando você envia a mesma requisição de novo mais tarde.
Repetindo uma requisição: o mesmo requestId, arquivo e opções em até 15 minutos da resposta recebem a mesma resposta sem custo, sem rodar os motores, com o header Idempotent-Replayed: true. Enquanto a primeira requisição ainda roda, uma repetição recebe 409 REQUEST_IN_PROGRESS com Retry-After.
Preço: uma resposta com dados custa o preço do motor que a responde, como GET /documents/prices o lista para cada documento: sem engine, nunca mais que o maior dos motores padrão; com "engine": "fast", nunca mais que o do fast. Verificar saldo
Autenticação
Sua chave de API DocsOCR, enviada como Authorization: Bearer <chave>. As chaves começam com dso_live_v1_ ou dso_test_v1_; as duas chamam os motores e usam créditos. Gerenciar chaves
Parâmetros
accept-languageO idioma das mensagens de recusas, erros e avisos:
pt-BRpara português, inglês nos outros casos.
Corpo da requisição
A imagem da certidão, em uma URL pública ou em base64: imageType diz qual.
Content-Type: application/json
imageType"url": a imagem está emimageUrl."base64": a imagem está emimageBase64.requestIdSeu ID para esta requisição, com até 128 caracteres: letras, dígitos,
_,-,.e:. Não coloque dados pessoais nele. O mesmorequestIdcom o mesmo arquivo e as mesmas opções em até 15 minutos da resposta devolve a mesma resposta sem custo, sem rodar os motores; com outro arquivo ou outras opções, é uma nova requisição. A resposta não o repete.imageUrlURL pública da imagem da certidão: um link direto que abre sem login.
imageBase64O arquivo da certidão em base64, com ou sem o prefixo data URI, por exemplo
data:image/jpeg;base64,/9j/4AAQ.... PDF*, JPG, PNG, WebP ou GIF, com até 10 MB; o tipo é lido do próprio arquivo. *Lemos apenas a primeira página do PDF.resizeImageRedimensiona uma imagem fora do nosso padrão (1344 a 2048 px no lado maior) para caber nele, em vez de recusá-la: o preço do redimensionamento se soma ao da extração, e a resposta traz
imageResized: true. A requisição precisa dos dois preços disponíveis enquanto roda (GET /documents/pricesos lista para cada documento). Sem ele, essa imagem é recusada com 422 e não custa nada. Uma imagem dentro do padrão nunca é redimensionada e custa o preço da extração de qualquer forma.enginePede o motor fast: ele é tentado primeiro e, quando não consegue responder, os motores padrão entram em seguida. Deixe de fora para usar os motores padrão. Só
"fast"é aceito; qualquer outro valor é recusado com 400 e não custa nada.
Exemplos
{
"imageType": "url",
"imageUrl": "https://docsocr.com/samples/certidao-casamento-exemplo.jpg",
"requestId": "5d2e8f1a-7c3b-4a9e-8f6d-2b1c0e9a7d4f"
}{
"imageType": "base64",
"imageBase64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcG...",
"requestId": "a3f7c9e1-2b4d-4c6e-9a8b-7d5f3e1c9b2a"
}{
"imageType": "url",
"imageUrl": "https://docsocr.com/samples/certidao-casamento-exemplo.jpg",
"requestId": "e8b4d2f6-1a3c-4e5b-9d7f-0c2a4b6d8e1f",
"engine": "fast"
}Respostas
201 Created
Os dados da certidão. Com success: false, nenhum motor conseguiu responder: errorCode diz por quê, e nada foi cobrado.
Idempotent-Replayedtruequando a resposta é a guardada para uma repetição: a mesma resposta da primeira vez, sem custo, sem os motores. Ausente nos outros casos.
Campos da resposta
successtruese a extração foi bem-sucedida. Verifique o campoerrorsefalse.errorO que deu errado. Presente apenas quando success é false.
errorCodePor que a extração falhou, como um código que o seu sistema pode tratar.
errorexplica em palavras simples. Presente apenas quando success é false.processingTimeMsQuanto tempo a extração levou, em milissegundos.
warningsValores de
datapara conferir no documento. Um valor que não pode estar certo, como um CPF cujos dígitos verificadores não conferem, vem como foi lido, com um aviso aqui; a requisição é cobrada como qualquer outra. Presente apenas quando há um.warnings[].codeO que há de errado com o valor, como um código que o seu sistema pode tratar.
warnings[].fieldO campo de
dataa que se refere, como um caminho com pontos.warnings[].messageO que há de errado e o que fazer, em palavras simples.
imageResizedtruequando a imagem estava fora do nosso padrão (1344 a 2048 px no lado maior) e foi redimensionada para caber nele, comoresizeImagepediu: o preço do redimensionamento se somou ao da extração. Presente apenas quando isso aconteceu.originalImageSizeTamanho da imagem como você a enviou, na orientação de exibição. Presente apenas quando imageResized é true.
originalImageSize.widthLargura, em pixels.
originalImageSize.heightAltura, em pixels.
finalImageSizeTamanho da imagem depois de redimensionada ao nosso padrão. Presente apenas quando imageResized é true.
finalImageSize.widthLargura, em pixels.
finalImageSize.heightAltura, em pixels.
engineO motor que respondeu com dados:
minioulargepara os motores padrão, oufastquando a requisição o pediu e o fast respondeu. Presente apenas quando um motor respondeu.creditsChargedCréditos que esta requisição custou, ao centésimo: o preço do motor que respondeu (nunca mais que o do motor que você pediu), mais o redimensionamento. 0 quando nada foi cobrado: uma imagem recusada, nenhum motor conseguiu responder, ou uma repetição respondida com a resposta guardada (
Idempotent-Replayed: true).dataDados extraídos da certidão. Todos os campos de uma certidão de casamento, vazios onde a certidão não imprime nada. Quando
successé false, todos os campos vêm vazios, menos o tipo do documento.
{
"success": true,
"processingTimeMs": 7480,
"data": {
"documento": {
"tipo": "Certidão de Casamento",
"título": "CERTIDÃO DE CASAMENTO",
"forma": "breve relato"
},
"registro": {
"matrícula": "123456 01 55 2025 2 00034 045 0009876 12",
"livro": "34",
"folha": "45",
"termo": "9876"
},
"cônjuge_1": {
"nome_completo": "RAFAEL COSTA TESTE",
"nome_atual": "RAFAEL COSTA TESTE",
"cpf": "123.456.789-09",
"nome_habilitação": "RAFAEL COSTA TESTE",
"nome_após_casamento": "RAFAEL COSTA TESTE",
"data_nascimento": {
"dia": "12",
"mês": "05",
"ano": "1994"
},
"nacionalidade": "BRASILEIRA",
"estado_civil": "SOLTEIRO",
"estado_civil_código": "solteiro",
"município_naturalidade": "RECIFE",
"uf_naturalidade": "PE",
"genitores": "JOSÉ COSTA TESTE; MARIA COSTA TESTE",
"profissão": "",
"domicílio": ""
},
"cônjuge_2": {
"nome_completo": "JULIANA MENDES COSTA TESTE",
"nome_atual": "JULIANA MENDES COSTA TESTE",
"cpf": "987.654.321-00",
"nome_habilitação": "JULIANA MENDES TESTE",
"nome_após_casamento": "JULIANA MENDES COSTA TESTE",
"data_nascimento": {
"dia": "03",
"mês": "09",
"ano": "1996"
},
"nacionalidade": "BRASILEIRA",
"estado_civil": "SOLTEIRA",
"estado_civil_código": "solteiro",
"município_naturalidade": "OLINDA",
"uf_naturalidade": "PE",
"genitores": "PAULO MENDES TESTE; ANA MENDES TESTE",
"profissão": "",
"domicílio": ""
},
"casamento": {
"tipo": "civil",
"data_celebração": {
"texto_completo": "VINTE E DOIS DE MARÇO DE DOIS MIL E VINTE E CINCO",
"dia": "22",
"mês": "03",
"ano": "2025"
},
"local_celebração": "",
"celebrante": "",
"documentos_apresentados": "",
"regime_bens": "COMUNHÃO PARCIAL DE BENS",
"regime_bens_código": "comunhão parcial",
"data_registro": {
"texto_completo": "VINTE E DOIS DE MARÇO DE DOIS MIL E VINTE E CINCO",
"dia": "22",
"mês": "03",
"ano": "2025"
}
},
"observações": {
"averbações_anotações": "",
"anotações_cadastro": "",
"outras_informações": ""
},
"inteiro_teor": {
"texto": ""
},
"cartório": {
"nome": "CARTÓRIO DO 1º OFÍCIO DE REGISTRO CIVIL DE RECIFE - PE",
"cns": "123456",
"município": "RECIFE",
"uf": "PE",
"endereço": "RUA DO EXEMPLO, 100, BOA VISTA, CEP 50000-000",
"telefone": "",
"email": ""
},
"autenticação": {
"selo_digital": "",
"consulta_autenticidade": "",
"oficial_registro": "PEDRO EXEMPLO",
"assinante": "MARIANA EXEMPLO",
"cargo_assinante": "ESCREVENTE",
"data_emissão": "25/03/2025",
"número_papel": ""
}
},
"engine": "large",
"creditsCharged": 1.5
}{
"success": true,
"processingTimeMs": 7480,
"data": {
"documento": {
"tipo": "Certidão de Casamento",
"título": "CERTIDÃO DE CASAMENTO",
"forma": "breve relato"
},
"registro": {
"matrícula": "123456 01 55 2025 2 00034 045 0009876 12",
"livro": "34",
"folha": "45",
"termo": "9876"
},
"cônjuge_1": {
"nome_completo": "RAFAEL COSTA TESTE",
"nome_atual": "RAFAEL COSTA TESTE",
"cpf": "123.456.789-00",
"nome_habilitação": "RAFAEL COSTA TESTE",
"nome_após_casamento": "RAFAEL COSTA TESTE",
"data_nascimento": {
"dia": "12",
"mês": "05",
"ano": "1994"
},
"nacionalidade": "BRASILEIRA",
"estado_civil": "SOLTEIRO",
"estado_civil_código": "solteiro",
"município_naturalidade": "RECIFE",
"uf_naturalidade": "PE",
"genitores": "JOSÉ COSTA TESTE; MARIA COSTA TESTE",
"profissão": "",
"domicílio": ""
},
"cônjuge_2": {
"nome_completo": "JULIANA MENDES COSTA TESTE",
"nome_atual": "JULIANA MENDES COSTA TESTE",
"cpf": "987.654.321-00",
"nome_habilitação": "JULIANA MENDES TESTE",
"nome_após_casamento": "JULIANA MENDES COSTA TESTE",
"data_nascimento": {
"dia": "03",
"mês": "09",
"ano": "1996"
},
"nacionalidade": "BRASILEIRA",
"estado_civil": "SOLTEIRA",
"estado_civil_código": "solteiro",
"município_naturalidade": "OLINDA",
"uf_naturalidade": "PE",
"genitores": "PAULO MENDES TESTE; ANA MENDES TESTE",
"profissão": "",
"domicílio": ""
},
"casamento": {
"tipo": "civil",
"data_celebração": {
"texto_completo": "VINTE E DOIS DE MARÇO DE DOIS MIL E VINTE E CINCO",
"dia": "22",
"mês": "03",
"ano": "2025"
},
"local_celebração": "",
"celebrante": "",
"documentos_apresentados": "",
"regime_bens": "COMUNHÃO PARCIAL DE BENS",
"regime_bens_código": "comunhão parcial",
"data_registro": {
"texto_completo": "VINTE E DOIS DE MARÇO DE DOIS MIL E VINTE E CINCO",
"dia": "22",
"mês": "03",
"ano": "2025"
}
},
"observações": {
"averbações_anotações": "",
"anotações_cadastro": "",
"outras_informações": ""
},
"inteiro_teor": {
"texto": ""
},
"cartório": {
"nome": "CARTÓRIO DO 1º OFÍCIO DE REGISTRO CIVIL DE RECIFE - PE",
"cns": "123456",
"município": "RECIFE",
"uf": "PE",
"endereço": "RUA DO EXEMPLO, 100, BOA VISTA, CEP 50000-000",
"telefone": "",
"email": ""
},
"autenticação": {
"selo_digital": "",
"consulta_autenticidade": "",
"oficial_registro": "PEDRO EXEMPLO",
"assinante": "MARIANA EXEMPLO",
"cargo_assinante": "ESCREVENTE",
"data_emissão": "25/03/2025",
"número_papel": ""
}
},
"warnings": [
{
"code": "INVALID_CPF",
"field": "cônjuge_1.cpf",
"message": "The value read is not a valid CPF: it is returned as read. Check it on the document."
}
],
"engine": "large",
"creditsCharged": 1.5
}{
"success": false,
"processingTimeMs": 1203,
"error": "The extraction service is busy. Please retry in a few moments. No credit was charged.",
"errorCode": "EXTRACTION_BUSY",
"data": {
"documento": {
"tipo": "Certidão de Casamento",
"título": "",
"forma": ""
},
"registro": {
"matrícula": "",
"livro": "",
"folha": "",
"termo": ""
},
"cônjuge_1": {
"nome_completo": "",
"nome_atual": "",
"cpf": "",
"nome_habilitação": "",
"nome_após_casamento": "",
"data_nascimento": {
"dia": "",
"mês": "",
"ano": ""
},
"nacionalidade": "",
"estado_civil": "",
"estado_civil_código": "",
"município_naturalidade": "",
"uf_naturalidade": "",
"genitores": "",
"profissão": "",
"domicílio": ""
},
"cônjuge_2": {
"nome_completo": "",
"nome_atual": "",
"cpf": "",
"nome_habilitação": "",
"nome_após_casamento": "",
"data_nascimento": {
"dia": "",
"mês": "",
"ano": ""
},
"nacionalidade": "",
"estado_civil": "",
"estado_civil_código": "",
"município_naturalidade": "",
"uf_naturalidade": "",
"genitores": "",
"profissão": "",
"domicílio": ""
},
"casamento": {
"tipo": "",
"data_celebração": {
"texto_completo": "",
"dia": "",
"mês": "",
"ano": ""
},
"local_celebração": "",
"celebrante": "",
"documentos_apresentados": "",
"regime_bens": "",
"regime_bens_código": "",
"data_registro": {
"texto_completo": "",
"dia": "",
"mês": "",
"ano": ""
}
},
"observações": {
"averbações_anotações": "",
"anotações_cadastro": "",
"outras_informações": ""
},
"inteiro_teor": {
"texto": ""
},
"cartório": {
"nome": "",
"cns": "",
"município": "",
"uf": "",
"endereço": "",
"telefone": "",
"email": ""
},
"autenticação": {
"selo_digital": "",
"consulta_autenticidade": "",
"oficial_registro": "",
"assinante": "",
"cargo_assinante": "",
"data_emissão": "",
"número_papel": ""
}
},
"creditsCharged": 0
}{
"success": false,
"processingTimeMs": 2410,
"error": "The document could not be processed. Check that the image shows a marriage certificate. No credit was charged.",
"errorCode": "DOCUMENT_NOT_RECOGNIZED",
"data": {
"documento": {
"tipo": "Certidão de Casamento",
"título": "",
"forma": ""
},
"registro": {
"matrícula": "",
"livro": "",
"folha": "",
"termo": ""
},
"cônjuge_1": {
"nome_completo": "",
"nome_atual": "",
"cpf": "",
"nome_habilitação": "",
"nome_após_casamento": "",
"data_nascimento": {
"dia": "",
"mês": "",
"ano": ""
},
"nacionalidade": "",
"estado_civil": "",
"estado_civil_código": "",
"município_naturalidade": "",
"uf_naturalidade": "",
"genitores": "",
"profissão": "",
"domicílio": ""
},
"cônjuge_2": {
"nome_completo": "",
"nome_atual": "",
"cpf": "",
"nome_habilitação": "",
"nome_após_casamento": "",
"data_nascimento": {
"dia": "",
"mês": "",
"ano": ""
},
"nacionalidade": "",
"estado_civil": "",
"estado_civil_código": "",
"município_naturalidade": "",
"uf_naturalidade": "",
"genitores": "",
"profissão": "",
"domicílio": ""
},
"casamento": {
"tipo": "",
"data_celebração": {
"texto_completo": "",
"dia": "",
"mês": "",
"ano": ""
},
"local_celebração": "",
"celebrante": "",
"documentos_apresentados": "",
"regime_bens": "",
"regime_bens_código": "",
"data_registro": {
"texto_completo": "",
"dia": "",
"mês": "",
"ano": ""
}
},
"observações": {
"averbações_anotações": "",
"anotações_cadastro": "",
"outras_informações": ""
},
"inteiro_teor": {
"texto": ""
},
"cartório": {
"nome": "",
"cns": "",
"município": "",
"uf": "",
"endereço": "",
"telefone": "",
"email": ""
},
"autenticação": {
"selo_digital": "",
"consulta_autenticidade": "",
"oficial_registro": "",
"assinante": "",
"cargo_assinante": "",
"data_emissão": "",
"número_papel": ""
}
},
"creditsCharged": 0
}{
"success": false,
"processingTimeMs": 2410,
"error": "The image shows a birth certificate, which this endpoint does not read. Send it to POST /documents/birth-certificate. No credit was charged.",
"errorCode": "DOCUMENT_NOT_RECOGNIZED",
"data": {
"documento": {
"tipo": "Certidão de Casamento",
"título": "",
"forma": ""
},
"registro": {
"matrícula": "",
"livro": "",
"folha": "",
"termo": ""
},
"cônjuge_1": {
"nome_completo": "",
"nome_atual": "",
"cpf": "",
"nome_habilitação": "",
"nome_após_casamento": "",
"data_nascimento": {
"dia": "",
"mês": "",
"ano": ""
},
"nacionalidade": "",
"estado_civil": "",
"estado_civil_código": "",
"município_naturalidade": "",
"uf_naturalidade": "",
"genitores": "",
"profissão": "",
"domicílio": ""
},
"cônjuge_2": {
"nome_completo": "",
"nome_atual": "",
"cpf": "",
"nome_habilitação": "",
"nome_após_casamento": "",
"data_nascimento": {
"dia": "",
"mês": "",
"ano": ""
},
"nacionalidade": "",
"estado_civil": "",
"estado_civil_código": "",
"município_naturalidade": "",
"uf_naturalidade": "",
"genitores": "",
"profissão": "",
"domicílio": ""
},
"casamento": {
"tipo": "",
"data_celebração": {
"texto_completo": "",
"dia": "",
"mês": "",
"ano": ""
},
"local_celebração": "",
"celebrante": "",
"documentos_apresentados": "",
"regime_bens": "",
"regime_bens_código": "",
"data_registro": {
"texto_completo": "",
"dia": "",
"mês": "",
"ano": ""
}
},
"observações": {
"averbações_anotações": "",
"anotações_cadastro": "",
"outras_informações": ""
},
"inteiro_teor": {
"texto": ""
},
"cartório": {
"nome": "",
"cns": "",
"município": "",
"uf": "",
"endereço": "",
"telefone": "",
"email": ""
},
"autenticação": {
"selo_digital": "",
"consulta_autenticidade": "",
"oficial_registro": "",
"assinante": "",
"cargo_assinante": "",
"data_emissão": "",
"número_papel": ""
}
},
"creditsCharged": 0
}400 Bad Request
O corpo não é válido: message lista o que corrigir. Nada foi cobrado.
Campos da resposta
statusCodeCódigo de status HTTP (sempre 400)
messageO que corrigir, uma linha por problema
errorCategoria do erro
{
"message": [
"imageUrl is required when imageType is \"url\"",
"requestId may only contain letters, digits, _, -, . and : (up to 128 characters)"
],
"error": "Bad Request",
"statusCode": 400
}401 Unauthorized
A chave de API está ausente, malformada, é desconhecida, foi revogada ou expirou.
Campos da resposta
errorCategoria do erro (sempre
Unauthorized)messageO que há de errado com a chave. Gerenciar chaves de API
timestampQuando a requisição foi recusada, em UTC
{
"error": "Unauthorized",
"message": "Invalid or expired API key",
"timestamp": "2026-10-02T12:00:00.000Z"
}{
"error": "Unauthorized",
"message": "API key is required. Provide Authorization: Bearer <your-api-key>",
"timestamp": "2026-10-02T12:00:00.000Z"
}402 Payment Required
Créditos insuficientes para esta requisição (errorCode NOT_ENOUGH_CREDITS). Uma requisição reserva o seu preço enquanto roda: o preço do motor (veja GET /documents/prices), mais o do redimensionamento com resizeImage: true. message traz o preço e o saldo; envie Accept-Language: pt-BR para recebê-la em português. A repetição de uma requisição respondida nos últimos 15 minutos não precisa de créditos.
Campos da resposta
statusCodeCódigo de status HTTP (sempre 402)
messageO preço da requisição e o saldo, com o que fazer. Envie
Accept-Language: pt-BRpara recebê-la em português.errorCategoria do erro
errorCodeSempre
NOT_ENOUGH_CREDITSactionO que fazer: comprar créditos ou mudar de plano
creditsAvailableCréditos que a organização pode usar agora, ao centésimo
creditsRequiredO preço da requisição, que ela reserva enquanto roda
planCreditsRemainingCréditos restantes da franquia mensal do plano
purchasedCreditsRemainingCréditos restantes de compras
{
"statusCode": 402,
"message": "This request costs 1.5 credits, and the available balance is 0 credits. Buy credits or upgrade your plan to continue.",
"error": "Payment Required",
"errorCode": "NOT_ENOUGH_CREDITS",
"action": "purchase_credits",
"creditsAvailable": 0,
"creditsRequired": 1.5,
"planCreditsRemaining": 0,
"purchasedCreditsRemaining": 0
}409 Conflict
Uma requisição com o mesmo requestId, arquivo e opções ainda está rodando (errorCode REQUEST_IN_PROGRESS). Nada rodou e nada foi cobrado. Aguarde os segundos do Retry-After e envie de novo: você recebe a resposta sem custo.
Retry-AfterSegundos para aguardar antes de enviar de novo, como
retryAfter
Campos da resposta
statusCodeCódigo de status HTTP (sempre 409)
messageO que fazer — legível
errorCategoria do erro
errorCodeSempre
REQUEST_IN_PROGRESSretryAfterSegundos para aguardar antes de enviar a requisição de novo
{
"statusCode": 409,
"message": "A request with this requestId and the same content is still being processed. Try again in a few seconds to get its answer, at no charge.",
"error": "Conflict",
"errorCode": "REQUEST_IN_PROGRESS",
"retryAfter": 5
}413 Payload Too Large
O corpo da requisição passa de 15 MB: errorCode IMAGE_TOO_LARGE. Nada foi cobrado.
Campos da resposta
successSempre
falseerrorCodeSempre
IMAGE_TOO_LARGEerrorO que enviar no lugar.
Accept-Language: pt-BRa traz em português.processingTimeMsSempre 0: nada foi processado
{
"success": false,
"errorCode": "IMAGE_TOO_LARGE",
"error": "The image is larger than 10 MB. Send a smaller image, for example a JPG with lower resolution or quality.",
"processingTimeMs": 0
}422 Unprocessable Entity
A imagem não pode ser usada, ou a imageUrl não pôde ser baixada. success é false, errorCode informa o problema (por exemplo IMAGE_TOO_LARGE, IMAGE_FORMAT_UNSUPPORTED, IMAGE_RESOLUTION_TOO_LOW, IMAGE_DOWNLOAD_FAILED) e error o explica em palavras simples, com o que corrigir. Envie PDF*, JPG, PNG, WebP ou GIF, com até 10 MB, dentro do nosso padrão de 1344 a 2048 px no lado maior. *Lemos apenas a primeira página do PDF. Uma requisição recusada não custa nada. Envie Accept-Language: pt-BR para receber a mensagem em português.
Campos da resposta
successtruese a extração foi bem-sucedida. Verifique o campoerrorsefalse.errorO que deu errado. Presente apenas quando success é false.
errorCodePor que a extração falhou, como um código que o seu sistema pode tratar.
errorexplica em palavras simples. Presente apenas quando success é false.processingTimeMsQuanto tempo a extração levou, em milissegundos.
warningsValores de
datapara conferir no documento. Um valor que não pode estar certo, como um CPF cujos dígitos verificadores não conferem, vem como foi lido, com um aviso aqui; a requisição é cobrada como qualquer outra. Presente apenas quando há um.warnings[].codeO que há de errado com o valor, como um código que o seu sistema pode tratar.
warnings[].fieldO campo de
dataa que se refere, como um caminho com pontos.warnings[].messageO que há de errado e o que fazer, em palavras simples.
imageResizedtruequando a imagem estava fora do nosso padrão (1344 a 2048 px no lado maior) e foi redimensionada para caber nele, comoresizeImagepediu: o preço do redimensionamento se somou ao da extração. Presente apenas quando isso aconteceu.originalImageSizeTamanho da imagem como você a enviou, na orientação de exibição. Presente apenas quando imageResized é true.
originalImageSize.widthLargura, em pixels.
originalImageSize.heightAltura, em pixels.
finalImageSizeTamanho da imagem depois de redimensionada ao nosso padrão. Presente apenas quando imageResized é true.
finalImageSize.widthLargura, em pixels.
finalImageSize.heightAltura, em pixels.
engineO motor que respondeu com dados:
minioulargepara os motores padrão, oufastquando a requisição o pediu e o fast respondeu. Presente apenas quando um motor respondeu.creditsChargedCréditos que esta requisição custou, ao centésimo: o preço do motor que respondeu (nunca mais que o do motor que você pediu), mais o redimensionamento. 0 quando nada foi cobrado: uma imagem recusada, nenhum motor conseguiu responder, ou uma repetição respondida com a resposta guardada (
Idempotent-Replayed: true).dataDados extraídos da certidão. Todos os campos de uma certidão de casamento, vazios onde a certidão não imprime nada. Quando
successé false, todos os campos vêm vazios, menos o tipo do documento.
{
"success": false,
"processingTimeMs": 35,
"error": "The image has 800 px on its long side; our standard is 1,344 to 2,048 px. Send a photo with more resolution, or set resizeImage: true to have it enlarged, at the resize's price.",
"errorCode": "IMAGE_RESOLUTION_TOO_LOW",
"data": {
"documento": {
"tipo": "Certidão de Casamento",
"título": "",
"forma": ""
},
"registro": {
"matrícula": "",
"livro": "",
"folha": "",
"termo": ""
},
"cônjuge_1": {
"nome_completo": "",
"nome_atual": "",
"cpf": "",
"nome_habilitação": "",
"nome_após_casamento": "",
"data_nascimento": {
"dia": "",
"mês": "",
"ano": ""
},
"nacionalidade": "",
"estado_civil": "",
"estado_civil_código": "",
"município_naturalidade": "",
"uf_naturalidade": "",
"genitores": "",
"profissão": "",
"domicílio": ""
},
"cônjuge_2": {
"nome_completo": "",
"nome_atual": "",
"cpf": "",
"nome_habilitação": "",
"nome_após_casamento": "",
"data_nascimento": {
"dia": "",
"mês": "",
"ano": ""
},
"nacionalidade": "",
"estado_civil": "",
"estado_civil_código": "",
"município_naturalidade": "",
"uf_naturalidade": "",
"genitores": "",
"profissão": "",
"domicílio": ""
},
"casamento": {
"tipo": "",
"data_celebração": {
"texto_completo": "",
"dia": "",
"mês": "",
"ano": ""
},
"local_celebração": "",
"celebrante": "",
"documentos_apresentados": "",
"regime_bens": "",
"regime_bens_código": "",
"data_registro": {
"texto_completo": "",
"dia": "",
"mês": "",
"ano": ""
}
},
"observações": {
"averbações_anotações": "",
"anotações_cadastro": "",
"outras_informações": ""
},
"inteiro_teor": {
"texto": ""
},
"cartório": {
"nome": "",
"cns": "",
"município": "",
"uf": "",
"endereço": "",
"telefone": "",
"email": ""
},
"autenticação": {
"selo_digital": "",
"consulta_autenticidade": "",
"oficial_registro": "",
"assinante": "",
"cargo_assinante": "",
"data_emissão": "",
"número_papel": ""
}
},
"creditsCharged": 0
}{
"success": false,
"processingTimeMs": 410,
"error": "We could not download the image from imageUrl: the link answered HTTP 404 (file not found). Use a public, direct link to a PDF, JPG, PNG, WebP or GIF file that opens without a login, or send the image as imageBase64.",
"errorCode": "IMAGE_DOWNLOAD_FAILED",
"data": {
"documento": {
"tipo": "Certidão de Casamento",
"título": "",
"forma": ""
},
"registro": {
"matrícula": "",
"livro": "",
"folha": "",
"termo": ""
},
"cônjuge_1": {
"nome_completo": "",
"nome_atual": "",
"cpf": "",
"nome_habilitação": "",
"nome_após_casamento": "",
"data_nascimento": {
"dia": "",
"mês": "",
"ano": ""
},
"nacionalidade": "",
"estado_civil": "",
"estado_civil_código": "",
"município_naturalidade": "",
"uf_naturalidade": "",
"genitores": "",
"profissão": "",
"domicílio": ""
},
"cônjuge_2": {
"nome_completo": "",
"nome_atual": "",
"cpf": "",
"nome_habilitação": "",
"nome_após_casamento": "",
"data_nascimento": {
"dia": "",
"mês": "",
"ano": ""
},
"nacionalidade": "",
"estado_civil": "",
"estado_civil_código": "",
"município_naturalidade": "",
"uf_naturalidade": "",
"genitores": "",
"profissão": "",
"domicílio": ""
},
"casamento": {
"tipo": "",
"data_celebração": {
"texto_completo": "",
"dia": "",
"mês": "",
"ano": ""
},
"local_celebração": "",
"celebrante": "",
"documentos_apresentados": "",
"regime_bens": "",
"regime_bens_código": "",
"data_registro": {
"texto_completo": "",
"dia": "",
"mês": "",
"ano": ""
}
},
"observações": {
"averbações_anotações": "",
"anotações_cadastro": "",
"outras_informações": ""
},
"inteiro_teor": {
"texto": ""
},
"cartório": {
"nome": "",
"cns": "",
"município": "",
"uf": "",
"endereço": "",
"telefone": "",
"email": ""
},
"autenticação": {
"selo_digital": "",
"consulta_autenticidade": "",
"oficial_registro": "",
"assinante": "",
"cargo_assinante": "",
"data_emissão": "",
"número_papel": ""
}
},
"creditsCharged": 0
}{
"success": false,
"processingTimeMs": 35,
"error": "The file is not in one of these formats: PDF, JPG, PNG, WebP or GIF. Convert it to one of them and send it again.",
"errorCode": "IMAGE_FORMAT_UNSUPPORTED",
"data": {
"documento": {
"tipo": "Certidão de Casamento",
"título": "",
"forma": ""
},
"registro": {
"matrícula": "",
"livro": "",
"folha": "",
"termo": ""
},
"cônjuge_1": {
"nome_completo": "",
"nome_atual": "",
"cpf": "",
"nome_habilitação": "",
"nome_após_casamento": "",
"data_nascimento": {
"dia": "",
"mês": "",
"ano": ""
},
"nacionalidade": "",
"estado_civil": "",
"estado_civil_código": "",
"município_naturalidade": "",
"uf_naturalidade": "",
"genitores": "",
"profissão": "",
"domicílio": ""
},
"cônjuge_2": {
"nome_completo": "",
"nome_atual": "",
"cpf": "",
"nome_habilitação": "",
"nome_após_casamento": "",
"data_nascimento": {
"dia": "",
"mês": "",
"ano": ""
},
"nacionalidade": "",
"estado_civil": "",
"estado_civil_código": "",
"município_naturalidade": "",
"uf_naturalidade": "",
"genitores": "",
"profissão": "",
"domicílio": ""
},
"casamento": {
"tipo": "",
"data_celebração": {
"texto_completo": "",
"dia": "",
"mês": "",
"ano": ""
},
"local_celebração": "",
"celebrante": "",
"documentos_apresentados": "",
"regime_bens": "",
"regime_bens_código": "",
"data_registro": {
"texto_completo": "",
"dia": "",
"mês": "",
"ano": ""
}
},
"observações": {
"averbações_anotações": "",
"anotações_cadastro": "",
"outras_informações": ""
},
"inteiro_teor": {
"texto": ""
},
"cartório": {
"nome": "",
"cns": "",
"município": "",
"uf": "",
"endereço": "",
"telefone": "",
"email": ""
},
"autenticação": {
"selo_digital": "",
"consulta_autenticidade": "",
"oficial_registro": "",
"assinante": "",
"cargo_assinante": "",
"data_emissão": "",
"número_papel": ""
}
},
"creditsCharged": 0
}429 Too Many Requests
Acima de um dos limites do seu plano. retryAfter diz quantos segundos aguardar; não há header Retry-After. Um limite por dia volta à meia-noite UTC.
Campos da resposta
statusCodeCódigo de status HTTP (sempre 429)
messageQual limite foi atingido, e o seu tamanho. Ver uso
errorCategoria do erro
retryAfterSegundos para aguardar antes de enviar a requisição de novo. Um limite por dia dura até a meia-noite UTC, então a espera pode ser de horas.
{
"statusCode": 429,
"message": "Organization rate limit exceeded (10 requests per minute). Retry after 6 seconds.",
"error": "Too Many Requests",
"retryAfter": 6
}{
"statusCode": 429,
"message": "Daily quota exceeded (1000 requests per day). Current usage: 1000",
"error": "Too Many Requests",
"retryAfter": 43200
}503 Service Unavailable
O serviço está reiniciando: o proxy responde com uma página HTML, e pode responder 502 ou 504 da mesma forma. Envie a mesma requisição de novo depois de alguns segundos, com o mesmo requestId, para nunca pagar duas vezes.
<html>
<head><title>503 Service Temporarily Unavailable</title></head>
<body>
<center><h1>503 Service Temporarily Unavailable</h1></center>
<hr><center>nginx</center>
</body>
</html>Valores de errorCode
O errorCode de uma resposta sem dados diz por quê, como um código que o seu sistema pode tratar. Os valores desta operação:
IMAGE_MISSINGIMAGE_BASE64_INVALIDIMAGE_TOO_LARGEIMAGE_TOO_MANY_PIXELSIMAGE_FORMAT_UNSUPPORTEDIMAGE_UNREADABLEIMAGE_URL_NOT_ALLOWEDIMAGE_RESOLUTION_TOO_LOWIMAGE_RESOLUTION_TOO_HIGHIMAGE_INVALIDPDF_PASSWORD_PROTECTEDPDF_UNREADABLEPDF_TOO_MANY_PAGESIMAGE_DOWNLOAD_FAILEDIMAGE_NOT_PROCESSABLEDOCUMENT_NOT_RECOGNIZEDEXTRACTION_TIMEOUTEXTRACTION_BUSYEXTRACTION_UNAVAILABLENOT_ENOUGH_CREDITSREQUEST_IN_PROGRESS
#!/usr/bin/env bash
# Extract the hosted sample marriage certificate (fictitious data).
# Needs DOCSOCR_API_KEY in the environment; create a key in the panel.
set -euo pipefail
REQUEST_ID="marriage-$(date +%s)-$RANDOM" # one id per document
# The API answers within 90 s
curl -sS --max-time 120 https://api.docsocr.com/api/v1/documents/marriage-certificate \
-H "Authorization: Bearer $DOCSOCR_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @- <<EOF
{
"imageType": "url",
"imageUrl": "https://docsocr.com/samples/certidao-casamento-exemplo.jpg",
"requestId": "$REQUEST_ID"
}
EOF"""Extract the hosted sample marriage certificate (fictitious data).
Needs the requests package and DOCSOCR_API_KEY in the environment.
"""
import os
import uuid
import requests
response = requests.post(
"https://api.docsocr.com/api/v1/documents/marriage-certificate",
headers={"Authorization": f"Bearer {os.environ['DOCSOCR_API_KEY']}"},
json={
"imageType": "url",
"imageUrl": "https://docsocr.com/samples/certidao-casamento-exemplo.jpg",
"requestId": str(uuid.uuid4()), # one id per document
},
timeout=120, # above the API's 90 s extraction budget
)
answer = response.json()
if response.status_code != 201 or not answer["success"]:
raise SystemExit(f"{response.status_code} {answer.get('errorCode', '')} {answer.get('message') or answer.get('error')}")
# The spouses in the order the certificate prints them
print(answer["data"]["cônjuge_1"]["nome_completo"])
print(answer["data"]["cônjuge_2"]["nome_completo"])// Extract the hosted sample marriage certificate (fictitious data).
// Needs Node.js 18+ and DOCSOCR_API_KEY in the environment.
import { randomUUID } from 'node:crypto'
const response = await fetch('https://api.docsocr.com/api/v1/documents/marriage-certificate', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.DOCSOCR_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
imageType: 'url',
imageUrl: 'https://docsocr.com/samples/certidao-casamento-exemplo.jpg',
requestId: randomUUID(), // one id per document
}),
signal: AbortSignal.timeout(120_000), // above the API's 90 s extraction budget
})
const answer = await response.json()
if (response.status !== 201 || !answer.success) {
console.error(response.status, answer.errorCode ?? '', answer.message ?? answer.error)
process.exit(1)
}
// The spouses in the order the certificate prints them
console.log(answer.data['cônjuge_1'].nome_completo)
console.log(answer.data['cônjuge_2'].nome_completo)<?php
// Extract the hosted sample marriage certificate (fictitious data).
// Needs the curl extension and DOCSOCR_API_KEY in the environment.
$request = curl_init('https://api.docsocr.com/api/v1/documents/marriage-certificate');
curl_setopt_array($request, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 120, // above the API's 90 s extraction budget
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('DOCSOCR_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'imageType' => 'url',
'imageUrl' => 'https://docsocr.com/samples/certidao-casamento-exemplo.jpg',
'requestId' => bin2hex(random_bytes(16)), // one id per document
]),
]);
$body = curl_exec($request);
if ($body === false) {
fwrite(STDERR, curl_error($request) . PHP_EOL);
exit(1);
}
$status = curl_getinfo($request, CURLINFO_RESPONSE_CODE);
$answer = json_decode($body, true);
if ($status !== 201 || empty($answer['success'])) {
fwrite(STDERR, "$status " . ($answer['errorCode'] ?? '') . ' ' . implode('; ', (array) ($answer['message'] ?? $answer['error'] ?? '')) . PHP_EOL);
exit(1);
}
// The spouses in the order the certificate prints them
echo $answer['data']['cônjuge_1']['nome_completo'], PHP_EOL;
echo $answer['data']['cônjuge_2']['nome_completo'], PHP_EOL;// Extract the hosted sample marriage certificate (fictitious data).
// Needs Java 17+ and DOCSOCR_API_KEY in the environment. Run: java MarriageCertificate.java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.UUID;
public class MarriageCertificate {
public static void main(String[] args) throws Exception {
String body = """
{
"imageType": "url",
"imageUrl": "https://docsocr.com/samples/certidao-casamento-exemplo.jpg",
"requestId": "%s"
}""".formatted(UUID.randomUUID()); // one id per document
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.docsocr.com/api/v1/documents/marriage-certificate"))
.timeout(Duration.ofSeconds(120)) // above the API's 90 s extraction budget
.header("Authorization", "Bearer " + System.getenv("DOCSOCR_API_KEY"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
// The answer is JSON: read data.cônjuge_1 and data.cônjuge_2 with your JSON library
System.out.println(response.body());
if (response.statusCode() != 201 || !response.body().contains("\"success\":true")) {
System.exit(1);
}
}
}// Extract the hosted sample marriage certificate (fictitious data).
// Needs .NET 8+ and DOCSOCR_API_KEY in the environment. Run: dotnet run MarriageCertificate.cs (.NET 10)
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Text.Json.Nodes;
using var http = new HttpClient { Timeout = TimeSpan.FromSeconds(120) }; // above the API's 90 s extraction budget
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("DOCSOCR_API_KEY"));
var body = new JsonObject
{
["imageType"] = "url",
["imageUrl"] = "https://docsocr.com/samples/certidao-casamento-exemplo.jpg",
["requestId"] = Guid.NewGuid().ToString(), // one id per document
};
using var content = new StringContent(body.ToJsonString(), Encoding.UTF8, "application/json");
using var response = await http.PostAsync("https://api.docsocr.com/api/v1/documents/marriage-certificate", content);
using var answer = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
var root = answer.RootElement;
if ((int)response.StatusCode != 201 || !root.GetProperty("success").GetBoolean())
{
Console.Error.WriteLine($"{(int)response.StatusCode} {root}");
return 1;
}
// The spouses in the order the certificate prints them
var data = root.GetProperty("data");
Console.WriteLine(data.GetProperty("cônjuge_1").GetProperty("nome_completo").GetString());
Console.WriteLine(data.GetProperty("cônjuge_2").GetProperty("nome_completo").GetString());
return 0;Testar
Envia esta requisição para a API em produção, com a sua chave.
A chave fica só nesta aba do navegador e vai apenas para a API. Gerar chave no painel
Lendo os preços…
Cole a sua chave de API para enviar.
{
"success": true,
"processingTimeMs": 7480,
"data": {
"documento": {
"tipo": "Certidão de Casamento",
"título": "CERTIDÃO DE CASAMENTO",
"forma": "breve relato"
},
"registro": {
"matrícula": "123456 01 55 2025 2 00034 045 0009876 12",
"livro": "34",
"folha": "45",
"termo": "9876"
},
"cônjuge_1": {
"nome_completo": "RAFAEL COSTA TESTE",
"nome_atual": "RAFAEL COSTA TESTE",
"cpf": "123.456.789-09",
"nome_habilitação": "RAFAEL COSTA TESTE",
"nome_após_casamento": "RAFAEL COSTA TESTE",
"data_nascimento": {
"dia": "12",
"mês": "05",
"ano": "1994"
},
"nacionalidade": "BRASILEIRA",
"estado_civil": "SOLTEIRO",
"estado_civil_código": "solteiro",
"município_naturalidade": "RECIFE",
"uf_naturalidade": "PE",
"genitores": "JOSÉ COSTA TESTE; MARIA COSTA TESTE",
"profissão": "",
"domicílio": ""
},
"cônjuge_2": {
"nome_completo": "JULIANA MENDES COSTA TESTE",
"nome_atual": "JULIANA MENDES COSTA TESTE",
"cpf": "987.654.321-00",
"nome_habilitação": "JULIANA MENDES TESTE",
"nome_após_casamento": "JULIANA MENDES COSTA TESTE",
"data_nascimento": {
"dia": "03",
"mês": "09",
"ano": "1996"
},
"nacionalidade": "BRASILEIRA",
"estado_civil": "SOLTEIRA",
"estado_civil_código": "solteiro",
"município_naturalidade": "OLINDA",
"uf_naturalidade": "PE",
"genitores": "PAULO MENDES TESTE; ANA MENDES TESTE",
"profissão": "",
"domicílio": ""
},
"casamento": {
"tipo": "civil",
"data_celebração": {
"texto_completo": "VINTE E DOIS DE MARÇO DE DOIS MIL E VINTE E CINCO",
"dia": "22",
"mês": "03",
"ano": "2025"
},
"local_celebração": "",
"celebrante": "",
"documentos_apresentados": "",
"regime_bens": "COMUNHÃO PARCIAL DE BENS",
"regime_bens_código": "comunhão parcial",
"data_registro": {
"texto_completo": "VINTE E DOIS DE MARÇO DE DOIS MIL E VINTE E CINCO",
"dia": "22",
"mês": "03",
"ano": "2025"
}
},
"observações": {
"averbações_anotações": "",
"anotações_cadastro": "",
"outras_informações": ""
},
"inteiro_teor": {
"texto": ""
},
"cartório": {
"nome": "CARTÓRIO DO 1º OFÍCIO DE REGISTRO CIVIL DE RECIFE - PE",
"cns": "123456",
"município": "RECIFE",
"uf": "PE",
"endereço": "RUA DO EXEMPLO, 100, BOA VISTA, CEP 50000-000",
"telefone": "",
"email": ""
},
"autenticação": {
"selo_digital": "",
"consulta_autenticidade": "",
"oficial_registro": "PEDRO EXEMPLO",
"assinante": "MARIANA EXEMPLO",
"cargo_assinante": "ESCREVENTE",
"data_emissão": "25/03/2025",
"número_papel": ""
}
},
"engine": "large",
"creditsCharged": 1.5
}