Noções básicas da API do Planejamento do Adobe Workfront

IMPORTANT
As informações contidas neste artigo referem-se ao Adobe Workfront Planning, um recurso adicional do Adobe Workfront.
Para obter uma lista dos requisitos para acessar o Workfront Planning, consulte Visão geral do acesso ao Adobe Workfront Planning.
Para obter informações gerais sobre o Workfront Planning, consulte Introdução ao Adobe Workfront Planning.

O objetivo da API de planejamento do Adobe Workfront é simplificar a criação de integrações com o Planning, introduzindo uma arquitetura RESTful que opera via HTTP. Este documento supõe que você esteja familiarizado com as respostas REST e JSON.

Para obter referência completa do ponto de extremidade, esquemas de solicitação/resposta e detalhes específicos da versão, consulte a documentação do desenvolvedor da API do Workfront Planning.

Autenticação

A API do Workfront Planning usa o OAuth 2.0 para autenticação. As credenciais são configuradas por meio da Adobe Developer Console.

Dependendo do seu tipo de integração, oferecemos suporte aos dois fluxos a seguir:

  • Autenticação de servidor para servidor (JWT): para integrações automatizadas e serviços de back-end sem interação com o usuário. Usa a credencial do servidor para servidor OAuth (concessão de credenciais do cliente — seu aplicativo é autenticado diretamente usando a ID do cliente e o segredo para obter um token de acesso, sem logon do usuário ou etapa de consentimento).

    Para obter informações, consulte Autenticação de Servidor para Servidor.

  • Autenticação de usuário (Fluxo de código de autorização): para integrações que atuam em nome de um usuário específico. Usa a credencial do aplicativo web OAuth ou do aplicativo de página única (concessão de código de autorização — o usuário faz logon e consente, após o qual o aplicativo recebe um código de autorização que troca por um token de acesso).

    Para obter informações, consulte Autenticação de Usuário.

Para começar, crie um projeto no Adobe Developer Console e adicione a API do Workfront Planning para obter suas credenciais.

Para configurar credenciais, crie um aplicativo OAuth2 no Workfront.

Para obter informações, consulte Criar aplicativos OAuth2 para integrações do Workfront.

NOTE
O ponto de extremidade /login e a autenticação de chave de API não são compatíveis com o Workfront Planning. Não use sessionID ou apiKey parâmetros.

Controle de versão da API

A versão da API do Planning é feita por meio do caminho do URL.

Estas são as versões atuais compatíveis:

Versão
Data de lançamento
Versão 1
Julho de 2024
Versão 2
Maio de 2026
NOTE
O Conector de planejamento do Workfront para Workfront Fusion não foi atualizado para a API Versão 2 e continuará a usar a Versão 1 até aviso em contrário.

Para obter mais informações sobre as versões atuais com suporte, consulte o artigo documentação do desenvolvedor da API do Workfront Planning.

Recomendamos o direcionamento explícito de uma versão em todas as integrações:

https://{customer-domain}/maestro/api/v2/...

Quando uma nova versão principal for lançada, a versão anterior continuará disponível até que uma data de desativação seja comunicada.

Siga as notas de versão do Workfront para se manter informado sobre alterações na API.

Estrutura e operações de URL

Os objetos são manipulados enviando uma solicitação HTTP para seu URI exclusivo. A operação é especificada pelo método HTTP.

Método
Operação
GET
Recuperar um único objeto por ID ou objetos de pesquisa/lista
POST
Criar um novo objeto
PUT
Substituir um objeto existente (atualização completa)
PATCH
Atualizar parcialmente um objeto existente (somente os campos fornecidos são modificados)
EXCLUIR
Excluir um objeto
NOTE
Observação de Versão1: PATCH não tem suporte na Versão 1. Use PUT para todas as atualizações.

Para obter caminhos completos de pontos de extremidade e exemplos de solicitação/resposta, consulte a Referência da API em developer.adobe.com/wf-planning.

Códigos de status HTTP

A API do Planning retorna códigos de status HTTP padrão:

Código
Significado
200 OK
GET, PUT ou PATCH com êxito
201 Criado
POST bem-sucedido (recurso criado)
204 Sem conteúdo
DELETE bem-sucedido
Status múltiplo 207
A operação em massa foi concluída com resultados mistos, em que alguns itens tiveram êxito e alguns falharam. Verifique as respostas de item individual para obter detalhes.
400 Solicitação incorreta
Solicitação inválida — consulte a resposta do erro para obter detalhes
401 Não autorizado
Token de autenticação ausente ou inválido
403 Proibido
Permissões autenticadas, mas insuficientes
404 Não encontrado
O recurso não existe
Conflito 409
Conflito de gravação; o recurso foi modificado por outra solicitação. Tente novamente com a versão mais recente.
429 Muitas solicitações
Limite de taxa excedido
NOTE
Observação da versão 1: a versão 1 retorna 200 OK para todas as operações bem-sucedidas, incluindo POST e DELETE.

