Opciones de privacidad

Como no pudimos ubicar con confianza esta visita fuera de una region que exige consentimiento, LocationNotes esta reteniendo las llamadas a terceros hasta que confirme lo que esta visita debe permitir.

Confirme los valores recomendados para avanzar mas rapido, o abra las opciones de esta visita abajo si primero quiere limitar los mapas o la analitica del navegador.

Valor recomendado para esta visita

API HTTP

Documentación de la API de LocationNotes

Utilice esta página cuando necesite rutas HTTP reales, parámetros de consulta, reglas de autenticación y ejemplos de copiar y pegar detrás del sitio web y la aplicación de Android. El sitio público, los flujos de sitios web autenticados y el cliente de Android se comunican con esta misma superficie API en el mismo dominio.

¿Necesita el modelo de producto detrás de los puntos finales? Que es un usuario?, Que es un equipo?, Que es una nota?, y Que es un trackable?, y Que es un enlace externo?, y Que es una Imagen? y Que es una solicitud de soporte? Explique los objetos sobre los que operan estas rutas. Para secuencias rastreables paso a paso, utilice el flujo de API rastreable autenticado, flujo de API rastreable anónimo, y referencia de error rastreable páginas.

URL base y convenciones

URL base

Todos los ejemplos de esta página asumen el host de producción actual:

https://www.locationnotes.com

.

Las solicitudes y respuestas utilizan JSON. Los GUID son los identificadores principales entre notas, categorías, equipos y dispositivos.

Autorización

Los puntos finales privados, de sincronización y de equipo requieren una Authorization: Bearer <access token> encabezado a menos que la ruta esté marcada como pública a continuación.

Idioma

Las lecturas públicas y de gestión pueden pasar contentLanguage=en-US u otro idioma de contenido admitido para filtrar el contenido de nota/categoría devuelto.

Tokens de autenticación y portadores

Las páginas de inicio de sesión del sitio web y la configuración del proveedor externo están documentadas en el Autenticación pagina. Registrese primero cuando el llamador todavia no tenga una cuenta de LocationNotes. Los clientes de API que necesiten un token de acceso de tipo bearer deben usar despues la ruta de inicio de sesion de la API de identidad con las cookies desactivadas, el mismo patron que usa la aplicacion de Android.

POST /api/auth/register Anónimo

Cuerpo de la solicitud de registro

{
  "email": "tester@example.com",
  "password": "StrongP@ssw0rd!"
}

Comportamiento del registro

Una llamada de registro correcta crea la cuenta, pero no reemplaza el inicio de sesion. Llame despues a la ruta de inicio de sesion bearer cuando el cliente necesite un token de acceso para rutas privadas, de sincronizacion, de equipo o de administracion.

POST /api/auth/login?useCookies=false&useSessionCookies=false Anónimo

Cuerpo de la solicitud

{
  "email": "tester@example.com",
  "password": "StrongP@ssw0rd!"
}

Extracto de respuesta

{
  "tokenType": "Bearer",
  "accessToken": "eyJhbGciOi..."
}
curl -X POST "https://www.locationnotes.com/api/auth/login?useCookies=false&useSessionCookies=false" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "tester@example.com",
    "password": "StrongP@ssw0rd!"
  }'

El inventario completo de rutas que aparece abajo tambien enumera las rutas actuales de identidad administradas por el framework bajo /api/auth. Si necesita el flujo interactivo completo del sitio web, las devoluciones del proveedor, las páginas de seguridad de la cuenta o el comportamiento de vinculación de proveedores, use la Página de autenticación.

Notas públicas dentro de los límites del mapa.

Utilice este punto final para ventanas de mapas públicos y experiencias de navegación por área. Esta es la ruta que utiliza el mapa de la página de inicio.

GET /api/notes/public/bounds Anónimo
  • Cadena de consulta requerida: minLatitude, minLongitude, maxLatitude, maxLongitude
  • Cadena de consulta opcional: contentLanguage
  • Las respuestas están limitadas por el límite de exposición de datos públicos del sitio, que actualmente es 500 de forma predeterminada, y están ordenadas primero por actividad reciente.

Estas consultas públicas del mapa incluyen tanto las notas normales con visibilidad Public como las notas con visibilidad VisibleOnceAssociatedTrackableAccessed mientras todavía no tengan rastreables asociados. En cuanto se asocia un rastreable, la nota deja de aparecer en el descubrimiento anónimo del mapa público hasta que la persona visitante haya desbloqueado uno de los rastreables asociados desde una ruta a nivel de página.

curl "https://www.locationnotes.com/api/notes/public/bounds?minLatitude=41.78&minLongitude=-87.75&maxLatitude=41.96&maxLongitude=-87.54&contentLanguage=en-US"
[
  {
    "noteId": "4d6c5df3-3c53-4d0e-8e72-7d98a0f8a9f3",
    "ownerUserId": "a7cfd28f-c17f-4cf7-8913-47fa10fd0d1f",
    "categoryId": "4de6bb76-f25d-4c73-b8e3-81b9ca3bf08f",
    "title": "Dock gate closed",
    "body": "Security redirected vehicles to the south entrance.",
    "contentLanguage": "en-US",
    "latitude": 41.8818,
    "longitude": -87.6231,
    "visibility": "Public",
    "isDeleted": false,
    "updatedUtc": "2026-03-13T20:10:00Z",
    "clientMutationId": "web-demo-public-1",
    "teamId": null
  }
]

Notas públicas cerca de un punto

Utilice este punto final cuando el cliente ya conozca un punto central y desee un conjunto de resultados con distancia limitada en lugar de una ventana de mapa rectangular.

GET /api/notes/public/nearby Anónimo
  • Cadena de consulta requerida: latitude, longitude
  • Cadena de consulta opcional: radiusKm (predeterminado 5), contentLanguage
  • Los resultados cercanos están limitados por el límite de exposición de datos públicos del sitio, que actualmente es 500 de forma predeterminada.

Aquí se aplica la misma regla de visibilidad que en el punto final de límites: las notas públicas se incluyen normalmente, y las notas VisibleOnceAssociatedTrackableAccessed se incluyen solo hasta que obtienen su primer trackable asociado.

curl "https://www.locationnotes.com/api/notes/public/nearby?latitude=41.8818&longitude=-87.6231&radiusKm=8&contentLanguage=en-US"

Flujos de notas de paginas publicas de perfil y equipo

Estas rutas respaldan el mapa publicado y la franja de notas en las paginas publicas de perfil y de equipo. Usan las mismas reglas de acceso a notas que la propia pagina y aceptan un punto central cercano o limites completos del mapa.

GET /api/public/profiles/{userName}/notes/nearby Anónimo o Portador
GET /api/public/teams/{teamName}/notes/nearby Anónimo o Portador

Cadena de consulta requerida: latitude, longitude o limites completos del mapa con minLatitude, minLongitude, maxLatitude, maxLongitude.

Cadena de consulta opcional: radiusKm (predeterminado 5), contentLanguage, includeAllLanguages

El sitio normalmente envia el idioma actual de la ruta como contentLanguage para que las paginas publicas /en-US y /tlh no mezclen por defecto idiomas de autoria de notas en el mismo mapa o franja.

Use includeAllLanguages=true solo cuando el cliente este creando de forma intencional una superficie multilingue de exploracion en lugar de reflejar la pagina del sitio.

curl "https://www.locationnotes.com/api/public/profiles/michael-kappel/notes/nearby?minLatitude=41.87&minLongitude=-87.64&maxLatitude=41.89&maxLongitude=-87.62&contentLanguage=en-US"

Ciclo de sincronización sin conexión

Los clientes de sincronización deben enviar primero los datos locales sucios y luego extraer los cambios del servidor para el usuario, los equipos activos y las notas públicas en el área actual. Ambas rutas de sincronización requieren autenticación de portador.

