Ir para o conteúdo
Documentação para desenvolvedores

A API v1 e o servidor MCP

Tudo o que você precisa para chamar a API: como autenticar, cada endpoint com sua requisição e resposta, os erros e limites, e exemplos em curl, JavaScript e Python.

Nesta página

Primeiros passos

Visão geral

A API tem a versão no caminho, /api/v1. Cada endpoint recebe um POST com corpo JSON e responde em JSON, inclusive nos erros.

URL base https://blurwrite.com

Só no site, não na API: o contador de palavras, o contador de caracteres, o verificador de plágio e a opção "Usar mais tempo" do humanizador.

Gerada a partir do documento OpenAPI, esta seção lista exatamente as rotas e os campos que a API aceita. O documento OpenAPI

Sua primeira chamada

Um texto precisa ter pelo menos 50 palavras.

Verifique "calibrated" antes de tudo: quando for false, o idioma ainda não tem uma curva ajustada, então a pontuação não deve ser usada como resultado.

Cada valor é mostrado como seu tipo. Uma resposta real contém a análise do seu texto.

Requisição de exemplo
curl -X POST https://blurwrite.com/api/v1/detect \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"O comitê se reuniu na terça-feira para revisar o plano da nova biblioteca. Os membros concordaram que a sala de leitura deveria ficar aberta até mais tarde nos dias úteis e pediram à equipe que preparasse um orçamento para as horas extras. A próxima reunião analisará os custos, o provável número de visitantes e o impacto no restante do prédio."}'
Resposta de exemplo
{
  "figure": "number, 0 a 100",
  "low": "number, 0 a 100",
  "high": "number, 0 a 100",
  "uncertainty": "number",
  "verdict": "human | uncertain | ai",
  "confidence": "low | medium | high",
  "sentences": [
    {
      "text": "string",
      "score": "number, 0 a 1",
      "verdict": "human | uncertain | ai"
    }
  ],
  "words": "integer",
  "language": "string",
  "model": "string",
  "calibrated": "boolean",
  "bandHumanFlagRate": "number | null",
  "usage": {
    "recorded": "boolean",
    "words": "integer",
    "source": "plan | balance | plan_and_balance",
    "fromPlan": "integer",
    "fromBalance": "integer",
    "allowanceLeft": "integer | null",
    "balance": "integer"
  }
}

Autenticação

Envie sua chave no cabeçalho Authorization como um token bearer. Uma chave na URL é recusada.

Uma chave tem escopos: detect, rewrite, summarize e grammar. Uma rota retorna 403 out_of_scope quando a chave não tem o escopo necessário.

Autenticação
Authorization: Bearer YOUR_API_KEY

Endpoints

POST /api/v1/detect

Analisar um texto. A análise do detector para um texto: uma pontuação de 0 a 100, o intervalo ao redor dela, uma análise por frase e a indicação de calibração do idioma.

Escopo da chave: detect

Corpo da requisição

CampoTipoObrigatórioDescrição
textstringsimO texto a analisar ou reescrever.
languagestringnãoO código do idioma, como "en" ou "de". Se omitido, ele é detectado a partir do texto.
contentTypestringnãoO tipo de texto, como "essay" ou "email", quando a análise deve usar a curva desse tipo de texto.

Resposta

CampoTipoDescrição
figurenumberA pontuação de 0 a 100: a probabilidade de o texto ter sido escrito por uma máquina.
lownumberO limite inferior do intervalo ao redor da pontuação.
highnumberO limite superior do intervalo ao redor da pontuação.
uncertaintynumberMetade da largura do intervalo, em pontos.
verdictstringA faixa em que a pontuação se encontra; uma faixa, nunca uma conclusão sobre quem escreveu o texto. Um destes: human, uncertain, ai.
confidencestringO quanto se pode confiar na análise. Um destes: low, medium, high.
sentencesarray de SentenceScoreUma análise por frase.
wordsintegerAs palavras analisadas.
languagestringO idioma usado para analisar o texto.
modelstringO modelo que produziu a análise.
calibratedbooleanSe o idioma tem uma curva ajustada. Quando for false, a pontuação não deve ser usada como resultado.
bandHumanFlagRatenumber | nullA frequência com que textos humanos nesta faixa foram classificados como escritos por máquina nas nossas medições, ou null.
usageUsageO que esta chamada contabilizou.

