<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alexander Prokofiev</title>
    <description>The latest articles on DEV Community by Alexander Prokofiev (@revan_dondego).</description>
    <link>https://dev.to/revan_dondego</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3846765%2F20d98fa5-7a54-473e-a8d8-59b7c31f3954.png</url>
      <title>DEV Community: Alexander Prokofiev</title>
      <link>https://dev.to/revan_dondego</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/revan_dondego"/>
    <language>en</language>
    <item>
      <title>What happens to an agent’s PASS after a dependency upgrade?</title>
      <dc:creator>Alexander Prokofiev</dc:creator>
      <pubDate>Tue, 29 Sep 2026 23:26:58 +0000</pubDate>
      <link>https://dev.to/revan_dondego/what-happens-to-an-agents-pass-after-a-dependency-upgrade-1lbd</link>
      <guid>https://dev.to/revan_dondego/what-happens-to-an-agents-pass-after-a-dependency-upgrade-1lbd</guid>
      <description>&lt;p&gt;A PASS is a statement about an observation. It is not a permanent property of a package, a service, or a fix.&lt;/p&gt;

&lt;p&gt;If an agent reports that a workaround passed with dependency version 3.2, then the dependency moves to 4.0, what should the next agent believe? Deleting the old PASS loses useful history. Reusing it as evidence for 4.0 silently widens what the observation actually proved.&lt;/p&gt;

&lt;p&gt;The useful answer sits between those two mistakes: keep the historical result, keep its scope attached, and require new evidence before claiming the new version passes.&lt;/p&gt;

&lt;p&gt;In an &lt;a href="https://dev.to/revan_dondego/i-made-claude-and-perplexity-share-a-durable-task-then-hit-an-identity-problem-1ocn"&gt;earlier post about sharing a task between Claude and Perplexity&lt;/a&gt;, I wrote about a related boundary: two agent identities under one operator show interoperability, but do not establish two independent reproductions. The follow-up discussion sharpened the problem. Who observed a result, what evidence grounds it, and whether it applies to the current dependency are separate questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  A version change opens a new evidence question
&lt;/h2&gt;

&lt;p&gt;Suppose a report says a workaround passed with &lt;code&gt;example-package@3.2&lt;/code&gt;. The package is now at &lt;code&gt;4.0&lt;/code&gt;, and nobody has rerun the relevant check.&lt;/p&gt;

&lt;p&gt;The old result is still meaningful. It says a particular observation passed against 3.2 in a recorded environment. It does not answer what happens on 4.0. Until somebody runs that check, the 4.0 state is unknown. Unknown is not a failure; it is the absence of a new observation.&lt;/p&gt;

&lt;p&gt;Here is a small &lt;strong&gt;illustrative design&lt;/strong&gt;, not a real execution record or a current API contract. The identifier-like values are fictional placeholders that bind an outcome to the exact claim and check revisions; they are not hashes and do not prove correctness:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;observation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;illustrative-observation-1&lt;/span&gt;
  &lt;span class="na"&gt;claim_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;illustrative-claim-1&lt;/span&gt;
  &lt;span class="na"&gt;claim_revision&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
  &lt;span class="na"&gt;check_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;illustrative-check-1&lt;/span&gt;
  &lt;span class="na"&gt;check_revision&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
  &lt;span class="na"&gt;dependency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example-package@3.2&lt;/span&gt;
  &lt;span class="na"&gt;outcome&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PASS&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;captured environment&amp;gt;&lt;/span&gt;
  &lt;span class="na"&gt;evidence&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;sanitized execution record&amp;gt;&lt;/span&gt;
  &lt;span class="na"&gt;lineage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;executed_here&lt;/span&gt;

&lt;span class="na"&gt;derived_applicability&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;dependency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example-package@4.0&lt;/span&gt;
  &lt;span class="na"&gt;claim_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;illustrative-claim-1&lt;/span&gt;
  &lt;span class="na"&gt;claim_revision&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
  &lt;span class="na"&gt;check_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;illustrative-check-1&lt;/span&gt;
  &lt;span class="na"&gt;check_revision&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
  &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NOT_ESTABLISHED&lt;/span&gt;
  &lt;span class="na"&gt;basis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no observation for &lt;/span&gt;&lt;span class="m"&gt;4.0&lt;/span&gt;
  &lt;span class="na"&gt;related_history&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;illustrative-observation-1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second block is a derived applicability view, not an observation: it does not overwrite or revoke the historical PASS, and it records no 4.0 run. If someone runs the check at 4.0, that should create a new observation with its own environment and evidence. A PASS or FAIL then describes that run. Editing the proposed fix or the check creates a new claim or check revision and therefore a new evaluation subject, even if the package remains at 3.2. If two runs disagree under what appears to be the same conditions, record an unresolved conflict and investigate the missing variable. “Newest wins” would hide the question that needs answering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three design decisions that keep the record honest
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Bind an outcome to the thing and context that were tested.&lt;/strong&gt; A result should identify the dependency or service version, the relevant configuration, and enough environment detail to judge whether another run is comparable. When available, include a build or artifact identifier, source references, and a sanitized record of what was executed. “It passed” without a subject and context is difficult to reuse safely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Preserve old evidence without carrying its scope forward.&lt;/strong&gt; A version change is a reason to ask a new question, not a reason to erase history or claim the next version failed. Not every meaningful change arrives with a neat version number: hosted APIs, model behavior, authentication policy, regional behavior, and infrastructure defaults can move independently. A date can help locate an observation, but age alone does not establish staleness. Prefer an explicit “not rechecked against this change” state to automatic decay that pretends to know what changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Keep lineage and disagreement visible.&lt;/strong&gt; A second agent may have run a fresh test, inherited the first agent’s transcript, or repeated a source without running anything. Those are different paths. Record whether an observation was executed independently or derived from prior evidence, and preserve the source links. If outcomes conflict, show both observations and the unresolved status instead of averaging them into a score or selecting the newest one. There is no universal trust score that can safely replace the details a particular reader needs.&lt;/p&gt;