POST /api/sync/push Portador
{
  "deviceId": "5dd06ca7-34a5-4f2e-812d-3f1ef3e48290",
  "notes": [
    {
      "noteId": "ef90c4ca-88a9-4a9b-b3a8-36e2649c5dcb",
      "ownerUserId": "a7cfd28f-c17f-4cf7-8913-47fa10fd0d1f",
      "categoryId": "4de6bb76-f25d-4c73-b8e3-81b9ca3bf08f",
      "title": "Offline inspection",
      "body": "Saved while disconnected.",
      "contentLanguage": "en-US",
      "latitude": null,
      "longitude": null,
      "visibility": "Private",
      "externalLinkUrl": "https://example.com/offline-inspection",
      "externalLinkDescription": "",
      "applyExternalLinkChanges": true,
      "isDeleted": false,
      "updatedUtc": "2026-03-13T20:12:00Z",
      "clientMutationId": "android-offline-42",
      "teamId": null
    }
  ],
  "categories": []
}
{
  "appliedNoteIds": [
    "ef90c4ca-88a9-4a9b-b3a8-36e2649c5dcb"
  ],
  "appliedCategoryIds": [],
  "conflicts": []
}
POST /api/sync/pull Portador
{
  "lastSyncUtc": "2026-03-13T19:45:00Z",
  "publicArea": {
    "minLatitude": 41.78,
    "minLongitude": -87.75,
    "maxLatitude": 41.96,
    "maxLongitude": -87.54
  }
}
{
  "serverSyncUtc": "2026-03-13T20:13:02Z",
  "userNotes": [],
  "userCategories": [],
  "teamCategories": [],
  "publicNotes": [],
  "teamNotes": []
}

Los puntos finales de sincronización rechazan solicitudes anónimas. Si el servidor bloquea una versión beta de Android anterior, verifique GET /api/system/status para conocer la versión mínima compatible y la URL de la página beta.

Notas personales y categorías.

Estas rutas devuelven el espacio de trabajo del sitio web en el que se ha iniciado sesión y el estado de sincronización personal de Android. Todos requieren autenticación de portador.

Leer notas personales

GET /api/notes/mine Portador

Cadena de consulta opcional: contentLanguage y límites completos del mapa con minLatitude, minLongitude, maxLatitude, maxLongitude.

Las cargas de lectura de notas ahora incluyen lastActivityUtc para que los clientes puedan mostrar la actividad más reciente por separado de las marcas de tiempo de persistencia/actualización.

crear una nota

POST /api/notes/mine Portador
{
  "categoryId": "4de6bb76-f25d-4c73-b8e3-81b9ca3bf08f",
  "title": "Category-only feedback",
  "body": "This note stays off the map on purpose.",
  "contentLanguage": "en-US",
  "externalLinkUrl": "https://example.com/field-guide",
  "externalLinkDescription": "",
  "latitude": null,
  "longitude": null,
  "visibility": "VisibleOnceAssociatedTrackableAccessed",
  "commentPolicy": "LoggedInUsers"
}

El campo visibility admite Private, Public y VisibleOnceAssociatedTrackableAccessed. El modo asociado a rastreables se comporta como Public hasta que la nota tenga uno o más rastreables asociados. A partir de ese momento, el descubrimiento público y el acceso a la página de la nota exigen que la persona visitante ya haya desbloqueado uno de esos rastreables asociados.

  • Todavia no hay trackables asociados: la nota se comporta como una nota publica.
  • Despues de la primera asociacion: la nota deja de aparecer en el descubrimiento publico anonimo y en el acceso normal a la pagina publica de la nota.
  • Visitante desbloqueado: alguien que ya desbloqueo un trackable asociado puede abrir la pagina de la nota y usar las rutas API publicas conectadas a la pagina de la nota.
  • Propietario o miembro autorizado del equipo: conserva el acceso normal a la nota y los permisos de administracion.

Lecturas y acciones de la pagina de la nota

GET /api/public/notes/{noteId} Anónimo o Portador
GET /api/public/notes/{noteId}/comments Anónimo o Portador
POST /api/public/notes/{noteId}/comments Portador
GET /api/public/notes/{noteId}/trackables Anónimo o Portador
POST /api/public/notes/{noteId}/trackables Portador
{
  "body": "I found it too."
}
{
  "trackableSecretCodes": "LN4C8R2Z",
  "selectedActiveTrackableIds": [
    "f3a8f841-20db-4f1e-a3f8-9f14bc0b3c31"
  ],
  "activeTrackableAttachMode": "Self"
}

Estas rutas de pagina de nota respetan las reglas de acceso de la nota, incluidas las notas privadas y las notas protegidas por acceso de trackable asociado. Si quien llama puede abrir la pagina de la nota, la API puede devolver comentarios y trackables visibles para esa nota. Adjuntar trackables requiere al propietario de la nota o a un administrador del equipo.

  • Antes de que exista el primer trackable asociado, estas rutas se comportan como rutas normales de pagina publica de nota.
  • Despues de que exista al menos una asociacion, quienes llamen sin acceso a uno de los trackables asociados deben esperar 404 en las rutas publicas de pagina de nota aunque la nota siga existiendo.
  • La misma nota aun puede devolver 200 para el propietario, los miembros autorizados del equipo o quienes ya desbloquearon un trackable asociado.

Leer categorías

GET /api/categories/mine Portador
GET /api/categories/mine/tree Portador

Ayudas del arbol del espacio de trabajo

GET /api/categories/mine/tree/sections Portador
GET /api/categories/mine/tree/children?parentCategoryId={categoryId} Portador

Use estas rutas auxiliares mas ligeras para selectores de categorias con carga diferida y arboles de barra lateral. tree/sections agrupa las categorias raiz por contentLanguage. tree/children devuelve los nodos hijos directos de un padre e incluye childCategoryCount para que el cliente pueda decidir si debe mostrar una opcion de expandir antes de cargar los nietos.

[
  {
    "contentLanguage": "en-US",
    "rootCategories": [
      {
        "categoryId": "68cb4c9b-d9bd-4bde-8c6a-a03a4c70b283",
        "name": "Field Reports",
        "contentLanguage": "en-US",
        "parentCategoryId": null,
        "childCategoryCount": 2
      }
    ]
  }
]
[
  {
    "categoryId": "c4b2e65f-5cf2-4ab6-8577-a89dfb51407f",
    "name": "Dock checks",
    "contentLanguage": "en-US",
    "parentCategoryId": "68cb4c9b-d9bd-4bde-8c6a-a03a4c70b283",
    "childCategoryCount": 0
  }
]

Crear o mover categorías

POST /api/categories/mine Portador
POST /api/categories/mine/{categoryId}/move Portador
{
  "name": "Field Reports",
  "contentLanguage": "en-US",
  "parentCategoryId": null
}

Traspaso GPX de waypoints personales

GET /api/notes/mine/gpx Portador

GET /api/notes/mine/gpx exporta solo notas personales mapeadas con coordenadas guardadas como waypoints GPX 1.1.

POST /api/notes/mine/gpx Portador

POST /api/notes/mine/gpx acepta envíos multipart con file, visibility y contentLanguage opcional. La importación lee solo entradas de waypoint, crea notas mapeadas normales y nunca sobrescribe una nota existente.

Las comprobaciones de duplicados se quedan dentro del ambito personal seleccionado. Los titulos y coordenadas coincidentes con el mismo texto de nota se informan como duplicados. Los titulos y coordenadas coincidentes con texto de nota diferente se omiten para evitar sobrescritura.

curl "https://www.locationnotes.com/api/notes/mine/gpx" \
  -H "Authorization: Bearer <access token>"
curl -X POST "https://www.locationnotes.com/api/notes/mine/gpx" \
  -H "Authorization: Bearer <access token>" \
  -F "file=@waypoints.gpx;type=application/gpx+xml" \
  -F "visibility=Private" \
  -F "contentLanguage=en-US"

Que son la importacion y la exportacion? explica en que se diferencia el intercambio GPX de waypoints frente a las exportaciones completas de cuenta en JSON y ZIP portable.

Puntos finales del equipo

Las rutas de equipo cubren membresía, invitaciones, configuraciones, notas de equipo y categorías de equipo. Todos requieren autenticación de portador y el servidor aplica permisos de administrador/miembro por ruta.