Erros específicos desta rota

StatusCódigoSignificado
400no_textO corpo não contém "text".
422too_shortO texto está abaixo do tamanho mínimo.
413text_too_longO texto é maior do que o mecanismo consegue analisar em uma chamada. Divida-o. Nada foi contabilizado.
422not_calibratedO idioma ainda não pode ser analisado.
503engine_unavailableO mecanismo não respondeu. Nada foi contabilizado.
502engine_unavailableO mecanismo não respondeu. Nada foi contabilizado.
503engine_startingO mecanismo está iniciando e não ficou pronto a tempo. Nada foi contabilizado. Tente novamente em um minuto.
503engine_busyO mecanismo estava ocupado e a análise não pôde começar a tempo; as análises de usuários Pro do site têm prioridade sobre as chamadas de API. Nada foi contabilizado. Tente novamente em instantes.
504engine_timeoutO mecanismo não terminou de analisar o texto a tempo. Nada foi contabilizado. Tente novamente ou envie um texto mais curto.
429concurrency_limitedEsta chave já atingiu o limite de chamadas deste tipo em execução. Aguarde uma delas terminar ou o tempo indicado em Retry-After.
Requisição de exemplo
curl -X POST https://blurwrite.com/api/v1/detect \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"O comitê se reuniu na terça-feira para revisar o plano da nova biblioteca. Os membros concordaram que a sala de leitura deveria ficar aberta até mais tarde nos dias úteis e pediram à equipe que preparasse um orçamento para as horas extras. A próxima reunião analisará os custos, o provável número de visitantes e o impacto no restante do prédio."}'
Resposta de exemplo
{
  "figure": "number, 0 a 100",
  "low": "number, 0 a 100",
  "high": "number, 0 a 100",
  "uncertainty": "number",
  "verdict": "human | uncertain | ai",
  "confidence": "low | medium | high",
  "sentences": [
    {
      "text": "string",
      "score": "number, 0 a 1",
      "verdict": "human | uncertain | ai"
    }
  ],
  "words": "integer",
  "language": "string",
  "model": "string",
  "calibrated": "boolean",
  "bandHumanFlagRate": "number | null",
  "usage": {
    "recorded": "boolean",
    "words": "integer",
    "source": "plan | balance | plan_and_balance",
    "fromPlan": "integer",
    "fromBalance": "integer",
    "allowanceLeft": "integer | null",
    "balance": "integer"
  }
}

POST /api/v1/detect/batch

Analisar vários textos. Até o limite de textos por lote em uma chamada. A chamada precisa reservar antecipadamente as palavras de cada texto que pode analisar (50 palavras ou mais); as palavras de qualquer texto que não retornar uma análise são devolvidas depois. A falha de um texto nunca faz o lote inteiro falhar.

Escopo da chave: detect

Corpo da requisição

CampoTipoObrigatórioDescrição
itemsarray de objectsimOs textos, cada um com seu próprio "text" e, opcionalmente, "id", "language" e "contentType".
items[].idstringnãoSeu próprio id para o item, retornado com o resultado. Se omitido, a posição do item é usada.
items[].textstringsimO texto a analisar ou reescrever.
items[].languagestringnãoO código do idioma, como "en" ou "de". Se omitido, ele é detectado a partir do texto.
items[].contentTypestringnãoO tipo de texto, como "essay" ou "email", quando a análise deve usar a curva desse tipo de texto.

Resposta

CampoTipoDescrição
resultsarray de BatchResultUm resultado por item, na ordem de envio.
usageUsageO que esta chamada contabilizou.

Erros específicos desta rota