&lt;p&gt;This also shapes how summaries should work. A compact view can say that 3.2 has a recorded PASS and 4.0 has no observation. But the summary is a view over the evidence, not a new reproduction. The canonical record should remain inspectable and revisions should not silently rewrite what an earlier participant said.&lt;/p&gt;

&lt;p&gt;“Immutable” needs a boundary, too. Sanitization should happen before sharing, and a system still needs an explicit way to correct or remove material when privacy, rights, or policy require it. Preserving history is not a reason to keep sensitive data public forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the next agent should inherit
&lt;/h2&gt;

&lt;p&gt;After an upgrade, the next agent should inherit the old PASS with its version and environment, not a broader claim that the fix works now. It should also see what changed, whether a new run exists, and whether any result was inherited rather than independently executed.&lt;/p&gt;

&lt;p&gt;That leaves the reader with a useful starting point and an honest boundary: this worked under those conditions; the upgraded dependency remains untested. The old work is not wasted, and the new question is clear.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;AI disclosure: AI agents drafted and edited this article from the ideas in my earlier DEV post and its discussion. The new text has not been manually rewritten by me; the schema above is an illustrative design, not a report of an executed test.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover image disclosure: AI-generated illustration. The v1/v2 labels are generic; the image does not depict the example package versions or a real test.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>architecture</category>
      <category>debugging</category>
    </item>
    <item>
      <title>I made Claude and Perplexity share a durable task - then hit an identity problem</title>
      <dc:creator>Alexander Prokofiev</dc:creator>
      <pubDate>Mon, 14 Sep 2026 22:29:07 +0000</pubDate>
      <link>https://dev.to/revan_dondego/i-made-claude-and-perplexity-share-a-durable-task-then-hit-an-identity-problem-1ocn</link>
      <guid>https://dev.to/revan_dondego/i-made-claude-and-perplexity-share-a-durable-task-then-hit-an-identity-problem-1ocn</guid>
      <description>&lt;p&gt;AI agents are getting better at solving problems.&lt;br&gt;
They are still surprisingly bad at remembering what another agent already learned.&lt;br&gt;
I kept running into the same pattern:&lt;br&gt;
Claude debugs something in one session.&lt;br&gt;
Codex discovers the same failure two days later.&lt;br&gt;
Another agent researches the same API limitation from scratch.&lt;br&gt;
The model may be different, the application may be different, but the operational experience is usually trapped inside one conversation.&lt;br&gt;
So I started experimenting with a shared layer where agents could leave structured experience for each other.&lt;br&gt;
Not just documents.&lt;br&gt;
Something closer to:&lt;br&gt;
&lt;code&gt;Problem&lt;br&gt;
  ↓&lt;br&gt;
Solution&lt;br&gt;
  ↓&lt;br&gt;
Outcome&lt;br&gt;
  ↓&lt;br&gt;
PASS / FAIL / limitation&lt;/code&gt;&lt;br&gt;
And, for questions that cannot be answered immediately:&lt;br&gt;
&lt;code&gt;Agent A asks&lt;br&gt;
  ↓&lt;br&gt;
shared durable task&lt;br&gt;
  ↓&lt;br&gt;
Agent B replies later&lt;br&gt;
  ↓&lt;br&gt;
Agent A retrieves the reply&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That led to an interesting test.&lt;br&gt;
Claude asks, Perplexity answers&lt;br&gt;
I connected Claude and Perplexity to the same shared knowledge layer through agent-facing interfaces.&lt;br&gt;
The flow was:&lt;br&gt;
&lt;code&gt;Claude&lt;br&gt;
  ↓&lt;br&gt;
creates a durable question&lt;br&gt;
  ↓&lt;br&gt;
Knowledge layer&lt;br&gt;
  ↓&lt;br&gt;
Perplexity finds the question&lt;br&gt;
  ↓&lt;br&gt;
Perplexity replies&lt;br&gt;
  ↓&lt;br&gt;
Knowledge layer&lt;br&gt;
  ↓&lt;br&gt;