Lecturas comunes

  • GET /api/teams
  • GET /api/teams/{teamId}/notes
  • GET /api/teams/{teamId}/categories
  • GET /api/teams/{teamId}/categories/tree
  • GET /api/teams/{teamId}/invite-links

Los modelos de lectura de notas de equipo y de equipo incluyen lastActivityUtc. El recorte público prefiere primero los registros activos más recientes.

Ayudas del arbol de categorias del equipo

GET /api/teams/{teamId}/categories/tree/sections Portador
GET /api/teams/{teamId}/categories/tree/children?parentCategoryId={categoryId} Portador

Estas rutas usan las mismas formas de seccion y nodos secundarios que las ayudas del arbol del espacio de trabajo personal, pero los datos permanecen dentro del ambito del equipo seleccionado y aun requieren membresia activa del equipo.

Utilice DELETE /api/teams/{teamId}/notes/{noteId} cuando la nota deba salir del espacio de trabajo del equipo pero seguir existiendo para el propietario, y use DELETE /api/teams/{teamId}/notes/{noteId}/delete cuando la propia nota del equipo deba eliminarse permanentemente.

crear un equipo

{
  "name": "Beta Testers",
  "title": "Beta Testers",
  "description": "Public beta release gate for Android validation.",
  "externalLinkUrl": "https://example.com/beta-program",
  "externalLinkDescription": "",
  "joinPolicy": "RequestsAllowed",
  "pageVisibility": "Public",
  "defaultNoteVisibility": "Public",
  "contentLanguage": "en-US"
}

Crear una nota de equipo

POST /api/teams/{teamId}/notes Portador
{
  "categoryId": "68cb4c9b-d9bd-4bde-8c6a-a03a4c70b283",
  "title": "Shared dock inspection",
  "body": "Visible to the team until we publish it.",
  "contentLanguage": "en-US",
  "externalLinkUrl": "https://example.com/shared-briefing",
  "externalLinkDescription": "",
  "latitude": 41.8818,
  "longitude": -87.6231,
  "visibility": "Private",
  "commentPolicy": "TeamMembers"
}

Traspaso GPX de waypoints de equipo

GET /api/teams/{teamId}/notes/gpx Portador
POST /api/teams/{teamId}/notes/gpx Portador

GET /api/teams/{teamId}/notes/gpx y POST /api/teams/{teamId}/notes/gpx aplican las mismas reglas GPX dentro del ambito del equipo seleccionado. Las comprobaciones de duplicado y sobrescritura solo se comparan con las notas de ese equipo.

curl "https://www.locationnotes.com/api/teams/{teamId}/notes/gpx" \
  -H "Authorization: Bearer <access token>"
curl -X POST "https://www.locationnotes.com/api/teams/{teamId}/notes/gpx" \
  -H "Authorization: Bearer <access token>" \
  -F "file=@team-waypoints.gpx;type=application/gpx+xml" \
  -F "visibility=Public" \
  -F "contentLanguage=en-US"

Operaciones de membresía e invitación

  • POST /api/teams/{teamId}/memberships/request
  • POST /api/teams/{teamId}/memberships/invite
  • POST /api/teams/{teamId}/memberships/{membershipId}/accept
  • POST /api/teams/{teamId}/memberships/{membershipId}/refuse
  • POST /api/teams/{teamId}/memberships/{membershipId}/approve
  • POST /api/teams/{teamId}/memberships/{membershipId}/deny
  • POST /api/teams/{teamId}/memberships/{membershipId}/promote-admin
  • DELETE /api/teams/{teamId}/memberships/{membershipId}
  • POST /api/teams/invite-links/{teamSlug}/{inviteCode}/join
{
  "isSingleUse": false
}
{
  "inviteLinkId": "9a4726dc-4fb1-4c16-b7b3-5d48ea68fdce",
  "teamId": "0f4ddf5d-f3dc-4417-b96d-8e212d24235e",
  "teamName": "Invite Team",
  "teamSlug": "invite-team",
  "code": "8K4V9T",
  "createdByDisplayName": "invite-admin",
  "createdByCurrentUser": true,
  "inviterIsCurrentlyAdmin": true,
  "isSingleUse": false,
  "createdUtc": "2026-03-18T21:15:00Z"
}
{
  "teamSlug": "invite-team",
  "membershipStatus": "RequestingMembership"
}

Puntos finales rastreables

Los rastreables admiten la exploración de códigos públicos, acceso a códigos secretos o QR de solo escaneo, revelación secreta única durante la creación, sesiones activas en el navegador, comentarios y flujos de trabajo de inventario agrupados. Los códigos cortos secretos y las URL QR de solo escaneo solo se devuelven desde los puntos finales de creación que aparecen a continuación. Nunca más regresan de rutas de lectura, búsqueda, comentarios o detalles.

Reglas rastreables importantes:
  • Los códigos públicos son tokens públicos cortos que siguen siendo globalmente únicos en todos los rastreables.
  • Los códigos públicos y los códigos secretos cortos no chocan entre sí, por lo que un código corto no puede significar ambas cosas.
  • Los códigos secretos cortos y las URL QR de solo escaneo son credenciales de acceso basadas en posesión.
  • Piense en los trackables y grupos de trackables como visibles tras el acceso o siempre visibles para todos. El acceso secreto usado con sesión iniciada puede guardarse en la cuenta para dispositivos posteriores.
  • Los formularios para adjuntar notas del sitio web aceptan un código rastreable a la vez y solo se adjuntan a partir de una coincidencia de código secreto breve existente.
  • Si aún no se ha registrado un código externo, primero cree el rastreable. La entrada manual de notas adjuntas no registra automáticamente nuevos códigos de terceros.
  • La activación se infiere de OwnerUserId; no existe un indicador de activación persistente independiente.
  • Los rastreables no activados no se pueden adjuntar a notas y no pueden aceptar comentarios.
  • Un rastreable puede pertenecer solo a un grupo a la vez, y para cambiar de grupo es necesario desconectarlo primero y luego volverlo a conectar.

Formatos y ejemplos de identificadores

. Ejemplo regla de búsqueda
Token de código público LN-7K4V9T Token publico corto y globalmente unico. Seguro para busqueda publica y enlaces publicos.
Ruta de entrada pública GET /trackable/LN-7K4V9T URL corta publica para compartir. La misma ruta base se usa para codigos publicos, codigos secretos cortos y tokens QR largos solo de escaneo.
Página rastreable pública localizada GET /en-US/trackables/LN-7K4V9T Pagina publica representada especifica del idioma a la que se llega despues de que la URL compartida resuelve el codigo.
Ruta de entrada secreta GET /trackable/LN4C8R2Z URL corta de entrada basada en posesion para quien sostiene el objeto. Usa la misma ruta base <code>/trackable/{code}</code> que las formas publica y de escaneo largo.
Código secreto corto del sistema LN4C8R2Z Unico a nivel global entre todos los trackables y tambien unico frente a los codigos publicos. Pensado para entrada manual basada en posesion.
Prefijo del sistema alternativo GT8M2Q7V El mismo patron generado de secreto corto en implementaciones hermanas que usan el prefijo <code>GT</code>.
Trae tu propio código secreto ITEM42X Identificador externo avanzado. Debe seguir siendo unico entre todos los trackables y no debe empezar con <code>LN</code> ni <code>GT</code>.
Ruta de escaneo privada https://locationnotes.com/trackable/AB4D5QW2...<100 chars total>... Unico entre todos los trackables y pensado para provenir del escaneo QR en lugar de la entrada manual.

Los tokens de código público generados y los cuerpos secretos breves generados utilizan la misma familia de caracteres resistentes a las manchas. La búsqueda escrita trata a O como 0, I o L como 1, S como 5 y U como V. Para los códigos secretos cortos del sistema, esa normalización se aplica al cuerpo generado después del prefijo literal. Los códigos públicos utilizan el mismo prefijo configurado con un guión antes del cuerpo generado, por lo que son visualmente distintos de los códigos secretos cortos.

Lecturas de lista y detalle

Las lecturas de la lista pública están limitadas por el límite de exposición de datos públicos del sitio, que actualmente es 500 de forma predeterminada.