StatusCódigoSignificado
400batch_emptyO corpo não contém "items" ou a lista está vazia.
413batch_too_largeO lote tem mais itens do que o limite permitido.
429concurrency_limitedEsta chave já atingiu o limite de chamadas deste tipo em execução. Aguarde uma delas terminar ou o tempo indicado em Retry-After.
Requisição de exemplo
curl -X POST https://blurwrite.com/api/v1/detect/batch \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"id":"1","text":"O comitê se reuniu na terça-feira para revisar o plano da nova biblioteca. Os membros concordaram que a sala de leitura deveria ficar aberta até mais tarde nos dias úteis e pediram à equipe que preparasse um orçamento para as horas extras. A próxima reunião analisará os custos, o provável número de visitantes e o impacto no restante do prédio."},{"id":"2","text":"O comitê se reuniu na terça-feira para revisar o plano da nova biblioteca. Os membros concordaram que a sala de leitura deveria ficar aberta até mais tarde nos dias úteis e pediram à equipe que preparasse um orçamento para as horas extras. A próxima reunião analisará os custos, o provável número de visitantes e o impacto no restante do prédio."}]}'
Resposta de exemplo
{
  "results": [
    {
      "id": "string",
      "detection": {
        "figure": "number, 0 a 100",
        "low": "number, 0 a 100",
        "high": "number, 0 a 100",
        "uncertainty": "number",
        "verdict": "human | uncertain | ai",
        "confidence": "low | medium | high",
        "sentences": [
          {
            "text": "string",
            "score": "number, 0 a 1",
            "verdict": "human | uncertain | ai"
          }
        ],
        "words": "integer",
        "language": "string",
        "model": "string",
        "calibrated": "boolean",
        "bandHumanFlagRate": "number | null"
      },
      "error": {
        "code": "string",
        "message": "string"
      }
    }
  ],
  "usage": {
    "recorded": "boolean",
    "words": "integer",
    "source": "plan | balance | plan_and_balance",
    "fromPlan": "integer",
    "fromBalance": "integer",
    "allowanceLeft": "integer | null",
    "balance": "integer"
  }
}

POST /api/v1/humanize

Humanizar um texto. O humanizador com suas verificações de fatos: números, nomes e citações são preservados, e uma reescrita que alterou um fato é corrigida ou sinalizada. O modo "custom" (Pro) escreve no seu estilo, identificado a partir de uma amostra da sua escrita.

Pela API, o humanizador faz a reescrita padrão. "Usar mais tempo" está disponível só no site.

Escopo da chave: rewrite

Corpo da requisição

CampoTipoObrigatórioDescrição
textstringsimO texto a analisar ou reescrever.
modestringnãoO modo de reescrita. Um destes: natural, formal, simple, academic, creative, shorten, expand, custom. Padrão: natural.
style_samplestringnãoCom o modo "custom": uma amostra da sua escrita, de 150 a 2.000 palavras, analisada no servidor. Se omitida, a amostra salva na sua conta é usada.
tabstringnãoA aba do humanizador: o registro linguístico usado na reescrita. Padrão mantém o registro do texto original. Um destes: standard, academic, professional, casual. Padrão: standard.
strengthstringnãoRegular mantém o conteúdo e o registro linguístico. Agressiva pode reorganizar o texto e omitir detalhes, mas mantém todos os pontos principais. Algumas partes podem soar pouco naturais. Um destes: regular, aggressive. Padrão: regular.
ownTouchstringnãoUm detalhe, exemplo ou opinião com suas próprias palavras, de até 400 caracteres, incorporado à reescrita.
languagestringnãoO código do idioma, como "en" ou "de". Se omitido, ele é detectado a partir do texto.

Resposta

CampoTipoDescrição
textstringO texto reescrito.
beforeDetectionA análise do detector para seu texto, ou null quando não houver.
afterDetectionA análise do detector para a reescrita, ou null.
passesintegerQuantas reescritas foram produzidas antes de esta ser escolhida.
factsobjectO que as verificações de fatos encontraram e por que uma reescrita tem problemas, quando for o caso.
latebooleanTrue quando a reescrita foi retornada ao atingir o limite de tempo, com as verificações incompletas.
usageUsageO que esta chamada contabilizou.

Erros específicos desta rota