Claude retrieves the reply later&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzt21v78mwev6mkwiffw1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzt21v78mwev6mkwiffw1.gif" alt="Animation showing Claude sending a durable question to Knowledge for Agents, Perplexity replying through the same shared layer, and Claude later retrieving the response." width="640" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was performed through actual hosted AI products rather than two instances of the same local agent framework.&lt;br&gt;
That part worked.&lt;br&gt;
But the more interesting problem appeared immediately afterward.&lt;br&gt;
Two agents do not necessarily mean two independent observations&lt;br&gt;
Claude and Perplexity were different agent identities.&lt;br&gt;
But both were operated by me.&lt;br&gt;
That distinction matters.&lt;br&gt;
Suppose an agent publishes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This fix works.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then another agent records:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PASS — reproduced successfully.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At first glance that looks like independent corroboration.&lt;br&gt;
But what if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;both agents belong to the same human;&lt;/li&gt;
&lt;li&gt;both inherited the same context;&lt;/li&gt;
&lt;li&gt;both were given the same assumptions;&lt;/li&gt;
&lt;li&gt;both ultimately relied on the same source;&lt;/li&gt;
&lt;li&gt;or one agent simply repeated information produced by the other?
Counting that as two independent reproductions would manufacture confidence.
So in the system I am building, agent identity and operator identity are separate concepts.
The Claude/Perplexity experiment therefore means:
&lt;code&gt;2 agent identities
1 operator
= interoperability evidence
≠ independent reproduction&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That sounds like a small bookkeeping detail.&lt;br&gt;
I think it becomes a fairly fundamental issue once agents start sharing knowledge with each other.&lt;br&gt;
Successful answers are not enough&lt;br&gt;
There is another thing I wanted the knowledge model to preserve: failure.&lt;br&gt;
Most knowledge systems naturally converge on the final answer.&lt;br&gt;
Agent work often looks more like this:&lt;br&gt;
`Problem&lt;/p&gt;

&lt;p&gt;Attempt A&lt;br&gt;
FAIL — wrong API version&lt;/p&gt;

&lt;p&gt;Attempt B&lt;br&gt;
FAIL — works locally, fails behind proxy&lt;/p&gt;

&lt;p&gt;Attempt C&lt;br&gt;
PASS — environment X, version Y&lt;/p&gt;

&lt;p&gt;Later:&lt;br&gt;
FAIL — version Z changed the behavior&lt;code&gt;&lt;br&gt;
For the next agent, Attempt A and Attempt B may be as valuable as Attempt C.&lt;br&gt;
They prevent repeated exploration.&lt;br&gt;
So the useful unit of shared agent knowledge is not simply:&lt;br&gt;
&lt;/code&gt;question → answer&lt;code&gt;&lt;br&gt;
It is closer to:&lt;br&gt;
&lt;/code&gt;problem&lt;br&gt;
→ proposed solution&lt;br&gt;
→ observed outcome&lt;br&gt;
→ environment&lt;br&gt;
→ evidence&lt;br&gt;
→ limitations&lt;br&gt;
→ provenance`&lt;br&gt;
That also means a system should be able to say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We do not know.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This worked once under these conditions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;instead of collapsing everything into a single canonical answer.&lt;br&gt;
Why I did not put an LLM in the middle&lt;br&gt;
One design decision was to keep the shared layer itself deterministic.&lt;br&gt;
Reading a stored result should not trigger another model to reinterpret or regenerate it.&lt;br&gt;
If an agent recorded:&lt;br&gt;
&lt;code&gt;FAIL&lt;br&gt;
Node 24&lt;br&gt;
macOS&lt;br&gt;
spawn npx ENOENT&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;another agent should be able to retrieve exactly that observation.&lt;br&gt;
The server can structure, index and connect knowledge.&lt;br&gt;
It does not need to invent a new answer every time someone reads it.&lt;br&gt;
That gives a useful separation:&lt;br&gt;
`AI agents produce observations&lt;/p&gt;

&lt;p&gt;shared infrastructure stores provenance&lt;/p&gt;

&lt;p&gt;other AI agents decide how much to trust and reuse them`&lt;br&gt;
It also makes the knowledge usable by systems with very different models and vendors.&lt;br&gt;
Synchronous tools and asynchronous questions are different problems&lt;br&gt;
This experiment also made another distinction clearer to me.&lt;br&gt;
Sometimes an agent needs:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Search the existing knowledge now.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That maps naturally to a tool protocol such as MCP.&lt;br&gt;
But sometimes the request is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nobody has answered this yet. Ask the network and let me come back later.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is a different interaction model.&lt;br&gt;
The caller needs a durable task rather than a synchronous tool response.&lt;br&gt;
So I ended up treating those as separate primitives:&lt;br&gt;
`MCP:&lt;br&gt;
What does the network already know?&lt;/p&gt;

&lt;p&gt;Asynchronous task:&lt;br&gt;
Ask the network and let me return later.`&lt;br&gt;
Trying to force both into one synchronous request makes the second case awkward very quickly.&lt;br&gt;
The part I am still unsure about&lt;br&gt;
Transport is relatively easy compared with trust.&lt;br&gt;
Once multiple agents can share operational experience, several questions become much harder:&lt;br&gt;
How should an agent decide whether another agent's PASS is worth trusting?&lt;br&gt;
How much should operator independence matter?&lt;br&gt;
Should reproduction across different models count more strongly?&lt;br&gt;
What happens when two credible agents publish conflicting outcomes?&lt;br&gt;
How quickly should old outcomes decay when dependencies and APIs change?&lt;br&gt;
And should a failed approach increase confidence in another solution — or simply remain a warning attached to one environment?&lt;br&gt;
Those seem less like retrieval problems and more like social/provenance problems for machines.&lt;br&gt;
The Claude → Perplexity exchange convinced me that cross-vendor transport is possible.&lt;br&gt;
It also convinced me that transport may be the easy part.&lt;br&gt;
The difficult problem is deciding what an agent should believe after the message arrives.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>agents</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Making a Local Events API Discoverable to Developers and AI Assistants</title>
      <dc:creator>Alexander Prokofiev</dc:creator>
      <pubDate>Thu, 21 May 2026 23:14:32 +0000</pubDate>
      <link>https://dev.to/revan_dondego/making-a-local-events-api-discoverable-to-developers-and-ai-assistants-4i07</link>
      <guid>https://dev.to/revan_dondego/making-a-local-events-api-discoverable-to-developers-and-ai-assistants-4i07</guid>
      <description>&lt;p&gt;Local cultural data should not only live as web pages.&lt;br&gt;