Los modelos de lectura rastreables y de grupos rastreables incluyen lastActivityUtc para que los paneles y los clientes API puedan mostrar la actividad reciente de manera explícita.

  • GET /api/trackables/public
  • GET /api/trackables/mine
  • GET /api/trackables/{trackableId}
  • POST /api/trackables/{trackableId}/watch
  • DELETE /api/trackables/{trackableId}/watch
  • GET /api/trackables/{trackableId}/journey
  • POST /api/trackables/{trackableId}/journey-stops
  • DELETE /api/trackables/{trackableId}/journey-stops/{journeyStopId}

GET /api/trackables/public y las paginas publicas de exploracion de trackables del sitio siguen siendo multilingues para que los datos publicos de recorrido y logistica no queden ocultos por el idioma de la ruta.

Cambie el idioma del sitio cuando quiera la interfaz localizada alrededor de los mismos datos publicos del trackable.

Crear un trackable

POST /api/trackables Portador
{
  "name": "Promo coin",
  "description": "Launch event inventory item",
  "externalLinkUrl": "https://example.com/promo-coin",
  "externalLinkDescription": "",
  "teamId": null,
  "visibility": "AlwaysVisibleToEveryone",
  "activateImmediately": false,
  "secretCode": ""
}
{
  "trackableId": "f3a8f841-20db-4f1e-a3f8-9f14bc0b3c31",
  "heading": "Unactivated Trackable",
  "description": "Please activate this trackable item",
  "items": [
    {
      "trackableId": "f3a8f841-20db-4f1e-a3f8-9f14bc0b3c31",
      "name": "Unactivated Trackable",
      "publicCode": "LN-7K4V9T",
      "secretCode": "LN4C8R2Z",
      "scanUrl": "https://locationnotes.com/trackable/ABCD...<100 characters total>...",
      "qrPayload": "ABCD...<100 characters total>..."
    }
  ]
}

Trae tu propio código secreto

{
  "name": "Marketing token",
  "description": "Bring-your-own identifier",
  "teamId": null,
  "visibility": "VisibleOnceAccessed",
  "activateImmediately": true,
  "secretCode": "TAG42"
}

El servidor acepta codigos secretos proporcionados por la persona que llama que no comienzan con LN, GT ni GC y no coinciden con ningun codigo publico o secreto existente. El codigo publico devuelto todavia lo genera el sistema.

Crear un grupo

POST /api/trackables/groups Portador
{
  "name": "Gnomes in this hunt",
  "description": "Seasonal hunt inventory",
  "defaultTrackableTitle": "",
  "defaultTrackableDescription": "",
  "defaultExternalLinkUrl": "https://example.com/hunt-rules",
  "defaultExternalLinkDescription": "",
  "trackableCount": 12,
  "teamId": null,
  "visibility": "AlwaysVisibleToEveryone",
  "activateImmediately": false,
  "watchGroupActivityWhenCreated": true
}

Los grupos están limitados a 100 rastreables. Los elementos no activados vuelven a los valores predeterminados del grupo hasta su activación. Una vez activados, deberán utilizar su propio título y descripción.

La creacion de grupos de trackables tambien puede aceptar watchGroupActivityWhenCreated cuando un lote sin activar debe empezar en la lista de seguimiento del creador.

Búsqueda y sesión activa.

  • POST /api/trackables/lookup coincide con un token de código público o un código secreto corto después de normalizar las sustituciones comunes de caracteres borrosos enumeradas anteriormente.
  • GET /trackable/{code} es la ruta corta de entrada al sitio web que se muestra a los usuarios y clientes API. Acepta un código público, un código secreto corto o el token QR largo y luego lo dirige al flujo correcto.
  • GET /api/trackables/active enumera la sesión de código secreto activa actual del cliente cuando existe.
  • GET /api/trackables/active/{trackableId} devuelve la carga útil de aterrizaje activa, incluidos los requisitos de activación y los elementos agrupados cuando estén disponibles.
  • POST /api/trackables/active/{trackableId}/message actualiza el texto de estado recordado.
  • DELETE /api/trackables/active/{trackableId} finaliza la sesión de código secreto recordada en ese cliente.

Las búsquedas de códigos secretos y las visitas de QR de solo escaneo crean una sesión de cliente activa en lugar de devolver el valor secreto. Esa sesión activa es lo que permite que los flujos de notas posteriores adjunten el rastreable sin tener que volver a ingresar el código.

Cuando la persona que llama se autentica, la misma búsqueda Visible una vez accedida también vincula el rastreable a esa cuenta para que los dispositivos que hayan iniciado sesión posteriormente puedan reabrir el rastreable, su página de grupo y las rutas de seguimiento normales sin volver a ingresar el secreto.

El sitio web utiliza intencionalmente la misma ruta base de entrada directa para los tres formularios: /trackable/{publicCode}, /trackable/{secretCode} y /trackable/{qrToken}.

La ruta localizada /{lang}/trackable/{code} es la llegada renderizada de un solo elemento despues de la seleccion automatica de idioma, pero aun asi no deberia mostrarse como la URL para compartir o imprimir.

Despues de que se resuelve la busqueda de un codigo publico, la pagina publica renderizada queda en /{lang}/trackable/{publicCode}.

Esa ruta de entrada compartida sigue siendo válida incluso si las longitudes de los códigos cortos configurados cambian más adelante, porque el servidor resuelve el valor del código en lugar de depender de las variaciones de la ruta del sitio web codificadas.

Las rutas rastreables de sitios web controladas por el propietario no forman parte intencionalmente del sistema de URL público.

Esa distinción también se aplica a las páginas de notas: un código público sirve para abrir la página pública rastreable, mientras que el archivo adjunto de una nota espera un código secreto breve existente o una sesión de navegador ya activa.

GET /api/trackables/lookup?code=LN4C8R2Z
{
  "found": true,
  "trackableId": "f3a8f841-20db-4f1e-a3f8-9f14bc0b3c31",
  "isPublicCodeMatch": false,
  "usesSecretAccess": true,
  "redirectUrl": "/en-US/trackables/active/f3a8f841-20db-4f1e-a3f8-9f14bc0b3c31"
}
GET /trackable/LN-7K4V9T
GET /en-US/trackables/LN-7K4V9T
GET /trackable/ABCD...<100 characters total>...

Activar para uno mismo o para el equipo

POST /api/trackables/{trackableId}/activate Portador
{
  "name": "",
  "description": "",
  "useGroupDefaultTitle": true,
  "useGroupDefaultDescription": true,
  "externalLinkUrl": "",
  "externalLinkDescription": "",
  "useGroupDefaultExternalLink": true,
  "teamId": "optional-team-guid"
}

Si se proporciona teamId, el rastreable pasa a ser propiedad del equipo, los administradores del equipo pueden administrarlo y el miembro activador mantiene el control mientras permanece en ese equipo. Sin teamId, el rastreable pasa a ser de propiedad personal.

Cuando se activa un elemento agrupado, el propietario puede guardar un título y una descripción explícitos del elemento o copiar intencionalmente el título y la descripción predeterminados actuales del grupo en el elemento.

Separar y volver a unir grupos

  • DELETE /api/trackables/{trackableId}/group elimina la asociación de grupo actual.
  • POST /api/trackables/{trackableId}/group con { "trackableGroupId": "..." } asocia un rastreable separado con un nuevo grupo.
  • POST /api/trackables/groups/{trackableGroupId}/watch empieza a seguir los miembros visibles del grupo. Los seguimientos existentes de elementos miembros de ese mismo grupo todavia pueden consolidarse en el seguimiento del grupo, y la superposicion de propietario o seguidor se deduplica por usuario.
  • DELETE /api/trackables/groups/{trackableGroupId}/watch deja de supervisar el grupo.

Un rastreable sólo puede pertenecer a un grupo a la vez. El servidor aplica la regla de desconexión primero. Solo el activador original puede volver a adjuntar un rastreable desconectado, y el grupo de destino también debe ser controlado por ese usuario o un administrador de equipo elegible.