StatusCódigoSignificado
400no_textO corpo não contém "text".
422too_shortO texto está abaixo do tamanho mínimo.
400unknown_modeO modo não está entre os oferecidos por esta rota.
400unknown_optionA aba ou a intensidade não está disponível nesta rota.
402plan_requiredO modo, a aba, a intensidade ou o toque pessoal exige um plano que a conta não tem; o modo "custom" exige Pro. Nada foi contabilizado.
400no_sampleO modo "custom" precisa de uma amostra de escrita, enviada ou salva na conta.
400sample_too_shortA amostra de escrita está abaixo do tamanho mínimo.
400sample_too_longA amostra de escrita está acima do tamanho máximo.
429concurrency_limitedEsta chave já atingiu o limite de chamadas deste tipo em execução. Aguarde uma delas terminar ou o tempo indicado em Retry-After.
422no_rewriteO mecanismo respondeu, mas nenhum rascunho passou nas verificações (vazio, recusa ou cópia do texto). Nada foi contabilizado.
503timeoutA reescrita demorou demais e foi interrompida. Nada foi contabilizado.
503engine_unavailableO mecanismo não respondeu. Nada foi contabilizado.
502engine_unavailableO mecanismo não respondeu. Nada foi contabilizado.
Requisição de exemplo
curl -X POST https://blurwrite.com/api/v1/humanize \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"O comitê se reuniu na terça-feira para revisar o plano da nova biblioteca. Os membros concordaram que a sala de leitura deveria ficar aberta até mais tarde nos dias úteis e pediram à equipe que preparasse um orçamento para as horas extras. A próxima reunião analisará os custos, o provável número de visitantes e o impacto no restante do prédio."}'
Resposta de exemplo
{
  "text": "string",
  "before": {
    "figure": "number, 0 a 100",
    "low": "number, 0 a 100",
    "high": "number, 0 a 100",
    "uncertainty": "number",
    "verdict": "human | uncertain | ai",
    "confidence": "low | medium | high",
    "sentences": [
      {
        "text": "string",
        "score": "number, 0 a 1",
        "verdict": "human | uncertain | ai"
      }
    ],
    "words": "integer",
    "language": "string",
    "model": "string",
    "calibrated": "boolean",
    "bandHumanFlagRate": "number | null"
  },
  "after": {
    "figure": "number, 0 a 100",
    "low": "number, 0 a 100",
    "high": "number, 0 a 100",
    "uncertainty": "number",
    "verdict": "human | uncertain | ai",
    "confidence": "low | medium | high",
    "sentences": [
      {
        "text": "string",
        "score": "number, 0 a 1",
        "verdict": "human | uncertain | ai"
      }
    ],
    "words": "integer",
    "language": "string",
    "model": "string",
    "calibrated": "boolean",
    "bandHumanFlagRate": "number | null"
  },
  "passes": "integer",
  "facts": "object",
  "late": "boolean",
  "usage": {
    "recorded": "boolean",
    "words": "integer",
    "source": "plan | balance | plan_and_balance",
    "fromPlan": "integer",
    "fromBalance": "integer",
    "allowanceLeft": "integer | null",
    "balance": "integer"
  }
}

POST /api/v1/paraphrase

Parafrasear um texto. O parafraseador, com a mesma lista de modos da ferramenta de paráfrase.

Escopo da chave: rewrite

Corpo da requisição

CampoTipoObrigatórioDescrição
textstringsimO texto a analisar ou reescrever.
modestringnãoO modo de reescrita. Um destes: standard, fluency, formal, academic, simple, creative, expand, shorten. Padrão: standard.
strengthstringnãoO quanto a reescrita pode se afastar do original. Um destes: readable, balanced, strong. Padrão: balanced.
readabilitystringnãoO registro de linguagem da escrita. Um destes: casual, professional, academic, creative. Padrão: professional.
purposestringnãoA finalidade do texto. Um destes: general, essay, article, email, marketing, report, story. Padrão: general.
synonymsstringnãoCom que liberdade as palavras podem ser substituídas. Um destes: few, some, many. Padrão: some.
freezeWordsarray de stringnãoPalavras e expressões que devem ser retornadas exatamente como foram escritas: no máximo 25, cada uma com até 60 caracteres. Suas palavras entram na contagem de palavras da chamada.
customInstructionstringnãoUma instrução curta sua para a reescrita, com até 500 caracteres. Suas palavras entram na contagem de palavras da chamada.
languagestringnãoO código do idioma, como "en" ou "de". Se omitido, ele é detectado a partir do texto.
closedLoopbooleannãoDefina como false para pular o ciclo fechado. Padrão: true.