That is the idea behind the public discovery layer we just shipped for the DondeGo API.&lt;br&gt;
DondeGo is a local discovery platform for Barcelona and Madrid, focused on events, places, cultural life, and local news. We are building it as a media and discovery product, but we also want the data surface to be understandable by developers, API clients, documentation tools, and AI assistants.&lt;br&gt;
So instead of only publishing a human-readable API page, we built a small discovery package around the API.&lt;br&gt;
It includes OpenAPI, llms.txt, an API Catalog linkset, Postman documentation, examples, and a documentation-only Agent Skills index.&lt;br&gt;
The goal is simple:&lt;br&gt;
make the API easier to discover, understand, cite, and use without pretending to support capabilities that do not exist yet.&lt;/p&gt;
&lt;h2&gt;
  
  
  What is live
&lt;/h2&gt;

&lt;p&gt;Here are the main public entry points.&lt;br&gt;
OpenAPI 3.1:&lt;br&gt;
&lt;a href="https://dondego.es/openapi.json" rel="noopener noreferrer"&gt;https://dondego.es/openapi.json&lt;/a&gt;&lt;br&gt;
llms.txt:&lt;br&gt;
&lt;a href="https://dondego.es/llms.txt" rel="noopener noreferrer"&gt;https://dondego.es/llms.txt&lt;/a&gt;&lt;br&gt;
API Catalog linkset:&lt;br&gt;
&lt;a href="https://dondego.es/.well-known/api-catalog" rel="noopener noreferrer"&gt;https://dondego.es/.well-known/api-catalog&lt;/a&gt;&lt;br&gt;
Rich DondeGo discovery JSON:&lt;br&gt;
&lt;a href="https://dondego.es/api-catalog.json" rel="noopener noreferrer"&gt;https://dondego.es/api-catalog.json&lt;/a&gt;&lt;br&gt;
Documentation-only Agent Skills index:&lt;br&gt;
&lt;a href="https://dondego.es/.well-known/agent-skills/index.json" rel="noopener noreferrer"&gt;https://dondego.es/.well-known/agent-skills/index.json&lt;/a&gt;&lt;br&gt;
Postman documentation:&lt;br&gt;
&lt;a href="https://documenter.getpostman.com/view/55094507/2sBXwjvZRZ" rel="noopener noreferrer"&gt;https://documenter.getpostman.com/view/55094507/2sBXwjvZRZ&lt;/a&gt;&lt;br&gt;
GitHub repository:&lt;br&gt;
&lt;a href="https://github.com/revanbcn/DondeGo-API" rel="noopener noreferrer"&gt;https://github.com/revanbcn/DondeGo-API&lt;/a&gt;&lt;br&gt;
The repository also includes server-side examples for curl, Python, and Node:&lt;br&gt;
&lt;a href="https://github.com/revanbcn/DondeGo-API/tree/main/examples" rel="noopener noreferrer"&gt;https://github.com/revanbcn/DondeGo-API/tree/main/examples&lt;/a&gt;&lt;br&gt;
And a ready-to-import Postman Collection:&lt;br&gt;
&lt;a href="https://github.com/revanbcn/DondeGo-API/tree/main/postman" rel="noopener noreferrer"&gt;https://github.com/revanbcn/DondeGo-API/tree/main/postman&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Why not just publish OpenAPI?
&lt;/h2&gt;

&lt;p&gt;OpenAPI is the most important artifact, but it is not the whole discovery story.&lt;br&gt;
Different tools look for different signals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;developers want examples and a clear README&lt;/li&gt;
&lt;li&gt;API clients want OpenAPI&lt;/li&gt;
&lt;li&gt;Postman users want a collection&lt;/li&gt;
&lt;li&gt;LLM-oriented tools can benefit from llms.txt&lt;/li&gt;
&lt;li&gt;API discovery systems can use a linkset&lt;/li&gt;
&lt;li&gt;agents need short, explicit usage guidance&lt;/li&gt;
&lt;li&gt;partners need attribution and usage rules
So the discovery layer is intentionally made of several small, stable surfaces instead of one giant documentation page.
## Verified endpoint families
The current OpenAPI v0.1 spec is intentionally conservative.
It documents only endpoint families we have verified and are ready to describe clearly:
&lt;code&gt;GET /locations/
GET /events/
GET /events/{id}/
GET /places/
GET /places/{id}/
GET /news/
GET /news/{id}/
GET /events-of-the-day/
GET /search/?q=...&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We did not add endpoints just because they might exist somewhere.&lt;/p&gt;

&lt;p&gt;We did not document parameters that still need verification.&lt;/p&gt;

&lt;p&gt;We did not generate a huge speculative spec.&lt;/p&gt;

&lt;p&gt;The goal of v0.1 is to describe what can be described accurately.&lt;/p&gt;

&lt;p&gt;Quick example&lt;/p&gt;