{
  "trackableGroupId": "4bdffcab-bb51-4fd8-8c15-59f7b2d72c3f"
}

Comentarios del trackable

  • GET /api/trackables/{trackableId}/comments
  • POST /api/trackables/{trackableId}/comments
  • PUT /api/trackables/{trackableId}/comments/{commentId}
  • DELETE /api/trackables/{trackableId}/comments/{commentId}

Los rastreables no activados no pueden recibir comentarios ni paradas de viaje.

Los usuarios autenticados pueden publicar comentarios directamente. Las personas que llaman anónimamente también pueden publicar, pero cada escritura anónima debe provenir de la sesión rastreable activa de ese navegador o reenviar el código secreto corto exacto o el token QR privado para ese rastreable específico.

Solo el autor del comentario que haya iniciado sesión puede editar su propio comentario. Los propietarios rastreables y los administradores actuales del equipo pueden eliminar comentarios o paradas del viaje, pero aún no pueden reescribir las palabras de otra persona.

{
  "body": "Starting the route now.",
  "accessCode": "LN4C8R2Z"
}

Paradas de viaje directo

El feed del recorrido ahora es un historial inmutable de paradas. Las paradas respaldadas por notas capturan una instantanea de la ubicacion cuando se adjunta la nota, y los reportes directos en el mapa pueden guardarse sin crear primero una nota.

Si una nota vinculada luego se mueve a una coordenada diferente, el viaje rastreable aún mantiene la parada original para que el historial de logística no se reescriba silenciosamente.

Los informes directos anónimos siguen la misma regla que los comentarios anónimos: la persona que llama debe usar la sesión rastreable activa de ese navegador o reenviar el código secreto corto o el token QR privado en la solicitud de escritura.

{
  "latitude": 41.8819,
  "longitude": -87.6278,
  "accessCode": "LN4C8R2Z"
}

GET /api/trackables/{trackableId}/journey devuelve los datos del lugar con la etiqueta como referencia principal. Cada punto incluye coordinateId, locationLabel y currentNotesAtCoordinate para que los clientes puedan mostrar las notas visibles actuales en esa coordenada sin tratar la parada como si tuviera una sola nota guardada propia.

Las respuestas del recorrido ya no dividen el contrato externo del lugar en campos city, stateOrProvince y country. Lea locationLabel junto con las coordenadas.

[
  {
    "journeyStopId": "8a274ad6-5dd4-45c4-969a-c13cc1b8d92c",
    "coordinateId": "565c42dd-2e12-49b4-a16b-c89ff4502b8e",
    "latitude": 41.8819,
    "longitude": -87.6278,
    "associatedUtc": "2026-04-05T18:30:00Z",
    "isLocationOnly": false,
    "isAnonymous": false,
    "canDelete": false,
    "canConvertToNote": false,
    "locationLabel": "Chicago, Illinois, United States",
    "creatorDisplayText": "Jordan",
    "creatorProfileUserName": "jordan",
    "currentNotesAtCoordinate": [
      {
        "noteId": "4d6c5df3-3c53-4d0e-8e72-7d98a0f8a9f3",
        "title": "Lobby drop",
        "contentLanguage": "en-US",
        "thumbnailUrl": "/api/images/notes/4d6c5df3-3c53-4d0e-8e72-7d98a0f8a9f3/thumbnail"
      }
    ]
  }
]

Visibilidad y divulgación del recorrido

Las páginas de viaje rastreables pueden mostrar ubicaciones mapeadas incluso cuando algunas notas subyacentes sean privadas. En esos casos, los espectadores no autorizados pueden recibir el punto de ubicación pero no el contenido de la nota protegida.

Los espectadores autorizados reciben el título de la nota, la descripción y el enlace de la nota directamente desde la carga útil del viaje precargada y las ventanas emergentes de pin del mapa.

Eliminación y retención

Eliminar una cuenta no elimina automáticamente todos los rastreables que esa cuenta haya tocado. Los rastreables compartidos o propiedad del equipo pueden permanecer mientras solo se elimina la actividad personal extraíble del usuario eliminado.

Revise la página Eliminar datos y la sección API de eliminación de cuenta para conocer los límites de retención actuales.

Guías de flujo rastreables

La API rastreable tiene un flujo de trabajo de propiedad con inicio de sesión completo y un flujo de trabajo de informes anónimo respaldado por secretos más ligero. Utilice las páginas dedicadas a continuación cuando necesite secuencias de llamadas ordenadas, puntos de decisión y ejemplos de copiar y pegar en lugar de un catálogo de rutas.

Flujo autenticado

Desde la búsqueda de elementos encontrados hasta el acceso secreto al navegador, el inicio de sesión, la activación, la vinculación de notas, el registro directo del viaje, la moderación y las consideraciones de exportación/eliminación.

Abra la guía de flujo de API rastreable autenticada

Flujo anónimo

Para personas que llaman que no inician sesión pero tienen el código secreto exacto o el token QR privado y necesitan publicar un informe de ubicación directo o comentar de forma segura.

Abra la guía de flujo de API rastreable anónima

búsqueda de errores

Las respuestas rastreables de detalles del problema ahora incluyen un campo de código estable legible por máquina. Utilice la página de referencia de errores para asignar fallas a causas probables y soluciones.

Abra la referencia de error de API rastreable

Puntos finales de imagen

La visibilidad de la imagen siempre sigue al elemento principal. Si la persona que llama puede abrir la página de perfil, nota, equipo, rastreable o de grupo rastreable conectado, la persona que llama también puede abrir sus imágenes. Si no se puede acceder al elemento principal, las lecturas de la lista de imágenes no devuelven elementos y las descargas directas de imágenes devuelven 404.

Los clientes también deben recordar que las cargas se examinan antes de guardarlas, los originales no se conservan y el servidor solo almacena variantes JPEG redimensionadas. Tanto el sitio web como la aplicación de Android utilizan estos mismos contratos API y rutas de archivos.

Listar imágenes por padre

GET /api/images/profiles/{userId} Anónimo o Portador
GET /api/images/notes/{noteId} Anónimo o Portador
GET /api/images/teams/{teamId} Anónimo o Portador
GET /api/images/trackables/{trackableId} Anónimo o Portador
GET /api/images/trackable-groups/{trackableGroupId} Anónimo o Portador

Utilice estas lecturas para poblar galerías. Cada elemento incluye el GUID de la imagen, las dimensiones originales y las URL relativas para las copias almacenadas en miniatura, pequeñas, medianas y grandes.

originalWidth y originalHeight describen la imagen fuente cargada como referencia. Los archivos descargables reales siguen siendo las variantes redimensionadas almacenadas y enlazadas por thumbnailUrl, smallUrl, mediumUrl y largeUrl.

curl "https://www.locationnotes.com/api/images/notes/4d6c5df3-3c53-4d0e-8e72-7d98a0f8a9f3"
[
  {
    "contentImageId": "f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1",
    "targetType": 1,
    "noteId": "4d6c5df3-3c53-4d0e-8e72-7d98a0f8a9f3",
    "originalWidth": 1600,
    "originalHeight": 1200,
    "createdUtc": "2026-03-18T21:15:00Z",
    "thumbnailUrl": "/Images/Thumbnail/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1-64.jpg",
    "smallUrl": "/Images/Small/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1-306.jpg",
    "mediumUrl": "/Images/Medium/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1-612.jpg",
    "largeUrl": "/Images/Large/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1-1024.jpg"
  }
]

Descargar bytes almacenados

GET /api/images/{contentImageId}/{variant} Anónimo o Portador

Los valores de variante válidos son miniatura, pequeño, mediano y grande. Las respuestas devuelven imagen/jpeg.

Las URL de los archivos del sitio web en /Images/{Variant}/{guid}-{size}.jpg aplican la misma regla de visibilidad principal antes de que se entreguen los bytes de la imagen, por lo que los enlaces directos de las imágenes aún están protegidos por los permisos de perfil, nota, equipo, rastreable o grupo rastreable conectados.

curl -L "https://www.locationnotes.com/api/images/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1/large" --output note-large.jpg

Subir imagenes