Resposta

CampoTipoDescrição
textstringO texto reescrito.
beforeDetectionA análise do detector para seu texto, ou null quando não houver.
afterDetectionA análise do detector para a reescrita, ou null.
passesintegerQuantas reescritas foram produzidas antes de esta ser escolhida.
factsobjectO que as verificações de fatos encontraram e por que uma reescrita tem problemas, quando for o caso.
latebooleanTrue quando a reescrita foi retornada ao atingir o limite de tempo, com as verificações incompletas.
usageUsageO que esta chamada contabilizou.

Erros específicos desta rota

StatusCódigoSignificado
400no_textO corpo não contém "text".
422too_shortO texto está abaixo do tamanho mínimo.
400unknown_modeO modo não está entre os oferecidos por esta rota.
400option_invalidfreezeWords não é uma lista de palavras ou frases. Nada foi contabilizado.
400option_too_longfreezeWords ou customInstruction excede o limite. Nada foi contabilizado.
429concurrency_limitedEsta chave já atingiu o limite de chamadas deste tipo em execução. Aguarde uma delas terminar ou o tempo indicado em Retry-After.
422no_rewriteO mecanismo respondeu, mas nenhum rascunho passou nas verificações (vazio, recusa ou cópia do texto). Nada foi contabilizado.
503timeoutA reescrita demorou demais e foi interrompida. Nada foi contabilizado.
503engine_unavailableO mecanismo não respondeu. Nada foi contabilizado.
502engine_unavailableO mecanismo não respondeu. Nada foi contabilizado.
Requisição de exemplo
curl -X POST https://blurwrite.com/api/v1/paraphrase \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"O comitê se reuniu na terça-feira para revisar o plano da nova biblioteca. Os membros concordaram que a sala de leitura deveria ficar aberta até mais tarde nos dias úteis e pediram à equipe que preparasse um orçamento para as horas extras. A próxima reunião analisará os custos, o provável número de visitantes e o impacto no restante do prédio."}'
Resposta de exemplo
{
  "text": "string",
  "before": {
    "figure": "number, 0 a 100",
    "low": "number, 0 a 100",
    "high": "number, 0 a 100",
    "uncertainty": "number",
    "verdict": "human | uncertain | ai",
    "confidence": "low | medium | high",
    "sentences": [
      {
        "text": "string",
        "score": "number, 0 a 1",
        "verdict": "human | uncertain | ai"
      }
    ],
    "words": "integer",
    "language": "string",
    "model": "string",
    "calibrated": "boolean",
    "bandHumanFlagRate": "number | null"
  },
  "after": {
    "figure": "number, 0 a 100",
    "low": "number, 0 a 100",
    "high": "number, 0 a 100",
    "uncertainty": "number",
    "verdict": "human | uncertain | ai",
    "confidence": "low | medium | high",
    "sentences": [
      {
        "text": "string",
        "score": "number, 0 a 1",
        "verdict": "human | uncertain | ai"
      }
    ],
    "words": "integer",
    "language": "string",
    "model": "string",
    "calibrated": "boolean",
    "bandHumanFlagRate": "number | null"
  },
  "passes": "integer",
  "facts": "object",
  "late": "boolean",
  "usage": {
    "recorded": "boolean",
    "words": "integer",
    "source": "plan | balance | plan_and_balance",
    "fromPlan": "integer",
    "fromBalance": "integer",
    "allowanceLeft": "integer | null",
    "balance": "integer"
  }
}

POST /api/v1/summarize

Resumir um texto. O resumidor, em frases principais, um parágrafo ou tópicos.

Escopo da chave: summarize

Corpo da requisição

CampoTipoObrigatórioDescrição
textstringsimO texto a analisar ou reescrever.
modestringnãoO formato do resumo. Um destes: key-sentences, paragraph, bullets. Padrão: key-sentences.
lengthstringnãoO tamanho do resumo. Um destes: short, medium, long. Padrão: medium.