&lt;p&gt;The public API base is:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dondego.es/public-api/v1.4" rel="noopener noreferrer"&gt;https://dondego.es/public-api/v1.4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;List supported locations:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;curl -s https://dondego.es/public-api/v1.4/locations/ | jq&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;List a few Barcelona event summaries:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;curl -s "https://dondego.es/public-api/v1.4/events/?location=barcelona&amp;amp;page_size=3" | jq&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Fetch event details:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"https://dondego.es/public-api/v1.4/events/{id}/?expand=place,images,dates,categories,tags,participants"&lt;/span&gt; | jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More complete examples are available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/revanbcn/DondeGo-API/tree/main/examples" rel="noopener noreferrer"&gt;https://github.com/revanbcn/DondeGo-API/tree/main/examples&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The detail-first attribution rule&lt;/p&gt;

&lt;p&gt;One important rule in the current API is event attribution.&lt;/p&gt;

&lt;p&gt;Event list rows are useful for discovery, but they do not expose everything needed for safe public rendering. In particular, list rows do not expose the canonical DondeGo event page URL.&lt;/p&gt;

&lt;p&gt;For public event rendering, the rule is:&lt;/p&gt;

&lt;p&gt;event list -&amp;gt; fetch event detail -&amp;gt; use EventDetail.site_url as the visible DondeGo source link&lt;/p&gt;

&lt;p&gt;This matters because any public website, app, newsletter, bot, AI assistant, or partner integration that displays DondeGo event descriptions or substantial DondeGo event data must include a visible direct link to the canonical DondeGo.es event page as the source.&lt;/p&gt;

&lt;p&gt;That rule is repeated across the docs, examples, Postman collection, llms.txt, and API catalog.&lt;/p&gt;

&lt;p&gt;It is not just a legal or SEO detail. It is part of making local data trustworthy.&lt;/p&gt;

&lt;p&gt;If a user sees an event recommendation in an app or assistant, they should be able to click through to the original canonical page.&lt;/p&gt;

&lt;p&gt;llms.txt&lt;/p&gt;

&lt;p&gt;We publish:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dondego.es/llms.txt" rel="noopener noreferrer"&gt;https://dondego.es/llms.txt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This file is a short LLM-oriented index.&lt;/p&gt;

&lt;p&gt;It points to the most important resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what DondeGo is&lt;/li&gt;
&lt;li&gt;what the public API covers&lt;/li&gt;
&lt;li&gt;where the OpenAPI spec lives&lt;/li&gt;
&lt;li&gt;where the API Catalog lives&lt;/li&gt;
&lt;li&gt;where examples live&lt;/li&gt;
&lt;li&gt;what attribution rule must be followed&lt;/li&gt;
&lt;li&gt;what is not supported yet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It does not magically make every model use the API.&lt;/p&gt;

&lt;p&gt;But it gives AI systems and developer tools a clear, stable, crawlable reference.&lt;/p&gt;

&lt;p&gt;API Catalog linkset&lt;/p&gt;

&lt;p&gt;We also publish:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dondego.es/.well-known/api-catalog" rel="noopener noreferrer"&gt;https://dondego.es/.well-known/api-catalog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is served as:&lt;/p&gt;

&lt;p&gt;application/linkset+json&lt;/p&gt;

&lt;p&gt;It links to the core discovery resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAPI&lt;/li&gt;
&lt;li&gt;documentation&lt;/li&gt;
&lt;li&gt;llms.txt&lt;/li&gt;
&lt;li&gt;attribution policy&lt;/li&gt;
&lt;li&gt;examples&lt;/li&gt;
&lt;li&gt;version history&lt;/li&gt;
&lt;li&gt;richer DondeGo discovery JSON&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The richer DondeGo-specific JSON is available separately:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dondego.es/api-catalog.json" rel="noopener noreferrer"&gt;https://dondego.es/api-catalog.json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This split is intentional.&lt;/p&gt;

&lt;p&gt;The .well-known/api-catalog route is a compact machine-readable linkset. The /api-catalog.json route carries richer DondeGo-specific context.&lt;/p&gt;

&lt;p&gt;Documentation-only Agent Skills&lt;/p&gt;

&lt;p&gt;We also publish a documentation-only Agent Skills index:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dondego.es/.well-known/agent-skills/index.json" rel="noopener noreferrer"&gt;https://dondego.es/.well-known/agent-skills/index.json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The important part is “documentation-only”.&lt;/p&gt;

&lt;p&gt;There are no scripts. No executable code. No hidden tool access. No permission escalation. No OAuth. No MCP transport.&lt;/p&gt;

&lt;p&gt;The skill exists to teach an AI agent how to discover and correctly use the DondeGo public API documentation.&lt;/p&gt;

&lt;p&gt;It explains the stable discovery URLs, verified endpoint families, attribution requirement, and detail-first event rendering rule.&lt;/p&gt;

&lt;p&gt;What we intentionally do not advertise&lt;/p&gt;

&lt;p&gt;This is probably the most important architectural decision in the whole package.&lt;/p&gt;

&lt;p&gt;We do not advertise OAuth or OIDC support, because DondeGo does not currently run an OAuth issuer.&lt;/p&gt;

&lt;p&gt;We do not publish OAuth Protected Resource Metadata, because the current public discovery package does not expose OAuth-protected scopes.&lt;/p&gt;

&lt;p&gt;We do not claim to have an MCP server.&lt;/p&gt;

&lt;p&gt;We do not claim to have WebMCP tools.&lt;/p&gt;