POST /api/images/profiles Portador
POST /api/images/notes/{noteId} Portador
POST /api/images/teams/{teamId} Portador
POST /api/images/trackables/{trackableId} Portador
POST /api/images/trackable-groups/{trackableGroupId} Portador

Envíe un campo de archivo de varias partes llamado archivo. La persona que llama ya debe tener permiso de administración principal para el objetivo, lo que significa acceso de administrador de equipo para las páginas del equipo y el permiso normal de edición/administración para los otros tipos de padres. Las cargas se analizan antes de guardarlas y luego se almacenan solo como copias JPEG redimensionadas.

curl -X POST "https://www.locationnotes.com/api/images/trackables/721f5205-ed2c-43e8-8ecd-1502d5bb7b56" \
  -H "Authorization: Bearer <access token>" \
  -F "file=@tracker.jpg"
{
  "image": {
    "contentImageId": "f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1",
    "targetType": 3,
    "trackableId": "721f5205-ed2c-43e8-8ecd-1502d5bb7b56",
    "originalWidth": 1600,
    "originalHeight": 1200,
    "createdUtc": "2026-03-18T21:15:00Z",
    "thumbnailUrl": "/Images/Thumbnail/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1-64.jpg",
    "smallUrl": "/Images/Small/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1-306.jpg",
    "mediumUrl": "/Images/Medium/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1-612.jpg",
    "largeUrl": "/Images/Large/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1-1024.jpg"
  }
}

Eliminar imágenes

DELETE /api/images/{contentImageId} Portador

La eliminación requiere el mismo permiso de administración principal que la carga. Cuando la eliminación se realiza correctamente, la fila de imagen de contenido y todas las variantes redimensionadas almacenadas se eliminan juntas.

Los clientes de la API deben usar aquí el verbo HTTP DELETE. Si alguien abre esta URL directamente en la barra de direcciones del navegador, el navegador enviará GET y la respuesta será 405 Method Not Allowed porque esta ruta no es una página de descarga.

Los botones de eliminación del sitio web usan la ruta localizada del formulario del sitio en /{culture}/images/{contentImageId}/delete para que las eliminaciones desde la galería del navegador conserven la protección antifalsificación.

curl -X DELETE "https://www.locationnotes.com/api/images/f1d52aa2-4d59-49bf-8d21-7d0b4e9e57f1" \
  -H "Authorization: Bearer <access token>"

Que es una Imagen? explica las reglas de visibilidad, moderación, informes, cambio de tamaño, exportación y eliminación detrás de estas rutas.

Informes de cumplimiento

Use estas rutas para reportes de contenido inapropiado, errores de sistema rastreados y los mismos registros de tickets de soporte que respaldan el flujo de solicitudes de soporte del sitio web. Las personas que llaman anónimamente pueden enviar informes, pero solo los informantes que hayan iniciado sesión pueden realizar un seguimiento posterior de las actualizaciones de estado y las resoluciones de los superadministradores a través de la API.

Enviar un informe

POST /api/compliance/reports Anónimo o Portador

Si la solicitud est? autenticada mediante la cookie del sitio web o un token bearer, el informe creado se vincula a esa cuenta para que aparezca en GET /api/compliance/reports/mine.

{
  "pageType": 2,
  "contentType": 5,
  "pageTitle": "Reported note title",
  "pageUrl": "/en-US/Note/2f4a9f80-b7db-4f4b-9d34-0c2cb8777d9a#note-page-title",
  "pageReference": "2f4a9f80-b7db-4f4b-9d34-0c2cb8777d9a",
  "contentLabel": "Note Page title and content",
  "contentReference": "2f4a9f80-b7db-4f4b-9d34-0c2cb8777d9a:page-content",
  "contentPreview": "Title: Reported note title\n\nContent: Reported note body",
  "reportTitle": "Needs review",
  "reportExplanation": "This title is not appropriate for a public note."
}

Realice un seguimiento de un ticket de API o informe un error de la aplicación

POST /api/compliance/errors Anónimo o Portador

Si una ruta API ya falló con un 500 inesperado y devolvió un ticketNumber en el JSON de detalles del problema, publique ese ticket aquí en lugar de crear una segunda fila de registro de errores. Incluya userExplanation y configure trackInSupportTickets cuando la persona que llama quiera un seguimiento del superadministrador.

{
  "ticketNumber": "ERR-1M7Q4D9K2X5R8V6N",
  "userExplanation": "Android app hit this right after I tapped refresh twice.",
  "trackInSupportTickets": true,
  "clientContext": {
    "platform": "Android",
    "screen": "My Journeys",
    "appVersion": "1.0.0-beta.20260318.1"
  }
}

Cuando la falla ocurrió solo dentro de la aplicación de Android y aún no hay ningún ticket del servidor, cree un nuevo ticket de error con un marcador que describa dónde estaba la aplicación.

{
  "pageMarkerType": "Android screen",
  "pageMarker": "My Journeys",
  "requestCulture": "en-US",
  "requestUrl": "https://locationnotes.com/api/trackables/active/721f5205-ed2c-43e8-8ecd-1502d5bb7b56?includeHistory=true",
  "httpMethod": "GET",
  "responseStatusCode": 503,
  "exceptionType": "Java.Lang.IllegalStateException",
  "exceptionMessage": "Journey list render failed.",
  "stackTrace": "at com.locationnotes.trackables.MyJourneysFragment.render(MyJourneysFragment.kt:42)",
  "userExplanation": "This happened right after scanning a QR code.",
  "trackInSupportTickets": true,
  "clientContext": {
    "platform": "Android",
    "deviceModel": "Pixel 9",
    "osVersion": "Android 17",
    "appVersion": "1.0.0-beta.20260318.1"
  }
}
{
  "ticketNumber": "ERR-1M7Q4D9K2X5R8V6N",
  "usedExistingTicket": false,
  "explanationSaved": true,
  "trackedInSupportTickets": true,
  "trackedContentReportId": "d91f6e1c-b8e2-4e38-9e96-f2de0cc4f0e2"
}

Utilice valores de pageMarkerType como URL, pantalla de Android o tarea en segundo plano de Android. Para los tickets generados por el servidor, mantenga el marcador de URL original y envíe el ticketNumber devuelto aquí para que la URL de API registrada permanezca adjunta al mismo ticket.

Lecturas de estado del reportero

GET /api/compliance/reports/mine Portador
GET /api/compliance/reports/{contentReportId} Portador

Estas rutas devuelven solo los informes de la persona que llama, a menos que la persona que llama sea un superadministrador. Úselos para mostrar Reportado, Revisando o Resuelto además de cualquier nota de resolución final tanto para informes de contenido como para errores del sistema rastreados.

{
  "contentReportId": "3ab419ab-4b71-4d43-b52c-303d6039f01f",
  "reporterUserId": "6d650c55-b235-4370-8572-e4b772cd1aea",
  "pageType": 2,
  "pageTypeLabel": "Note Page",
  "contentType": 5,
  "contentTypeLabel": "Title and content",
  "status": 2,
  "statusLabel": "Resolved",
  "pageTitle": "Reported note title",
  "pageUrl": "/en-US/Note/2f4a9f80-b7db-4f4b-9d34-0c2cb8777d9a#note-page-title",
  "pageReference": "2f4a9f80-b7db-4f4b-9d34-0c2cb8777d9a",
  "contentLabel": "Note Page title and content",
  "contentReference": "2f4a9f80-b7db-4f4b-9d34-0c2cb8777d9a:page-content",
  "contentPreview": "Title: Reported note title\n\nContent: Reported note body",
  "reportTitle": "Needs review",
  "reportExplanation": "This title is not appropriate for a public note.",
  "resolutionText": "Reviewed and recorded for moderation follow-up.",
  "reporterDisplayName": "site-compliance-reporter",
  "reviewerDisplayName": "site-compliance-admin",
  "createdUtc": "2026-03-18T18:00:00Z",
  "reviewedUtc": "2026-03-18T18:10:00Z"
}

Revisión de superadministrador

GET /api/compliance/reports Portador + SuperAdmin
PUT /api/compliance/reports/{contentReportId} Portador + SuperAdmin