Tratamento de erros

A API de Planejamento retorna erros em um formato consistente. Cada resposta de erro inclui uma mensagem legível por humanos, um código de erro legível por computador e uma ID de solicitação para escalonamento de suporte.

Exemplo de resposta de erro:

json
{
  "title": "Validation failed",
  "status": 400,
  "detail": "Request validation failed. See 'errors' for details.",
  "errorCode": "VALIDATION_FAILED",
  "requestId": "req-123",
  "errors": [
    { "field": "name", "message": "must not be blank" }
  ]
}

Use errorCode (não status) para direcionar tratamento de erros programáticos. Ela fornece a classificação mais específica da falha.

NOTE
Observação sobre a Versão 1: as respostas de erro da versão 1 usam um campo numérico type (por exemplo, 40001) em vez de uma cadeia de caracteres errorCode, e quebra automática de detalhes em um objeto report em vez de um campo detail de nível superior.

Filtrar registros

Use o parâmetro filter em solicitações de pesquisa de registro para retornar somente registros que correspondam a critérios específicos. Para solicitações POST, filter é uma propriedade JSON no corpo da solicitação. Para solicitações GET, filter é um parâmetro de consulta que contém um grupo de filtros codificado em JSON. Os filtros usam uma estrutura composta digitada com operadores lógicos explícitos.

json
{
  "filter": {
    "operator": "AND",
    "conditions": [
      { "fieldId": "<fieldId>", "condition": "IS", "value": "Active" },
      { "fieldId": "<fieldId>", "condition": "CONTAINS", "value": "marketing" }
    ]
  }
}

Filtros podem ser aninhados usando operadores AND / OR para criar condições compostas:

json
{
  "filter": {
    "operator": "OR",
    "conditions": [
      {
        "operator": "AND",
        "conditions": [
          { "fieldId": "<fieldId>", "condition": "BETWEEN", "value": ["2024-03-31T20:00:00.000Z", "2024-04-01T20:00:00.000Z"] },
          { "fieldId": "<fieldId>", "condition": "IS", "value": "active" }
        ]
      },
      {
        "operator": "AND",
        "conditions": [
          { "fieldId": "<fieldId>", "condition": "IS_BETWEEN", "value": ["2024-04-15T00:00:00.000Z", "2024-04-16T00:00:00.000Z"] },
          { "fieldId": "<fieldId>", "condition": "IS", "value": "planned" }
        ]
      }
    ]
  }
}
NOTE
Observação da versão 1: a versão 1 usa operadores sem tipo de estilo Mongo em um objeto filters. Os operadores recebem o prefixo $ (por exemplo, $and, $or, $is, $contains, $isBetween). Os parâmetros de paginação (offset, limit) e recordTypeId são passados no corpo da solicitação, em vez de como caminho de URL e parâmetros de consulta.

Tipos de campo e modificadores de pesquisa

Você pode usar modificadores e filtros com campos para controlar quais dados serão retornados nos resultados.

Para obter exemplos, consulte a documentação para desenvolvedores da API do Workfront Planning.

Uso de modificadores de pesquisa

O Workfront Planning suporta os seguintes modificadores de pesquisa:

Modificador
Exemplo
Descrição
Valores possíveis
CONTÉM
{"fieldId":"<id>","condition":"CONTAINS","value":"product"}
Retorna registros cujo valor de campo contém o filtro
"Lançamento de novo produto"
DOES_NOT_CONTAIN
{"fieldId":"<id>","condition":"DOES_NOT_CONTAIN","value":"product"}
Retorna registros em que o valor do campo não contém o filtro
"Novo lançamento"
É
{"fieldId":"<id>","condition":"IS","value":"new product launch"}
Retorna registros cujo valor de campo corresponde exatamente ao filtro
"Lançamento de novo produto"
IS_NOT
{"fieldId":"<id>","condition":"IS_NOT","value":"product"}
Retorna registros cujo valor de campo não corresponde exatamente ao filtro
"Lançamento de novo produto"
IS_EMPTY
{"fieldId":"<id>","condition":"IS_EMPTY"}
Retorna registros cujo valor de campo está vazio
"" ou nulo
IS_NOT_EMPTY
{"fieldId":"<id>","condition":"IS_NOT_EMPTY"}
Retorna registros cujo valor de campo não está vazio
"Lançamento de novo produto"
GREATER_THAN
{"fieldId":"<id>","condition":"GREATER_THAN","value":"10"}
Retorna registros cujo valor de campo é maior que o filtro
"11"
GREATER_THAN_OR_EQUAL
{"fieldId":"<id>","condition":"GREATER_THAN_OR_EQUAL","value":"10"}
Retorna registros cujo valor de campo é maior ou igual ao filtro
"10", "11"
LESS_THAN
{"fieldId":"<id>","condition":"LESS_THAN","value":"10"}
Retorna registros cujo valor de campo é menor que o filtro
"9"
LESS_THAN_OR_EQUAL
{"fieldId":"<id>","condition":"LESS_THAN_OR_EQUAL","value":"10"}
Retorna registros cujo valor de campo é inferior ou igual ao filtro
"9", "10"
IS_BETWEEN
{"fieldId":"<id>","condition":"IS_BETWEEN","value":["2024-01-01","2024-12-31"]}
Retorna registros cujo valor de campo está entre os dois valores de filtro
["2024-03-01","2024-06-30"]
IS_NOT_BETWEEN
{"fieldId":"<id>","condition":"IS_NOT_BETWEEN","value":["2024-01-01","2024-12-31"]}
Retorna registros cujo valor de campo não está entre os dois valores de filtro
["2023-01-01","2025-06-30"]
IS_AFTER
{"fieldId":"<id>","condition":"IS_AFTER","value":"2024-01-01"}
Retorna registros cujo valor de campo de data está após o filtro
"2024-06-01"
IS_BEFORE
{"fieldId":"<id>","condition":"IS_BEFORE","value":"2024-12-31"}
Retorna registros cujo valor de campo de data é anterior ao filtro
"2024-06-01"
IS_ANY_OF
{"fieldId":"<id>","condition":"IS_ANY_OF","value":["Ative","Planned"]}
Retorna registros cujo valor de campo corresponde a qualquer valor na lista de filtros
["Ativo","Planejado","Concluído"]
IS_NONE_OF
{"fieldId":"<id>","condition":"IS_NONE_OF","value":["Ative","Planned"]}
Retorna registros cujo valor de campo não corresponde a nenhum dos valores na lista de filtros
["Ativo","Planejado"]
HAS_ANY_OF
{"fieldId":"<id>","condition":"HAS_ANY_OF","value":["Tag1","Tag2"]}
Retorna registros cujo campo de vários valores contém qualquer um dos valores de filtro
["Tag1","Tag2"]
HAS_ALL_OF
{"fieldId":"<id>","condition":"HAS_ALL_OF","value":["Tag1","Tag2"]}
Retorna registros cujo campo de vários valores contém todos os valores de filtro
["Tag1","Tag2"]
IS_EXACTLY
{"fieldId":"<id>","condition":"IS_EXACTLY","value":["Tag1"]}
Retorna registros cujo campo de vários valores contém exatamente os valores de filtro e nenhum outro
["Tag1"]
HAS_NONE_OF
{"fieldId":"<id>","condition":"HAS_NONE_OF","value":["Tag1"]}
Retorna registros cujo campo de vários valores não contém nenhum dos valores de filtro
["Tag1"]
NOTE
Observação sobre a versão 1: os nomes de modificadores V1 usam $-prefixed camelCase (por exemplo, $contains, $isNot, $isEmpty, $greaterThan, $greaterThanOrEqual, $lessThan, $lessThanOrEqual, $isBetween, $isNotBetween, $isAnyOf, $hasAllOf). O comportamento de cada modificador é o mesmo.

Condições de filtro compatíveis por tipo de campo