&lt;p&gt;We do not document date filters or the limit parameter in OpenAPI v0.1, because those still need separate verification.&lt;/p&gt;

&lt;p&gt;We do not publish browser-only examples yet, because CORS behavior should be handled deliberately, not assumed.&lt;/p&gt;

&lt;p&gt;Accurate discovery metadata is more useful than fake “agent-ready” metadata.&lt;/p&gt;

&lt;p&gt;If a site publishes machine-readable discovery files, those files should describe real capabilities.&lt;/p&gt;

&lt;p&gt;Postman documentation&lt;/p&gt;

&lt;p&gt;For developers who prefer Postman, we published public documentation:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://documenter.getpostman.com/view/55094507/2sBXwjvZRZ" rel="noopener noreferrer"&gt;https://documenter.getpostman.com/view/55094507/2sBXwjvZRZ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository also includes a ready-to-import Postman Collection v2.1:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/revanbcn/DondeGo-API/tree/main/postman" rel="noopener noreferrer"&gt;https://github.com/revanbcn/DondeGo-API/tree/main/postman&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The collection uses only public GET requests. It does not include environments, secrets, API keys, cookies, bearer tokens, or OAuth settings.&lt;/p&gt;

&lt;p&gt;What this enables&lt;/p&gt;

&lt;p&gt;This discovery layer is useful for several types of builders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;local newsletters that want to enrich issues with cultural events&lt;/li&gt;
&lt;li&gt;city guides that need venues and event details&lt;/li&gt;
&lt;li&gt;travel or lifestyle apps building a Barcelona or Madrid experience layer&lt;/li&gt;
&lt;li&gt;AI assistants that need structured local data instead of guessing&lt;/li&gt;
&lt;li&gt;developers who want to explore the API through OpenAPI or Postman&lt;/li&gt;
&lt;li&gt;partners who need clear attribution rules before building on the data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The package is not a huge platform launch.&lt;/p&gt;

&lt;p&gt;It is a foundation.&lt;/p&gt;

&lt;p&gt;But I think this foundation matters.&lt;/p&gt;

&lt;p&gt;Local media and cultural platforms should be easier to integrate with. They should publish machine-readable contracts. They should be understandable by AI-assisted tools. And they should be clear about attribution.&lt;/p&gt;

&lt;p&gt;That is the direction we are taking with DondeGo.&lt;/p&gt;

&lt;p&gt;Start here&lt;/p&gt;

&lt;p&gt;GitHub repository:&lt;br&gt;
&lt;a href="https://github.com/revanbcn/DondeGo-API" rel="noopener noreferrer"&gt;https://github.com/revanbcn/DondeGo-API&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Live OpenAPI:&lt;br&gt;
&lt;a href="https://dondego.es/openapi.json" rel="noopener noreferrer"&gt;https://dondego.es/openapi.json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Postman documentation:&lt;br&gt;
&lt;a href="https://documenter.getpostman.com/view/55094507/2sBXwjvZRZ" rel="noopener noreferrer"&gt;https://documenter.getpostman.com/view/55094507/2sBXwjvZRZ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;llms.txt:&lt;br&gt;
&lt;a href="https://dondego.es/llms.txt" rel="noopener noreferrer"&gt;https://dondego.es/llms.txt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;API Catalog:&lt;br&gt;
&lt;a href="https://dondego.es/.well-known/api-catalog" rel="noopener noreferrer"&gt;https://dondego.es/.well-known/api-catalog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are building a local guide, AI assistant, cultural newsletter, events app, map product, or city discovery experience for Barcelona or Madrid, I would be happy to talk.&lt;/p&gt;

&lt;p&gt;Partner access and integration discussions:&lt;br&gt;
&lt;strong&gt;&lt;a href="mailto:bcn@dondego.es"&gt;bcn@dondego.es&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>ai</category>
      <category>webdev</category>
      <category>openapi</category>
    </item>
    <item>
      <title>First real use case of the DondeGo API: daily event picks for Barcelona and Madrid</title>
      <dc:creator>Alexander Prokofiev</dc:creator>
      <pubDate>Mon, 04 May 2026 11:24:36 +0000</pubDate>
      <link>https://dev.to/dondego/first-real-use-case-of-the-dondego-api-daily-event-picks-for-barcelona-and-madrid-2m0</link>
      <guid>https://dev.to/dondego/first-real-use-case-of-the-dondego-api-daily-event-picks-for-barcelona-and-madrid-2m0</guid>
      <description>&lt;p&gt;We have reached a small but important milestone for DondeGo API.&lt;/p&gt;

&lt;p&gt;The first working use case is already live: we are using our API to power daily event selections for two local projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://x.com/HoyBcn" rel="noopener noreferrer"&gt;https://x.com/HoyBcn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/EnMadridHoy" rel="noopener noreferrer"&gt;https://x.com/EnMadridHoy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The idea is simple: every day, the system uses DondeGo data to select some of the best events happening today in Barcelona and Madrid.&lt;/p&gt;

&lt;p&gt;Instead of manually searching across dozens of pages, calendars and sources, we can now use a structured local data layer with events, cities, dates, categories and editorial signals. This makes it much easier to build useful local discovery products.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A local event project usually needs three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fresh event data&lt;/li&gt;
&lt;li&gt;A way to filter it by city, date and category&lt;/li&gt;
&lt;li&gt;Enough structure to build products on top of it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is exactly what we are building with DondeGo API.&lt;/p&gt;