La lista de administradores incluye el enlace del informe, los metadatos de la página, los metadatos del contenido ofensivo, la identidad del denunciante cuando esté disponible y cualquier nota de revisión anterior. Las actualizaciones escriben el estado de revisión actual y el texto de resolución visible.

{
  "status": 1,
  "resolutionText": "Review opened and queued for follow-up."
}

Establezca el estado en 2 e incluya un texto de resolución que no esté vacío al cerrar un informe como resuelto.

Valores de enumeración

  • pageType: 0 La página de perfil, 1 página del equipo, 2 página de notas, 3 La página rastreable, 4 página de grupo rastreable, 5 error del sistema, 6 pagina de soporte
  • contentType: 0 título, 1 descripción, 2 comentario, 3 cuerpo, 4 biografía, 5 título y contenido, 6 detalles del error, 7 imagen, 8 solicitud de soporte
  • status: 0 informado, 1 revisando la sección, 2 resuelto

Los informes a nivel de página del sitio web ahora usan 5, por lo que un botón de informe puede cubrir tanto el título visible como la descripción/cuerpo visible juntos. Los informes a nivel de comentarios todavía utilizan los tipos de contenido específicos de comentarios.

Las solicitudes generales de soporte del sitio crean tickets de Pagina de soporte y Solicitud de soporte en el mismo almacen COMPLIANCE.ContentReports, aunque el formulario del navegador use la pagina de soporte en lugar de esta ruta API directa.

Los errores de sitios web, API y aplicaciones de Android rastreados se almacenan en LOG.Errors. Cuando trackInSupportTickets está habilitado, el ticket de soporte vinculado también aparece en COMPLIANCE.ContentReports, por lo que la revisión del superadministrador y el estado del reportero siguen el mismo flujo de trabajo.

Metadatos del sistema y beta

GET /api/system/status Anónimo

Use este endpoint para comprobaciones de estado, control de compatibilidad de Android, la URL actual de la página beta y el estado resuelto de mapa y privacidad para la solicitud actual.

GET /api/system/beta-android Anónimo

Devuelve metadatos beta de Android preparados, incluida la versión para mostrar, el código de versión, la versión mínima compatible y las notas de la versión.

GET /api/system/ip-location Anónimo

Devuelve la mejor ubicacion basada en IP para la solicitud actual, util para centrar mapas y diagnosticar problemas. Cuando la IP del cliente es privada, local o no confiable por otro motivo, la respuesta sigue siendo HTTP 200 y explica la falla en failureReason en lugar de generar un error de transporte.

GET /api/system/coordinate-locality Anónimo

Hace geocodificacion inversa de un par latitud/longitud a etiquetas de ciudad, estado/provincia y pais para los flujos del planificador de paradas y seleccion del mapa. Las coordenadas no validas devuelven una carga util sin excepcion con resolved=false y failureReason=invalid-coordinates.

  • requestedExperienceMode frente a effectiveExperienceMode le dice si la preferencia del usuario autenticado sobrevivio a las reglas de privacidad aplicadas a la solicitud o si fue rebajada a no_3rd_parties.
  • requestedMapSource, preferredMapSource y fallbackMapSource le dicen que proveedor pidio el usuario, cual quiere intentar primero el servidor y cual debe cargarse despues si falla la fuente preferida.
  • thirdPartyBrowserCallsAllowed, googleMapsAllowed y openStreetMapAllowed le dicen si esta solicitud puede llamar a proveedores del navegador.
  • hostedMapsForcedByPrivacy mas hostedMapTileUrlTemplate le indican cuando la solicitud fue forzada a teselas alojadas del mismo origen, que actualmente se representan mediante /maps/tiles/{z}/{x}/{y}.png.

Las solicitudes desde redes privadas, redes locales u otras IP que no puedan resolverse toman intencionalmente la ruta mas estricta, por lo que una prueba en localhost o en una red de oficina puede mostrar legitimamente no_3rd_parties y hosted_maps incluso cuando la preferencia del usuario autenticado era distinta.

curl "https://www.locationnotes.com/api/system/status"
{
  "status": "online",
  "utcNow": "2026-03-13T21:15:00Z",
  "androidMinimumCompatibleDisplayVersion": "1.0.0-beta.20260313.2",
  "androidMinimumCompatibleVersionCode": "2026031302",
  "androidCompatibilityMessage": "The API changed after older beta builds were published. Update to the latest beta before syncing or using live team management.",
  "androidBetaPageUrl": "https://www.locationnotes.com/es-US/account/beta",
  "requestedExperienceMode": "latest_and_greatest",
  "effectiveExperienceMode": "no_3rd_parties",
  "usesSavedExperienceModePreference": false,
  "usesVisitorExperienceModePreferenceCookie": false,
  "thirdPartyBrowserCallsAllowed": false,
  "requestedMapSource": "google_maps",
  "preferredMapSource": "hosted_maps",
  "fallbackMapSource": "hosted_maps",
  "usesSavedMapPreference": false,
  "usesVisitorMapPreferenceCookie": false,
  "googleMapsAllowed": false,
  "googleMapsConfigured": false,
  "openStreetMapAllowed": false,
  "openStreetMapConfigured": true,
  "hostedMapsConfigured": true,
  "hostedMapsForcedByPrivacy": true,
  "hostedMapTileUrlTemplate": "/maps/tiles/{z}/{x}/{y}.png"
}
curl "https://www.locationnotes.com/api/system/ip-location"
{
  "resolved": true,
  "clientIpAddress": "50.77.187.28",
  "lookupIpAddress": "50.77.187.28",
  "usedDevelopmentFallbackIp": false,
  "sourceKind": "IpAddress",
  "coordinateSourceProvider": "IpInfoDb",
  "localitySourceProvider": "IpInfoDb",
  "latitude": 41.8758,
  "longitude": -87.6206,
  "city": "Chicago",
  "stateOrProvince": "Illinois",
  "country": "United States of America",
  "isApproximate": true,
  "accuracyRadiusKm": null,
  "failureReason": ""
}
curl "https://www.locationnotes.com/api/system/coordinate-locality?latitude=41.8818&longitude=-87.6231"
{
  "resolved": true,
  "sourceKind": "Coordinates",
  "coordinateSourceProvider": "StopPlanner",
  "localitySourceProvider": "HostedMapPostGIS",
  "latitude": 41.8818,
  "longitude": -87.6231,
  "city": "Chicago",
  "stateOrProvince": "Illinois",
  "country": "United States",
  "isApproximate": false,
  "accuracyRadiusKm": null,
  "failureReason": ""
}

Inventario completo de rutas

Esta sección es la lista exhaustiva de verbos y rutas para la superficie actual de la API de LocationNotes, incluidas las rutas de identidad administradas por el marco bajo /api/auth. Las secciones detalladas anteriores explican los flujos principales; este inventario es la fuente de verdad a nivel de ruta y debe mantenerse alineado con la tabla de puntos finales en vivo.

Autenticacion de identidad y seguridad de la cuenta

  • POST /api/auth/register Anónimo
  • POST /api/auth/login Anónimo
  • POST /api/auth/refresh Anónimo
  • GET /api/auth/confirmEmail Anónimo
  • POST /api/auth/resendConfirmationEmail Anónimo
  • POST /api/auth/forgotPassword Anónimo
  • POST /api/auth/resetPassword Anónimo
  • GET /api/auth/manage/info Portador
  • POST /api/auth/manage/info Portador
  • POST /api/auth/manage/2fa Portador

Cuenta, sistema, sincronizacion y enlaces externos

  • DELETE /api/account Portador
  • GET /api/system/status Anónimo
  • GET /api/system/beta-android Anónimo
  • GET /api/system/ip-location Anónimo
  • GET /api/system/coordinate-locality Anónimo
  • POST /api/sync/push Portador
  • POST /api/sync/pull Portador
  • POST /api/external-links/verify Portador