Tipo de campo
Condições suportadas
texto, texto longo
CONTAINS, DOES_NOT_CONTAIN, IS, IS_NOT, IS_EMPTY, IS_NOT_EMPTY
número, porcentagem, moeda
IS, IS_NOT, GREATER_THAN, GREATER_THAN_OR_EQUAL, LESS_THAN, LESS_THAN_OR_EQUAL, IS_EMPTY, IS_NOT_EMPTY
data
IS, IS_NOT, IS_AFTER, IS_BEFORE, IS_BETWEEN, IS_NOT_BETWEEN, IS_EMPTY, IS_NOT_EMPTY
seleção única
IS, IS_NOT, IS_ANY_OF, IS_NONE_OF, IS_EMPTY, IS_NOT_EMPTY
multisseleção, usuário
HAS_ANY_OF, HAS_ALL_OF, IS_EXACTLY, HAS_NONE_OF, IS_EMPTY, IS_NOT_EMPTY
booleano
É
fórmula
CONTAINS, DOES_NOT_CONTAIN, IS, IS_NOT, IS_EMPTY, IS_NOT_EMPTY
created-by
IS, IS_NOT, IS_ANY_OF, IS_NONE_OF
atualizado por
IS, IS_NOT, IS_ANY_OF, IS_NONE_OF, IS_EMPTY, IS_NOT_EMPTY
created-at
IS, IS_NOT, IS_AFTER, IS_BEFORE, IS_BETWEEN, IS_NOT_BETWEEN
atualizado-em
IS, IS_NOT, IS_AFTER, IS_BEFORE, IS_BETWEEN, IS_NOT_BETWEEN, IS_EMPTY, IS_NOT_EMPTY
referência
HAS_ANY_OF, HAS_ALL_OF, IS_EXACTLY, HAS_NONE_OF, IS_EMPTY, IS_NOT_EMPTY
pesquisa
Depende do tipo de campo vinculado
NOTE
Observação sobre a Versão 1: a Versão 1 usa nomes de operadores com prefixos $ (por exemplo, $contains, $greaterThan, $isAnyOf, $hasAllOf). O conjunto de condições aceitas por tipo de campo é o mesmo.

Filtragem por campos de pessoas

Os filtros de campo de pessoas (user, created-by, updated-by, approved-by) aceitam IDs de usuário do Adobe IMS e IDs de usuário do Workfront. Um valor de string simples é interpretado como uma ID de usuário do Adobe IMS.

Para definir o tipo de identificador para verificar a ID de usuário do Workfront, é necessário passar explicitamente os parâmetros id e idType. Os valores com suporte para idType são “WF” para IDs de usuário do Workfront e “IMS” para IDs de usuário do Adobe IMS.

{
  "filter": {
   "operator": "AND",
    "conditions": [
      {
        "fieldId": "<userFieldId>",
        "condition": "HAS_ANY_OF",
        "value": [
          { "id": "63e3b13000078c1795146248182d15dc", "idType": "WF" }
        ]
      }
    ]
  }
}
NOTE
Observação da versão 1: V1 oferece suporte somente à filtragem por ID de IMS dos usuários.

Filtrar campos de referência externa por ID externa

Os campos de referência externa vinculam registros a objetos em outros sistemas Adobe (como projetos Workfront ou AEM Assets). Internamente, o Planning atribui IDs de registro do Planning a esses objetos. Para filtrar esses campos diretamente pela ID de objeto original, adicione "matchExternalId": true a uma condição de filtro.

Esse sinalizador só é válido para campos de referência onde referenceOptions.isExternal é true; ele é ignorado para campos de referência não externos. Se um único valor de cadeia de caracteres não puder ser resolvido, a solicitação falhará com 400 Bad Request. Se um valor de lista for fornecido, as entradas não resolvidas passarão inalteradas e simplesmente não corresponderão.

{
  "filter": {
    "operator": "AND",
    "conditions": [
      {
        "fieldId": "<externalReferenceFieldId>",
        "condition": "IS_ANY_OF",
        "value": [
          "5f6a4f6e00000123456789abcdef0123",
          "/content/dam/wknd/en/adventures/bali-surf-camp"
        ],
        "matchExternalId": true
      }
    ]
  }
}
NOTE
Observação da versão 1: V1 não oferece suporte à filtragem por IDs de objeto externo.

Campos de conexão externa

Os tipos de registro do Planning podem hospedar campos de referência externa que vinculam registros a objetos em outros sistemas Adobe, em vez de outros tipos de registro do Planning.

Para criar um campo de referência externa por meio da API, defina referenceOptions.recordTypeId em um novo campo REFERENCE como a ID do tipo de registro externo desejado. O servidor deriva automaticamente referenceOptions.isExternal=true e os metadados de conexão (connectionName, objectName) do tipo de registro de destino.

Os tipos de objetos externos compatíveis incluem objetos do Workfront (projetos, tarefas, programas, portfólios, empresas, grupos, equipes, usuários) e do AEM Assets (ativos, fragmentos de conteúdo).

NOTE
Observação da versão 1: V1 não oferece suporte à criação de campos de conexão externa.