&lt;p&gt;For our own use case, the API helps us answer questions like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is happening in Barcelona today?&lt;br&gt;
What are the most interesting events in Madrid today?&lt;br&gt;
Which events are good enough to recommend?&lt;br&gt;
How can we turn local data into a useful daily feed?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is still an early version, but it already shows the direction clearly.&lt;/p&gt;

&lt;p&gt;DondeGo API is not just a technical experiment. It is becoming a practical content layer for local discovery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want to build something with events in Barcelona or Madrid?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you are building a project about events, culture, local plans, maps, newsletters or city discovery in Barcelona or Madrid, we would be happy to share the data with you for free.&lt;/p&gt;

&lt;p&gt;The only thing we ask is simple:&lt;br&gt;
&lt;em&gt;Please link back to DondeGo as the source.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That helps us keep building the project, improve the data and support independent local media.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Possible use cases&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can use DondeGo API to build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;local event newsletters&lt;/li&gt;
&lt;li&gt;city guides&lt;/li&gt;
&lt;li&gt;interactive maps&lt;/li&gt;
&lt;li&gt;Telegram or WhatsApp bots&lt;/li&gt;
&lt;li&gt;daily event feeds&lt;/li&gt;
&lt;li&gt;cultural recommendation tools&lt;/li&gt;
&lt;li&gt;“what to do today” pages&lt;/li&gt;
&lt;li&gt;travel and expat guides&lt;/li&gt;
&lt;li&gt;niche projects for families, concerts, exhibitions or free events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We are especially interested in small independent projects, local builders and media experiments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/revanbcn/DondeGo-API" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/HoyBcn" rel="noopener noreferrer"&gt;Daily Barcelona events&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/EnMadridHoy" rel="noopener noreferrer"&gt;Daily Madrid events&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dondego.es/" rel="noopener noreferrer"&gt;DondeGo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to test the API or build something with local event data for Barcelona or Madrid, feel free to contact us.&lt;/p&gt;

&lt;p&gt;We would love to see more projects using structured local data to make city life easier to discover.&lt;/p&gt;

</description>
      <category>api</category>
      <category>madrid</category>
      <category>barcelona</category>
      <category>eventsinyourcity</category>
    </item>
    <item>
      <title>We’re opening our events &amp; local news API for Barcelona and Madrid. Free to use for side projects and products – the only requirement is a visible link back to the source.</title>
      <dc:creator>Alexander Prokofiev</dc:creator>
      <pubDate>Fri, 27 Mar 2026 22:47:56 +0000</pubDate>
      <link>https://dev.to/revan_dondego/were-opening-our-events-local-news-api-for-barcelona-and-madrid-free-to-use-for-side-projects-1ja5</link>
      <guid>https://dev.to/revan_dondego/were-opening-our-events-local-news-api-for-barcelona-and-madrid-free-to-use-for-side-projects-1ja5</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/dondego/we-built-an-api-for-events-places-and-local-news-in-barcelona-and-madrid-1409" class="crayons-story__hidden-navigation-link"&gt;We built an API for events, places, and local news in Barcelona and Madrid&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/dondego"&gt;
            &lt;img alt="API for events in Madrid and Barcelona logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F12840%2F37d62ad3-34a2-4106-8c8f-f313711c89c0.jpg" class="crayons-logo__image" width="600" height="600"&gt;
          &lt;/a&gt;

          &lt;a href="/revan_dondego" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3846765%2F20d98fa5-7a54-473e-a8d8-59b7c31f3954.png" alt="revan_dondego profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/revan_dondego" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Alexander Prokofiev
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Alexander Prokofiev
                
              
              &lt;div id="story-author-preview-content-3417174" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/revan_dondego" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3846765%2F20d98fa5-7a54-473e-a8d8-59b7c31f3954.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Alexander Prokofiev&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/dondego" class="crayons-story__secondary fw-medium"&gt;API for events in Madrid and Barcelona&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/dondego/we-built-an-api-for-events-places-and-local-news-in-barcelona-and-madrid-1409" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 27&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/dondego/we-built-an-api-for-events-places-and-local-news-in-barcelona-and-madrid-1409" id="article-link-3417174"&gt;
          We built an API for events, places, and local news in Barcelona and Madrid
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/api"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;api&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/barcelona"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;barcelona&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/madrid"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;madrid&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opendata"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opendata&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/dondego/we-built-an-api-for-events-places-and-local-news-in-barcelona-and-madrid-1409" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/dondego/we-built-an-api-for-events-places-and-local-news-in-barcelona-and-madrid-1409#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>api</category>
      <category>barcelona</category>
      <category>madrid</category>
      <category>opendata</category>
    </item>
    <item>
      <title>We built an API for events, places, and local news in Barcelona and Madrid</title>
      <dc:creator>Alexander Prokofiev</dc:creator>
      <pubDate>Fri, 27 Mar 2026 22:34:02 +0000</pubDate>
      <link>https://dev.to/dondego/we-built-an-api-for-events-places-and-local-news-in-barcelona-and-madrid-1409</link>
      <guid>https://dev.to/dondego/we-built-an-api-for-events-places-and-local-news-in-barcelona-and-madrid-1409</guid>
      <description>&lt;h2&gt;
  
  
  Building a local API for events, places, and news in Barcelona and Madrid &lt;a href="https://github.com/revanbcn/DondeGo-API" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Most city products run into the same problem sooner or later.&lt;/p&gt;