Notas y paginas publicas de notas

  • GET /api/notes/public/bounds Anónimo
  • GET /api/notes/public/nearby Anónimo
  • GET /api/notes/mine Portador
  • POST /api/notes/mine Portador
  • GET /api/notes/mine/gpx Portador
  • POST /api/notes/mine/gpx Portador
  • POST /api/notes/mine/{noteId}/move Portador
  • DELETE /api/notes/mine/{noteId} Portador
  • GET /api/public/profiles/{userName}/notes/nearby Anónimo o Portador
  • GET /api/public/teams/{teamName}/notes/nearby Anónimo o Portador
  • GET /api/public/notes/{noteId} Anónimo o Portador
  • GET /api/public/notes/{noteId}/comments Anónimo o Portador
  • POST /api/public/notes/{noteId}/comments Portador
  • GET /api/public/notes/{noteId}/trackables Anónimo o Portador
  • POST /api/public/notes/{noteId}/trackables Portador

Categorias y arboles del area de trabajo

  • GET /api/categories/mine Portador
  • GET /api/categories/mine/tree Portador
  • GET /api/categories/mine/tree/sections Portador
  • GET /api/categories/mine/tree/children Portador
  • POST /api/categories/mine Portador
  • POST /api/categories/mine/{categoryId}/move Portador
  • DELETE /api/categories/mine/{categoryId} Portador

Equipos, membresias y enlaces de invitacion

  • GET /api/teams Portador
  • POST /api/teams Portador
  • PUT /api/teams/{teamId}/settings Portador
  • GET /api/teams/{teamId}/notes Portador
  • GET /api/teams/{teamId}/notes/gpx Portador
  • DELETE /api/teams/{teamId}/notes/{noteId} Portador
  • POST /api/teams/{teamId}/notes Portador
  • POST /api/teams/{teamId}/notes/gpx Portador
  • POST /api/teams/{teamId}/notes/{noteId}/move Portador
  • DELETE /api/teams/{teamId}/notes/{noteId}/delete Portador
  • GET /api/teams/{teamId}/categories Portador
  • GET /api/teams/{teamId}/categories/tree Portador
  • GET /api/teams/{teamId}/categories/tree/sections Portador
  • GET /api/teams/{teamId}/categories/tree/children Portador
  • POST /api/teams/{teamId}/categories Portador
  • POST /api/teams/{teamId}/categories/{categoryId}/move Portador
  • DELETE /api/teams/{teamId}/categories/{categoryId} Portador
  • POST /api/teams/{teamId}/memberships/request Portador
  • POST /api/teams/{teamId}/memberships/invite Portador
  • POST /api/teams/{teamId}/memberships/{membershipId}/accept Portador
  • POST /api/teams/{teamId}/memberships/{membershipId}/refuse Portador
  • POST /api/teams/{teamId}/memberships/{membershipId}/approve Portador
  • POST /api/teams/{teamId}/memberships/{membershipId}/deny Portador
  • POST /api/teams/{teamId}/memberships/{membershipId}/promote-admin Portador
  • DELETE /api/teams/{teamId}/memberships/{membershipId} Portador
  • GET /api/teams/{teamId}/invite-links Portador
  • POST /api/teams/{teamId}/invite-links Portador
  • DELETE /api/teams/{teamId}/invite-links/{inviteLinkId} Portador
  • POST /api/teams/invite-links/{teamSlug}/{inviteCode}/join Portador
  • DELETE /api/teams/{teamId} Portador

Trackables y sesiones activas con respaldo de codigo secreto

  • GET /api/trackables/public Anónimo o Portador
  • GET /api/trackables/mine Portador
  • GET /api/trackables/{trackableId} Anónimo o Portador
  • GET /api/trackables/{trackableId}/journey Anónimo o Portador
  • POST /api/trackables Portador
  • POST /api/trackables/groups Portador
  • POST /api/trackables/{trackableId}/activate Portador
  • POST /api/trackables/{trackableId}/watch Portador
  • DELETE /api/trackables/{trackableId}/watch Portador
  • DELETE /api/trackables/{trackableId}/group Portador
  • POST /api/trackables/{trackableId}/group Portador
  • POST /api/trackables/groups/{trackableGroupId}/watch Portador
  • DELETE /api/trackables/groups/{trackableGroupId}/watch Portador
  • GET /api/trackables/lookup Anónimo
  • POST /api/trackables/lookup Anónimo
  • GET /api/trackables/active Anónimo
  • GET /api/trackables/active/{trackableId} Anónimo
  • POST /api/trackables/active/{trackableId}/message Anónimo
  • DELETE /api/trackables/active/{trackableId} Anónimo
  • GET /api/trackables/{trackableId}/comments Anónimo o Portador
  • POST /api/trackables/{trackableId}/comments Anónimo o Portador
  • PUT /api/trackables/{trackableId}/comments/{commentId} Portador
  • DELETE /api/trackables/{trackableId}/comments/{commentId} Portador
  • POST /api/trackables/{trackableId}/journey-stops Anónimo o Portador
  • DELETE /api/trackables/{trackableId}/journey-stops/{journeyStopId} Portador

Imagenes y cumplimiento

  • GET /api/images/profiles/{userId} Anónimo o Portador
  • GET /api/images/notes/{noteId} Anónimo o Portador
  • GET /api/images/teams/{teamId} Anónimo o Portador
  • GET /api/images/trackables/{trackableId} Anónimo o Portador
  • GET /api/images/trackable-groups/{trackableGroupId} Anónimo o Portador
  • GET /api/images/{contentImageId}/{variant} Anónimo o Portador
  • POST /api/images/profiles Portador
  • POST /api/images/notes/{noteId} Portador
  • POST /api/images/teams/{teamId} Portador
  • POST /api/images/trackables/{trackableId} Portador
  • POST /api/images/trackable-groups/{trackableGroupId} Portador
  • DELETE /api/images/{contentImageId} Portador
  • POST /api/compliance/reports Anónimo o Portador
  • POST /api/compliance/errors Anónimo o Portador
  • GET /api/compliance/reports/mine Portador
  • GET /api/compliance/reports/{contentReportId} Portador
  • GET /api/compliance/reports Portador + SuperAdmin
  • PUT /api/compliance/reports/{contentReportId} Portador + SuperAdmin

Eliminar cuenta de la API

Los clientes autenticados pueden eliminar permanentemente la cuenta actual y los datos personales sincronizados a través de la API. Lea el Eliminar datos página primero si necesita las reglas de retención completas para las exportaciones y los datos propiedad del equipo.

La limpieza rastreable no es todo o nada. El servidor elimina la actividad rastreable personal del usuario eliminado cuando puede, pero no elimina los rastreables compartidos, los rastreables propiedad del equipo ni el historial de otros usuarios solo porque se elimina una cuenta. Si un rastreable propiedad del equipo todavía es importante para el equipo, permanece en ese equipo. Si la actividad de otra persona todavía está adjunta a un rastreable, ese rastreable permanece en el sistema.

DELETE /api/account Portador
curl -X DELETE "https://www.locationnotes.com/api/account" \
  -H "Authorization: Bearer <access token>"
{
  "deletedAccount": true,
  "notesDeleted": 14,
  "categoriesDeleted": 6,
  "linkedProvidersDeleted": 2
}

Errores y detalles del problema

Los errores de validación, permisos y búsqueda devuelven códigos de estado HTTP estándar. Muchas rutas de espacios de trabajo devuelven JSON de detalles de problemas estilo RFC 7807 con un título, detalle y estado.

{
  "title": "Forbidden",
  "code": "trackable_access_code_required",
  "detail": "Sign in, keep this trackable active on this browser, or provide this trackable's secret code or QR access code before posting comments or location reports.",
  "status": 403
}
  • 400 para validación o rechazo de reglas comerciales
  • 401 para autenticación faltante o no válida
  • 403 para usuarios autenticados que no tienen acceso
  • 404 para notas, categorías, equipos, membresías o enlaces de invitación faltantes

Las rutas de escritura de trackables tambien agregan una propiedad code estable para que los clientes de la API puedan distinguir casos como trackable_access_code_required, trackable_access_code_invalid, trackable_activation_required, y trackable_already_activated sin analizar el texto en inglés. El mapeo completo está documentado en el página de referencia de errores rastreables.