Classificação

Classifique os resultados por qualquer campo incluindo uma matriz sort em sua solicitação:

json
{
  "sort": [
    { "fieldId": "F6527ecb25df57c441d92b9fc", "direction": "asc" },
    { "fieldId": "F658afcbd4a0273c67c346fd5", "direction": "desc" }
  ]
}

Os campos de classificação múltipla são avaliados em ordem. Sempre aplique uma classificação ao paginar para garantir uma ordem consistente entre as páginas.

Para agrupar resultados, inclua uma matriz de grupo ao lado de classificar:

{
  "sort": [{ "fieldId": "F001", "direction": "asc" }],
  "group": [{ "fieldId": "F002", "direction": "asc" }]
}
NOTE
Observação da versão 1: V1 usa sorting (não sort), groupingFieldIds (matriz de IDs de campo, não objetos group) e o rowOrderViewId obsoleto agora para aplicar uma ordem de linha de exibição existente. Nenhum desses parâmetros V1 é compatível com a versão

Projeção de campo

Para limitar quais campos são retornados em uma resposta, use os parâmetros de consulta fieldIds ou fieldAliases com uma lista separada por vírgulas. Isso reduz o tamanho da carga de resposta e é recomendado para integrações de alto volume ou sensíveis à latência.

NOTE
Observação sobre a Versão 1: a Versão 1 usa ?attributes= para projeção (por exemplo, ?attributes=data,createdBy) em vez de ?fieldIds= ou ?fieldAliases=.

Paginação

A API do Planning permite respostas paginadas para gerenciar grandes conjuntos de dados.

  • A paginação baseada em cursor é usada para espaços de trabalho, tipos de registro, campos e exibições. Passe um valor cursor da resposta anterior para recuperar a próxima página. As respostas baseadas em cursor incluem um sinalizador hasMore para indicar se há mais páginas ou não.
  • A paginação baseada em página é usada para a pesquisa de registro. Use page e size como parâmetros de consulta. Sempre aplique uma classificação ao paginar para garantir uma ordem consistente entre as páginas. Observe que a paginação é baseada em zero, portanto, para recuperar os resultados da segunda página, use “page=1” como parâmetro.

Por exemplo, use a seguinte solicitação para recuperar a segunda página de 500 registros de uma pesquisa de registro:

POST /v2/record-types/{recordTypeId}/records/search?page=1&size=500
{
  "sort": [{ "fieldId": "F6527ecb25df57c441d92b9fc", "direction": "asc" }],
  "filter": { "operator": "AND", "conditions": [
    { "fieldId": "<fieldId>", "condition": "IS", "value": "active" }
  ] }
}

Todas as respostas paginadas incluem um envelope estruturado indicando se mais resultados estão disponíveis. Sempre aplique uma classificação ao paginar para garantir uma ordem consistente entre as páginas.

NOTE
Observação da versão 1: a V1 usa offset e limit passados no corpo da solicitação (padrão 500, máx. 2.000). Para recuperar os registros 2001-4000, defina "offset": "2000", "limit": "2000" no corpo da solicitação. A resposta retorna uma matriz de registros simples com um campo totalCount.

Operações em massa

A API do Planning permite criar, atualizar, corrigir e excluir registros em massa em uma única solicitação. Consulte a Referência da API em developer.adobe.com/wf-planning para obter os caminhos de ponto de extremidade, formatos de solicitação e limites de registro por operação.

NOTE
Observação sobre a versão 1: operações em massa não estão disponíveis na versão 1.

Permissões

As permissões para entidades são gerenciadas por meio de uma API de permissões dedicada, separada dos próprios endpoints de recursos. Isso permite que você leia as permissões atuais, gerencie a lista de compartilhamento e lide com as solicitações de acesso independentemente das operações de dados. Para obter mais informações, consulte a seção “Referências de API” no artigo API do Workfront Planning.

NOTE
Observação da versão 1: a versão 1 não expõe uma API de permissões pública. O nível de permissão é incorporado diretamente nos DTOs de resposta do recurso.

Uso da API do Planning com formulários personalizados do Workfront

Você pode chamar a API do Planning a partir de um campo de pesquisa Externo em um formulário personalizado do Workfront para exibir dados do Planning diretamente nos objetos do Workfront. Para obter mais informações, consulte Exemplos do campo de pesquisa Externa em um formulário personalizado.

Recursos relacionados

Para obter mais documentação relacionada à API, consulte também os seguintes artigos:

recommendation-more-help
workfront-help-quicksilver