&lt;p&gt;You want to answer simple questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is happening today?&lt;/li&gt;
&lt;li&gt;What is near these coordinates?&lt;/li&gt;
&lt;li&gt;Which places belong to this category?&lt;/li&gt;
&lt;li&gt;Which local news is still actually relevant?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But once you start building, local data is rarely clean enough. Events, places, and news often live in separate systems, use different filters, and do not map well to the way people actually explore a city.&lt;/p&gt;

&lt;p&gt;That is one of the reasons we started opening up the data layer behind DondeGo.&lt;/p&gt;

&lt;p&gt;DondeGo is a local media and city guide focused on &lt;strong&gt;Barcelona&lt;/strong&gt; and &lt;strong&gt;Madrid&lt;/strong&gt;. The editorial side is built around practical discovery: things to do, places to know, and local news that matters in city life. Recently, we have been turning more of that into an API that can be reused in real products.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the API is trying to solve
&lt;/h2&gt;

&lt;p&gt;The goal is not to build a huge generic directory.&lt;/p&gt;

&lt;p&gt;The goal is to make local urban content easier to work with for developers, editorial teams, maps, newsletters, recommendation tools, and city-focused products.&lt;/p&gt;

&lt;p&gt;Right now the API is centered around three main object types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;events&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;places&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;news&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That makes it possible to support workflows like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;showing events happening today in Madrid&lt;/li&gt;
&lt;li&gt;finding places within a radius from a point on the map&lt;/li&gt;
&lt;li&gt;filtering objects by tags or categories&lt;/li&gt;
&lt;li&gt;returning only current news items&lt;/li&gt;
&lt;li&gt;building city guides or local recommendation layers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Recent changes in v0.1.0
&lt;/h2&gt;

&lt;p&gt;We have just published &lt;strong&gt;v0.1.0&lt;/strong&gt;, partly because I wanted the project to have a visible public milestone and partly because the API has become much more usable recently.&lt;/p&gt;

&lt;p&gt;A few of the changes included in this version:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;daily events now also include films&lt;/li&gt;
&lt;li&gt;daily events can now return a title override&lt;/li&gt;
&lt;li&gt;event and place categories now expose identifiers&lt;/li&gt;
&lt;li&gt;filtering by tag slugs is supported via &lt;code&gt;tags&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;news now supports an &lt;code&gt;actual_only&lt;/code&gt; filter for current items&lt;/li&gt;
&lt;li&gt;event date serialization now includes:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;start_date&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;start_time&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;end_date&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;end_time&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;is_continuous&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;is_endless&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;is_startless&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;schedules&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;image serialization now includes authorship&lt;/li&gt;

&lt;li&gt;it is now possible to fetch only films with free screenings&lt;/li&gt;

&lt;li&gt;it is now possible to fetch only places with free events&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;is_free&lt;/code&gt; is now interpreted more strictly&lt;/li&gt;

&lt;li&gt;categories for events and places can now be disabled in collection responses&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;None of this is especially flashy, but it moves the API closer to being something that is genuinely usable in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  The kind of queries we care about
&lt;/h2&gt;

&lt;p&gt;The API is most useful when it reflects how people actually navigate a city.&lt;/p&gt;

&lt;p&gt;For example, a basic daily query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/v1/events/?location=madrid&amp;amp;date=hoy
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A proximity-based query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/v1/events/?lat=40.4168&amp;amp;lon=-3.7038&amp;amp;radius=3000&amp;amp;date=hoy
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And place discovery around a point:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/v1/places/?lat=41.3874&amp;amp;lon=2.1686&amp;amp;radius=2000
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That may sound simple, but in practice this is the layer many local products need most.&lt;/p&gt;

&lt;p&gt;Not “all possible city data”, but structured answers to questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what can I do today?&lt;/li&gt;
&lt;li&gt;what is nearby?&lt;/li&gt;
&lt;li&gt;what is free?&lt;/li&gt;
&lt;li&gt;what is still current?&lt;/li&gt;
&lt;li&gt;what belongs to this area or category?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I find local APIs interesting
&lt;/h2&gt;

&lt;p&gt;There are many great APIs in the world, but local discovery still feels oddly underserved.&lt;/p&gt;

&lt;p&gt;A lot of the difficulty is not in storing records. It is in making the data useful in the context of a real city. Dates matter. Geography matters. Editorial freshness matters. Category structure matters. Free vs paid matters. Sometimes a simple “today” filter matters more than a complex taxonomy.&lt;/p&gt;

&lt;p&gt;That is why I think local APIs are interesting. They sit somewhere between media, maps, structured data, and product design.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you are building in this space
&lt;/h2&gt;

&lt;p&gt;We are opening access gradually, but if you are working on a project around Barcelona or Madrid and need local events, places, or news, that is what we are building toward.&lt;/p&gt;

&lt;p&gt;The public project is here, a bit more context lives there: &lt;a href="https://dondego.es/" rel="noopener noreferrer"&gt;DondeGo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I would also be curious how other people here would design this kind of API.&lt;/p&gt;

&lt;p&gt;Would you prioritize geospatial search first, editorial freshness first, or category and tag structure first?&lt;/p&gt;

</description>
      <category>api</category>
      <category>barcelona</category>
      <category>madrid</category>
      <category>opendata</category>
    </item>
  </channel>
</rss>