Resposta

CampoTipoDescrição
textstringO resumo.
usageUsageO que esta chamada contabilizou.

Erros específicos desta rota

StatusCódigoSignificado
400no_textO corpo não contém "text".
422too_shortO texto está abaixo do tamanho mínimo.
429concurrency_limitedEsta chave já atingiu o limite de chamadas deste tipo em execução. Aguarde uma delas terminar ou o tempo indicado em Retry-After.
503timeoutA reescrita demorou demais e foi interrompida. Nada foi contabilizado.
503engine_unavailableO mecanismo não respondeu. Nada foi contabilizado.
502engine_unavailableO mecanismo não respondeu. Nada foi contabilizado.
Requisição de exemplo
curl -X POST https://blurwrite.com/api/v1/summarize \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"O comitê se reuniu na terça-feira para revisar o plano da nova biblioteca. Os membros concordaram que a sala de leitura deveria ficar aberta até mais tarde nos dias úteis e pediram à equipe que preparasse um orçamento para as horas extras. A próxima reunião analisará os custos, o provável número de visitantes e o impacto no restante do prédio."}'
Resposta de exemplo
{
  "text": "string",
  "usage": {
    "recorded": "boolean",
    "words": "integer",
    "source": "plan | balance | plan_and_balance",
    "fromPlan": "integer",
    "fromBalance": "integer",
    "allowanceLeft": "integer | null",
    "balance": "integer"
  }
}

POST /api/v1/grammar

Verificar gramática. Problemas de gramática, ortografia, pontuação e estilo, cada um com sua posição no texto e substituições sugeridas.

Escopo da chave: grammar

Corpo da requisição

CampoTipoObrigatórioDescrição
textstringsimO texto a analisar ou reescrever.
languagestringnãoO código do idioma para a revisão, como "en-US" ou "de-DE". Padrão: en-US.

Resposta

CampoTipoDescrição
issuesarray de GrammarIssueOs problemas encontrados, na ordem em que aparecem.
usageUsageO que esta chamada contabilizou.

Erros específicos desta rota

StatusCódigoSignificado
400no_textO corpo não contém "text".
503engine_unavailableO mecanismo não respondeu. Nada foi contabilizado.
502engine_unavailableO mecanismo não respondeu. Nada foi contabilizado.
503engine_startingO mecanismo está iniciando e não ficou pronto a tempo. Nada foi contabilizado. Tente novamente em um minuto.
504engine_timeoutO mecanismo não terminou de analisar o texto a tempo. Nada foi contabilizado. Tente novamente ou envie um texto mais curto.
Requisição de exemplo
curl -X POST https://blurwrite.com/api/v1/grammar \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"O comitê se reuniu na terça-feira para revisar o plano da nova biblioteca. Os membros concordaram que a sala de leitura deveria ficar aberta até mais tarde nos dias úteis e pediram à equipe que preparasse um orçamento para as horas extras. A próxima reunião analisará os custos, o provável número de visitantes e o impacto no restante do prédio."}'
Resposta de exemplo
{
  "issues": [
    {
      "offset": "integer",
      "length": "integer",
      "message": "string",
      "shortMessage": "string",
      "category": "grammar | spelling | punctuation | style | typography",
      "replacements": [
        "string"
      ],
      "context": "string"
    }
  ],
  "usage": {
    "recorded": "boolean",
    "words": "integer",
    "source": "plan | balance | plan_and_balance",
    "fromPlan": "integer",
    "fromBalance": "integer",
    "allowanceLeft": "integer | null",
    "balance": "integer"
  }
}

Referência

Erros

Um erro responde com seu status HTTP e um corpo neste formato. Use o código para decidir; a mensagem diz o que deu errado e o que fazer em seguida.

Erros que qualquer rota pode retornar

