GEOCitation Agents API
The agents API from GEOCitation — 9 operation(s) for agents.
The agents API from GEOCitation — 9 operation(s) for agents.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/geocitation:geocitation-agents-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: GEOCitation Agents API
description: Citation Rank Intelligence — Content Gap & Market Audit API
version: 0.1.0
tags:
- name: Agents
paths:
/v1/agents/output-aggregator/run:
post:
tags:
- Agents
summary: Lancer le Graphe 3 Output Engine sur un audit Graphe 2 déjà terminé
operationId: run_output_aggregator_v1_agents_output_aggregator_run_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/OutputAggregatorRunRequest'
required: true
responses:
'202':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/OutputAggregatorRunResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
security:
- HTTPBearer: []
/v1/agents/fan-query/run-group:
post:
tags:
- Agents
summary: 'Multi-mot-clé : un run fan-query par mot-clé, regroupés sous un run parent'
operationId: run_fan_query_group_v1_agents_fan_query_run_group_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/FanQueryGroupRunRequest'
required: true
responses:
'202':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/FanQueryGroupRunResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
security:
- HTTPBearer: []
/v1/agents/fan-query/runs:
get:
tags:
- Agents
summary: Runs fan-query terminés pas encore utilisés par une campagne (reprise d'un…
operationId: list_fan_query_drafts_v1_agents_fan_query_runs_get
security:
- HTTPBearer: []
parameters:
- name: page
in: query
required: false
schema:
type: integer
minimum: 1
default: 1
title: Page
- name: page_size
in: query
required: false
schema:
type: integer
maximum: 100
minimum: 1
default: 20
title: Page Size
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/DraftRunsResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/v1/agents/fan-query/{audit_id}/queries:
patch:
tags:
- Agents
summary: Éditer/ajouter des queries sur un run fan-query terminé (human-in-the-loop)
operationId: patch_fan_query_queries_v1_agents_fan_query__audit_id__queries_patch
security:
- HTTPBearer: []
parameters:
- name: audit_id
in: path
required: true
schema:
type: string
format: uuid
title: Audit Id
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/FanQueryPatchRequest'
responses:
'200':
description: Successful Response
content:
application/json:
schema:
type: object
title: Response Patch Fan Query Queries V1 Agents Fan Query Audit Id Queries Patch
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/v1/agents/fan-query/import:
post:
tags:
- Agents
summary: Importer ses propres queries sans génération (crée un run fan-query terminé)
operationId: import_fan_query_v1_agents_fan_query_import_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/FanQueryImportRequest'
required: true
responses:
'201':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/AuditCreateResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
security:
- HTTPBearer: []
/v1/agents/{graph_name}/run:
post:
tags:
- Agents
summary: 'Lancer un graphe LangGraph (ex: fan-query)'
operationId: run_agent_graph_v1_agents__graph_name__run_post
security:
- HTTPBearer: []
parameters:
- name: graph_name
in: path
required: true
schema:
type: string
title: Graph Name
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AgentRunRequest'
responses:
'202':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/AuditCreateResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/v1/agents/{graph_name}/run-batch:
post:
tags:
- Agents
summary: 'Lancer N audits en une requête (bulk, ex: geo-query-audit)'
operationId: run_agent_graph_batch_v1_agents__graph_name__run_batch_post
security:
- HTTPBearer: []
parameters:
- name: graph_name
in: path
required: true
schema:
type: string
title: Graph Name
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BatchRunRequest'
responses:
'202':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/BatchRunResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/v1/agents/{graph_name}/schedule:
post:
tags:
- Agents
summary: 'Créer un déclenchement récurrent (Cloud Scheduler, ex: geo-query-audit)'
operationId: create_agent_schedule_v1_agents__graph_name__schedule_post
security:
- HTTPBearer: []
parameters:
- name: graph_name
in: path
required: true
schema:
type: string
title: Graph Name
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ScheduleCreateRequest'
responses:
'202':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ScheduleResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
get:
tags:
- Agents
summary: Lister les déclenchements récurrents du compte
operationId: list_agent_schedules_v1_agents__graph_name__schedule_get
security:
- HTTPBearer: []
parameters:
- name: graph_name
in: path
required: true
schema:
type: string
title: Graph Name
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ScheduleListResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/v1/agents/{graph_name}/schedule/{job_id}:
delete:
tags:
- Agents
summary: Supprimer un déclenchement récurrent
operationId: delete_agent_schedule_v1_agents__graph_name__schedule__job_id__delete
security:
- HTTPBearer: []
parameters:
- name: graph_name
in: path
required: true
schema:
type: string
title: Graph Name
- name: job_id
in: path
required: true
schema:
type: string
title: Job Id
responses:
'204':
description: Successful Response
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
components:
schemas:
FanQueryPatchRequest:
properties:
edits:
items:
$ref: '#/components/schemas/FanQueryEditItem'
type: array
title: Edits
additions:
items:
$ref: '#/components/schemas/FanQueryAdditionItem'
type: array
title: Additions
deletions:
items:
type: integer
type: array
maxItems: 32767
title: Deletions
type: object
title: FanQueryPatchRequest
description: 'PATCH human-in-the-loop entre Graphe 1 et Graphe 2 (sprint refonte
3-graphes, 2026-10-03+). edits/additions optionnels indépendamment, mais
au moins un des trois doit être non vide.'
DraftRun:
properties:
audit_id:
type: string
format: uuid
title: Audit Id
keyword:
type: string
title: Keyword
language:
type: string
title: Language
country:
type: string
title: Country
created_at:
type: string
format: date-time
title: Created At
queries_count:
type: integer
title: Queries Count
queries_by_engine:
additionalProperties:
type: integer
type: object
title: Queries By Engine
type: object
required:
- audit_id
- keyword
- language
- country
- created_at
- queries_count
title: DraftRun
description: 'Run fan-query terminé qu''aucune campagne n''utilise encore (reprise d''un
brouillon, sans relancer la génération).'
FanQueryImportItem:
properties:
query:
type: string
maxLength: 500
minLength: 1
title: Query
engine:
type: string
enum:
- gemini
- chatgpt
- perplexity
- ai_mode
title: Engine
default: gemini
category:
type: string
title: Category
default: custom
type: object
required:
- query
title: FanQueryImportItem
HTTPValidationError:
properties:
detail:
items:
$ref: '#/components/schemas/ValidationError'
type: array
title: Detail
type: object
title: HTTPValidationError
OutputAggregatorRunResponse:
properties:
audit_id:
type: string
format: uuid
title: Audit Id
status:
type: string
title: Status
default: accepted
type: object
required:
- audit_id
title: OutputAggregatorRunResponse
description: 'Pas de nouvelle ligne audits créée (décision Karim 2026-10-02) — on
renvoie l''audit_id source tel quel, le client poll GET /v1/audits/{id}/
status sur ce même id (comme pour un audit classique). `status` ici est
toujours ''accepted'' (202) — pas le statut SQL de l''audit, qui va presque
immédiatement repasser par ''running'' côté run_graph().'
FanQueryAdditionItem:
properties:
query:
type: string
maxLength: 500
minLength: 1
title: Query
engine:
type: string
enum:
- gemini
- chatgpt
- perplexity
- ai_mode
title: Engine
default: gemini
category:
type: string
title: Category
default: custom
type: object
required:
- query
title: FanQueryAdditionItem
description: 'Query 100% custom fournie par l''utilisateur — id généré par le système
(continuité stricte de la séquence existante, jamais de réutilisation d''un
id libéré).'
SupportedCountry:
type: string
enum:
- BE
- CA
- CH
- DE
- ES
- FR
- GB
- JP
- MA
- SN
- US
title: SupportedCountry
description: 'Sprint Country-Production (2026-04-21) + Sprint SPR (2026-04-23) :
10 pays Decodo Residential supportés E2E via endpoints dédiés
(fr.decodo.com, ma.decodo.com, ...).
Cette enum est INLINE pour garder le runtime backend autonome (pas de dépendance
sur lab/ qui n''est ni copié dans le Dockerfile ni accessible quand le build context
est `backend/`). La source de vérité opérationnelle reste lab/config/countries.yaml,
consommée par l''orchestrator + page_collector. Drift detection : test_country_matrix.py
charge le YAML et vérifie l''égalité keys(YAML) == set(SupportedCountry).
Sprint SPR : T3.9 résolu — CH/MA/SN natifs Decodo Residential (ch.decodo.com:29000,
ma.decodo.com:40000, sn.decodo.com:49000).
Sprint N04 V2 J4 D1 (2026-05-14) — extension worldwide JP (jp.decodo.com:30000).'
AgentRunRequest:
properties:
keyword:
type: string
maxLength: 200
minLength: 2
title: Keyword
language:
allOf:
- $ref: '#/components/schemas/Language'
default: en
country:
allOf:
- $ref: '#/components/schemas/SupportedCountry'
default: US
engines:
items:
type: string
enum:
- gemini
- chatgpt
- perplexity
- ai_mode
type: array
minItems: 1
title: Engines
source_fan_query_run_id:
anyOf:
- type: string
format: uuid
- type: 'null'
title: Source Fan Query Run Id
fan_query_id:
anyOf:
- type: integer
maximum: 32767.0
minimum: 1.0
- type: 'null'
title: Fan Query Id
fan_query_text:
anyOf:
- type: string
- type: 'null'
title: Fan Query Text
user_url:
anyOf:
- type: string
- type: 'null'
title: User Url
competitor_urls:
items:
type: string
type: array
maxItems: 20
title: Competitor Urls
include_eeat:
type: boolean
title: Include Eeat
default: false
include_onpage:
type: boolean
title: Include Onpage
default: false
include_semantic:
type: boolean
title: Include Semantic
default: true
include_sentiment:
type: boolean
title: Include Sentiment
default: false
queries_per_engine:
anyOf:
- additionalProperties:
type: integer
type: object
- type: 'null'
title: Queries Per Engine
measure_engines:
anyOf:
- items:
type: string
enum:
- gemini
- chatgpt
- gemini_web
- chatgpt_web
- perplexity_web
- ai_mode_web
type: array
- type: 'null'
title: Measure Engines
type: object
required:
- keyword
title: AgentRunRequest
ScheduleCreateRequest:
properties:
campaign_id:
type: string
format: uuid
title: Campaign Id
fan_query_ids:
items:
type: integer
type: array
maxItems: 500
title: Fan Query Ids
frequency_preset:
anyOf:
- type: string
enum:
- daily
- twice_daily
- weekly
- bi_weekly
- monthly
- custom
- type: 'null'
title: Frequency Preset
cron_expression:
anyOf:
- type: string
maxLength: 100
minLength: 1
- type: 'null'
title: Cron Expression
include_eeat:
type: boolean
title: Include Eeat
default: false
include_onpage:
type: boolean
title: Include Onpage
default: false
include_semantic:
anyOf:
- type: boolean
- type: 'null'
title: Include Semantic
include_sentiment:
type: boolean
title: Include Sentiment
default: false
api_key:
type: string
minLength: 1
title: Api Key
type: object
required:
- campaign_id
- api_key
title: ScheduleCreateRequest
description: 'Déclenchement récurrent (Sprint 3 scheduler_lab, 2026-09-30) — crée un
job Cloud Scheduler qui appellera run-batch à la fréquence donnée, avec
ce même lot de fan_query_ids et ces mêmes flags figés.'
BatchRunRequest:
properties:
source_fan_query_run_id:
type: string
format: uuid
title: Source Fan Query Run Id
fan_query_ids:
items:
type: integer
type: array
maxItems: 500
minItems: 1
title: Fan Query Ids
include_eeat:
type: boolean
title: Include Eeat
default: false
include_onpage:
type: boolean
title: Include Onpage
default: false
include_semantic:
type: boolean
title: Include Semantic
default: true
include_sentiment:
type: boolean
title: Include Sentiment
default: false
user_url:
anyOf:
- type: string
- type: 'null'
title: User Url
competitor_urls:
items:
type: string
type: array
maxItems: 20
title: Competitor Urls
measure_engines:
anyOf:
- items:
type: string
enum:
- gemini
- chatgpt
- gemini_web
- chatgpt_web
- perplexity_web
- ai_mode_web
type: array
- type: 'null'
title: Measure Engines
type: object
required:
- source_fan_query_run_id
- fan_query_ids
title: BatchRunRequest
description: 'Déclenchement en masse (Phase 4 bulk, sprint Chantiers 2+3 fusionnés,
2026-09-30) — un seul appel lance N audits geo-query-audit à partir d''un
lot de fan_query_id choisis dans un run fan-query déjà terminé. Sélection
et lancement sont le même geste : pas d''état "approved" persisté séparément.'
OutputAggregatorRunRequest:
properties:
audit_id:
type: string
format: uuid
title: Audit Id
type: object
required:
- audit_id
title: OutputAggregatorRunRequest
description: 'Déclenchement du Graphe 3 "Output Engine" (2026-10-02) — pas de
keyword : opère sur un audit_id du Graphe 2 (geo-query-audit) déjà
status=''completed''. AgentRunRequest (keyword obligatoire) ne peut pas
être réutilisé tel quel (confirmé Phase 1), d''où ce schéma dédié,
volontairement minimal.'
BatchRunResponse:
properties:
audits:
items:
$ref: '#/components/schemas/BatchAuditItem'
type: array
title: Audits
measurement_items:
items:
$ref: '#/components/schemas/BatchMeasurementItem'
type: array
title: Measurement Items
type: object
required:
- audits
title: BatchRunResponse
BatchMeasurementItem:
properties:
item_id:
type: string
format: uuid
title: Item Id
fan_query_id:
type: integer
title: Fan Query Id
engine:
type: string
title: Engine
status:
type: string
title: Status
type: object
required:
- item_id
- fan_query_id
- engine
- status
title: BatchMeasurementItem
description: 'Élément de mesure mis en file par le collecteur (drapeau BRIGHTDATA_COLLECTOR_ENABLED) : l''audit n''existe qu''à la
réception de la mesure, `audits` reste donc vide à la réponse du lancement.'
ValidationError:
properties:
loc:
items:
anyOf:
- type: string
- type: integer
type: array
title: Location
msg:
type: string
title: Message
type:
type: string
title: Error Type
type: object
required:
- loc
- msg
- type
title: ValidationError
FanQueryGroupRunResponse:
properties:
audit_id:
type: string
format: uuid
title: Audit Id
status:
$ref: '#/components/schemas/AuditStatus'
created_at:
type: string
format: date-time
title: Created At
runs:
items:
$ref: '#/components/schemas/GroupRunItem'
type: array
title: Runs
type: object
required:
- audit_id
- status
- created_at
- runs
title: FanQueryGroupRunResponse
description: '`audit_id` = le run PARENT : c''est lui qu''on suit (GET .../status, qui
expose `runs[]` pour le détail par mot-clé), qu''on édite (PATCH queries) et
qu''on utilise comme source de campagne une fois terminé.'
Language:
type: string
enum:
- fr
- en
title: Language
AuditStatus:
type: string
enum:
- pending
- running
- completed
- failed
- cancelled
title: AuditStatus
AuditCreateResponse:
properties:
audit_id:
type: string
format: uuid
title: Audit Id
status:
$ref: '#/components/schemas/AuditStatus'
created_at:
type: string
format: date-time
title: Created At
stream_url:
type: string
title: Stream Url
type: object
required:
- audit_id
- status
- created_at
- stream_url
title: AuditCreateResponse
FanQueryGroupRunRequest:
properties:
keywords:
items:
type: string
type: array
maxItems: 10
minItems: 2
title: Keywords
language:
allOf:
- $ref: '#/components/schemas/Language'
default: en
country:
allOf:
- $ref: '#/components/schemas/SupportedCountry'
default: US
engines:
items:
type: string
enum:
- gemini
- chatgpt
- perplexity
- ai_mode
type: array
minItems: 1
title: Engines
queries_per_engine:
anyOf:
- additionalProperties:
type: integer
type: object
- type: 'null'
title: Queries Per Engine
user_url:
anyOf:
- type: string
- type: 'null'
title: User Url
competitor_urls:
items:
type: string
type: array
maxItems: 20
title: Competitor Urls
type: object
required:
- keywords
title: FanQueryGroupRunRequest
description: 'Multi-mot-clé (sprint cockpit, 2026-10-15, D1=B) : un run fan-query par
mot-clé, lancés en parallèle avec les mêmes moteurs / volume / pays /
langue, regroupés sous un run PARENT dont les queries sont fusionnées avec
des ids continus à la fin. Les autres champs de AgentRunRequest (engines,
queries_per_engine) sont validés comme pour un run simple.'
FanQueryImportRequest:
properties:
keyword:
type: string
maxLength: 200
minLength: 2
title: Keyword
language:
allOf:
- $ref: '#/components/schemas/Language'
default: en
country:
allOf:
- $ref: '#/components/schemas/SupportedCountry'
default: US
queries:
items:
$ref: '#/components/schemas/FanQueryImportItem'
type: array
maxItems: 32767
minItems: 1
title: Queries
type: object
required:
- keyword
- queries
title: FanQueryImportRequest
description: 'Cas 3 (2026-10-04) — l''utilisateur fournit ses propres queries, sans
aucune génération LLM. Crée directement un run fan-query à l''état
completed, utilisable ensuite comme n''importe quel run (PATCH, campagne,
run-batch). `keyword` sert de libellé du run (colonne audits.keyword).'
DraftRunsResponse:
properties:
runs:
items:
$ref: '#/components/schemas/DraftRun'
type: array
title: Runs
total:
type: integer
title: Total
type: object
required:
- runs
- total
title: DraftRunsResponse
GroupRunItem:
properties:
audit_id:
type: string
format: uuid
title: Audit Id
keyword:
type: string
title: Keyword
position:
type: integer
title: Position
type: object
required:
- audit_id
- keyword
- position
title: GroupRunItem
ScheduleListItem:
properties:
job_id:
type: string
title: Job Id
campaign_id:
type: string
format: uuid
title: Campaign Id
fan_query_ids:
items:
type: integer
type: array
title: Fan Query Ids
cron_expression:
type: string
title: Cron Expression
include_semantic:
type: boolean
title: Include Semantic
include_eeat:
type: boolean
title: Include Eeat
include_onpage:
type: boolean
title: Include Onpage
include_sentiment:
type: boolean
title: Include Sentiment
default: false
created_at:
type: string
title: Created At
real_campaign_id:
anyOf:
- type: string
format: uuid
- type: 'null'
title: Real Campaign Id
frequency_preset:
anyOf:
- type: string
- type: 'null'
title: Frequency Preset
type: object
required:
- job_id
- campaign_id
- fan_query_ids
- cron_expression
- include_semantic
- include_eeat
- include_onpage
- created_at
title: ScheduleListItem
BatchAuditItem:
properties:
audit_id:
type: string
format: uuid
title: Audit Id
fan_query_id:
type: integer
title: Fan Query Id
status:
$ref: '#/components/schemas/AuditStatus'
type: object
required:
- audit_id
- fan_query_id
- status
title: BatchAuditItem
FanQueryEditItem:
properties:
id:
type: integer
maximum: 32767.0
minimum: 1.0
title: Id
query:
type: string
maxLength: 500
minLength: 1
title: Query
type: object
required:
- id
- query
title: FanQueryEditItem
description: Correction du texte d'une query déjà générée — id conservé tel quel.
ScheduleResponse:
properties:
job_id:
type: string
title: Job Id
campaign_id:
type: string
format: uuid
title: Campaign Id
cron_expression:
type: string
title: Cron Expression
created_at:
type: string
title: Created At
real_campaign_id:
anyOf:
- type: string
format: uuid
- type: 'null'
title: Real Campaign Id
frequency_preset:
anyOf:
- type: string
- type: 'null'
title: Frequency Preset
type: object
required:
- job_id
- campaign_id
- cron_expression
- created_at
title: ScheduleResponse
ScheduleListResponse:
properties:
schedules:
items:
$ref: '#/components/schemas/ScheduleListItem'
type: array
title: Schedules
type: object
required:
- schedules
title: ScheduleListResponse
securitySchemes:
HTTPBearer:
type: http
scheme: bearer
x-provenance:
method: harvested
publisher: GEOCitation
source: https://api.geocitation.io/openapi.json
note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
stamped by stamp-openapi-provenance.py (roadmap#793)