StatusCódigoSignificado
401key_in_urlA chave foi enviada na URL. Envie-a no cabeçalho Authorization.
401no_keyNenhuma chave foi enviada.
401bad_keyA chave não é válida ou foi revogada.
403out_of_scopeA chave não tem o escopo necessário para esta rota.
429rate_limitedMuitas requisições para esta chave. Aguarde o tempo indicado em Retry-After.
403plan_lapsedO plano da conta não inclui mais a API.
413too_largeA requisição é grande demais.
400bad_bodyO corpo não é um objeto JSON.
413too_many_wordsA chamada tem mais palavras do que o permitido por chamada. Divida o texto. Nada foi contabilizado.
402quota_exhaustedAs palavras de API do plano para este período de cobrança acabaram e o saldo de recarga está vazio. Nada foi contabilizado.
402quota_shortA chamada precisa de mais palavras do que a soma das palavras de API restantes do plano e do saldo. Nada foi contabilizado.
402monthly_ceilingA conta atingiu seu limite de API deste período de cobrança, que se aplica independentemente do saldo. Nada foi contabilizado.
503store_unavailableNão foi possível ler a chave, a contagem de palavras da conta ou a amostra de escrita salva neste momento, ou esta implantação não tem armazenamento de contas. Nada foi executado ou contabilizado.

Uma chamada reserva as palavras antes de ser executada e as devolve se falhar. Se não for possível registrar a contagem de palavras naquele momento, elas continuam sendo contabilizadas: uma chamada com falha informa isso e inclui "recorded": false nos dados de uso, um lote retorna "recorded": false nos dados de uso, e a quantidade de palavras não é estimada.

Corpo do erro
{
  "error": {
    "code": "string",
    "message": "string",
    "docs": "string",
    "available": "integer"
  },
  "usage": {
    "recorded": "boolean",
    "words": "integer",
    "source": "plan | balance | plan_and_balance",
    "fromPlan": "integer",
    "fromBalance": "integer",
    "allowanceLeft": "integer | null",
    "balance": "integer"
  }
}

Limites

Todos os valores aqui correspondem aos limites aplicados pela API.

  • Cada chave faz no máximo 60 requisições a cada 60 segundos.
  • Cada chave pode ter no máximo 4 chamadas de detecção (um lote conta como uma) e 2 chamadas de humanização, reescrita ou resumo em execução ao mesmo tempo; uma chamada adicional recebe a resposta 429 concurrency_limited com um Retry-After.
  • Quando os mecanismos estão ocupados, as análises das contas Pro do site são processadas antes das chamadas de API, então uma chamada de API pode precisar esperar sua vez.
  • Um lote contém no máximo 50 textos.
  • Cada chamada aceita no máximo 20.000 palavras, seja em um único texto ou em um lote inteiro.
  • O detector analisa um texto de até 90.000 caracteres, cerca de 10.000 palavras, em qualquer plano. Um texto maior recebe a resposta 413 text_too_long, mesmo dentro do limite de palavras da chamada.
  • Uma conta pode ter até 5 chaves ativas, permitindo substituir uma chave sem interrupção do serviço.

Objetos de resposta

Os objetos que os endpoints retornam, campo por campo.

Detection

CampoTipoDescrição
figurenumberA pontuação de 0 a 100: a probabilidade de o texto ter sido escrito por uma máquina.
lownumberO limite inferior do intervalo ao redor da pontuação.
highnumberO limite superior do intervalo ao redor da pontuação.
uncertaintynumberMetade da largura do intervalo, em pontos.
verdictstringA faixa em que a pontuação se encontra; uma faixa, nunca uma conclusão sobre quem escreveu o texto. Um destes: human, uncertain, ai.
confidencestringO quanto se pode confiar na análise. Um destes: low, medium, high.
sentencesarray de SentenceScoreUma análise por frase.
wordsintegerAs palavras analisadas.
languagestringO idioma usado para analisar o texto.
modelstringO modelo que produziu a análise.
calibratedbooleanSe o idioma tem uma curva ajustada. Quando for false, a pontuação não deve ser usada como resultado.
bandHumanFlagRatenumber | nullA frequência com que textos humanos nesta faixa foram classificados como escritos por máquina nas nossas medições, ou null.

SentenceScore

CampoTipoDescrição
textstringA frase.
scorenumberDe 0 a 1, a probabilidade de a frase ter sido escrita por uma máquina.
verdictstringA faixa em que a frase se encontra. Um destes: human, uncertain, ai.

Usage

CampoTipoDescrição
recordedbooleanTrue quando a contagem foi registrada. False apenas quando um lote não conseguiu devolver suas palavras não analisadas; nesse caso, apenas "words" está presente.
wordsintegerAs palavras contabilizadas nesta chamada.
sourcestringDe onde vieram: as palavras de API do plano, o saldo de recarga ou ambos. Um destes: plan, balance, plan_and_balance.
fromPlanintegerAs palavras descontadas das palavras de API do plano. Presente quando recorded é true.
fromBalanceintegerAs palavras descontadas do saldo de recarga. Presente quando recorded é true.
allowanceLeftinteger | nullAs palavras restantes do plano para esta ferramenta após esta chamada, no período de cobrança atual. Null para uma ferramenta sem cota neste plano. Presente quando recorded é true.
balanceintegerO saldo de recarga restante após esta chamada. Presente quando recorded é true.

RewriteResult

CampoTipoDescrição
textstringO texto reescrito.
beforeDetectionA análise do detector para seu texto, ou null quando não houver.
afterDetectionA análise do detector para a reescrita, ou null.
passesintegerQuantas reescritas foram produzidas antes de esta ser escolhida.
factsobjectO que as verificações de fatos encontraram e por que uma reescrita tem problemas, quando for o caso.
latebooleanTrue quando a reescrita foi retornada ao atingir o limite de tempo, com as verificações incompletas.

GrammarIssue

CampoTipoDescrição
offsetintegerOnde o problema começa no texto enviado, em unidades de código UTF-16 (um índice de string JavaScript).
lengthintegerQuantas unidades de código UTF-16 do texto enviado o problema abrange.
messagestringO que está errado.
shortMessagestringO mesmo, em poucas palavras.
categorystringO tipo de problema. Um destes: grammar, spelling, punctuation, style, typography.
replacementsarray de stringSubstituições sugeridas, com as melhores primeiro.
contextstringO texto ao redor do problema.

BatchResult

CampoTipoDescrição
idstringO id do item.
detectionDetectionA análise, quando o item retornou uma.
errorobjectPor que o item não retornou uma análise.

Error

CampoTipoDescrição
errorobject
usageUsageO que esta chamada contabilizou.
Servidor MCP

O servidor MCP

Um agente pode acessar as mesmas ferramentas pelo Model Context Protocol. O servidor é apenas um cliente desta API, então o agente recebe exatamente a mesma análise que o site fornece.

  • detect_textAnalisa um texto.
  • detect_batchAnalisa vários textos.
  • humanize_textHumaniza um texto com verificação de fatos.
  • paraphrase_textReescreve um texto.
  • summarize_textResume um texto.
  • check_grammarVerifica a gramática e a ortografia.

Claude Code Conecta online

  1. Guarde sua chave de API em uma variável de ambiente chamada BLURWRITE_API_KEY, onde o cliente é executado:

    export BLURWRITE_API_KEY="YOUR_API_KEY"
  2. Execute isto em um terminal:

    claude mcp add --transport http blurwrite https://blurwrite.com/api/mcp --header "Authorization: Bearer $BLURWRITE_API_KEY"
  3. Ou coloque isto no .mcp.json:

    .mcp.json
    {
      "mcpServers": {
        "blurwrite": {
          "type": "http",
          "url": "https://blurwrite.com/api/mcp",
          "headers": {
            "Authorization": "Bearer ${BLURWRITE_API_KEY}"
          }
        }
      }
    }
  4. Verifique se funciona: peça ao seu assistente "Analise este parágrafo com o Blurwrite e me diga o intervalo e o nível de confiança."

Sua chave de API fica no seu painel, em API. Nunca coloque uma chave em um arquivo compartilhado ou em um repositório.

Toda análise recebida por um agente inclui o valor, a incerteza associada e o estado de calibração, para que o agente possa explicar o que a análise significa e quando ela não deve ser usada.

Sua chave

Entre na sua conta e crie uma chave no seu painel.

Obtenha sua chave no painel

As chaves nunca são criadas nesta página.

O que a API e o servidor MCP fazem